From f98f1b8a593dc3f8d6e9f47b8e82067e458bb03c Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Wed, 10 Oct 2018 07:27:14 -0700 Subject: [PATCH 001/483] mlflow.projects.run should inherit parent_run_id (#618) --- mlflow/projects/__init__.py | 9 ++++++++- tests/projects/test_projects.py | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/mlflow/projects/__init__.py b/mlflow/projects/__init__.py index d6c7c2b04610b..44b95eaa162bb 100644 --- a/mlflow/projects/__init__.py +++ b/mlflow/projects/__init__.py @@ -18,6 +18,7 @@ from mlflow.entities import RunStatus, SourceType, Param import mlflow.tracking as tracking from mlflow.tracking.fluent import _get_experiment_id, _get_git_commit +import mlflow.tracking.fluent as fluent import mlflow.projects.databricks @@ -416,12 +417,18 @@ def _create_run(uri, experiment_id, work_dir, entry_point): source_name = tracking.utils._get_git_url_if_present(_expand_uri(uri)) else: source_name = _expand_uri(uri) + existing_run = fluent.active_run() + if existing_run: + parent_run_id = existing_run.info.run_uuid + else: + parent_run_id = None active_run = tracking.MlflowClient().create_run( experiment_id=experiment_id, source_name=source_name, source_version=_get_git_commit(work_dir), entry_point_name=entry_point, - source_type=SourceType.PROJECT) + source_type=SourceType.PROJECT, + parent_run_id=parent_run_id) return active_run diff --git a/tests/projects/test_projects.py b/tests/projects/test_projects.py index 0b0dd77b5d84a..fcfd9446b8ff1 100644 --- a/tests/projects/test_projects.py +++ b/tests/projects/test_projects.py @@ -11,6 +11,7 @@ from mlflow.entities import RunStatus, ViewType from mlflow.exceptions import ExecutionException from mlflow.utils import env +from mlflow.utils.mlflow_tags import MLFLOW_PARENT_RUN_ID from tests.projects.utils import TEST_PROJECT_DIR, TEST_PROJECT_NAME, GIT_PROJECT_URI, \ validate_exit_status, assert_dirs_equal @@ -226,6 +227,22 @@ def test_run(tmpdir, tracking_uri_mock, use_start_run): # pylint: disable=unuse assert metric.value == expected_metrics[metric.key] +def test_run_with_parent(tmpdir, tracking_uri_mock): # pylint: disable=unused-argument + """Verify that if we are in a nested run, mlflow.projects.run() will have a parent_run_id.""" + with mlflow.start_run(): + parent_run_id = mlflow.active_run().info.run_uuid + submitted_run = mlflow.projects.run( + TEST_PROJECT_DIR, entry_point="test_tracking", + parameters={"use_start_run": "1"}, + use_conda=False, experiment_id=0) + assert submitted_run.run_id is not None + validate_exit_status(submitted_run.get_status(), RunStatus.FINISHED) + run_uuid = submitted_run.run_id + run = mlflow.tracking.MlflowClient().get_run(run_uuid) + parent_run_id_tag = [tag.value for tag in run.data.tags if tag.key == MLFLOW_PARENT_RUN_ID] + assert parent_run_id_tag == [parent_run_id] + + def test_run_async(tracking_uri_mock): # pylint: disable=unused-argument submitted_run0 = mlflow.projects.run( TEST_PROJECT_DIR, entry_point="sleep", parameters={"duration": 2}, From f3e1f49fe65e9a03739719c9974acff9a3752593 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Wed, 10 Oct 2018 08:15:34 -0700 Subject: [PATCH 002/483] Fix react warnings in ExperimentViewUtil.getExpander (#615) --- .../js/src/components/ExperimentRunsTableCompactView.js | 2 +- mlflow/server/js/src/components/ExperimentViewUtil.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js index 691ac0311ec37..7cdb776b17ce6 100644 --- a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js +++ b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js @@ -90,7 +90,7 @@ class ExperimentRunsTableCompactView extends Component { const rowContents = [ ExperimentViewUtil.getCheckboxForRow(selected, () => onCheckbox(runInfo.run_uuid)), ExperimentViewUtil.getExpander( - hasExpander, expanderOpen, () => onExpand(runInfo.run_uuid, childrenIds)), + hasExpander, expanderOpen, () => onExpand(runInfo.run_uuid, childrenIds), runInfo.run_uuid), ]; ExperimentViewUtil.getRunInfoCellsForRow(runInfo, tagsList[idx], isParent) .forEach((col) => rowContents.push(col)); diff --git a/mlflow/server/js/src/components/ExperimentViewUtil.js b/mlflow/server/js/src/components/ExperimentViewUtil.js index 1bdc8483035d9..c850ff850e71f 100644 --- a/mlflow/server/js/src/components/ExperimentViewUtil.js +++ b/mlflow/server/js/src/components/ExperimentViewUtil.js @@ -229,20 +229,20 @@ export default class ExperimentViewUtil { return expanderOpen; } - static getExpander(hasExpander, expanderOpen, onExpandBound) { + static getExpander(hasExpander, expanderOpen, onExpandBound, runUuid) { if (!hasExpander) { - return + return ; } if (expanderOpen) { return ( - + ); } else { return ( - + ); From 532310280ef0fcce3f0ecec437c0f0e8ff4e8a0f Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Wed, 10 Oct 2018 11:19:58 -0700 Subject: [PATCH 003/483] Use PyYAML for MLflow conda environment generation (#611) * Use yaml for mlflow conda env generation * Lint * Remove base env method * Fix * Use safe dump --- mlflow/utils/environment.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/mlflow/utils/environment.py b/mlflow/utils/environment.py index 45fec3d9fb3db..88acb2c0489c7 100644 --- a/mlflow/utils/environment.py +++ b/mlflow/utils/environment.py @@ -1,31 +1,34 @@ +import yaml + from mlflow.utils import PYTHON_VERSION -_conda_header = """name: mlflow-env +_conda_header = """\ +name: mlflow-env channels: - anaconda - defaults -dependencies:""" +""" -def _mlflow_conda_env(path, additional_conda_deps=None, additional_pip_deps=None): +def _mlflow_conda_env(path, additional_conda_deps=None, additional_pip_deps=None, + additional_conda_channels=None): """ Create conda environment file. Contains default dependency on current python version. :param path: local filesystem path where the conda env file is to be created. :param additional_conda_deps: List of additional conda dependencies passed as strings. :param additional_pip_deps: List of additional pip dependencies passed as strings. - :return: path where the files has been created + :param additional_channels: List of additional conda channels to search when resolving packages. + :return: path where the conda environment file has been created. """ - conda_deps = ["python={}".format(PYTHON_VERSION)] - if additional_conda_deps: - conda_deps += additional_conda_deps - pip_deps = additional_pip_deps + env = yaml.load(_conda_header) + env["dependencies"] = ["python={}".format(PYTHON_VERSION)] + if additional_conda_deps is not None: + env["dependencies"] += additional_conda_deps + if additional_pip_deps is not None: + env["dependencies"].append({"pip": additional_pip_deps}) + if additional_conda_channels is not None: + env["channels"] += additional_conda_channels + with open(path, "w") as f: - f.write(_conda_header) - prefix = "\n - " - f.write(prefix + prefix.join(conda_deps)) - if pip_deps: - f.write(prefix + "pip:") - prefix = "\n - " - f.write(prefix + prefix.join(pip_deps)) - f.write("\n") + yaml.safe_dump(env, f, default_flow_style=False) return path From e86f1084fade59e5d75d617201af90eb2eb27283 Mon Sep 17 00:00:00 2001 From: Andrew Chen Date: Thu, 11 Oct 2018 15:18:39 -0700 Subject: [PATCH 004/483] Improve experiment deletion UX (#605) * Show the active experiment with smallest ID * Show a "no experiments found" view when there are no experiments --- mlflow/server/js/package-lock.json | 6738 +++++++++-------- mlflow/server/js/package.json | 2 +- .../js/src/components/ExperimentListView.js | 14 +- .../src/components/ExperimentListView.test.js | 21 + .../js/src/components/ExperimentPage.js | 10 +- .../ExperimentRunsTableCompactView.js | 3 +- .../ExperimentRunsTableMultiColumnView.js | 2 +- .../js/src/components/ExperimentView.js | 1 - mlflow/server/js/src/components/HomePage.js | 58 +- mlflow/server/js/src/components/HomeView.js | 83 + .../server/js/src/components/HomeView.test.js | 12 + .../js/src/components/NoExperimentView.js | 28 + .../js/src/components/RequestStateWrapper.js | 4 +- mlflow/server/js/src/reducers/Reducers.js | 2 +- .../server/js/src/static/no-experiments.svg | 22 + mlflow/server/js/src/test-utils/Fixtures.js | 16 + 16 files changed, 3586 insertions(+), 3430 deletions(-) create mode 100644 mlflow/server/js/src/components/ExperimentListView.test.js create mode 100644 mlflow/server/js/src/components/HomeView.js create mode 100644 mlflow/server/js/src/components/HomeView.test.js create mode 100644 mlflow/server/js/src/components/NoExperimentView.js create mode 100644 mlflow/server/js/src/static/no-experiments.svg create mode 100644 mlflow/server/js/src/test-utils/Fixtures.js diff --git a/mlflow/server/js/package-lock.json b/mlflow/server/js/package-lock.json index cfa9e98eb44b2..d1a37005d1be2 100644 --- a/mlflow/server/js/package-lock.json +++ b/mlflow/server/js/package-lock.json @@ -20,10 +20,10 @@ "dev": true, "requires": { "@babel/types": "7.0.0-rc.1", - "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "jsesc": "2.5.1", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "jsesc": { @@ -75,9 +75,9 @@ "integrity": "sha512-5PgPDV6F5s69XNznTcP0za3qH7qgBkr9DVQTXfZtpF+3iEyuIZB1Mjxu52F5CFxgzQUQJoBYHVxtH4Itdb5MgA==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "chalk": "2.4.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" }, "dependencies": { "chalk": { @@ -86,9 +86,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -104,7 +104,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", "requires": { - "regenerator-runtime": "^0.12.0" + "regenerator-runtime": "0.12.1" }, "dependencies": { "regenerator-runtime": { @@ -123,7 +123,7 @@ "@babel/code-frame": "7.0.0-rc.1", "@babel/parser": "7.0.0-rc.1", "@babel/types": "7.0.0-rc.1", - "lodash": "^4.17.10" + "lodash": "4.17.10" } }, "@babel/traverse": { @@ -138,9 +138,9 @@ "@babel/helper-split-export-declaration": "7.0.0-rc.1", "@babel/parser": "7.0.0-rc.1", "@babel/types": "7.0.0-rc.1", - "debug": "^3.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.10" + "debug": "3.1.0", + "globals": "11.7.0", + "lodash": "4.17.10" }, "dependencies": { "debug": { @@ -166,9 +166,9 @@ "integrity": "sha512-MBwO1JQKin9BwKTGydrYe4VDJbStCUy35IhJzeZt3FByOdx/q3CYaqMRrH70qVD2RA7+Xk8e3RN0mzKZkYBYuQ==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "2.0.0" }, "dependencies": { "to-fast-properties": { @@ -195,7 +195,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "~2.1.18", + "mime-types": "2.1.18", "negotiator": "0.6.1" } }, @@ -209,7 +209,7 @@ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { - "acorn": "^4.0.3" + "acorn": "4.0.13" }, "dependencies": { "acorn": { @@ -224,7 +224,7 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "requires": { - "acorn": "^4.0.4" + "acorn": "4.0.13" }, "dependencies": { "acorn": { @@ -239,7 +239,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "requires": { - "acorn": "^3.0.4" + "acorn": "3.3.0" }, "dependencies": { "acorn": { @@ -259,10 +259,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { @@ -275,9 +275,9 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" }, "dependencies": { "kind-of": { @@ -285,7 +285,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -305,7 +305,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "^2.0.0" + "string-width": "2.1.1" } }, "ansi-escapes": { @@ -328,7 +328,7 @@ "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" + "color-convert": "1.9.1" } }, "anymatch": { @@ -336,8 +336,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" }, "dependencies": { "arr-diff": { @@ -345,7 +345,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -358,9 +358,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -368,7 +368,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -376,7 +376,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -384,7 +384,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -392,19 +392,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -414,7 +414,7 @@ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "1.0.0" } }, "argparse": { @@ -422,7 +422,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "aria-query": { @@ -431,7 +431,7 @@ "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", "requires": { "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "commander": "2.15.1" } }, "arr-diff": { @@ -479,8 +479,8 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "1.1.2", + "es-abstract": "1.11.0" } }, "array-map": { @@ -498,7 +498,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "^1.0.1" + "array-uniq": "1.0.3" } }, "array-uniq": { @@ -517,9 +517,9 @@ "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" + "define-properties": "1.1.2", + "es-abstract": "1.11.0", + "function-bind": "1.1.1" } }, "arrify": { @@ -542,9 +542,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -575,7 +575,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "^4.14.0" + "lodash": "4.17.10" } }, "async-each": { @@ -598,12 +598,12 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", "requires": { - "browserslist": "^2.5.1", - "caniuse-lite": "^1.0.30000748", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.13", - "postcss-value-parser": "^3.2.3" + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000839", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.22", + "postcss-value-parser": "3.3.0" } }, "aws-sign2": { @@ -629,9 +629,9 @@ "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" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" } }, "babel-core": { @@ -639,25 +639,25 @@ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.0", - "debug": "^2.6.8", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.7", - "slash": "^1.0.0", - "source-map": "^0.5.6" + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -673,12 +673,12 @@ "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.40", - "@babel/traverse": "^7.0.0-beta.40", - "@babel/types": "^7.0.0-beta.40", - "babylon": "^7.0.0-beta.40", - "eslint-scope": "~3.7.1", - "eslint-visitor-keys": "^1.0.0" + "@babel/code-frame": "7.0.0-rc.1", + "@babel/traverse": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1", + "babylon": "7.0.0-beta.47", + "eslint-scope": "3.7.3", + "eslint-visitor-keys": "1.0.0" }, "dependencies": { "babylon": { @@ -694,14 +694,14 @@ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "source-map": { @@ -716,9 +716,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-builder-react-jsx": { @@ -726,9 +726,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" } }, "babel-helper-call-delegate": { @@ -736,10 +736,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { @@ -747,10 +747,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-helper-explode-assignable-expression": { @@ -758,9 +758,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -768,11 +768,11 @@ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -780,8 +780,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -789,8 +789,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { @@ -798,8 +798,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { @@ -807,9 +807,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-helper-remap-async-to-generator": { @@ -817,11 +817,11 @@ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -829,12 +829,12 @@ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -842,8 +842,8 @@ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-jest": { @@ -851,9 +851,9 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.0.0", - "babel-preset-jest": "^20.0.3" + "babel-core": "6.26.0", + "babel-plugin-istanbul": "4.1.6", + "babel-preset-jest": "20.0.3" } }, "babel-loader": { @@ -861,9 +861,9 @@ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" } }, "babel-messages": { @@ -871,7 +871,7 @@ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-check-es2015-constants": { @@ -879,7 +879,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-dynamic-import-node": { @@ -887,9 +887,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-istanbul": { @@ -897,10 +897,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.10.1", + "test-exclude": "4.2.1" } }, "babel-plugin-jest-hoist": { @@ -953,9 +953,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-class-properties": { @@ -963,10 +963,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -974,7 +974,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -982,7 +982,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -990,11 +990,11 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-plugin-transform-es2015-classes": { @@ -1002,15 +1002,15 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -1018,8 +1018,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -1027,7 +1027,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -1035,8 +1035,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { @@ -1044,7 +1044,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -1052,9 +1052,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { @@ -1062,7 +1062,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -1070,9 +1070,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -1080,10 +1080,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -1091,9 +1091,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -1101,9 +1101,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { @@ -1111,8 +1111,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -1120,12 +1120,12 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -1133,8 +1133,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -1142,7 +1142,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -1150,9 +1150,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -1160,7 +1160,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -1168,7 +1168,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -1176,9 +1176,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -1186,9 +1186,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -1196,8 +1196,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -1205,8 +1205,8 @@ "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-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-constant-elements": { @@ -1214,7 +1214,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-display-name": { @@ -1222,7 +1222,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx": { @@ -1230,9 +1230,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx-self": { @@ -1240,8 +1240,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx-source": { @@ -1249,8 +1249,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -1258,7 +1258,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "requires": { - "regenerator-transform": "^0.10.0" + "regenerator-transform": "0.10.1" } }, "babel-plugin-transform-runtime": { @@ -1266,7 +1266,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-strict-mode": { @@ -1274,8 +1274,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-polyfill": { @@ -1283,9 +1283,9 @@ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "regenerator-runtime": "0.10.5" }, "dependencies": { "core-js": { @@ -1305,36 +1305,36 @@ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^2.1.2", - "invariant": "^2.2.2", - "semver": "^5.3.0" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.11.3", + "invariant": "2.2.4", + "semver": "5.5.0" } }, "babel-preset-flow": { @@ -1342,7 +1342,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" + "babel-plugin-transform-flow-strip-types": "6.22.0" } }, "babel-preset-jest": { @@ -1350,7 +1350,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", "requires": { - "babel-plugin-jest-hoist": "^20.0.3" + "babel-plugin-jest-hoist": "20.0.3" } }, "babel-preset-react": { @@ -1358,12 +1358,12 @@ "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" } }, "babel-preset-react-app": { @@ -1391,13 +1391,13 @@ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.6", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" }, "dependencies": { "core-js": { @@ -1412,8 +1412,8 @@ "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" + "core-js": "2.5.6", + "regenerator-runtime": "0.11.1" }, "dependencies": { "core-js": { @@ -1428,11 +1428,11 @@ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" } }, "babel-traverse": { @@ -1440,15 +1440,15 @@ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { @@ -1456,10 +1456,10 @@ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -1477,13 +1477,13 @@ "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" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -1491,7 +1491,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -1499,7 +1499,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1507,7 +1507,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1515,9 +1515,9 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -1538,7 +1538,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "big.js": { @@ -1572,15 +1572,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "~1.6.15" + "type-is": "1.6.16" }, "dependencies": { "iconv-lite": { @@ -1600,12 +1600,12 @@ "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" + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" } }, "boolbase": { @@ -1618,7 +1618,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } }, "bowser": { @@ -1631,13 +1631,13 @@ "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" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" }, "dependencies": { "camelcase": { @@ -1650,9 +1650,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -1662,7 +1662,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1671,16 +1671,16 @@ "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" + "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.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -1688,7 +1688,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1718,12 +1718,12 @@ "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" + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "browserify-cipher": { @@ -1731,9 +1731,9 @@ "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-aes": "1.2.0", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.3" } }, "browserify-des": { @@ -1741,9 +1741,9 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" } }, "browserify-rsa": { @@ -1751,8 +1751,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "bn.js": "4.11.8", + "randombytes": "2.0.6" } }, "browserify-sign": { @@ -1760,13 +1760,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -1774,7 +1774,7 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "~1.0.5" + "pako": "1.0.6" } }, "browserslist": { @@ -1782,8 +1782,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "caniuse-lite": "1.0.30000839", + "electron-to-chromium": "1.3.45" } }, "bser": { @@ -1791,7 +1791,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "requires": { - "node-int64": "^0.4.0" + "node-int64": "0.4.0" } }, "buffer": { @@ -1799,9 +1799,9 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "1.3.0", + "ieee754": "1.1.11", + "isarray": "1.0.0" } }, "buffer-from": { @@ -1839,15 +1839,15 @@ "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" + "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" } }, "caller-path": { @@ -1855,7 +1855,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "requires": { - "callsites": "^0.2.0" + "callsites": "0.2.0" } }, "callsites": { @@ -1868,8 +1868,8 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "camelcase": { @@ -1882,8 +1882,8 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "2.1.1", + "map-obj": "1.0.1" }, "dependencies": { "camelcase": { @@ -1898,10 +1898,10 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000839", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" }, "dependencies": { "browserslist": { @@ -1909,8 +1909,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000839", + "electron-to-chromium": "1.3.45" } } } @@ -1945,8 +1945,8 @@ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chalk": { @@ -1954,11 +1954,11 @@ "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" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" }, "dependencies": { "ansi-styles": { @@ -1984,12 +1984,12 @@ "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "parse5": "3.0.3" }, "dependencies": { "domhandler": { @@ -1998,7 +1998,7 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "htmlparser2": { @@ -2007,12 +2007,12 @@ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parse5": { @@ -2021,7 +2021,7 @@ "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "10.9.2" } } } @@ -2031,18 +2031,18 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.5" }, "dependencies": { "anymatch": { @@ -2050,8 +2050,8 @@ "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" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" } }, "glob-parent": { @@ -2059,8 +2059,8 @@ "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" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" }, "dependencies": { "is-glob": { @@ -2068,7 +2068,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -2083,7 +2083,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } } } @@ -2098,8 +2098,8 @@ "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" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "circular-json": { @@ -2112,7 +2112,7 @@ "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { - "chalk": "^1.1.3" + "chalk": "1.1.3" } }, "class-utils": { @@ -2120,10 +2120,10 @@ "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" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -2131,7 +2131,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -2146,7 +2146,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { - "source-map": "0.5.x" + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -2166,7 +2166,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "2.0.0" } }, "cli-width": { @@ -2179,8 +2179,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" }, "dependencies": { @@ -2206,7 +2206,7 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { - "q": "^1.1.2" + "q": "1.5.1" } }, "code-point-at": { @@ -2219,8 +2219,8 @@ "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" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color": { @@ -2228,9 +2228,9 @@ "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" + "clone": "1.0.4", + "color-convert": "1.9.1", + "color-string": "0.3.0" } }, "color-convert": { @@ -2238,7 +2238,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -2251,7 +2251,7 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { - "color-name": "^1.0.0" + "color-name": "1.1.3" } }, "colormin": { @@ -2259,9 +2259,9 @@ "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { - "color": "^0.11.0", + "color": "0.11.4", "css-color-names": "0.0.4", - "has": "^1.0.1" + "has": "1.0.1" } }, "colors": { @@ -2274,7 +2274,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -2302,7 +2302,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "requires": { - "mime-db": ">= 1.33.0 < 2" + "mime-db": "1.33.0" } }, "compression": { @@ -2310,13 +2310,13 @@ "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "requires": { - "accepts": "~1.3.4", + "accepts": "1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.13", + "compressible": "2.0.13", "debug": "2.6.9", - "on-headers": "~1.0.1", + "on-headers": "1.0.1", "safe-buffer": "5.1.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "safe-buffer": { @@ -2336,10 +2336,10 @@ "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" + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" } }, "configstore": { @@ -2347,12 +2347,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "^4.1.0", - "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" + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" } }, "connect-history-api-fallback": { @@ -2365,7 +2365,7 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { - "date-now": "^0.1.4" + "date-now": "0.1.4" } }, "constants-browserify": { @@ -2428,13 +2428,13 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" }, "dependencies": { "minimist": { @@ -2449,8 +2449,8 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "bn.js": "4.11.8", + "elliptic": "6.4.0" } }, "create-error-class": { @@ -2458,7 +2458,7 @@ "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" + "capture-stack-trace": "1.0.0" } }, "create-hash": { @@ -2466,11 +2466,11 @@ "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" + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { @@ -2478,12 +2478,12 @@ "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" + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "create-react-context": { @@ -2491,8 +2491,8 @@ "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" + "fbjs": "0.8.16", + "gud": "1.0.0" } }, "cross-spawn": { @@ -2500,9 +2500,9 @@ "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" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.0" } }, "cryptiles": { @@ -2510,7 +2510,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.x.x" + "boom": "5.2.0" }, "dependencies": { "boom": { @@ -2518,7 +2518,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } } } @@ -2528,17 +2528,17 @@ "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" + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "crypto-random-string": { @@ -2556,20 +2556,20 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", "requires": { - "babel-code-frame": "^6.11.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": ">=2.6.1 <4", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.0", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.1.0", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.0", + "source-list-map": "2.0.0" }, "dependencies": { "has-flag": { @@ -2582,10 +2582,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -2598,7 +2598,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -2608,10 +2608,10 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", + "boolbase": "1.0.0", + "css-what": "2.1.0", "domutils": "1.5.1", - "nth-check": "~1.0.1" + "nth-check": "1.0.1" } }, "css-selector-tokenizer": { @@ -2619,9 +2619,9 @@ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" }, "dependencies": { "regexpu-core": { @@ -2629,9 +2629,9 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } } } @@ -2651,38 +2651,38 @@ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.1", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.2", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.0", + "postcss-zindex": "2.2.0" }, "dependencies": { "autoprefixer": { @@ -2690,12 +2690,12 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000839", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" } }, "browserslist": { @@ -2703,8 +2703,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000839", + "electron-to-chromium": "1.3.45" } }, "has-flag": { @@ -2717,10 +2717,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -2733,7 +2733,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -2743,8 +2743,8 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" + "clap": "1.2.3", + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -2764,7 +2764,7 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { - "cssom": "0.3.x" + "cssom": "0.3.2" } }, "currently-unhandled": { @@ -2772,7 +2772,7 @@ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "array-find-index": "^1.0.1" + "array-find-index": "1.0.2" } }, "d": { @@ -2780,7 +2780,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "0.10.42" } }, "d3-array": { @@ -2808,7 +2808,7 @@ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", "requires": { - "d3-color": "1" + "d3-color": "1.2.0" } }, "d3-path": { @@ -2821,13 +2821,13 @@ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz", "integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.2.0", + "d3-format": "1.3.0", + "d3-interpolate": "1.2.0", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" } }, "d3-shape": { @@ -2835,7 +2835,7 @@ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", "requires": { - "d3-path": "1" + "d3-path": "1.0.5" } }, "d3-time": { @@ -2848,7 +2848,7 @@ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", "requires": { - "d3-time": "1" + "d3-time": "1.0.8" } }, "damerau-levenshtein": { @@ -2861,7 +2861,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "date-now": { @@ -2917,7 +2917,7 @@ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "2.0.0" } }, "define-properties": { @@ -2925,8 +2925,8 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "foreach": "2.0.5", + "object-keys": "1.0.11" } }, "define-property": { @@ -2934,8 +2934,8 @@ "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" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2943,7 +2943,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2951,7 +2951,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2959,9 +2959,9 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -2976,13 +2976,13 @@ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" } }, "delayed-stream": { @@ -3000,8 +3000,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -3014,7 +3014,7 @@ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "detect-node": { @@ -3027,8 +3027,8 @@ "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" + "address": "1.0.3", + "debug": "2.6.9" } }, "diff": { @@ -3041,9 +3041,9 @@ "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" + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" } }, "discontinuous-range": { @@ -3062,8 +3062,8 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "ip": "1.1.5", + "safe-buffer": "5.1.2" } }, "dns-txt": { @@ -3071,7 +3071,7 @@ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "buffer-indexof": "^1.0.0" + "buffer-indexof": "1.1.1" } }, "doctrine": { @@ -3079,7 +3079,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "esutils": "^2.0.2" + "esutils": "2.0.2" } }, "dom-converter": { @@ -3087,7 +3087,7 @@ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { - "utila": "~0.3" + "utila": "0.3.3" }, "dependencies": { "utila": { @@ -3107,8 +3107,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "1.1.3", + "entities": "1.1.1" }, "dependencies": { "domelementtype": { @@ -3123,7 +3123,7 @@ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "requires": { - "urijs": "^1.16.1" + "urijs": "1.19.1" } }, "domain-browser": { @@ -3141,7 +3141,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "domutils": { @@ -3149,8 +3149,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" } }, "dot-prop": { @@ -3158,7 +3158,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "dotenv": { @@ -3176,9 +3176,9 @@ "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz", "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==", "requires": { - "fbjs": "^0.8.15", - "immutable": "~3.7.4", - "object-assign": "^4.1.0" + "fbjs": "0.8.16", + "immutable": "3.7.6", + "object-assign": "4.1.1" }, "dependencies": { "immutable": { @@ -3204,7 +3204,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "ee-first": { @@ -3222,13 +3222,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "emoji-regex": { @@ -3251,7 +3251,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.23" } }, "enhanced-resolve": { @@ -3259,10 +3259,10 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" } }, "entities": { @@ -3276,24 +3276,24 @@ "integrity": "sha512-I51gsZvXiUjrJC3oJ9wo1tvKyWQrrLD+7esOwTw5sZeQ6a+GVcQYVroXBF13hB/kJQ4vurtxEm35+5T1Q8R2Pw==", "dev": true, "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" + "array.prototype.flat": "1.2.1", + "cheerio": "1.0.0-rc.2", + "function.prototype.name": "1.1.0", + "has": "1.0.3", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.4", + "is-number-object": "1.0.3", + "is-string": "1.0.4", + "is-subset": "0.1.1", + "lodash.escape": "4.0.1", + "lodash.isequal": "4.5.0", + "object-inspect": "1.6.0", + "object-is": "1.0.1", + "object.assign": "4.1.0", + "object.entries": "1.0.4", + "object.values": "1.0.4", + "raf": "3.4.0", + "rst-selector-parser": "2.2.3" }, "dependencies": { "has": { @@ -3302,7 +3302,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "function-bind": "1.1.1" } }, "is-callable": { @@ -3319,13 +3319,13 @@ "integrity": "sha512-TRX+Y5QPreGmqfFU3bPsJUmqNZX9paQCmQ93kj7hnfQoZzufO/pahGN/OviWn60YcgaQojhf0AWv3PxrIDARbA==", "dev": true, "requires": { - "enzyme-adapter-utils": "^1.6.0", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.values": "^1.0.4", - "prop-types": "^15.6.2", - "react-is": "^16.4.2", - "react-test-renderer": "^16.0.0-0" + "enzyme-adapter-utils": "1.6.0", + "function.prototype.name": "1.1.0", + "object.assign": "4.1.0", + "object.values": "1.0.4", + "prop-types": "15.6.2", + "react-is": "16.4.2", + "react-test-renderer": "16.4.2" }, "dependencies": { "prop-types": { @@ -3334,8 +3334,8 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "react-is": { @@ -3352,9 +3352,9 @@ "integrity": "sha512-8bzxmmBwYNqgEVVpTgONW3IzH3eYHiLZp+V+JL1GPKLVbIMnXSPChsQ7EKMdIimf6+aSHzANUEsGXG+zSRS23w==", "dev": true, "requires": { - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "prop-types": "^15.6.2" + "function.prototype.name": "1.1.0", + "object.assign": "4.1.0", + "prop-types": "15.6.2" }, "dependencies": { "prop-types": { @@ -3363,8 +3363,8 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } } } @@ -3374,7 +3374,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "error-ex": { @@ -3382,7 +3382,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es-abstract": { @@ -3390,11 +3390,11 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" } }, "es-to-primitive": { @@ -3402,9 +3402,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" } }, "es5-ext": { @@ -3412,9 +3412,9 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -3422,9 +3422,9 @@ "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" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-symbol": "3.1.1" } }, "es6-map": { @@ -3432,12 +3432,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-promise": { @@ -3450,11 +3450,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" } }, "es6-symbol": { @@ -3462,8 +3462,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.42" } }, "es6-weak-map": { @@ -3471,10 +3471,10 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "escape-html": { @@ -3492,11 +3492,11 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" }, "dependencies": { "esprima": { @@ -3511,10 +3511,10 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint": { @@ -3523,43 +3523,43 @@ "integrity": "sha512-gPSfpSRCHre1GLxGmO68tZNxOlL2y7xBd95VcLD+Eo4S2js31YoMum3CAQIOaxY24hqYOMksMvW38xuuWKQTgw==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.2", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.3", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.7.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.3", + "text-table": "0.2.0" }, "dependencies": { "ansi-regex": { @@ -3574,9 +3574,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "debug": { @@ -3606,8 +3606,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "strip-ansi": { @@ -3616,7 +3616,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -3627,7 +3627,7 @@ "integrity": "sha512-rQqOvAzrMC3BBCH6Dd/1RenDi+RW4vdgnh8xcPf6sgd324ad6aX7hSZ52L1SfDGe2VsZR2yB5uPvDfXYvxHZmA==", "dev": true, "requires": { - "eslint-restricted-globals": "^0.1.1" + "eslint-restricted-globals": "0.1.1" } }, "eslint-config-react-app": { @@ -3646,8 +3646,8 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" + "debug": "2.6.9", + "resolve": "1.6.0" } }, "eslint-import-resolver-webpack": { @@ -3656,17 +3656,17 @@ "integrity": "sha512-b6JxR57ruiMxq2tIu4T/SrYED5RKJfeBEs8u3+JWF+O2RxDmFpUH84c5uS1T5qiP0K4r0SL7CXhvd41hXdDlAg==", "dev": true, "requires": { - "array-find": "^1.0.0", - "debug": "^2.6.8", - "enhanced-resolve": "~0.9.0", - "find-root": "^0.1.1", - "has": "^1.0.1", - "interpret": "^1.0.0", - "is-absolute": "^0.2.3", - "lodash.get": "^3.7.0", - "node-libs-browser": "^1.0.0 || ^2.0.0", - "resolve": "^1.2.0", - "semver": "^5.3.0" + "array-find": "1.0.0", + "debug": "2.6.9", + "enhanced-resolve": "0.9.1", + "find-root": "0.1.2", + "has": "1.0.1", + "interpret": "1.1.0", + "is-absolute": "0.2.6", + "lodash.get": "3.7.0", + "node-libs-browser": "2.1.0", + "resolve": "1.6.0", + "semver": "5.5.0" }, "dependencies": { "enhanced-resolve": { @@ -3675,9 +3675,9 @@ "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" + "graceful-fs": "4.1.11", + "memory-fs": "0.2.0", + "tapable": "0.1.10" } }, "memory-fs": { @@ -3699,11 +3699,11 @@ "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" + "loader-fs-cache": "1.0.1", + "loader-utils": "1.1.0", + "object-assign": "4.1.1", + "object-hash": "1.3.0", + "rimraf": "2.6.2" } }, "eslint-module-utils": { @@ -3711,8 +3711,8 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "requires": { - "debug": "^2.6.8", - "pkg-dir": "^1.0.0" + "debug": "2.6.9", + "pkg-dir": "1.0.0" }, "dependencies": { "find-up": { @@ -3720,8 +3720,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -3729,7 +3729,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "pkg-dir": { @@ -3737,7 +3737,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" } } } @@ -3759,7 +3759,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz", "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", "requires": { - "lodash": "^4.15.0" + "lodash": "4.17.10" } }, "eslint-plugin-import": { @@ -3767,16 +3767,16 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", "requires": { - "builtin-modules": "^1.1.1", - "contains-path": "^0.1.0", - "debug": "^2.6.8", + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.1.1", - "has": "^1.0.1", - "lodash.cond": "^4.3.0", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0" + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.2.0", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" }, "dependencies": { "doctrine": { @@ -3784,8 +3784,8 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "2.0.2", + "isarray": "1.0.0" } }, "load-json-file": { @@ -3793,10 +3793,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" } }, "path-type": { @@ -3804,7 +3804,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" } }, "read-pkg": { @@ -3812,9 +3812,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" } }, "read-pkg-up": { @@ -3822,8 +3822,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "strip-bom": { @@ -3838,13 +3838,13 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", "requires": { - "aria-query": "^0.7.0", - "array-includes": "^3.0.3", + "aria-query": "0.7.1", + "array-includes": "3.0.3", "ast-types-flow": "0.0.7", - "axobject-query": "^0.1.0", - "damerau-levenshtein": "^1.0.0", - "emoji-regex": "^6.1.0", - "jsx-ast-utils": "^1.4.0" + "axobject-query": "0.1.0", + "damerau-levenshtein": "1.0.4", + "emoji-regex": "6.5.1", + "jsx-ast-utils": "1.4.1" } }, "eslint-plugin-node": { @@ -3853,9 +3853,9 @@ "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", "dev": true, "requires": { - "ignore": "^3.3.6", - "minimatch": "^3.0.4", - "resolve": "^1.3.3", + "ignore": "3.3.10", + "minimatch": "3.0.4", + "resolve": "1.6.0", "semver": "5.3.0" }, "dependencies": { @@ -3878,10 +3878,10 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", "requires": { - "doctrine": "^2.0.0", - "has": "^1.0.1", - "jsx-ast-utils": "^2.0.0", - "prop-types": "^15.5.10" + "doctrine": "2.1.0", + "has": "1.0.1", + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.1" }, "dependencies": { "jsx-ast-utils": { @@ -3889,7 +3889,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "requires": { - "array-includes": "^3.0.3" + "array-includes": "3.0.3" } } } @@ -3911,8 +3911,8 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint-visitor-keys": { @@ -3926,8 +3926,8 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "5.5.3", + "acorn-jsx": "3.0.1" } }, "esprima": { @@ -3940,7 +3940,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "requires": { - "estraverse": "^4.0.0" + "estraverse": "4.2.0" } }, "esrecurse": { @@ -3948,7 +3948,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "^4.1.0" + "estraverse": "4.2.0" } }, "estraverse": { @@ -3971,8 +3971,8 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.42" } }, "eventemitter3": { @@ -3990,7 +3990,7 @@ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { - "original": ">=0.0.5" + "original": "1.0.0" } }, "evp_bytestokey": { @@ -3998,8 +3998,8 @@ "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" + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" } }, "exec-sh": { @@ -4007,7 +4007,7 @@ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "requires": { - "merge": "^1.1.3" + "merge": "1.2.0" } }, "execa": { @@ -4015,13 +4015,13 @@ "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" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "exenv": { @@ -4034,13 +4034,13 @@ "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" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -4048,7 +4048,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -4056,7 +4056,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4066,7 +4066,7 @@ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.4" }, "dependencies": { "fill-range": { @@ -4074,11 +4074,11 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.0.0", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" } }, "is-number": { @@ -4086,7 +4086,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "isobject": { @@ -4102,7 +4102,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4112,7 +4112,7 @@ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "requires": { - "homedir-polyfill": "^1.0.1" + "homedir-polyfill": "1.0.1" } }, "express": { @@ -4120,36 +4120,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "~1.3.5", + "accepts": "1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.3.1", "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", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", + "proxy-addr": "2.0.3", "qs": "6.5.1", - "range-parser": "~1.2.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "statuses": "1.4.0", + "type-is": "1.6.16", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "array-flatten": { @@ -4184,8 +4184,8 @@ "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" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -4193,7 +4193,7 @@ "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" + "is-plain-object": "2.0.4" } } } @@ -4203,9 +4203,9 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "chardet": "0.4.2", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" } }, "extglob": { @@ -4213,14 +4213,14 @@ "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" + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -4228,7 +4228,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -4236,7 +4236,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -4244,7 +4244,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -4252,7 +4252,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -4260,9 +4260,9 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -4272,10 +4272,10 @@ "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" + "async": "2.6.0", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0", + "webpack-sources": "1.1.0" } }, "extsprintf": { @@ -4308,7 +4308,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { - "websocket-driver": ">=0.5.1" + "websocket-driver": "0.7.0" } }, "fb-watchman": { @@ -4316,7 +4316,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "requires": { - "bser": "^2.0.0" + "bser": "2.0.0" } }, "fbjs": { @@ -4324,13 +4324,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.18" } }, "figures": { @@ -4338,7 +4338,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "1.0.5" } }, "file-entry-cache": { @@ -4346,8 +4346,8 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, "file-loader": { @@ -4355,8 +4355,8 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" } }, "file-saver": { @@ -4374,8 +4374,8 @@ "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "glob": "7.1.2", + "minimatch": "3.0.4" } }, "filesize": { @@ -4388,10 +4388,10 @@ "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" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -4399,7 +4399,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4410,12 +4410,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" } }, "find-cache-dir": { @@ -4423,9 +4423,9 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" } }, "find-root": { @@ -4439,7 +4439,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "flat-cache": { @@ -4447,10 +4447,10 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" } }, "flatten": { @@ -4468,7 +4468,7 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { - "debug": "^3.1.0" + "debug": "3.1.0" }, "dependencies": { "debug": { @@ -4491,7 +4491,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "foreach": { @@ -4509,9 +4509,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.18" } }, "formik": { @@ -4519,15 +4519,15 @@ "resolved": "https://registry.npmjs.org/formik/-/formik-1.2.0.tgz", "integrity": "sha512-WtVCIf5LrFdv2lhhReWPVbKkUai4BEoHCKTjdIklKAk/MjhrnAXJkOJMFq0aA8g8B2KWNs/oXBTkIeEWCIlVuA==", "requires": { - "create-react-context": "^0.2.2", - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^2.5.5", - "lodash.clonedeep": "^4.5.0", + "create-react-context": "0.2.3", + "deepmerge": "2.1.1", + "hoist-non-react-statics": "2.5.5", + "lodash.clonedeep": "4.5.0", "lodash.topath": "4.5.2", - "prop-types": "^15.6.1", - "react-fast-compare": "^1.0.0", - "tslib": "^1.9.3", - "warning": "^3.0.0" + "prop-types": "15.6.1", + "react-fast-compare": "1.0.0", + "tslib": "1.9.3", + "warning": "3.0.0" }, "dependencies": { "hoist-non-react-statics": { @@ -4547,7 +4547,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fresh": { @@ -4560,9 +4560,9 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" + "graceful-fs": "4.1.11", + "jsonfile": "3.0.1", + "universalify": "0.1.1" } }, "fs.realpath": { @@ -4576,8 +4576,8 @@ "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.9.0" + "nan": "2.10.0", + "node-pre-gyp": "0.9.1" }, "dependencies": { "abbrev": { @@ -4603,8 +4603,8 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "balanced-match": { @@ -4617,7 +4617,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -4681,7 +4681,7 @@ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "fs.realpath": { @@ -4696,14 +4696,14 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" } }, "glob": { @@ -4712,12 +4712,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "has-unicode": { @@ -4732,7 +4732,7 @@ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": "2.1.2" } }, "ignore-walk": { @@ -4741,7 +4741,7 @@ "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "inflight": { @@ -4750,8 +4750,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -4770,7 +4770,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "isarray": { @@ -4784,7 +4784,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -4797,8 +4797,8 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "minizlib": { @@ -4807,7 +4807,7 @@ "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "mkdirp": { @@ -4830,9 +4830,9 @@ "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", "optional": true, "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" } }, "node-pre-gyp": { @@ -4841,16 +4841,16 @@ "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.6", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -4859,8 +4859,8 @@ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "npm-bundled": { @@ -4875,8 +4875,8 @@ "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { @@ -4885,10 +4885,10 @@ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -4907,7 +4907,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -4928,8 +4928,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -4950,10 +4950,10 @@ "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "optional": true, "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -4970,13 +4970,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "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.2" } }, "rimraf": { @@ -4985,7 +4985,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -5028,9 +5028,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -5039,7 +5039,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } }, "strip-ansi": { @@ -5047,7 +5047,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -5062,13 +5062,13 @@ "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "optional": true, "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "util-deprecate": { @@ -5083,7 +5083,7 @@ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } }, "wrappy": { @@ -5109,9 +5109,9 @@ "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "is-callable": "1.1.3" } }, "functional-red-black-tree": { @@ -5144,7 +5144,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -5152,12 +5152,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-base": { @@ -5165,8 +5165,8 @@ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" } }, "glob-parent": { @@ -5174,7 +5174,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" } }, "global-dirs": { @@ -5182,7 +5182,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "^1.3.4" + "ini": "1.3.5" } }, "global-modules": { @@ -5190,9 +5190,9 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, "global-prefix": { @@ -5200,11 +5200,11 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.0" } }, "globals": { @@ -5217,12 +5217,12 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "got": { @@ -5230,17 +5230,17 @@ "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" + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" } }, "graceful-fs": { @@ -5263,7 +5263,7 @@ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { - "duplexer": "^0.1.1" + "duplexer": "0.1.1" } }, "handle-thing": { @@ -5276,10 +5276,10 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" }, "dependencies": { "async": { @@ -5292,7 +5292,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } }, "uglify-js": { @@ -5301,9 +5301,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "source-map": { @@ -5320,9 +5320,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -5338,8 +5338,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has": { @@ -5347,7 +5347,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "requires": { - "function-bind": "^1.0.2" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -5355,7 +5355,7 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-flag": { @@ -5374,9 +5374,9 @@ "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" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -5384,8 +5384,8 @@ "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" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -5393,7 +5393,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5403,8 +5403,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "hash.js": { @@ -5412,8 +5412,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "hawk": { @@ -5421,10 +5421,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" } }, "he": { @@ -5437,11 +5437,11 @@ "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", "requires": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", - "value-equal": "^0.4.0", - "warning": "^3.0.0" + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "resolve-pathname": "2.2.0", + "value-equal": "0.4.0", + "warning": "3.0.0" } }, "hmac-drbg": { @@ -5449,9 +5449,9 @@ "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" + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "hoek": { @@ -5469,8 +5469,8 @@ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "homedir-polyfill": { @@ -5478,7 +5478,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "requires": { - "parse-passwd": "^1.0.0" + "parse-passwd": "1.0.0" } }, "hosted-git-info": { @@ -5491,10 +5491,10 @@ "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" + "inherits": "2.0.3", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" } }, "html-comment-regex": { @@ -5507,7 +5507,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "1.0.3" } }, "html-entities": { @@ -5520,13 +5520,13 @@ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz", "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==", "requires": { - "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.15.x", - "he": "1.1.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.3.x" + "camel-case": "3.0.0", + "clean-css": "4.1.11", + "commander": "2.15.1", + "he": "1.1.1", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.3.24" } }, "html-webpack-plugin": { @@ -5534,12 +5534,12 @@ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", "requires": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" + "bluebird": "3.5.1", + "html-minifier": "3.5.15", + "loader-utils": "0.2.17", + "lodash": "4.17.10", + "pretty-error": "2.1.1", + "toposort": "1.0.7" }, "dependencies": { "loader-utils": { @@ -5547,10 +5547,10 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } } } @@ -5560,10 +5560,10 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" }, "dependencies": { "domutils": { @@ -5571,7 +5571,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "isarray": { @@ -5584,10 +5584,10 @@ "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", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -5607,10 +5607,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.4.0" } }, "http-parser-js": { @@ -5623,9 +5623,9 @@ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "eventemitter3": "3.1.0", + "follow-redirects": "1.4.1", + "requires-port": "1.0.0" } }, "http-proxy-middleware": { @@ -5633,10 +5633,10 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" + "http-proxy": "1.17.0", + "is-glob": "3.1.0", + "lodash": "4.17.10", + "micromatch": "2.3.11" }, "dependencies": { "arr-diff": { @@ -5644,7 +5644,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -5657,9 +5657,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -5667,7 +5667,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -5675,7 +5675,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" }, "dependencies": { "is-extglob": { @@ -5695,7 +5695,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } }, "kind-of": { @@ -5703,7 +5703,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -5711,19 +5711,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" }, "dependencies": { "is-extglob": { @@ -5736,7 +5736,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -5748,9 +5748,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" } }, "https-browserify": { @@ -5768,7 +5768,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "icss-replace-symbols": { @@ -5781,7 +5781,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.22" } }, "ieee754": { @@ -5809,8 +5809,8 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" } }, "imurmurhash": { @@ -5823,7 +5823,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "indexes-of": { @@ -5841,8 +5841,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -5860,8 +5860,8 @@ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz", "integrity": "sha1-wVPH6I/YT+9cYC6VqBaLJ3BnH+c=", "requires": { - "bowser": "^1.0.0", - "hyphenate-style-name": "^1.0.1" + "bowser": "1.9.3", + "hyphenate-style-name": "1.0.2" } }, "inquirer": { @@ -5869,20 +5869,20 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" }, "dependencies": { "ansi-regex": { @@ -5895,9 +5895,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "strip-ansi": { @@ -5905,7 +5905,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -5915,7 +5915,7 @@ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "requires": { - "meow": "^3.3.0" + "meow": "3.7.0" } }, "interpret": { @@ -5928,7 +5928,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "invert-kv": { @@ -5952,8 +5952,8 @@ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "dev": true, "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" + "is-relative": "0.2.1", + "is-windows": "0.2.0" }, "dependencies": { "is-windows": { @@ -5974,7 +5974,7 @@ "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" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -5982,7 +5982,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5997,7 +5997,7 @@ "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" + "binary-extensions": "1.11.0" } }, "is-boolean-object": { @@ -6016,7 +6016,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-callable": { @@ -6029,7 +6029,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "^1.0.0" + "ci-info": "1.1.3" } }, "is-data-descriptor": { @@ -6037,7 +6037,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -6045,7 +6045,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -6060,9 +6060,9 @@ "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" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -6087,7 +6087,7 @@ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-extendable": { @@ -6105,7 +6105,7 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-fullwidth-code-point": { @@ -6118,7 +6118,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "is-installed-globally": { @@ -6126,8 +6126,8 @@ "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" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" } }, "is-npm": { @@ -6140,7 +6140,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -6148,7 +6148,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -6169,7 +6169,7 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -6189,7 +6189,7 @@ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "1.0.1" } }, "is-path-inside": { @@ -6197,7 +6197,7 @@ "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" + "path-is-inside": "1.0.2" } }, "is-plain-obj": { @@ -6210,7 +6210,7 @@ "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" + "isobject": "3.0.1" } }, "is-posix-bracket": { @@ -6238,7 +6238,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "^1.0.1" + "has": "1.0.1" } }, "is-relative": { @@ -6247,7 +6247,7 @@ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "dev": true, "requires": { - "is-unc-path": "^0.1.1" + "is-unc-path": "0.1.2" } }, "is-resolvable": { @@ -6287,7 +6287,7 @@ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { - "html-comment-regex": "^1.1.0" + "html-comment-regex": "1.1.1" } }, "is-symbol": { @@ -6306,7 +6306,7 @@ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "dev": true, "requires": { - "unc-path-regex": "^0.1.0" + "unc-path-regex": "0.1.2" } }, "is-utf8": { @@ -6344,8 +6344,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.4" } }, "isstream": { @@ -6358,18 +6358,18 @@ "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "requires": { - "async": "^2.1.4", - "compare-versions": "^3.1.0", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-hook": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-report": "^1.1.4", - "istanbul-lib-source-maps": "^1.2.4", - "istanbul-reports": "^1.3.0", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" + "async": "2.6.0", + "compare-versions": "3.1.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "once": "1.4.0" }, "dependencies": { "debug": { @@ -6385,11 +6385,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" } }, "source-map": { @@ -6409,7 +6409,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "requires": { - "append-transform": "^0.4.0" + "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { @@ -6417,13 +6417,13 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" } }, "istanbul-lib-report": { @@ -6431,10 +6431,10 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "requires": { - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" }, "dependencies": { "has-flag": { @@ -6447,7 +6447,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -6457,11 +6457,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" }, "dependencies": { "debug": { @@ -6484,7 +6484,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "requires": { - "handlebars": "^4.0.3" + "handlebars": "4.0.11" } }, "jest": { @@ -6492,7 +6492,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", "requires": { - "jest-cli": "^20.0.4" + "jest-cli": "20.0.4" }, "dependencies": { "ansi-escapes": { @@ -6505,7 +6505,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6518,9 +6518,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "callsites": { @@ -6533,7 +6533,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6541,7 +6541,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "jest-cli": { @@ -6549,36 +6549,36 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", "requires": { - "ansi-escapes": "^1.4.0", - "callsites": "^2.0.0", - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.1", - "istanbul-lib-coverage": "^1.0.1", - "istanbul-lib-instrument": "^1.4.2", - "istanbul-lib-source-maps": "^1.1.0", - "jest-changed-files": "^20.0.3", - "jest-config": "^20.0.4", - "jest-docblock": "^20.0.3", - "jest-environment-jsdom": "^20.0.3", - "jest-haste-map": "^20.0.4", - "jest-jasmine2": "^20.0.4", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve-dependencies": "^20.0.3", - "jest-runtime": "^20.0.4", - "jest-snapshot": "^20.0.3", - "jest-util": "^20.0.3", - "micromatch": "^2.3.11", - "node-notifier": "^5.0.2", - "pify": "^2.3.0", - "slash": "^1.0.0", - "string-length": "^1.0.1", - "throat": "^3.0.0", - "which": "^1.2.12", - "worker-farm": "^1.3.1", - "yargs": "^7.0.2" + "ansi-escapes": "1.4.0", + "callsites": "2.0.0", + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "istanbul-api": "1.3.1", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-source-maps": "1.2.3", + "jest-changed-files": "20.0.3", + "jest-config": "20.0.4", + "jest-docblock": "20.0.3", + "jest-environment-jsdom": "20.0.3", + "jest-haste-map": "20.0.5", + "jest-jasmine2": "20.0.4", + "jest-message-util": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve-dependencies": "20.0.3", + "jest-runtime": "20.0.4", + "jest-snapshot": "20.0.3", + "jest-util": "20.0.3", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "pify": "2.3.0", + "slash": "1.0.0", + "string-length": "1.0.1", + "throat": "3.2.0", + "which": "1.3.0", + "worker-farm": "1.6.0", + "yargs": "7.1.0" } }, "kind-of": { @@ -6586,7 +6586,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6594,19 +6594,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -6621,16 +6621,16 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", "requires": { - "chalk": "^1.1.3", - "glob": "^7.1.1", - "jest-environment-jsdom": "^20.0.3", - "jest-environment-node": "^20.0.3", - "jest-jasmine2": "^20.0.4", - "jest-matcher-utils": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-validate": "^20.0.3", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "glob": "7.1.2", + "jest-environment-jsdom": "20.0.3", + "jest-environment-node": "20.0.3", + "jest-jasmine2": "20.0.4", + "jest-matcher-utils": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-validate": "20.0.3", + "pretty-format": "20.0.3" } }, "jest-diff": { @@ -6638,10 +6638,10 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", "requires": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "diff": "3.5.0", + "jest-matcher-utils": "20.0.3", + "pretty-format": "20.0.3" } }, "jest-docblock": { @@ -6654,9 +6654,9 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3", - "jsdom": "^9.12.0" + "jest-mock": "20.0.3", + "jest-util": "20.0.3", + "jsdom": "9.12.0" } }, "jest-environment-node": { @@ -6664,8 +6664,8 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3" + "jest-mock": "20.0.3", + "jest-util": "20.0.3" } }, "jest-haste-map": { @@ -6673,12 +6673,12 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^20.0.3", - "micromatch": "^2.3.11", - "sane": "~1.6.0", - "worker-farm": "^1.3.1" + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "20.0.3", + "micromatch": "2.3.11", + "sane": "1.6.0", + "worker-farm": "1.6.0" }, "dependencies": { "arr-diff": { @@ -6686,7 +6686,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6699,9 +6699,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -6709,7 +6709,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6717,7 +6717,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -6725,7 +6725,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6733,19 +6733,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -6755,15 +6755,15 @@ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-matchers": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-snapshot": "^20.0.3", - "once": "^1.4.0", - "p-map": "^1.1.1" + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-matchers": "20.0.3", + "jest-message-util": "20.0.3", + "jest-snapshot": "20.0.3", + "once": "1.4.0", + "p-map": "1.2.0" } }, "jest-matcher-utils": { @@ -6771,8 +6771,8 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", "requires": { - "chalk": "^1.1.3", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "pretty-format": "20.0.3" } }, "jest-matchers": { @@ -6780,10 +6780,10 @@ "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", "requires": { - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3" + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-message-util": "20.0.3", + "jest-regex-util": "20.0.3" } }, "jest-message-util": { @@ -6791,9 +6791,9 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", "requires": { - "chalk": "^1.1.3", - "micromatch": "^2.3.11", - "slash": "^1.0.0" + "chalk": "1.1.3", + "micromatch": "2.3.11", + "slash": "1.0.0" }, "dependencies": { "arr-diff": { @@ -6801,7 +6801,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6814,9 +6814,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -6824,7 +6824,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6832,7 +6832,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -6840,7 +6840,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6848,19 +6848,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -6880,9 +6880,9 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", "requires": { - "browser-resolve": "^1.11.2", - "is-builtin-module": "^1.0.0", - "resolve": "^1.3.2" + "browser-resolve": "1.11.2", + "is-builtin-module": "1.0.0", + "resolve": "1.6.0" } }, "jest-resolve-dependencies": { @@ -6890,7 +6890,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", "requires": { - "jest-regex-util": "^20.0.3" + "jest-regex-util": "20.0.3" } }, "jest-runtime": { @@ -6898,21 +6898,21 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^20.0.3", - "babel-plugin-istanbul": "^4.0.0", - "chalk": "^1.1.3", - "convert-source-map": "^1.4.0", - "graceful-fs": "^4.1.11", - "jest-config": "^20.0.4", - "jest-haste-map": "^20.0.4", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-util": "^20.0.3", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", + "babel-core": "6.26.0", + "babel-jest": "20.0.3", + "babel-plugin-istanbul": "4.1.6", + "chalk": "1.1.3", + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "jest-config": "20.0.4", + "jest-haste-map": "20.0.5", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-util": "20.0.3", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", "strip-bom": "3.0.0", - "yargs": "^7.0.2" + "yargs": "7.1.0" }, "dependencies": { "arr-diff": { @@ -6920,7 +6920,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6933,9 +6933,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -6943,7 +6943,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6951,7 +6951,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -6959,7 +6959,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6967,19 +6967,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } }, "strip-bom": { @@ -6994,12 +6994,12 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", "requires": { - "chalk": "^1.1.3", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-util": "^20.0.3", - "natural-compare": "^1.4.0", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-util": "20.0.3", + "natural-compare": "1.4.0", + "pretty-format": "20.0.3" } }, "jest-util": { @@ -7007,13 +7007,13 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-message-util": "^20.0.3", - "jest-mock": "^20.0.3", - "jest-validate": "^20.0.3", - "leven": "^2.1.0", - "mkdirp": "^0.5.1" + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-message-util": "20.0.3", + "jest-mock": "20.0.3", + "jest-validate": "20.0.3", + "leven": "2.1.0", + "mkdirp": "0.5.1" } }, "jest-validate": { @@ -7021,10 +7021,10 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", "requires": { - "chalk": "^1.1.3", - "jest-matcher-utils": "^20.0.3", - "leven": "^2.1.0", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "jest-matcher-utils": "20.0.3", + "leven": "2.1.0", + "pretty-format": "20.0.3" } }, "jquery": { @@ -7047,8 +7047,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" + "argparse": "1.0.10", + "esprima": "2.7.3" } }, "jsbn": { @@ -7062,25 +7062,25 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "requires": { - "abab": "^1.0.3", - "acorn": "^4.0.4", - "acorn-globals": "^3.1.0", - "array-equal": "^1.0.0", - "content-type-parser": "^1.0.1", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "escodegen": "^1.6.1", - "html-encoding-sniffer": "^1.0.1", - "nwmatcher": ">= 1.3.9 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.79.0", - "sax": "^1.2.1", - "symbol-tree": "^3.2.1", - "tough-cookie": "^2.3.2", - "webidl-conversions": "^4.0.0", - "whatwg-encoding": "^1.0.1", - "whatwg-url": "^4.3.0", - "xml-name-validator": "^2.0.1" + "abab": "1.0.4", + "acorn": "4.0.13", + "acorn-globals": "3.1.0", + "array-equal": "1.0.0", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.9.1", + "html-encoding-sniffer": "1.0.2", + "nwmatcher": "1.4.4", + "parse5": "1.5.1", + "request": "2.85.0", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.4", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "4.8.0", + "xml-name-validator": "2.0.1" }, "dependencies": { "acorn": { @@ -7097,9 +7097,8 @@ }, "json-bigint": { "version": "github:databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", - "from": "json-bigint@github:databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", "requires": { - "bignumber.js": "^4.0.0" + "bignumber.js": "4.1.0" } }, "json-loader": { @@ -7122,7 +7121,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, "json-stable-stringify-without-jsonify": { @@ -7151,7 +7150,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "4.1.11" } }, "jsonify": { @@ -7195,7 +7194,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "graceful-fs": "^4.1.9" + "graceful-fs": "4.1.11" } }, "latest-version": { @@ -7203,7 +7202,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "^4.0.0" + "package-json": "4.0.1" } }, "lazy-cache": { @@ -7216,7 +7215,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "leven": { @@ -7229,8 +7228,8 @@ "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" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "load-json-file": { @@ -7238,11 +7237,11 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "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" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "loader-fs-cache": { @@ -7250,7 +7249,7 @@ "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", "requires": { - "find-cache-dir": "^0.1.1", + "find-cache-dir": "0.1.1", "mkdirp": "0.5.1" }, "dependencies": { @@ -7259,9 +7258,9 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" } }, "find-up": { @@ -7269,8 +7268,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -7278,7 +7277,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "pkg-dir": { @@ -7286,7 +7285,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" } } } @@ -7301,9 +7300,9 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } }, "locate-path": { @@ -7311,8 +7310,8 @@ "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-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -7347,7 +7346,7 @@ "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", "dev": true, "requires": { - "lodash.isarray": "^3.0.0" + "lodash.isarray": "3.0.4" } }, "lodash.camelcase": { @@ -7393,8 +7392,8 @@ "integrity": "sha1-POaK4skWg7KBzFOUEoMDy/deaR8=", "dev": true, "requires": { - "lodash._baseget": "^3.0.0", - "lodash._topath": "^3.0.0" + "lodash._baseget": "3.7.2", + "lodash._topath": "3.8.1" } }, "lodash.isarguments": { @@ -7428,9 +7427,9 @@ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash.memoize": { @@ -7448,8 +7447,8 @@ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" } }, "lodash.templatesettings": { @@ -7457,7 +7456,7 @@ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "3.0.0" } }, "lodash.topath": { @@ -7485,7 +7484,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "loud-rejection": { @@ -7493,8 +7492,8 @@ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" } }, "lower-case": { @@ -7512,8 +7511,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "macaddress": { @@ -7526,7 +7525,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" }, "dependencies": { "pify": { @@ -7541,7 +7540,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.4" } }, "map-cache": { @@ -7559,7 +7558,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "math-expression-evaluator": { @@ -7577,8 +7576,8 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "3.0.4", + "inherits": "2.0.3" } }, "media-typer": { @@ -7591,7 +7590,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "memory-fs": { @@ -7599,8 +7598,8 @@ "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" + "errno": "0.1.7", + "readable-stream": "2.3.6" } }, "meow": { @@ -7608,16 +7607,16 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "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" + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" }, "dependencies": { "minimist": { @@ -7647,19 +7646,19 @@ "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" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "miller-rabin": { @@ -7667,8 +7666,8 @@ "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" + "bn.js": "4.11.8", + "brorand": "1.1.0" } }, "mime": { @@ -7686,7 +7685,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "mimic-fn": { @@ -7709,7 +7708,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -7722,8 +7721,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -7731,7 +7730,7 @@ "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" + "is-plain-object": "2.0.4" } } } @@ -7760,8 +7759,8 @@ "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" + "dns-packet": "1.3.1", + "thunky": "1.0.2" } }, "multicast-dns-service-types": { @@ -7785,18 +7784,18 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "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-odd": "^2.0.0", - "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" + "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-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "natural-compare": { @@ -7810,11 +7809,11 @@ "integrity": "sha512-8IUY/rUrKz2mIynUGh8k+tul1awMKEjeHHC5G3FHvvyAW6oq4mQfNp2c0BMea+sYZJvYcrrM6GmZVIle/GRXGw==", "dev": true, "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", + "moo": "0.4.3", + "nomnom": "1.6.2", + "railroad-diagrams": "1.0.0", "randexp": "0.4.6", - "semver": "^5.4.1" + "semver": "5.5.0" } }, "negotiator": { @@ -7837,7 +7836,7 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "node-fetch": { @@ -7845,8 +7844,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "encoding": "0.1.12", + "is-stream": "1.1.0" } }, "node-forge": { @@ -7864,28 +7863,28 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "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": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", "path-browserify": "0.0.0", - "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", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.2", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", + "url": "0.11.0", + "util": "0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -7901,10 +7900,10 @@ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", "requires": { - "growly": "^1.3.0", - "semver": "^5.4.1", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "growly": "1.3.0", + "semver": "5.5.0", + "shellwords": "0.1.1", + "which": "1.3.0" } }, "nomnom": { @@ -7913,8 +7912,8 @@ "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", "dev": true, "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" + "colors": "0.5.1", + "underscore": "1.4.4" }, "dependencies": { "colors": { @@ -7930,10 +7929,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { @@ -7941,7 +7940,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "normalize-range": { @@ -7954,10 +7953,10 @@ "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" + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" }, "dependencies": { "query-string": { @@ -7965,8 +7964,8 @@ "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" + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" } }, "strict-uri-encode": { @@ -7981,124 +7980,124 @@ "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz", "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==", "requires": { - "JSONStream": "^1.3.4", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "~1.2.0", - "archy": "~1.0.0", - "bin-links": "^1.1.2", - "bluebird": "~3.5.1", - "byte-size": "^4.0.3", - "cacache": "^11.2.0", - "call-limit": "~1.1.0", - "chownr": "~1.0.1", - "ci-info": "^1.4.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.0", - "cmd-shim": "~2.0.2", - "columnify": "~1.5.4", - "config-chain": "~1.1.11", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.4.1", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.0.1", - "glob": "~7.1.2", - "graceful-fs": "~4.1.11", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.7.1", - "iferr": "^1.0.2", - "imurmurhash": "*", - "inflight": "~1.0.6", - "inherits": "~2.0.3", - "ini": "^1.3.5", - "init-package-json": "^1.10.3", - "is-cidr": "^2.0.6", - "json-parse-better-errors": "^1.0.2", - "lazy-property": "~1.0.0", - "libcipm": "^2.0.2", - "libnpmhook": "^4.0.1", - "libnpx": "^10.2.0", - "lock-verify": "^2.0.2", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^4.1.3", - "meant": "~1.0.1", - "mississippi": "^3.0.0", - "mkdirp": "~0.5.1", - "move-concurrently": "^1.0.1", - "node-gyp": "^3.8.0", - "nopt": "~4.0.1", - "normalize-package-data": "~2.4.0", - "npm-audit-report": "^1.3.1", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "~3.0.0", - "npm-lifecycle": "^2.1.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.11", - "npm-pick-manifest": "^2.1.0", - "npm-profile": "^3.0.2", - "npm-registry-client": "^8.6.0", - "npm-registry-fetch": "^1.1.0", - "npm-user-validate": "~1.0.0", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "^1.5.0", - "osenv": "^0.1.5", - "pacote": "^8.1.6", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.1.0", - "qw": "~1.0.1", - "read": "~1.0.7", - "read-cmd-shim": "~1.0.1", - "read-installed": "~4.0.3", - "read-package-json": "^2.0.13", - "read-package-tree": "^5.2.1", - "readable-stream": "^2.3.6", - "readdir-scoped-modules": "*", - "request": "^2.88.0", - "retry": "^0.12.0", - "rimraf": "~2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "sha": "~2.0.1", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.0", - "stringify-package": "^1.0.0", - "tar": "^4.4.6", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", + "JSONStream": "1.3.4", + "abbrev": "1.1.1", + "ansicolors": "0.3.2", + "ansistyles": "0.1.3", + "aproba": "1.2.0", + "archy": "1.0.0", + "bin-links": "1.1.2", + "bluebird": "3.5.1", + "byte-size": "4.0.3", + "cacache": "11.2.0", + "call-limit": "1.1.0", + "chownr": "1.0.1", + "ci-info": "1.4.0", + "cli-columns": "3.1.2", + "cli-table3": "0.5.0", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "config-chain": "1.1.11", + "debuglog": "1.0.1", + "detect-indent": "5.0.0", + "detect-newline": "2.1.0", + "dezalgo": "1.0.3", + "editor": "1.0.0", + "figgy-pudding": "3.4.1", + "find-npm-prefix": "1.0.2", + "fs-vacuum": "1.2.10", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "has-unicode": "2.0.1", + "hosted-git-info": "2.7.1", + "iferr": "1.0.2", + "imurmurhash": "0.1.4", + "inflight": "1.0.6", + "inherits": "2.0.3", + "ini": "1.3.5", + "init-package-json": "1.10.3", + "is-cidr": "2.0.6", + "json-parse-better-errors": "1.0.2", + "lazy-property": "1.0.0", + "libcipm": "2.0.2", + "libnpmhook": "4.0.1", + "libnpx": "10.2.0", + "lock-verify": "2.0.2", + "lockfile": "1.0.4", + "lodash._baseindexof": "3.1.0", + "lodash._baseuniq": "4.6.0", + "lodash._bindcallback": "3.0.1", + "lodash._cacheindexof": "3.0.2", + "lodash._createcache": "3.1.2", + "lodash._getnative": "3.9.1", + "lodash.clonedeep": "4.5.0", + "lodash.restparam": "3.6.1", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "lodash.without": "4.4.0", + "lru-cache": "4.1.3", + "meant": "1.0.1", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "node-gyp": "3.8.0", + "nopt": "4.0.1", + "normalize-package-data": "2.4.0", + "npm-audit-report": "1.3.1", + "npm-cache-filename": "1.0.2", + "npm-install-checks": "3.0.0", + "npm-lifecycle": "2.1.0", + "npm-package-arg": "6.1.0", + "npm-packlist": "1.1.11", + "npm-pick-manifest": "2.1.0", + "npm-profile": "3.0.2", + "npm-registry-client": "8.6.0", + "npm-registry-fetch": "1.1.0", + "npm-user-validate": "1.0.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "opener": "1.5.0", + "osenv": "0.1.5", + "pacote": "8.1.6", + "path-is-inside": "1.0.2", + "promise-inflight": "1.0.1", + "qrcode-terminal": "0.12.0", + "query-string": "6.1.0", + "qw": "1.0.1", + "read": "1.0.7", + "read-cmd-shim": "1.0.1", + "read-installed": "4.0.3", + "read-package-json": "2.0.13", + "read-package-tree": "5.2.1", + "readable-stream": "2.3.6", + "readdir-scoped-modules": "1.0.2", + "request": "2.88.0", + "retry": "0.12.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "sha": "2.0.1", + "slide": "1.1.6", + "sorted-object": "2.0.1", + "sorted-union-stream": "2.1.3", + "ssri": "6.0.0", + "stringify-package": "1.0.0", + "tar": "4.4.6", + "text-table": "0.2.0", + "tiny-relative-date": "1.3.0", "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "~1.1.0", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.2", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.6.0", - "write-file-atomic": "^2.3.0" + "umask": "1.1.0", + "unique-filename": "1.1.0", + "unpipe": "1.0.0", + "update-notifier": "2.5.0", + "uuid": "3.3.2", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "3.0.0", + "which": "1.3.1", + "worker-farm": "1.6.0", + "write-file-atomic": "2.3.0" }, "dependencies": { "JSONStream": { @@ -8106,8 +8105,8 @@ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "jsonparse": "1.3.1", + "through": "2.3.8" } }, "abbrev": { @@ -8120,7 +8119,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" } }, "agentkeepalive": { @@ -8128,7 +8127,7 @@ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.4.1.tgz", "integrity": "sha512-MPIwsZU9PP9kOrZpyu2042kYA8Fdt/AedQYkYXucHgF9QoD9dXVp0ypuGnHXSR0hTstBxdt85Xkh4JolYfK5wg==", "requires": { - "humanize-ms": "^1.2.1" + "humanize-ms": "1.2.1" } }, "ajv": { @@ -8136,10 +8135,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ansi-align": { @@ -8147,7 +8146,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "^2.0.0" + "string-width": "2.1.1" } }, "ansi-regex": { @@ -8160,7 +8159,7 @@ "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" + "color-convert": "1.9.1" } }, "ansicolors": { @@ -8188,8 +8187,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "asap": { @@ -8202,7 +8201,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } }, "assert-plus": { @@ -8236,7 +8235,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "bin-links": { @@ -8244,11 +8243,11 @@ "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-1.1.2.tgz", "integrity": "sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg==", "requires": { - "bluebird": "^3.5.0", - "cmd-shim": "^2.0.2", - "gentle-fs": "^2.0.0", - "graceful-fs": "^4.1.11", - "write-file-atomic": "^2.3.0" + "bluebird": "3.5.1", + "cmd-shim": "2.0.2", + "gentle-fs": "2.0.1", + "graceful-fs": "4.1.11", + "write-file-atomic": "2.3.0" } }, "block-stream": { @@ -8256,7 +8255,7 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } }, "bluebird": { @@ -8269,13 +8268,13 @@ "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" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" } }, "brace-expansion": { @@ -8283,7 +8282,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -8317,20 +8316,20 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "figgy-pudding": "3.4.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "6.0.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" } }, "call-limit": { @@ -8358,9 +8357,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "chownr": { @@ -8378,7 +8377,7 @@ "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.9.tgz", "integrity": "sha512-F7/fBRUU45FnvSPjXdpIrc++WRSBdCiSTlyq4ZNhLKOlHFNWgtzZ0Fd+zrqI/J1j0wmlx/f5ZQDmD2GcbrNcmw==", "requires": { - "ip-regex": "^2.1.0" + "ip-regex": "2.1.0" } }, "cli-boxes": { @@ -8391,8 +8390,8 @@ "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz", "integrity": "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=", "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" + "string-width": "2.1.1", + "strip-ansi": "3.0.1" } }, "cli-table3": { @@ -8400,9 +8399,9 @@ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.0.tgz", "integrity": "sha512-c7YHpUyO1SaKaO7kYtxd5NZ8FjAmSK3LpKkuzdwn+2CwpFxBpdoQLm+OAnnCfoEl7onKhN9PKQi1lsHuAIUqGQ==", "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" + "colors": "1.1.2", + "object-assign": "4.1.1", + "string-width": "2.1.1" } }, "cliui": { @@ -8410,9 +8409,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" }, "dependencies": { "ansi-regex": { @@ -8425,7 +8424,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -8440,8 +8439,8 @@ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" } }, "co": { @@ -8459,7 +8458,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -8478,8 +8477,8 @@ "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" } }, "combined-stream": { @@ -8487,7 +8486,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "concat-map": { @@ -8500,10 +8499,10 @@ "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" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" } }, "config-chain": { @@ -8511,8 +8510,8 @@ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "ini": "1.3.5", + "proto-list": "1.2.4" } }, "configstore": { @@ -8520,12 +8519,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "^4.1.0", - "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" + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" } }, "console-control-strings": { @@ -8538,12 +8537,12 @@ "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" + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" }, "dependencies": { "iferr": { @@ -8563,7 +8562,7 @@ "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" + "capture-stack-trace": "1.0.0" } }, "cross-spawn": { @@ -8571,9 +8570,9 @@ "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" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "crypto-random-string": { @@ -8591,7 +8590,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "debug": { @@ -8634,7 +8633,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "requires": { - "clone": "^1.0.2" + "clone": "1.0.4" } }, "delayed-stream": { @@ -8662,8 +8661,8 @@ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { - "asap": "^2.0.0", - "wrappy": "1" + "asap": "2.0.6", + "wrappy": "1.0.2" } }, "dot-prop": { @@ -8671,7 +8670,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "dotenv": { @@ -8689,10 +8688,10 @@ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" } }, "ecc-jsbn": { @@ -8701,8 +8700,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "editor": { @@ -8715,7 +8714,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.23" } }, "end-of-stream": { @@ -8723,7 +8722,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "err-code": { @@ -8736,7 +8735,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "es6-promise": { @@ -8749,7 +8748,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" } }, "escape-string-regexp": { @@ -8762,13 +8761,13 @@ "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" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "extend": { @@ -8806,7 +8805,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "flush-write-stream": { @@ -8814,8 +8813,8 @@ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "forever-agent": { @@ -8828,9 +8827,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.19" } }, "from2": { @@ -8838,8 +8837,8 @@ "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" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "fs-minipass": { @@ -8847,7 +8846,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.3" } }, "fs-vacuum": { @@ -8855,9 +8854,9 @@ "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.10.tgz", "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" + "graceful-fs": "4.1.11", + "path-is-inside": "1.0.2", + "rimraf": "2.6.2" } }, "fs-write-stream-atomic": { @@ -8865,10 +8864,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" + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" }, "dependencies": { "iferr": { @@ -8888,10 +8887,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" } }, "gauge": { @@ -8899,14 +8898,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "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" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" }, "dependencies": { "string-width": { @@ -8914,9 +8913,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -8931,14 +8930,14 @@ "resolved": "https://registry.npmjs.org/gentle-fs/-/gentle-fs-2.0.1.tgz", "integrity": "sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew==", "requires": { - "aproba": "^1.1.2", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" + "aproba": "1.2.0", + "fs-vacuum": "1.2.10", + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "path-is-inside": "1.0.2", + "read-cmd-shim": "1.0.1", + "slide": "1.1.6" }, "dependencies": { "iferr": { @@ -8963,7 +8962,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -8971,12 +8970,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "global-dirs": { @@ -8984,7 +8983,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "^1.3.4" + "ini": "1.3.5" } }, "got": { @@ -8992,17 +8991,17 @@ "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" + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" } }, "graceful-fs": { @@ -9020,8 +9019,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-flag": { @@ -9049,7 +9048,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "requires": { - "agent-base": "4", + "agent-base": "4.2.0", "debug": "3.1.0" } }, @@ -9058,9 +9057,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "https-proxy-agent": { @@ -9068,8 +9067,8 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.2.0", + "debug": "3.1.0" } }, "humanize-ms": { @@ -9077,7 +9076,7 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "requires": { - "ms": "^2.0.0" + "ms": "2.1.1" } }, "iconv-lite": { @@ -9085,7 +9084,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "iferr": { @@ -9098,7 +9097,7 @@ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "import-lazy": { @@ -9116,8 +9115,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -9135,14 +9134,14 @@ "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" + "glob": "7.1.2", + "npm-package-arg": "6.1.0", + "promzard": "0.3.0", + "read": "1.0.7", + "read-package-json": "2.0.13", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "3.0.0" } }, "invert-kv": { @@ -9165,7 +9164,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-ci": { @@ -9173,7 +9172,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "^1.0.0" + "ci-info": "1.4.0" } }, "is-cidr": { @@ -9181,7 +9180,7 @@ "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-2.0.6.tgz", "integrity": "sha512-A578p1dV22TgPXn6NCaDAPj6vJvYsBgAzUrAd28a4oldeXJjWqEUuSZOLIW3im51mazOKsoyVp8NU/OItlWacw==", "requires": { - "cidr-regex": "^2.0.8" + "cidr-regex": "2.0.9" } }, "is-fullwidth-code-point": { @@ -9189,7 +9188,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-installed-globally": { @@ -9197,8 +9196,8 @@ "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" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" } }, "is-npm": { @@ -9216,7 +9215,7 @@ "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" + "path-is-inside": "1.0.2" } }, "is-redirect": { @@ -9301,7 +9300,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "^4.0.0" + "package-json": "4.0.1" } }, "lazy-property": { @@ -9314,7 +9313,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "libcipm": { @@ -9322,20 +9321,20 @@ "resolved": "https://registry.npmjs.org/libcipm/-/libcipm-2.0.2.tgz", "integrity": "sha512-9uZ6/LAflVEijksTRq/RX0e+pGA4mr8tND9Cmk2JMg7j2fFUBrs8PpFX2DOAJR/XoxPzz+5h8bkWmtIYLunKAg==", "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "lock-verify": "^2.0.2", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^2.0.3", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^8.1.6", - "protoduck": "^5.0.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" + "bin-links": "1.1.2", + "bluebird": "3.5.1", + "find-npm-prefix": "1.0.2", + "graceful-fs": "4.1.11", + "lock-verify": "2.0.2", + "mkdirp": "0.5.1", + "npm-lifecycle": "2.1.0", + "npm-logical-tree": "1.2.1", + "npm-package-arg": "6.1.0", + "pacote": "8.1.6", + "protoduck": "5.0.0", + "read-package-json": "2.0.13", + "rimraf": "2.6.2", + "worker-farm": "1.6.0" } }, "libnpmhook": { @@ -9343,8 +9342,8 @@ "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-4.0.1.tgz", "integrity": "sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg==", "requires": { - "figgy-pudding": "^3.1.0", - "npm-registry-fetch": "^3.0.0" + "figgy-pudding": "3.4.1", + "npm-registry-fetch": "3.1.1" }, "dependencies": { "npm-registry-fetch": { @@ -9352,11 +9351,11 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.1.1.tgz", "integrity": "sha512-xBobENeenvjIG8PgQ1dy77AXTI25IbYhmA3DusMIfw/4EL5BaQ5e1V9trkPrqHvyjR3/T0cnH6o0Wt/IzcI5Ag==", "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^3.1.0", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^4.0.0", - "npm-package-arg": "^6.0.0" + "bluebird": "3.5.1", + "figgy-pudding": "3.4.1", + "lru-cache": "4.1.3", + "make-fetch-happen": "4.0.1", + "npm-package-arg": "6.1.0" } } } @@ -9366,14 +9365,14 @@ "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.0.tgz", "integrity": "sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ==", "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": "^11.0.0" + "dotenv": "5.0.1", + "npm-package-arg": "6.1.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "update-notifier": "2.5.0", + "which": "1.3.1", + "y18n": "4.0.0", + "yargs": "11.0.0" } }, "locate-path": { @@ -9381,8 +9380,8 @@ "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-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lock-verify": { @@ -9390,8 +9389,8 @@ "resolved": "https://registry.npmjs.org/lock-verify/-/lock-verify-2.0.2.tgz", "integrity": "sha512-QNVwK0EGZBS4R3YQ7F1Ox8p41Po9VGl2QG/2GsuvTbkJZYSsPeWHKMbbH6iZMCHWSMww5nrJroZYnGzI4cePuw==", "requires": { - "npm-package-arg": "^5.1.2 || 6", - "semver": "^5.4.1" + "npm-package-arg": "6.1.0", + "semver": "5.5.0" } }, "lockfile": { @@ -9399,7 +9398,7 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "requires": { - "signal-exit": "^3.0.2" + "signal-exit": "3.0.2" } }, "lodash._baseindexof": { @@ -9412,8 +9411,8 @@ "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" + "lodash._createset": "4.0.3", + "lodash._root": "3.0.1" } }, "lodash._bindcallback": { @@ -9431,7 +9430,7 @@ "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "requires": { - "lodash._getnative": "^3.0.0" + "lodash._getnative": "3.9.1" } }, "lodash._createset": { @@ -9484,8 +9483,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "make-dir": { @@ -9493,7 +9492,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "make-fetch-happen": { @@ -9501,17 +9500,17 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "agentkeepalive": "3.4.1", + "cacache": "11.2.0", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "4.0.1", + "ssri": "6.0.0" } }, "meant": { @@ -9524,7 +9523,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "mime-db": { @@ -9537,7 +9536,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "requires": { - "mime-db": "~1.35.0" + "mime-db": "1.35.0" } }, "mimic-fn": { @@ -9550,7 +9549,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -9563,8 +9562,8 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "safe-buffer": "5.1.2", + "yallist": "3.0.2" }, "dependencies": { "yallist": { @@ -9579,7 +9578,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.3" } }, "mississippi": { @@ -9587,16 +9586,16 @@ "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" + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "3.0.0", + "pumpify": "1.5.1", + "stream-each": "1.2.2", + "through2": "2.0.3" } }, "mkdirp": { @@ -9612,12 +9611,12 @@ "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" + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" } }, "ms": { @@ -9635,9 +9634,9 @@ "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.2", + "safe-buffer": "5.1.2" } }, "node-gyp": { @@ -9645,18 +9644,18 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.88.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.1" }, "dependencies": { "nopt": { @@ -9664,7 +9663,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { - "abbrev": "1" + "abbrev": "1.1.1" } }, "semver": { @@ -9677,9 +9676,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" } } } @@ -9689,8 +9688,8 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "normalize-package-data": { @@ -9698,10 +9697,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.4" } }, "npm-audit-report": { @@ -9709,8 +9708,8 @@ "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.1.tgz", "integrity": "sha512-SjTF8ZP4rOu3JiFrTMi4M1CmVo2tni2sP4TzhyCMHwnMGf6XkdGLZKt9cdZ12esKf0mbQqFyU9LtY0SoeahL7g==", "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" + "cli-table3": "0.5.0", + "console-control-strings": "1.1.0" } }, "npm-bundled": { @@ -9728,7 +9727,7 @@ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-3.0.0.tgz", "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" + "semver": "5.5.0" } }, "npm-lifecycle": { @@ -9736,14 +9735,14 @@ "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz", "integrity": "sha512-QbBfLlGBKsktwBZLj6AviHC6Q9Y3R/AY4a2PYSIRhSKSS0/CxRyD/PfxEX6tPeOCXQgMSNdwGeECacstgptc+g==", "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.11", - "node-gyp": "^3.8.0", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", + "byline": "5.0.0", + "graceful-fs": "4.1.11", + "node-gyp": "3.8.0", + "resolve-from": "4.0.0", + "slide": "1.1.6", "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" + "umask": "1.1.0", + "which": "1.3.1" } }, "npm-logical-tree": { @@ -9756,10 +9755,10 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "2.7.1", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" } }, "npm-packlist": { @@ -9767,8 +9766,8 @@ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.5" } }, "npm-pick-manifest": { @@ -9776,8 +9775,8 @@ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", "requires": { - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "npm-package-arg": "6.1.0", + "semver": "5.5.0" } }, "npm-profile": { @@ -9785,8 +9784,8 @@ "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-3.0.2.tgz", "integrity": "sha512-rEJOFR6PbwOvvhGa2YTNOJQKNuc6RovJ6T50xPU7pS9h/zKPNCJ+VHZY2OFXyZvEi+UQYtHRTp8O/YM3tUD20A==", "requires": { - "aproba": "^1.1.2 || 2", - "make-fetch-happen": "^2.5.0 || 3 || 4" + "aproba": "1.2.0", + "make-fetch-happen": "4.0.1" } }, "npm-registry-client": { @@ -9794,18 +9793,18 @@ "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", "requires": { - "concat-stream": "^1.5.2", - "graceful-fs": "^4.1.6", - "normalize-package-data": "~1.0.1 || ^2.0.0", - "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "npmlog": "2 || ^3.1.0 || ^4.0.0", - "once": "^1.3.3", - "request": "^2.74.0", - "retry": "^0.10.0", - "safe-buffer": "^5.1.1", - "semver": "2 >=2.2.1 || 3.x || 4 || 5", - "slide": "^1.1.3", - "ssri": "^5.2.4" + "concat-stream": "1.6.2", + "graceful-fs": "4.1.11", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "request": "2.88.0", + "retry": "0.10.1", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "slide": "1.1.6", + "ssri": "5.3.0" }, "dependencies": { "retry": { @@ -9818,7 +9817,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -9828,12 +9827,12 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-1.1.0.tgz", "integrity": "sha512-XJPIBfMtgaooRtZmuA42xCeLf3tkxdIX0xqRsGWwNrcVvJ9UYFccD7Ho7QWCzvkM3i/QrkUC37Hu0a+vDBmt5g==", "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^2.0.1", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^3.0.0", - "npm-package-arg": "^6.0.0", - "safe-buffer": "^5.1.1" + "bluebird": "3.5.1", + "figgy-pudding": "2.0.1", + "lru-cache": "4.1.3", + "make-fetch-happen": "3.0.0", + "npm-package-arg": "6.1.0", + "safe-buffer": "5.1.2" }, "dependencies": { "cacache": { @@ -9841,19 +9840,19 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" }, "dependencies": { "mississippi": { @@ -9861,16 +9860,16 @@ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "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": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.2", + "through2": "2.0.3" } } } @@ -9885,17 +9884,17 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz", "integrity": "sha512-FmWY7gC0mL6Z4N86vE14+m719JKE4H0A+pyiOH18B025gF/C113pyfb4gHDDYP5cqnRMHOz06JGdmffC/SES+w==", "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^10.0.4", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^3.0.1", - "ssri": "^5.2.4" + "agentkeepalive": "3.4.1", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.3.0" } }, "pump": { @@ -9903,8 +9902,8 @@ "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" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "smart-buffer": { @@ -9917,8 +9916,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "1.1.5", + "smart-buffer": "1.1.15" } }, "socks-proxy-agent": { @@ -9926,8 +9925,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" + "agent-base": "4.2.0", + "socks": "1.1.10" } }, "ssri": { @@ -9935,7 +9934,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -9945,7 +9944,7 @@ "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": "2.0.1" } }, "npm-user-validate": { @@ -9958,10 +9957,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -9984,7 +9983,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "opener": { @@ -10002,9 +10001,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "os-tmpdir": { @@ -10017,8 +10016,8 @@ "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" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "p-finally": { @@ -10031,7 +10030,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -10039,7 +10038,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" } }, "p-try": { @@ -10052,10 +10051,10 @@ "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" + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" } }, "pacote": { @@ -10063,31 +10062,31 @@ "resolved": "https://registry.npmjs.org/pacote/-/pacote-8.1.6.tgz", "integrity": "sha512-wTOOfpaAQNEQNtPEx92x9Y9kRWVu45v583XT8x2oEV2xRB74+xdqMZIeGW4uFvAyZdmSBtye+wKdyyLaT8pcmw==", "requires": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "get-stream": "^3.0.0", - "glob": "^7.1.2", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", - "minimatch": "^3.0.4", - "minipass": "^2.3.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", - "tar": "^4.4.3", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "bluebird": "3.5.1", + "cacache": "11.2.0", + "get-stream": "3.0.0", + "glob": "7.1.2", + "lru-cache": "4.1.3", + "make-fetch-happen": "4.0.1", + "minimatch": "3.0.4", + "minipass": "2.3.3", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npm-packlist": "1.1.11", + "npm-pick-manifest": "2.1.0", + "osenv": "0.1.5", + "promise-inflight": "1.0.1", + "promise-retry": "1.1.1", + "protoduck": "5.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "ssri": "6.0.0", + "tar": "4.4.6", + "unique-filename": "1.1.0", + "which": "1.3.1" } }, "parallel-transform": { @@ -10095,9 +10094,9 @@ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "path-exists": { @@ -10150,8 +10149,8 @@ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "1.1.2", + "retry": "0.10.1" }, "dependencies": { "retry": { @@ -10166,7 +10165,7 @@ "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "requires": { - "read": "1" + "read": "1.0.7" } }, "proto-list": { @@ -10179,7 +10178,7 @@ "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", "requires": { - "genfun": "^4.0.1" + "genfun": "4.0.1" } }, "prr": { @@ -10202,8 +10201,8 @@ "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" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { @@ -10211,9 +10210,9 @@ "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" + "duplexify": "3.6.0", + "inherits": "2.0.3", + "pump": "2.0.1" }, "dependencies": { "pump": { @@ -10221,8 +10220,8 @@ "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" + "end-of-stream": "1.4.1", + "once": "1.4.0" } } } @@ -10247,8 +10246,8 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.1.0.tgz", "integrity": "sha512-pNB/Gr8SA8ff8KpUFM36o/WFAlthgaThka5bV19AD9PNTH20Pwq5Zxodif2YyHwrctp6SkL4GqlOot0qR/wGaw==", "requires": { - "decode-uri-component": "^0.2.0", - "strict-uri-encode": "^2.0.0" + "decode-uri-component": "0.2.0", + "strict-uri-encode": "2.0.0" } }, "qw": { @@ -10261,10 +10260,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -10279,7 +10278,7 @@ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "requires": { - "mute-stream": "~0.0.4" + "mute-stream": "0.0.7" } }, "read-cmd-shim": { @@ -10287,7 +10286,7 @@ "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", "requires": { - "graceful-fs": "^4.1.2" + "graceful-fs": "4.1.11" } }, "read-installed": { @@ -10295,13 +10294,13 @@ "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" + "debuglog": "1.0.1", + "graceful-fs": "4.1.11", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2", + "semver": "5.5.0", + "slide": "1.1.6", + "util-extend": "1.0.3" } }, "read-package-json": { @@ -10309,11 +10308,11 @@ "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "json-parse-better-errors": "1.0.2", + "normalize-package-data": "2.4.0", + "slash": "1.0.0" } }, "read-package-tree": { @@ -10321,11 +10320,11 @@ "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "once": "1.4.0", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2" } }, "readable-stream": { @@ -10333,13 +10332,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "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" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "readdir-scoped-modules": { @@ -10347,10 +10346,10 @@ "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "graceful-fs": "4.1.11", + "once": "1.4.0" } }, "registry-auth-token": { @@ -10358,8 +10357,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "1.2.7", + "safe-buffer": "5.1.2" } }, "registry-url": { @@ -10367,7 +10366,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "^1.0.1" + "rc": "1.2.7" } }, "request": { @@ -10375,26 +10374,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "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.0", + "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.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" } }, "require-directory": { @@ -10422,7 +10421,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "run-queue": { @@ -10430,7 +10429,7 @@ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { - "aproba": "^1.1.1" + "aproba": "1.2.0" } }, "safe-buffer": { @@ -10453,7 +10452,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "^5.0.3" + "semver": "5.5.0" } }, "set-blocking": { @@ -10466,8 +10465,8 @@ "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", "requires": { - "graceful-fs": "^4.1.2", - "readable-stream": "^2.0.2" + "graceful-fs": "4.1.11", + "readable-stream": "2.3.6" } }, "shebang-command": { @@ -10475,7 +10474,7 @@ "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": "1.0.0" } }, "shebang-regex": { @@ -10508,8 +10507,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.0.tgz", "integrity": "sha512-uRKV9uXQ9ytMbGm2+DilS1jB7N3AC0mmusmW5TVWjNuBZjxS8+lX38fasKVY9I4opv/bY/iqTbcpFFaTwpfwRg==", "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" + "ip": "1.1.5", + "smart-buffer": "4.0.1" } }, "socks-proxy-agent": { @@ -10517,8 +10516,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" + "agent-base": "4.2.0", + "socks": "2.2.0" } }, "sorted-object": { @@ -10531,8 +10530,8 @@ "resolved": "https://registry.npmjs.org/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz", "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" + "from2": "1.3.0", + "stream-iterate": "1.2.0" }, "dependencies": { "from2": { @@ -10540,8 +10539,8 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-1.3.0.tgz", "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" + "inherits": "2.0.3", + "readable-stream": "1.1.14" } }, "isarray": { @@ -10554,10 +10553,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -10572,8 +10571,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -10586,8 +10585,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -10600,15 +10599,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "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" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "ssri": { @@ -10621,8 +10620,8 @@ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" } }, "stream-iterate": { @@ -10630,8 +10629,8 @@ "resolved": "https://registry.npmjs.org/stream-iterate/-/stream-iterate-1.2.0.tgz", "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" } }, "stream-shift": { @@ -10649,8 +10648,8 @@ "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" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -10668,7 +10667,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -10678,7 +10677,7 @@ "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" + "safe-buffer": "5.1.2" } }, "stringify-package": { @@ -10691,7 +10690,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-eof": { @@ -10709,7 +10708,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "tar": { @@ -10717,13 +10716,13 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.3", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.2" }, "dependencies": { "yallist": { @@ -10738,7 +10737,7 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { - "execa": "^0.7.0" + "execa": "0.7.0" } }, "text-table": { @@ -10756,8 +10755,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" } }, "timed-out": { @@ -10775,8 +10774,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "1.1.29", + "punycode": "1.4.1" } }, "tunnel-agent": { @@ -10784,7 +10783,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -10813,7 +10812,7 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "2.0.0" } }, "unique-slug": { @@ -10821,7 +10820,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "requires": { - "imurmurhash": "^0.1.4" + "imurmurhash": "0.1.4" } }, "unique-string": { @@ -10829,7 +10828,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "1.0.0" } }, "unpipe": { @@ -10847,16 +10846,16 @@ "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" + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" } }, "url-parse-lax": { @@ -10864,7 +10863,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" } }, "util-deprecate": { @@ -10887,8 +10886,8 @@ "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" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "validate-npm-package-name": { @@ -10896,7 +10895,7 @@ "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" + "builtins": "1.0.3" } }, "verror": { @@ -10904,9 +10903,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "wcwidth": { @@ -10914,7 +10913,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "requires": { - "defaults": "^1.0.3" + "defaults": "1.0.3" } }, "which": { @@ -10922,7 +10921,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -10935,7 +10934,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" }, "dependencies": { "string-width": { @@ -10943,9 +10942,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -10955,7 +10954,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "^2.1.1" + "string-width": "2.1.1" } }, "worker-farm": { @@ -10963,7 +10962,7 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "~0.1.7" + "errno": "0.1.7" } }, "wrap-ansi": { @@ -10971,8 +10970,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "string-width": { @@ -10980,9 +10979,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -10997,9 +10996,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, "xdg-basedir": { @@ -11027,18 +11026,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" }, "dependencies": { "y18n": { @@ -11053,7 +11052,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -11063,7 +11062,7 @@ "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": "2.0.1" } }, "nth-check": { @@ -11071,7 +11070,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { - "boolbase": "~1.0.0" + "boolbase": "1.0.0" } }, "num2fraction": { @@ -11104,9 +11103,9 @@ "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" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -11114,7 +11113,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "kind-of": { @@ -11122,7 +11121,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -11154,7 +11153,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.assign": { @@ -11163,10 +11162,10 @@ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.11" } }, "object.entries": { @@ -11175,10 +11174,10 @@ "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "1.1.2", + "es-abstract": "1.11.0", + "function-bind": "1.1.1", + "has": "1.0.1" } }, "object.omit": { @@ -11186,8 +11185,8 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "object.pick": { @@ -11195,7 +11194,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "object.values": { @@ -11204,10 +11203,10 @@ "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "1.1.2", + "es-abstract": "1.11.0", + "function-bind": "1.1.1", + "has": "1.0.1" } }, "obuf": { @@ -11233,7 +11232,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "onetime": { @@ -11241,7 +11240,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "opn": { @@ -11249,7 +11248,7 @@ "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", "requires": { - "is-wsl": "^1.1.0" + "is-wsl": "1.1.0" } }, "optimist": { @@ -11257,8 +11256,8 @@ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.8", + "wordwrap": "0.0.3" }, "dependencies": { "wordwrap": { @@ -11273,12 +11272,12 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" } }, "original": { @@ -11286,7 +11285,7 @@ "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", "requires": { - "url-parse": "1.0.x" + "url-parse": "1.0.5" }, "dependencies": { "url-parse": { @@ -11294,8 +11293,8 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", "requires": { - "querystringify": "0.0.x", - "requires-port": "1.0.x" + "querystringify": "0.0.4", + "requires-port": "1.0.0" } } } @@ -11315,7 +11314,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "os-tmpdir": { @@ -11333,7 +11332,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -11341,7 +11340,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" } }, "p-map": { @@ -11359,10 +11358,10 @@ "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" + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" } }, "pako": { @@ -11375,7 +11374,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, "parse-asn1": { @@ -11383,11 +11382,11 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" } }, "parse-glob": { @@ -11395,10 +11394,10 @@ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "parse-json": { @@ -11406,7 +11405,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.1" } }, "parse-passwd": { @@ -11484,9 +11483,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pbkdf2": { @@ -11494,11 +11493,11 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "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" + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "performance-now": { @@ -11521,7 +11520,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -11529,7 +11528,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "find-up": "^2.1.0" + "find-up": "2.1.0" } }, "pluralize": { @@ -11542,9 +11541,9 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" }, "dependencies": { "async": { @@ -11564,9 +11563,9 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "chalk": "2.4.1", + "source-map": "0.6.1", + "supports-color": "5.4.0" }, "dependencies": { "chalk": { @@ -11574,9 +11573,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -11586,9 +11585,9 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" }, "dependencies": { "has-flag": { @@ -11601,10 +11600,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11617,7 +11616,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11627,9 +11626,9 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -11642,10 +11641,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11658,7 +11657,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11668,8 +11667,8 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -11682,10 +11681,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11698,7 +11697,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11708,7 +11707,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11721,10 +11720,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11737,7 +11736,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11747,7 +11746,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11760,10 +11759,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11776,7 +11775,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11786,7 +11785,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11799,10 +11798,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11815,7 +11814,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11825,7 +11824,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { - "postcss": "^5.0.16" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11838,10 +11837,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11854,7 +11853,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11864,8 +11863,8 @@ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -11878,10 +11877,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11894,7 +11893,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11904,8 +11903,8 @@ "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "requires": { - "postcss": "^5.0.4", - "uniqid": "^4.0.0" + "postcss": "5.2.18", + "uniqid": "4.1.1" }, "dependencies": { "has-flag": { @@ -11918,10 +11917,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11934,7 +11933,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11944,7 +11943,7 @@ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz", "integrity": "sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==", "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.22" } }, "postcss-load-config": { @@ -11952,10 +11951,10 @@ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" } }, "postcss-load-options": { @@ -11963,8 +11962,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, "postcss-load-plugins": { @@ -11972,8 +11971,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, "postcss-loader": { @@ -11981,10 +11980,10 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", "requires": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^1.2.0", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "postcss": "6.0.22", + "postcss-load-config": "1.2.0", + "schema-utils": "0.3.0" } }, "postcss-merge-idents": { @@ -11992,9 +11991,9 @@ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12007,10 +12006,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12023,7 +12022,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12033,7 +12032,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -12046,10 +12045,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12062,7 +12061,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12072,11 +12071,11 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.2" }, "dependencies": { "browserslist": { @@ -12084,8 +12083,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000839", + "electron-to-chromium": "1.3.45" } }, "has-flag": { @@ -12098,10 +12097,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12114,7 +12113,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12129,9 +12128,9 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12144,10 +12143,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12160,7 +12159,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12170,8 +12169,8 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12184,10 +12183,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12200,7 +12199,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12210,10 +12209,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -12226,10 +12225,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12242,7 +12241,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12252,10 +12251,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" + "alphanum-sort": "1.0.2", + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" }, "dependencies": { "has-flag": { @@ -12268,10 +12267,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12284,7 +12283,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12294,7 +12293,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.22" } }, "postcss-modules-local-by-default": { @@ -12302,8 +12301,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.22" } }, "postcss-modules-scope": { @@ -12311,8 +12310,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.22" } }, "postcss-modules-values": { @@ -12320,8 +12319,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.22" } }, "postcss-normalize-charset": { @@ -12329,7 +12328,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { - "postcss": "^5.0.5" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -12342,10 +12341,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12358,7 +12357,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12368,10 +12367,10 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12384,10 +12383,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12400,7 +12399,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12410,8 +12409,8 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12424,10 +12423,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12440,7 +12439,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12450,8 +12449,8 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12464,10 +12463,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12480,7 +12479,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12490,7 +12489,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -12503,10 +12502,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12519,7 +12518,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12529,9 +12528,9 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12544,10 +12543,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12560,7 +12559,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12570,9 +12569,9 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } }, "postcss-svgo": { @@ -12580,10 +12579,10 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "svgo": "0.7.2" }, "dependencies": { "has-flag": { @@ -12596,10 +12595,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12612,7 +12611,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12622,9 +12621,9 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -12637,10 +12636,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12653,7 +12652,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12668,9 +12667,9 @@ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "has": "1.0.1", + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -12683,10 +12682,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12699,7 +12698,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12729,8 +12728,8 @@ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "renderkid": "2.0.1", + "utila": "0.4.0" } }, "pretty-format": { @@ -12738,8 +12737,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "ansi-regex": "2.1.1", + "ansi-styles": "3.2.1" } }, "private": { @@ -12767,7 +12766,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "~2.0.3" + "asap": "2.0.6" } }, "prop-types": { @@ -12775,9 +12774,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "prop-types-extra": { @@ -12785,8 +12784,8 @@ "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", "requires": { - "react-is": "^16.3.2", - "warning": "^3.0.0" + "react-is": "16.3.2", + "warning": "3.0.0" } }, "property-expr": { @@ -12799,7 +12798,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.6.0" } }, @@ -12818,11 +12817,11 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "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" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" } }, "punycode": { @@ -12860,10 +12859,10 @@ "resolved": "https://registry.npmjs.org/radium/-/radium-0.19.6.tgz", "integrity": "sha512-IABYntqCwYelUUIwA52maSCgJbqtJjHKIoD21wgpw3dGhIUbJ5chDShDGdaFiEzdF03hN9jfQqlmn0bF4YhfrQ==", "requires": { - "array-find": "^1.0.0", - "exenv": "^1.2.1", - "inline-style-prefixer": "^2.0.5", - "prop-types": "^15.5.8" + "array-find": "1.0.0", + "exenv": "1.2.2", + "inline-style-prefixer": "2.0.5", + "prop-types": "15.6.1" } }, "raf": { @@ -12871,7 +12870,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", "requires": { - "performance-now": "^2.1.0" + "performance-now": "2.1.0" } }, "railroad-diagrams": { @@ -12887,7 +12886,7 @@ "dev": true, "requires": { "discontinuous-range": "1.0.0", - "ret": "~0.1.10" + "ret": "0.1.15" } }, "randomatic": { @@ -12895,9 +12894,9 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { "is-number": { @@ -12912,7 +12911,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "^5.1.0" + "safe-buffer": "5.1.2" } }, "randomfill": { @@ -12920,8 +12919,8 @@ "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" + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" } }, "range-parser": { @@ -12953,7 +12952,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "statuses": "1.4.0" } }, "iconv-lite": { @@ -12973,10 +12972,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -12987,14 +12986,25 @@ } }, "react": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.3.2.tgz", - "integrity": "sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg==", + "version": "16.5.2", + "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", + "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.2", + "schedule": "0.5.0" + }, + "dependencies": { + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + } } }, "react-app-rewire-polyfills": { @@ -13002,7 +13012,7 @@ "resolved": "https://registry.npmjs.org/react-app-rewire-polyfills/-/react-app-rewire-polyfills-0.2.0.tgz", "integrity": "sha1-GMmn9ISdXA267ONVzxjBo8JVH9Q=", "requires": { - "babel-polyfill": "^6.20.0" + "babel-polyfill": "6.26.0" } }, "react-app-rewired": { @@ -13011,8 +13021,8 @@ "integrity": "sha512-/cbaFBaSYvCcj2BnolCh2Cx0J8QwFECg5RssXFPckhdzC9iEb5BKJGqt71ZTOF35gv6ebo4CPKJR4nZajzW4Sw==", "dev": true, "requires": { - "cross-spawn": "^5.1.0", - "dotenv": "^4.0.0" + "cross-spawn": "5.1.0", + "dotenv": "4.0.0" } }, "react-bootstrap": { @@ -13020,18 +13030,18 @@ "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.32.1.tgz", "integrity": "sha512-RbfzKUbsukWsToWqGHfCCyMFq9QQI0TznutdyxyJw6dih2NvIne25Mrssg8LZsprqtPpyQi8bN0L0Fx3fUsL8Q==", "requires": { - "babel-runtime": "^6.11.6", - "classnames": "^2.2.5", - "dom-helpers": "^3.2.0", - "invariant": "^2.2.1", - "keycode": "^2.1.2", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "react-overlays": "^0.8.0", - "react-prop-types": "^0.4.0", - "react-transition-group": "^2.0.0", - "uncontrollable": "^4.1.0", - "warning": "^3.0.0" + "babel-runtime": "6.26.0", + "classnames": "2.2.6", + "dom-helpers": "3.3.1", + "invariant": "2.2.4", + "keycode": "2.2.0", + "prop-types": "15.6.1", + "prop-types-extra": "1.1.0", + "react-overlays": "0.8.3", + "react-prop-types": "0.4.0", + "react-transition-group": "2.3.1", + "uncontrollable": "4.1.0", + "warning": "3.0.0" } }, "react-dev-utils": { @@ -13051,7 +13061,7 @@ "inquirer": "3.3.0", "is-root": "1.0.0", "opn": "5.2.0", - "react-error-overlay": "^4.0.0", + "react-error-overlay": "4.0.0", "recursive-readdir": "2.2.1", "shell-quote": "1.6.1", "sockjs-client": "1.1.4", @@ -13064,10 +13074,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.1" } }, "react-error-overlay": { @@ -13095,8 +13105,8 @@ "resolved": "https://registry.npmjs.org/react-mde/-/react-mde-5.8.0.tgz", "integrity": "sha512-/iLBMrnw9T8fdqf3qlK8gybIUlYhjDCVEQ/gxtD0rIncG0cS2oPmumRj6aaULQYkmqsjUGmFVUga6C/7g3cHWQ==", "requires": { - "classnames": "^2.2.5", - "npm": "^6.1.0" + "classnames": "2.2.6", + "npm": "6.4.1" } }, "react-modal": { @@ -13104,10 +13114,10 @@ "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.4.4.tgz", "integrity": "sha512-5VYNvy301Z0xxGBQhPmDdzOcyEkUG8sU7bpRsAPI4OHgEUkbBFrpjzs/ocNI0m824/lOqTxddXzwgmDJXx3s3Q==", "requires": { - "exenv": "^1.2.0", - "prop-types": "^15.5.10", - "react-lifecycles-compat": "^3.0.0", - "warning": "^3.0.0" + "exenv": "1.2.2", + "prop-types": "15.6.1", + "react-lifecycles-compat": "3.0.4", + "warning": "3.0.0" } }, "react-overlays": { @@ -13115,12 +13125,12 @@ "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.8.3.tgz", "integrity": "sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA==", "requires": { - "classnames": "^2.2.5", - "dom-helpers": "^3.2.1", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "react-transition-group": "^2.2.0", - "warning": "^3.0.0" + "classnames": "2.2.6", + "dom-helpers": "3.3.1", + "prop-types": "15.6.1", + "prop-types-extra": "1.1.0", + "react-transition-group": "2.3.1", + "warning": "3.0.0" } }, "react-prop-types": { @@ -13128,7 +13138,7 @@ "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", "requires": { - "warning": "^3.0.0" + "warning": "3.0.0" } }, "react-redux": { @@ -13136,12 +13146,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", "requires": { - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.0.0", - "lodash": "^4.17.5", - "lodash-es": "^4.17.5", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.0" + "hoist-non-react-statics": "2.5.0", + "invariant": "2.2.4", + "lodash": "4.17.10", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "prop-types": "15.6.1" } }, "react-resize-detector": { @@ -13149,7 +13159,7 @@ "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-1.1.0.tgz", "integrity": "sha512-68KVcQlhcWQGXMAie82YueCa4f4yqwEoiQbVyYlSgJEin1zMtNBLLeU/+6FLNf1TTgjwSfpbMTJTw/uU0HNgtQ==", "requires": { - "prop-types": "^15.5.10" + "prop-types": "15.6.1" } }, "react-router": { @@ -13157,13 +13167,13 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.3.0", - "invariant": "^2.2.2", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.5.4", - "warning": "^3.0.0" + "history": "4.7.2", + "hoist-non-react-statics": "2.5.0", + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "path-to-regexp": "1.7.0", + "prop-types": "15.6.1", + "warning": "3.0.0" } }, "react-router-dom": { @@ -13171,12 +13181,12 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", "requires": { - "history": "^4.7.2", - "invariant": "^2.2.2", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.4", - "react-router": "^4.2.0", - "warning": "^3.0.0" + "history": "4.7.2", + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "prop-types": "15.6.1", + "react-router": "4.2.0", + "warning": "3.0.0" } }, "react-router-redux": { @@ -13194,7 +13204,7 @@ "babel-eslint": "7.2.3", "babel-jest": "20.0.3", "babel-loader": "7.1.2", - "babel-preset-react-app": "^3.1.1", + "babel-preset-react-app": "3.1.1", "babel-runtime": "6.26.0", "case-sensitive-paths-webpack-plugin": "2.1.1", "chalk": "1.1.3", @@ -13202,7 +13212,7 @@ "dotenv": "4.0.0", "dotenv-expand": "4.2.0", "eslint": "4.10.0", - "eslint-config-react-app": "^2.1.0", + "eslint-config-react-app": "2.1.0", "eslint-loader": "1.9.0", "eslint-plugin-flowtype": "2.39.1", "eslint-plugin-import": "2.8.0", @@ -13211,7 +13221,7 @@ "extract-text-webpack-plugin": "3.0.2", "file-loader": "1.1.5", "fs-extra": "3.0.1", - "fsevents": "^1.1.3", + "fsevents": "1.2.3", "html-webpack-plugin": "2.29.0", "jest": "20.0.4", "object-assign": "4.1.1", @@ -13219,7 +13229,7 @@ "postcss-loader": "2.0.8", "promise": "8.0.1", "raf": "3.4.0", - "react-dev-utils": "^5.0.1", + "react-dev-utils": "5.0.1", "resolve": "1.6.0", "style-loader": "0.19.0", "sw-precache-webpack-plugin": "0.11.4", @@ -13240,10 +13250,10 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "requires": { - "babel-code-frame": "^6.22.0", - "babel-traverse": "^6.23.1", - "babel-types": "^6.23.0", - "babylon": "^6.17.0" + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" } }, "debug": { @@ -13259,43 +13269,43 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", "requires": { - "ajv": "^5.2.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.0.1", - "doctrine": "^2.0.0", - "eslint-scope": "^3.7.1", - "espree": "^3.5.1", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^9.17.0", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.3", + "espree": "3.5.4", + "esquery": "1.0.1", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.3", + "text-table": "0.2.0" }, "dependencies": { "chalk": { @@ -13303,9 +13313,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -13320,8 +13330,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "promise": { @@ -13329,7 +13339,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", "requires": { - "asap": "~2.0.3" + "asap": "2.0.6" } }, "strip-ansi": { @@ -13337,7 +13347,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "whatwg-fetch": { @@ -13352,10 +13362,10 @@ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.0.tgz", "integrity": "sha1-sp2+vd3bBtIbWwiWIWf7nqwYl9g=", "requires": { - "lodash": "~4.17.4", - "prop-types": "^15.6.0", - "raf": "^3.2.0", - "react-transition-group": "^2.2.1" + "lodash": "4.17.10", + "prop-types": "15.6.1", + "raf": "3.4.0", + "react-transition-group": "2.3.1" } }, "react-sticky": { @@ -13363,8 +13373,8 @@ "resolved": "https://registry.npmjs.org/react-sticky/-/react-sticky-6.0.2.tgz", "integrity": "sha512-eXsij6ifE2k1d6eCwQzil0JRS3VLP6BYfiF7qEbVPL3GLqciedGJfbavpXx5T95x5HvhuAA4FChYEDv83r1NyQ==", "requires": { - "prop-types": "^15.5.8", - "raf": "^3.3.0" + "prop-types": "15.6.1", + "raf": "3.4.0" } }, "react-test-renderer": { @@ -13373,10 +13383,10 @@ "integrity": "sha512-vdTPnRMDbxfv4wL4lzN4EkVGXyYs7LE2uImOsqh1FKiP6L5o1oJl8nore5sFi9vxrP9PK3l4rgb/fZ4PVUaWSA==", "dev": true, "requires": { - "fbjs": "^0.8.16", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0", - "react-is": "^16.4.2" + "fbjs": "0.8.16", + "object-assign": "4.1.1", + "prop-types": "15.6.1", + "react-is": "16.4.2" }, "dependencies": { "react-is": { @@ -13392,9 +13402,9 @@ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.3.1.tgz", "integrity": "sha512-hu4/LAOFSKjWt1+1hgnOv3ldxmt6lvZGTWz4KUkFrqzXrNDIVSu6txIcPszw7PNduR8en9YTN55JLRyd/L1ZiQ==", "requires": { - "dom-helpers": "^3.3.1", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1" + "dom-helpers": "3.3.1", + "loose-envify": "1.3.1", + "prop-types": "15.6.1" } }, "react-treebeard": { @@ -13402,12 +13412,12 @@ "resolved": "https://registry.npmjs.org/react-treebeard/-/react-treebeard-2.1.0.tgz", "integrity": "sha512-unoy8IJL1NR5jgTtK+CqOCZKZylh/Tlid0oYajW9bLZCbFelxzmCsF8Y2hyS6pvHqM4W501oOm5O/jvg3VZCrg==", "requires": { - "babel-runtime": "^6.23.0", - "deep-equal": "^1.0.1", - "prop-types": "^15.5.8", - "radium": "^0.19.0", - "shallowequal": "^0.2.2", - "velocity-react": "^1.3.1" + "babel-runtime": "6.26.0", + "deep-equal": "1.0.1", + "prop-types": "15.6.1", + "radium": "0.19.6", + "shallowequal": "0.2.2", + "velocity-react": "1.4.1" } }, "react-virtualized": { @@ -13415,12 +13425,12 @@ "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.19.0.tgz", "integrity": "sha512-aeOGF964AnR7rcKtl2mQF8Ci2s3OJI2a4lmcCTTj1tNBk0V3xKjlhQETrnHs1xU66yNx2+CMTgS4CV82Pf/oNQ==", "requires": { - "babel-runtime": "^6.26.0", - "classnames": "^2.2.3", - "dom-helpers": "^2.4.0 || ^3.0.0", - "loose-envify": "^1.3.0", - "prop-types": "^15.6.0", - "react-lifecycles-compat": "^1.0.2" + "babel-runtime": "6.26.0", + "classnames": "2.2.6", + "dom-helpers": "3.3.1", + "loose-envify": "1.3.1", + "prop-types": "15.6.1", + "react-lifecycles-compat": "1.1.4" }, "dependencies": { "react-lifecycles-compat": { @@ -13435,9 +13445,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -13445,8 +13455,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { "find-up": { @@ -13454,8 +13464,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -13463,7 +13473,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } } } @@ -13473,13 +13483,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "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" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "readdirp": { @@ -13487,10 +13497,10 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" } }, "recharts": { @@ -13500,11 +13510,11 @@ "requires": { "classnames": "2.2.5", "core-js": "2.5.1", - "d3-interpolate": "^1.1.5", + "d3-interpolate": "1.2.0", "d3-scale": "1.0.6", "d3-shape": "1.2.0", - "lodash": "~4.17.4", - "prop-types": "^15.6.0", + "lodash": "4.17.10", + "prop-types": "15.6.1", "react-resize-detector": "1.1.0", "react-smooth": "1.0.0", "recharts-scale": "0.3.2", @@ -13541,7 +13551,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "1.1.11" } } } @@ -13551,8 +13561,8 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "indent-string": "2.1.0", + "strip-indent": "1.0.1" } }, "reduce-css-calc": { @@ -13560,9 +13570,9 @@ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" }, "dependencies": { "balanced-match": { @@ -13577,7 +13587,7 @@ "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { - "balanced-match": "^0.4.2" + "balanced-match": "0.4.2" }, "dependencies": { "balanced-match": { @@ -13592,10 +13602,10 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "lodash": "4.17.10", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "symbol-observable": "1.2.0" } }, "redux-promise-middleware": { @@ -13623,9 +13633,9 @@ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" } }, "regex-cache": { @@ -13633,7 +13643,7 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regex-not": { @@ -13641,8 +13651,8 @@ "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" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexpu-core": { @@ -13650,9 +13660,9 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "registry-auth-token": { @@ -13660,8 +13670,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "1.2.7", + "safe-buffer": "5.1.2" } }, "registry-url": { @@ -13669,7 +13679,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "^1.0.1" + "rc": "1.2.7" } }, "regjsgen": { @@ -13682,7 +13692,7 @@ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" }, "dependencies": { "jsesc": { @@ -13707,11 +13717,11 @@ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { - "css-select": "^1.1.0", - "dom-converter": "~0.1", - "htmlparser2": "~3.3.0", - "strip-ansi": "^3.0.0", - "utila": "~0.3" + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" }, "dependencies": { "utila": { @@ -13736,7 +13746,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" } }, "request": { @@ -13744,28 +13754,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" } }, "require-directory": { @@ -13788,8 +13798,8 @@ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" } }, "requires-port": { @@ -13802,7 +13812,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.5" } }, "resolve-cwd": { @@ -13810,7 +13820,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "3.0.0" }, "dependencies": { "resolve-from": { @@ -13825,8 +13835,8 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" } }, "resolve-from": { @@ -13849,8 +13859,8 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "onetime": "2.0.1", + "signal-exit": "3.0.2" } }, "ret": { @@ -13863,7 +13873,7 @@ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, "rimraf": { @@ -13871,7 +13881,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "ripemd160": { @@ -13879,8 +13889,8 @@ "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" + "hash-base": "3.0.4", + "inherits": "2.0.3" } }, "rst-selector-parser": { @@ -13889,8 +13899,8 @@ "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", "dev": true, "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" + "lodash.flattendeep": "4.4.0", + "nearley": "2.15.1" } }, "run-async": { @@ -13898,7 +13908,7 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { - "is-promise": "^2.1.0" + "is-promise": "2.1.0" } }, "rx-lite": { @@ -13911,7 +13921,7 @@ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { - "rx-lite": "*" + "rx-lite": "4.0.8" } }, "safe-buffer": { @@ -13924,7 +13934,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -13937,13 +13947,13 @@ "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", "requires": { - "anymatch": "^1.3.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^1.8.0", - "minimatch": "^3.0.2", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.10.0" + "anymatch": "1.3.2", + "exec-sh": "0.2.1", + "fb-watchman": "1.9.2", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.10.0" }, "dependencies": { "bser": { @@ -13951,7 +13961,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", "requires": { - "node-int64": "^0.4.0" + "node-int64": "0.4.0" } }, "fb-watchman": { @@ -13974,16 +13984,16 @@ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.18.5.tgz", "integrity": "sha512-z0MV+AqOnDZVSQQHr/vwimRykKVyPuGZnjWDzIiV1mdgQEG9HMx9qrEapcOQeUmSsPvHZ04BXTuXQkB/vvbU9A==", "requires": { - "chalk": "^2.3.0", - "htmlparser2": "^3.9.0", - "lodash.clonedeep": "^4.5.0", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.mergewith": "^4.6.0", - "postcss": "^6.0.14", - "srcset": "^1.0.0", - "xtend": "^4.0.0" + "chalk": "2.4.1", + "htmlparser2": "3.9.2", + "lodash.clonedeep": "4.5.0", + "lodash.escaperegexp": "4.1.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mergewith": "4.6.1", + "postcss": "6.0.22", + "srcset": "1.0.0", + "xtend": "4.0.1" }, "dependencies": { "chalk": { @@ -13991,9 +14001,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "domhandler": { @@ -14001,7 +14011,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "htmlparser2": { @@ -14009,12 +14019,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" } } } @@ -14024,12 +14034,20 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "schedule": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", + "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", + "requires": { + "object-assign": "4.1.1" + } + }, "schema-utils": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { - "ajv": "^5.0.0" + "ajv": "5.5.2" } }, "select-hose": { @@ -14055,7 +14073,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "^5.0.3" + "semver": "5.5.0" } }, "send": { @@ -14064,18 +14082,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "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", + "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.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" }, "dependencies": { "mime": { @@ -14090,13 +14108,13 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { - "accepts": "~1.3.4", + "accepts": "1.3.5", "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" + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.18", + "parseurl": "1.3.2" } }, "serve-static": { @@ -14104,9 +14122,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", "send": "0.16.2" } }, @@ -14130,10 +14148,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -14141,7 +14159,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -14161,8 +14179,8 @@ "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" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "shallowequal": { @@ -14170,7 +14188,7 @@ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", "requires": { - "lodash.keys": "^3.1.2" + "lodash.keys": "3.1.2" } }, "shebang-command": { @@ -14178,7 +14196,7 @@ "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": "1.0.0" } }, "shebang-regex": { @@ -14191,10 +14209,10 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" } }, "shellwords": { @@ -14207,7 +14225,7 @@ "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.8.6.tgz", "integrity": "sha1-kepO47elRIqspoIKTifmkMatdxw=", "requires": { - "yargs": "^10.0.3" + "yargs": "10.1.2" }, "dependencies": { "ansi-regex": { @@ -14225,9 +14243,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" } }, "os-locale": { @@ -14235,9 +14253,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "strip-ansi": { @@ -14245,7 +14263,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "which-module": { @@ -14258,18 +14276,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" } }, "yargs-parser": { @@ -14277,7 +14295,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -14297,7 +14315,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "requires": { - "is-fullwidth-code-point": "^2.0.0" + "is-fullwidth-code-point": "2.0.0" } }, "snapdragon": { @@ -14305,14 +14323,14 @@ "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" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" }, "dependencies": { "define-property": { @@ -14320,7 +14338,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -14328,7 +14346,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "source-map": { @@ -14343,9 +14361,9 @@ "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" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -14353,7 +14371,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -14361,7 +14379,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -14369,7 +14387,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -14377,9 +14395,9 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -14389,7 +14407,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -14397,7 +14415,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -14407,7 +14425,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } }, "sockjs": { @@ -14415,8 +14433,8 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^2.0.2" + "faye-websocket": "0.10.0", + "uuid": "2.0.3" }, "dependencies": { "faye-websocket": { @@ -14424,7 +14442,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { - "websocket-driver": ">=0.5.1" + "websocket-driver": "0.7.0" } }, "uuid": { @@ -14439,12 +14457,12 @@ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { - "debug": "^2.6.6", + "debug": "2.6.9", "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.4.3" } }, "sort-keys": { @@ -14452,7 +14470,7 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "requires": { - "is-plain-obj": "^1.0.0" + "is-plain-obj": "1.1.0" } }, "source-list-map": { @@ -14470,11 +14488,11 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-support": { @@ -14482,7 +14500,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -14502,8 +14520,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -14516,8 +14534,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -14530,12 +14548,12 @@ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", - "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", - "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.2", + "select-hose": "2.0.0", + "spdy-transport": "2.1.0" } }, "spdy-transport": { @@ -14543,13 +14561,13 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", - "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "wbuf": "1.7.3" } }, "split-string": { @@ -14557,7 +14575,7 @@ "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" + "extend-shallow": "3.0.2" } }, "sprintf-js": { @@ -14570,8 +14588,8 @@ "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", "requires": { - "array-uniq": "^1.0.2", - "number-is-nan": "^1.0.0" + "array-uniq": "1.0.3", + "number-is-nan": "1.0.1" } }, "sshpk": { @@ -14579,14 +14597,14 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "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", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" } }, "static-extend": { @@ -14594,8 +14612,8 @@ "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" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -14603,7 +14621,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -14618,8 +14636,8 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "stream-http": { @@ -14627,11 +14645,11 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", "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" + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" } }, "string-length": { @@ -14639,7 +14657,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", "requires": { - "strip-ansi": "^3.0.0" + "strip-ansi": "3.0.1" } }, "string-width": { @@ -14647,8 +14665,8 @@ "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" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -14661,7 +14679,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -14671,7 +14689,7 @@ "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" + "safe-buffer": "5.1.2" } }, "stringstream": { @@ -14684,7 +14702,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -14692,7 +14710,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, "strip-eof": { @@ -14705,7 +14723,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { - "get-stdin": "^4.0.1" + "get-stdin": "4.0.1" } }, "strip-json-comments": { @@ -14718,8 +14736,8 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" } }, "supports-color": { @@ -14727,7 +14745,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "svgo": { @@ -14735,13 +14753,13 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" } }, "sw-precache": { @@ -14749,16 +14767,16 @@ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", "requires": { - "dom-urls": "^1.1.0", - "es6-promise": "^4.0.5", - "glob": "^7.1.1", - "lodash.defaults": "^4.2.0", - "lodash.template": "^4.4.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "pretty-bytes": "^4.0.2", - "sw-toolbox": "^3.4.0", - "update-notifier": "^2.3.0" + "dom-urls": "1.1.0", + "es6-promise": "4.2.4", + "glob": "7.1.2", + "lodash.defaults": "4.2.0", + "lodash.template": "4.4.0", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "pretty-bytes": "4.0.2", + "sw-toolbox": "3.6.0", + "update-notifier": "2.5.0" } }, "sw-precache-webpack-plugin": { @@ -14766,9 +14784,9 @@ "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz", "integrity": "sha1-ppUBflTu1XVVFJOlGdwdqNotxeA=", "requires": { - "del": "^2.2.2", - "sw-precache": "^5.1.1", - "uglify-js": "^3.0.13" + "del": "2.2.2", + "sw-precache": "5.2.1", + "uglify-js": "3.3.24" } }, "sw-toolbox": { @@ -14776,8 +14794,8 @@ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", "requires": { - "path-to-regexp": "^1.0.1", - "serviceworker-cache-polyfill": "^4.0.0" + "path-to-regexp": "1.7.0", + "serviceworker-cache-polyfill": "4.0.0" } }, "symbol-observable": { @@ -14800,12 +14818,12 @@ "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", + "chalk": "2.4.1", + "lodash": "4.17.10", "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "string-width": "2.1.1" }, "dependencies": { "ajv": { @@ -14813,10 +14831,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "chalk": { @@ -14824,9 +14842,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "fast-deep-equal": { @@ -14851,7 +14869,7 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { - "execa": "^0.7.0" + "execa": "0.7.0" } }, "test-exclude": { @@ -14859,11 +14877,11 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" } }, "text-table": { @@ -14901,7 +14919,7 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "requires": { - "setimmediate": "^1.0.4" + "setimmediate": "1.0.5" } }, "tmp": { @@ -14909,7 +14927,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "~1.0.2" + "os-tmpdir": "1.0.2" } }, "tmpl": { @@ -14932,7 +14950,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -14940,7 +14958,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -14950,10 +14968,10 @@ "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" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -14961,8 +14979,8 @@ "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" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "toposort": { @@ -14975,7 +14993,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" }, "dependencies": { "punycode": { @@ -15015,7 +15033,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -15029,7 +15047,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "1.1.2" } }, "type-is": { @@ -15038,7 +15056,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } }, "typedarray": { @@ -15056,8 +15074,8 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz", "integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==", "requires": { - "commander": "~2.15.0", - "source-map": "~0.6.1" + "commander": "2.15.1", + "source-map": "0.6.1" } }, "uglify-to-browserify": { @@ -15071,9 +15089,9 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" }, "dependencies": { "source-map": { @@ -15086,9 +15104,9 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" } }, "yargs": { @@ -15096,9 +15114,9 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -15115,7 +15133,7 @@ "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", "requires": { - "invariant": "^2.1.0" + "invariant": "2.2.4" } }, "underscore": { @@ -15129,10 +15147,10 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -15140,7 +15158,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -15148,10 +15166,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -15166,7 +15184,7 @@ "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "requires": { - "macaddress": "^0.2.8" + "macaddress": "0.2.8" } }, "uniqs": { @@ -15179,7 +15197,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "1.0.0" } }, "universalify": { @@ -15197,8 +15215,8 @@ "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" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -15206,9 +15224,9 @@ "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" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -15243,16 +15261,16 @@ "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" + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" }, "dependencies": { "chalk": { @@ -15260,9 +15278,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -15277,7 +15295,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "urijs": { @@ -15311,9 +15329,9 @@ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "mime": "1.6.0", + "schema-utils": "0.3.0" } }, "url-parse": { @@ -15321,8 +15339,8 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" + "querystringify": "2.0.0", + "requires-port": "1.0.0" }, "dependencies": { "querystringify": { @@ -15337,7 +15355,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" } }, "use": { @@ -15345,7 +15363,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" } }, "util": { @@ -15388,8 +15406,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "value-equal": { @@ -15412,10 +15430,10 @@ "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.4.1.tgz", "integrity": "sha512-ZyXBm+9C/6kNUNyc+aeNKEhtTu/Mn+OfpsNBGuTxU8S2DUcis/KQL0rTN6jWL+7ygdOrun18qhheNZTA7YERmg==", "requires": { - "lodash": "^4.17.5", - "prop-types": "^15.5.8", - "react-transition-group": "^2.0.0", - "velocity-animate": "^1.4.0" + "lodash": "4.17.10", + "prop-types": "15.6.1", + "react-transition-group": "2.3.1", + "velocity-animate": "1.5.1" } }, "vendors": { @@ -15428,9 +15446,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "vm-browserify": { @@ -15446,7 +15464,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.11" } }, "warning": { @@ -15454,7 +15472,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "watch": { @@ -15467,9 +15485,9 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" } }, "wbuf": { @@ -15477,7 +15495,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "1.0.1" } }, "webidl-conversions": { @@ -15490,28 +15508,28 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^5.1.5", - "ajv-keywords": "^2.0.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" + "acorn": "5.5.3", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" }, "dependencies": { "ajv-keywords": { @@ -15529,9 +15547,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" }, "dependencies": { "string-width": { @@ -15539,9 +15557,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -15556,7 +15574,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "load-json-file": { @@ -15564,10 +15582,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" } }, "os-locale": { @@ -15575,9 +15593,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "path-type": { @@ -15585,7 +15603,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" } }, "read-pkg": { @@ -15593,9 +15611,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" } }, "read-pkg-up": { @@ -15603,8 +15621,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "source-map": { @@ -15622,7 +15640,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "which-module": { @@ -15635,19 +15653,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" } }, "yargs-parser": { @@ -15655,7 +15673,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -15665,11 +15683,11 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" } }, "webpack-dev-server": { @@ -15678,32 +15696,32 @@ "integrity": "sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow==", "requires": { "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^1.6.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.13.3", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", - "import-local": "^0.1.1", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.2", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.3", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "import-local": "0.1.1", "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.1", + "opn": "5.2.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.3", + "serve-index": "1.9.1", "sockjs": "0.3.18", "sockjs-client": "1.1.4", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.1", - "supports-color": "^4.2.1", - "webpack-dev-middleware": "^1.11.0", - "yargs": "^6.6.0" + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "4.5.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" }, "dependencies": { "camelcase": { @@ -15716,15 +15734,15 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.2.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" } }, "cliui": { @@ -15732,9 +15750,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "debug": { @@ -15750,12 +15768,12 @@ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" } }, "globby": { @@ -15763,11 +15781,11 @@ "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" + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" }, "dependencies": { "pify": { @@ -15787,7 +15805,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "pify": { @@ -15800,9 +15818,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "supports-color": { @@ -15810,7 +15828,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "yargs": { @@ -15818,19 +15836,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" } }, "yargs-parser": { @@ -15838,7 +15856,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { - "camelcase": "^3.0.0" + "camelcase": "3.0.0" } } } @@ -15848,8 +15866,8 @@ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", "requires": { - "fs-extra": "^0.30.0", - "lodash": ">=3.5 <5" + "fs-extra": "0.30.0", + "lodash": "4.17.10" }, "dependencies": { "fs-extra": { @@ -15857,11 +15875,11 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" } }, "jsonfile": { @@ -15869,7 +15887,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "4.1.11" } } } @@ -15879,8 +15897,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "source-list-map": "2.0.0", + "source-map": "0.6.1" } }, "websocket-driver": { @@ -15888,8 +15906,8 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" + "http-parser-js": "0.4.12", + "websocket-extensions": "0.1.3" } }, "websocket-extensions": { @@ -15922,8 +15940,8 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "0.0.3", + "webidl-conversions": "3.0.1" }, "dependencies": { "webidl-conversions": { @@ -15943,7 +15961,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -15956,7 +15974,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "^2.1.1" + "string-width": "2.1.1" } }, "window-size": { @@ -15974,7 +15992,7 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "~0.1.7" + "errno": "0.1.7" } }, "wrap-ansi": { @@ -15982,8 +16000,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -15991,7 +16009,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -15999,9 +16017,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -16016,7 +16034,7 @@ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { - "mkdirp": "^0.5.1" + "mkdirp": "0.5.1" } }, "write-file-atomic": { @@ -16024,9 +16042,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, "xdg-basedir": { @@ -16059,19 +16077,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" }, "dependencies": { "camelcase": { @@ -16084,9 +16102,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "is-fullwidth-code-point": { @@ -16094,7 +16112,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -16102,9 +16120,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -16114,7 +16132,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { - "camelcase": "^3.0.0" + "camelcase": "3.0.0" }, "dependencies": { "camelcase": { @@ -16130,11 +16148,11 @@ "integrity": "sha512-Jg8fLV+ax2E5kHtAFAvh/JzMnpgyQykZS1DG8NAqojzsLjfSWKi1fX6VxHkYuQyyqPcH4bvStTBX/aF5CFhv4Q==", "requires": { "@babel/runtime": "7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.10", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.5", - "toposort": "^2.0.2" + "fn-name": "2.0.1", + "lodash": "4.17.10", + "property-expr": "1.5.1", + "synchronous-promise": "2.0.5", + "toposort": "2.0.2" }, "dependencies": { "toposort": { diff --git a/mlflow/server/js/package.json b/mlflow/server/js/package.json index 8a30b217eff11..495e1c0a7741a 100644 --- a/mlflow/server/js/package.json +++ b/mlflow/server/js/package.json @@ -15,7 +15,7 @@ "json-bigint": "databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", "prop-types": "15.6.1", "qs": "6.5.2", - "react": "^16.3.2", + "react": "16.5.2", "react-app-rewire-polyfills": "^0.2.0", "react-bootstrap": "0.32.1", "react-dom": "^16.3.2", diff --git a/mlflow/server/js/src/components/ExperimentListView.js b/mlflow/server/js/src/components/ExperimentListView.js index 7ebde9f63ed6d..8e5767591450e 100644 --- a/mlflow/server/js/src/components/ExperimentListView.js +++ b/mlflow/server/js/src/components/ExperimentListView.js @@ -7,10 +7,11 @@ import { Experiment } from '../sdk/MlflowMessages'; import Routes from '../Routes'; import { Link } from 'react-router-dom'; -class ExperimentListView extends Component { +export class ExperimentListView extends Component { static propTypes = { onClickListExperiments: PropTypes.func.isRequired, - activeExperimentId: PropTypes.number.isRequired, + // If activeExperimentId is undefined, then the active experiment is the first one. + activeExperimentId: PropTypes.number, experiments: PropTypes.arrayOf(Experiment).isRequired, }; @@ -44,8 +45,13 @@ class ExperimentListView extends Component { className="collapser fa fa-chevron-left login-icon"/>
- {this.props.experiments.map((e) => { - const active = parseInt(e.getExperimentId(), 10) === this.props.activeExperimentId; + {this.props.experiments.map((e, idx) => { + let active; + if (this.props.activeExperimentId) { + active = parseInt(e.getExperimentId(), 10) === this.props.activeExperimentId; + } else { + active = idx === 0; + } let className = "experiment-list-item"; if (active) { className = `${className} active-experiment-list-item`; diff --git a/mlflow/server/js/src/components/ExperimentListView.test.js b/mlflow/server/js/src/components/ExperimentListView.test.js new file mode 100644 index 0000000000000..bfd6904dfb8e7 --- /dev/null +++ b/mlflow/server/js/src/components/ExperimentListView.test.js @@ -0,0 +1,21 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import { ExperimentListView } from './ExperimentListView'; +import Fixtures from '../test-utils/Fixtures'; + +test('If activeExperimentId is defined then choose that one', () => { + const wrapper = shallow( {}} + experiments={Fixtures.experiments} + activeExperimentId={1} + />); + expect(wrapper.find('.active-experiment-list-item').first().prop('title')).toEqual('Test'); +}); + +test('If activeExperimentId is undefined then choose first experiment', () => { + const wrapper = shallow( {}} + experiments={Fixtures.experiments} + />); + expect(wrapper.find('.active-experiment-list-item').first().prop('title')).toEqual('Default'); +}); diff --git a/mlflow/server/js/src/components/ExperimentPage.js b/mlflow/server/js/src/components/ExperimentPage.js index 1391caf4fe531..b924d0a5b56cf 100644 --- a/mlflow/server/js/src/components/ExperimentPage.js +++ b/mlflow/server/js/src/components/ExperimentPage.js @@ -90,14 +90,6 @@ class ExperimentPage extends Component { } } -const mapStateToProps = (state, ownProps) => { - const { match } = ownProps; - if (match.url === "/") { - return { experimentId: 0 }; - } - return { experimentId: parseInt(match.params.experimentId, 10) }; -}; - const mapDispatchToProps = (dispatch) => { return { dispatch, @@ -118,4 +110,4 @@ const lifecycleFilterToRunViewType = (lifecycleFilter) => { } }; -export default connect(mapStateToProps, mapDispatchToProps)(ExperimentPage); +export default connect(undefined, mapDispatchToProps)(ExperimentPage); diff --git a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js index 7cdb776b17ce6..849d67cdcae29 100644 --- a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js +++ b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js @@ -1,10 +1,9 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import Table from 'react-bootstrap/es/Table'; import ExperimentViewUtil from "./ExperimentViewUtil"; import { RunInfo } from '../sdk/MlflowMessages'; import classNames from 'classnames'; -import { Dropdown, MenuItem } from 'react-bootstrap'; +import { Table, Dropdown, MenuItem } from 'react-bootstrap'; import ExperimentRunsSortToggle from './ExperimentRunsSortToggle'; import Utils from '../utils/Utils'; diff --git a/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js b/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js index f4ff6ddd7389d..be8d90fb899e5 100644 --- a/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js +++ b/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import Table from 'react-bootstrap/es/Table'; +import { Table } from 'react-bootstrap'; import ExperimentViewUtil from './ExperimentViewUtil'; import classNames from 'classnames'; import Utils from '../utils/Utils'; diff --git a/mlflow/server/js/src/components/ExperimentView.js b/mlflow/server/js/src/components/ExperimentView.js index c1ac5efc64c89..4f1544f367cf0 100644 --- a/mlflow/server/js/src/components/ExperimentView.js +++ b/mlflow/server/js/src/components/ExperimentView.js @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import './ExperimentView.css'; import { getApis, getExperiment, getParams, getRunInfos, getRunTags } from '../reducers/Reducers'; -import 'react-virtualized/styles.css'; import { withRouter } from 'react-router-dom'; import Routes from '../Routes'; import { Button, ButtonGroup, DropdownButton, MenuItem } from 'react-bootstrap'; diff --git a/mlflow/server/js/src/components/HomePage.js b/mlflow/server/js/src/components/HomePage.js index 0c0bc558f047f..d3e1fbab17478 100644 --- a/mlflow/server/js/src/components/HomePage.js +++ b/mlflow/server/js/src/components/HomePage.js @@ -1,26 +1,18 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import ExperimentPage from './ExperimentPage'; import { connect } from 'react-redux'; import { getUUID, listExperimentsApi } from '../Actions'; import RequestStateWrapper from './RequestStateWrapper'; import './HomePage.css'; -import ExperimentListView from './ExperimentListView'; +import HomeView from './HomeView'; class HomePage extends Component { - constructor(props) { - super(props); - this.onClickListExperiments = this.onClickListExperiments.bind(this); - } - static propTypes = { - match: PropTypes.object.isRequired, dispatchListExperimentsApi: PropTypes.func.isRequired, - experimentId: PropTypes.number.isRequired, + experimentId: PropTypes.number, }; state = { - listExperimentsExpanded: true, listExperimentsRequestId: getUUID(), }; @@ -28,51 +20,19 @@ class HomePage extends Component { this.props.dispatchListExperimentsApi(this.state.listExperimentsRequestId); } - onClickListExperiments() { - this.setState({ listExperimentsExpanded: !this.state.listExperimentsExpanded }); - } - render() { - if (this.state.listExperimentsExpanded) { - return ( -
-
- -
- -
-
-
-
- -
-
-
- ); - } else { - return ( -
-
- -
-
- -
-
- ); - } + return ( + + + + ); } } const mapStateToProps = (state, ownProps) => { const { match } = ownProps; if (match.url === "/") { - return { experimentId: 0 }; + return {}; } return { experimentId: parseInt(match.params.experimentId, 10) }; }; @@ -80,7 +40,7 @@ const mapStateToProps = (state, ownProps) => { const mapDispatchToProps = (dispatch) => { return { dispatchListExperimentsApi: (requestId) => { - dispatch(listExperimentsApi(requestId)); + return dispatch(listExperimentsApi(requestId)); } }; }; diff --git a/mlflow/server/js/src/components/HomeView.js b/mlflow/server/js/src/components/HomeView.js new file mode 100644 index 0000000000000..c76d276ab134a --- /dev/null +++ b/mlflow/server/js/src/components/HomeView.js @@ -0,0 +1,83 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { connect } from 'react-redux'; +import ExperimentListView from './ExperimentListView'; +import ExperimentPage from './ExperimentPage'; +import { getExperiments } from '../reducers/Reducers'; +import NoExperimentView from './NoExperimentView'; + +export const getFirstActiveExperiment = (experiments) => { + const sorted = experiments.concat().sort((a, b) => (a.experiment_id - b.experiment_id)); + return sorted.find((e) => e.lifecycle_stage === "active"); +}; + +class HomeView extends Component { + constructor(props) { + super(props); + this.onClickListExperiments = this.onClickListExperiments.bind(this); + } + + static propTypes = { + experimentId: PropTypes.number, + }; + + state = { + listExperimentsExpanded: true, + }; + + onClickListExperiments() { + this.setState({ listExperimentsExpanded: !this.state.listExperimentsExpanded }); + } + + render() { + if (this.state.listExperimentsExpanded) { + return ( +
+
+
+ +
+
+
+ { this.props.experimentId !== undefined ? + : + + } +
+
+
+ ); + } else { + return ( +
+
+ +
+
+ { this.props.experimentId !== undefined ? + : + + } +
+
+ ); + } + } +} + +const mapStateToProps = (state, ownProps) => { + if (ownProps.experimentId === undefined) { + const firstExp = getFirstActiveExperiment(getExperiments(state)); + if (firstExp) { + return { experimentId: parseInt(firstExp.experiment_id, 10) }; + } + } + return {}; +}; + +export default connect(mapStateToProps)(HomeView); diff --git a/mlflow/server/js/src/components/HomeView.test.js b/mlflow/server/js/src/components/HomeView.test.js new file mode 100644 index 0000000000000..1ae236075c44a --- /dev/null +++ b/mlflow/server/js/src/components/HomeView.test.js @@ -0,0 +1,12 @@ +import Fixtures from '../test-utils/Fixtures'; +import { getFirstActiveExperiment } from './HomeView'; + +const experiments = [ + Fixtures.createExperiment({ experiment_id: '1', name: '1', lifecycle_stage: 'deleted'}), + Fixtures.createExperiment({ experiment_id: '3', name: '3', lifecycle_stage: 'active'}), + Fixtures.createExperiment({ experiment_id: '2', name: '2', lifecycle_stage: 'active'}), +]; + +test('getFirstActiveExperiment works', () => { + expect(getFirstActiveExperiment(experiments).experiment_id).toEqual('2'); +}); diff --git a/mlflow/server/js/src/components/NoExperimentView.js b/mlflow/server/js/src/components/NoExperimentView.js new file mode 100644 index 0000000000000..bdd18264729bd --- /dev/null +++ b/mlflow/server/js/src/components/NoExperimentView.js @@ -0,0 +1,28 @@ +import React, { Component } from 'react'; +import Colors from '../styles/Colors'; +import noExperiments from '../static/no-experiments.svg'; + +export default class NoExperimentView extends Component { + render() { + return ( +
+ No experiments found. +

+ No Experiments Exist +

+

+ To create an experiment use the{' '} + + mlflow experiments + {' '} + CLI. +

+
+ ); + } +} diff --git a/mlflow/server/js/src/components/RequestStateWrapper.js b/mlflow/server/js/src/components/RequestStateWrapper.js index d70561cf0e6bd..1524abfc5f0eb 100644 --- a/mlflow/server/js/src/components/RequestStateWrapper.js +++ b/mlflow/server/js/src/components/RequestStateWrapper.js @@ -57,11 +57,11 @@ export class RequestStateWrapper extends Component { console.error("ERROR", requests); throw Error("GOTO error boundary"); } else { - return
{children}
; + return children; } } if (this.props.shouldOptimisticallyRender) { - return
{children}
; + return children; } return (
diff --git a/mlflow/server/js/src/reducers/Reducers.js b/mlflow/server/js/src/reducers/Reducers.js index 0753eeb84e767..a723d8814a2db 100644 --- a/mlflow/server/js/src/reducers/Reducers.js +++ b/mlflow/server/js/src/reducers/Reducers.js @@ -22,7 +22,7 @@ const experimentsById = (state = {}, action) => { switch (action.type) { case fulfilled(LIST_EXPERIMENTS_API): { let newState = Object.assign({}, state); - if (action.payload) { + if (action.payload && action.payload.experiments) { action.payload.experiments.forEach((eJson) => { const experiment = Experiment.fromJs(eJson); newState = Object.assign(newState, {[experiment.getExperimentId()]: experiment}); diff --git a/mlflow/server/js/src/static/no-experiments.svg b/mlflow/server/js/src/static/no-experiments.svg new file mode 100644 index 0000000000000..cfe714d89bcee --- /dev/null +++ b/mlflow/server/js/src/static/no-experiments.svg @@ -0,0 +1,22 @@ + + + + Empty + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mlflow/server/js/src/test-utils/Fixtures.js b/mlflow/server/js/src/test-utils/Fixtures.js new file mode 100644 index 0000000000000..06eecb5ec5a1e --- /dev/null +++ b/mlflow/server/js/src/test-utils/Fixtures.js @@ -0,0 +1,16 @@ +import { Experiment } from '../sdk/MlflowMessages'; + +const createExperiment = ({ + experiment_id = '0', + name = 'Default', + lifecycle_stage = 'active' } = {} +) => ( + Experiment.fromJs({ experiment_id, name, lifecycle_stage }) +); +export default { + createExperiment, + experiments: [ + createExperiment(), + createExperiment({ experiment_id: '1', name: 'Test'}), + ] +}; From 966ce4a072a47783d75fe07d12fe9b086683fab3 Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Thu, 11 Oct 2018 19:12:25 -0700 Subject: [PATCH 005/483] Address some issues with compact runs view (#620) --- .../src/components/ExperimentRunsTableCompactView.js | 12 +++++++----- mlflow/server/js/src/components/ExperimentView.css | 4 ++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js index 849d67cdcae29..65ead862a878f 100644 --- a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js +++ b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js @@ -103,17 +103,19 @@ class ExperimentRunsTableCompactView extends Component {
this.onHover({isParam: true, isMetric: false, key: paramKey})} - onMouseLeave={() => this.onHover({isParam: false, isMetric: false, key: ""})} > - + this.onHover({isParam: true, isMetric: false, key: paramKey})} + onMouseLeave={() => this.onHover({isParam: false, isMetric: false, key: ""})} + > @@ -176,7 +178,7 @@ class ExperimentRunsTableCompactView extends Component { className={"metric-param-sort-toggle"} > diff --git a/mlflow/server/js/src/components/ExperimentView.css b/mlflow/server/js/src/components/ExperimentView.css index c75232f2d30b1..8b3fd6b5bb9c0 100644 --- a/mlflow/server/js/src/components/ExperimentView.css +++ b/mlflow/server/js/src/components/ExperimentView.css @@ -173,6 +173,10 @@ span.error-message { font-weight: bold; } +.ExperimentView .underline-on-hover:hover { + text-decoration: underline; +} + .ExperimentView .metric-param-value { margin-left: 4px; } From 986f01b0a9b0ac55e6050dae46eec44c608c21b6 Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Thu, 11 Oct 2018 19:13:49 -0700 Subject: [PATCH 006/483] [Java] Add documentation on how to use extended createRun (#622) --- .../main/java/org/mlflow/tracking/MlflowClient.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/mlflow/java/client/src/main/java/org/mlflow/tracking/MlflowClient.java b/mlflow/java/client/src/main/java/org/mlflow/tracking/MlflowClient.java index eef1a495fb772..979a333670cf7 100644 --- a/mlflow/java/client/src/main/java/org/mlflow/tracking/MlflowClient.java +++ b/mlflow/java/client/src/main/java/org/mlflow/tracking/MlflowClient.java @@ -85,7 +85,17 @@ public RunInfo createRun(long experimentId, String appName) { } /** - * Creates a new run. + * Creates a new run. This method allows providing all possible fields of CreateRun, and can be + * invoked as follows: + * + *
+   *   import org.mlflow.api.proto.Service.CreateRun;
+   *   CreateRun.Builder request = CreateRun.newBuilder();
+   *   request.setExperimentId(experimentId);
+   *   request.setSourceVersion("my-version");
+   *   createRun(request.build());
+   *   
+ * * @return RunInfo created by the server */ public RunInfo createRun(CreateRun request) { From 38f5a4a1cba83923c475b035cadc51c52126e232 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Thu, 11 Oct 2018 19:33:55 -0700 Subject: [PATCH 007/483] Tensorflow: Bug fixes, API standardization, performance improvements (#612) * tf fix progress * Tf fixes * Lint * Ravel, load fix * Docs fix * Fixes * lint * Docs * lint * Docs * Lint * Add tests * Fix tests, make linter happy * File utils fix * Validation * Address comments * Linter part 1 * Lint part 2 * Add a todo * Doc fix * Lint, don't wrap exceptions * Import fix * docs * Fix typo * Use eprint * Import fix * Another import fix --- mlflow/tensorflow.py | 267 +++++++-- mlflow/utils/file_utils.py | 23 +- .../test_tensorflow_model_export.py | 517 ++++++++++++------ 3 files changed, 575 insertions(+), 232 deletions(-) diff --git a/mlflow/tensorflow.py b/mlflow/tensorflow.py index 1a7ed1f98a2cd..82b0fe967c3fe 100644 --- a/mlflow/tensorflow.py +++ b/mlflow/tensorflow.py @@ -13,76 +13,237 @@ from __future__ import absolute_import import os +import shutil import pandas import tensorflow as tf +import mlflow from mlflow import pyfunc +from mlflow.exceptions import MlflowException from mlflow.models import Model -from mlflow.tracking.fluent import _get_or_start_run, log_artifacts +from mlflow.protos.databricks_pb2 import DIRECTORY_NOT_EMPTY +from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils.file_utils import _copy_file_or_tree +from mlflow.utils.logging_utils import eprint +FLAVOR_NAME = "tensorflow" -class _TFWrapper(object): + +def log_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, artifact_path, + conda_env=None): """ - Wrapper class that creates a predict function such that - predict(data: pandas.DataFrame) -> pandas.DataFrame + Log a *serialized* collection of Tensorflow graphs and variables as an MLflow model + for the current run. This method operates on Tensorflow variables and graphs that have been + serialized in Tensorflow's `SavedModel` format. For more information about the `SavedModel`, + see the following Tensorflow documentation: https://www.tensorflow.org/guide/saved_model# + save_and_restore_models. + + :param tf_saved_model_dir: Path to the directory containing serialized Tensorflow variables and + graphs in `SavedModel` format. + :param tf_meta_graph_tags: A list of tags identifying the model's metagraph within the + serialized `SavedModel` object. For more information, see the `tags` + parameter of the `tf.saved_model.builder.SavedModelBuilder` method: + https://www.tensorflow.org/api_docs/python/tf/saved_model/builder/ + SavedModelBuilder#add_meta_graph + :param tf_signature_def_key: A string identifying the input/output signature associated with the + model. This is a key within the serialized `SavedModel`'s signature + definition mapping. For more information, see the + `signature_def_map` parameter of the + `tf.saved_model.builder.SavedModelBuilder` method. + :param artifact_path: The run-relative path to which to log model artifacts. + :param conda_env: Path to a Conda environment file. If provided, defines an environment for the + model. At minimum, it should specify python, tensorflow, and mlflow with + appropriate versions. """ - def __init__(self, saved_model_dir): - model = Model.load(os.path.join(saved_model_dir, "MLmodel")) - assert "tensorflow" in model.flavors - if "signature_def_key" not in model.flavors["tensorflow"]: - self._signature_def_key = tf.saved_model.signature_constants \ - .DEFAULT_SERVING_SIGNATURE_DEF_KEY - else: - self._signature_def_key = model.flavors["tensorflow"]["signature_def_key"] - self._saved_model_dir = model.flavors["tensorflow"]["saved_model_dir"] + return Model.log(artifact_path=artifact_path, flavor=mlflow.tensorflow, + tf_saved_model_dir=tf_saved_model_dir, tf_meta_graph_tags=tf_meta_graph_tags, + tf_signature_def_key=tf_signature_def_key, conda_env=conda_env) - def predict(self, df): - graph = tf.Graph() - with tf.Session(graph=graph) as sess: - meta_graph_def = tf.saved_model.loader.load(sess, - [tf.saved_model.tag_constants.SERVING], - self._saved_model_dir) - sig_def = tf.contrib.saved_model.get_signature_def_by_key(meta_graph_def, - self._signature_def_key) - - # Determining output tensors. - fetch_mapping = {sigdef_output: graph.get_tensor_by_name(tnsr_info.name) - for sigdef_output, tnsr_info in sig_def.outputs.items()} - # Build the feed dict, mapping input tensors to DataFrame column values. - # We assume that input arguments to the signature def correspond to DataFrame column - # names - feed_dict = {graph.get_tensor_by_name(tnsr_info.name): df[sigdef_input].values - for sigdef_input, tnsr_info in sig_def.inputs.items()} - raw_preds = sess.run(fetch_mapping, feed_dict=feed_dict) - pred_dict = {fetch_name: list(values) for fetch_name, values in raw_preds.items()} - return pandas.DataFrame(data=pred_dict) +def save_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, path, + mlflow_model=Model(), conda_env=None): + """ + Save a *serialized* collection of Tensorflow graphs and variables as an MLflow model + to a local path. This method operates on Tensorflow variables and graphs that have been + serialized in Tensorflow's `SavedModel` format. For more information about the `SavedModel`, + see the following Tensorflow documentation: https://www.tensorflow.org/guide/saved_model# + save_and_restore_models. + + :param tf_saved_model_dir: Path to the directory containing serialized Tensorflow variables and + graphs in `SavedModel` format. + :param tf_meta_graph_tags: A list of tags identifying the model's metagraph within the + serialized `savedmodel` object. for more information, see the `tags` + parameter of the `tf.saved_model.builder.savedmodelbuilder` method: + https://www.tensorflow.org/api_docs/python/tf/saved_model/builder/ + savedmodelbuilder#add_meta_graph + :param tf_signature_def_key: A string identifying the input/output signature associated with the + model. this is a key within the serialized `savedmodel`'s signature + definition mapping. for more information, see the + `signature_def_map` parameter of the + `tf.saved_model.builder.savedmodelbuilder` method. + :param path: Local path where the MLflow model is to be saved. + :param mlflow_model: MLflow model configuration to which this flavor will be added. + :param conda_env: Path to a Conda environment file. If provided, defines an environment for the + model. At minimum, it should specify python, tensorflow, and mlflow with + appropriate versions. + """ + eprint("Validating the specified Tensorflow model by attempting to load it in a new Tensorflow" + " graph...") + _validate_saved_model(tf_saved_model_dir=tf_saved_model_dir, + tf_meta_graph_tags=tf_meta_graph_tags, + tf_signature_def_key=tf_signature_def_key) + eprint("Validation succeeded!") + + if os.path.exists(path): + raise MlflowException("Path '{}' already exists".format(path), DIRECTORY_NOT_EMPTY) + os.makedirs(path) + root_relative_path = _copy_file_or_tree(src=tf_saved_model_dir, dst=path, dst_dir=None) + model_dir_subpath = "tfmodel" + shutil.move(os.path.join(path, root_relative_path), os.path.join(path, model_dir_subpath)) + + mlflow_model.add_flavor(FLAVOR_NAME, saved_model_dir=model_dir_subpath, + meta_graph_tags=tf_meta_graph_tags, + signature_def_key=tf_signature_def_key) + + model_conda_env = None + if conda_env: + model_conda_env = os.path.basename(os.path.abspath(conda_env)) + _copy_file_or_tree(src=conda_env, dst=path) + + pyfunc.add_to_model(mlflow_model, loader_module="mlflow.tensorflow", env=model_conda_env) + mlflow_model.save(os.path.join(path, "MLmodel")) + + +def _validate_saved_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key): + """ + Validate the Tensorflow SavedModel by attempting to load it in a new Tensorflow graph. + If the loading process fails, any exceptions thrown by Tensorflow will be propagated. + """ + validation_tf_graph = tf.Graph() + validation_tf_sess = tf.Session(graph=validation_tf_graph) + with validation_tf_graph.as_default(): + _load_model(tf_saved_model_dir=tf_saved_model_dir, + tf_sess=validation_tf_sess, + tf_meta_graph_tags=tf_meta_graph_tags, + tf_signature_def_key=tf_signature_def_key) -def log_saved_model(saved_model_dir, signature_def_key, artifact_path): +def load_model(path, tf_sess, run_id=None): + """ + Load an MLflow model that contains the Tensorflow flavor from the specified path. + + **This method must be called within a Tensorflow graph context!** + + :param path: The local filesystem path or run-relative artifact path to the model. + :param tf_sess: The Tensorflow session in which to the load the model. + :return: A Tensorflow signature definition of type: + `tensorflow.core.protobuf.meta_graph_pb2.SignatureDef`. This defines the input and + output tensors for model inference. + + >>> import mlflow.tensorflow + >>> import tensorflow as tf + >>> tf_graph = tf.Graph() + >>> tf_sess = tf.Session(graph=tf_graph) + >>> with tf_graph.as_default(): + >>> signature_definition = mlflow.tensorflow.load_model(path="model_path", tf_sess=tf_sess) + >>> input_tensors = [tf_graph.get_tensor_by_name(input_signature.name) + >>> for _, input_signature in signature_def.inputs.items()] + >>> output_tensors = [tf_graph.get_tensor_by_name(output_signature.name) + >>> for _, output_signature in signature_def.outputs.items()] """ - Log a TensorFlow model as an MLflow artifact for the current run. - - :param saved_model_dir: Directory where the TensorFlow model is saved. - :param signature_def_key: The signature definition to use when loading the model again. - See `SignatureDefs in SavedModel for TensorFlow Serving - `_ for details. - :param artifact_path: Path (within the artifact directory for the current run) to which - artifacts of the model are saved. + if run_id is not None: + path = _get_model_log_dir(model_name=path, run_id=run_id) + m = Model.load(os.path.join(path, 'MLmodel')) + if FLAVOR_NAME not in m.flavors: + raise Exception("Model does not have {} flavor".format(FLAVOR_NAME)) + conf = m.flavors[FLAVOR_NAME] + saved_model_dir = os.path.join(path, conf['saved_model_dir']) + return _load_model(tf_saved_model_dir=saved_model_dir, tf_sess=tf_sess, + tf_meta_graph_tags=conf['meta_graph_tags'], + tf_signature_def_key=conf['signature_def_key']) + + +def _load_model(tf_saved_model_dir, tf_sess, tf_meta_graph_tags, tf_signature_def_key): """ - run_id = _get_or_start_run().info.run_uuid - mlflow_model = Model(artifact_path=artifact_path, run_id=run_id) - pyfunc.add_to_model(mlflow_model, loader_module="mlflow.tensorflow") - mlflow_model.add_flavor("tensorflow", - saved_model_dir=saved_model_dir, - signature_def_key=signature_def_key) - mlflow_model.save(os.path.join(saved_model_dir, "MLmodel")) - log_artifacts(saved_model_dir, artifact_path) + Load a specified Tensorflow model consisting of a Tensorflow meta graph and signature definition + from a serialized Tensorflow `SavedModel` collection. + + :param tf_saved_model_dir: The local filesystem path or run-relative artifact path to the model. + :param tf_sess: The Tensorflow session in which to the load the metagraph. + :param tf_meta_graph_tags: A list of tags identifying the model's metagraph within the + serialized `SavedModel` object. For more information, see the `tags` + parameter of the `tf.saved_model.builder.SavedModelBuilder` method: + https://www.tensorflow.org/api_docs/python/tf/saved_model/builder/ + SavedModelBuilder#add_meta_graph + :param tf_signature_def_key: A string identifying the input/output signature associated with the + model. This is a key within the serialized `SavedModel`'s signature + definition mapping. For more information, see the + `signature_def_map` parameter of the + `tf.saved_model.builder.SavedModelBuilder` method. + :return: A Tensorflow signature definition of type: + `tensorflow.core.protobuf.meta_graph_pb2.SignatureDef`. This defines input and + output tensors within the specified metagraph for inference. + """ + meta_graph_def = tf.saved_model.loader.load( + sess=tf_sess, + tags=tf_meta_graph_tags, + export_dir=tf_saved_model_dir) + # TODO: Stop relying on `tf.contrib` when it becomes deprecated. For reference, see the + # Tensorflow roadmap: https://www.tensorflow.org/community/roadmap#roadmap_2. + signature_def = tf.contrib.saved_model.get_signature_def_by_key( + meta_graph_def, tf_signature_def_key) + return signature_def + + +def _load_pyfunc(path): + """ + Load PyFunc implementation. Called by ``pyfunc.load_pyfunc``. This function loads an MLflow + model with the Tensorflow flavor into a new Tensorflow graph and exposes it behind the + `pyfunc.predict` interface. + """ + tf_graph = tf.Graph() + tf_sess = tf.Session(graph=tf_graph) + with tf_graph.as_default(): + signature_def = load_model(path=path, tf_sess=tf_sess, run_id=None) + return _TFWrapper(tf_sess=tf_sess, tf_graph=tf_graph, signature_def=signature_def) -def _load_pyfunc(saved_model_dir): + +class _TFWrapper(object): """ - Load PyFunc implementation. Called by ``pyfunc.load_pyfunc``. + Wrapper class that exposes a Tensorflow model for inference via a `predict` function such that + predict(data: pandas.DataFrame) -> pandas.DataFrame. """ - return _TFWrapper(saved_model_dir) + def __init__(self, tf_sess, tf_graph, signature_def): + """ + :param tf_sess: The Tensorflow session used to evaluate the model. + :param tf_graph: The Tensorflow graph containing the model. + :param signature_def: The Tensorflow signature definition used to transform input dataframes + into tensors and output vectors into dataframes. + """ + self.tf_sess = tf_sess + self.tf_graph = tf_graph + # We assume that input keys in the signature definition correspond to input DataFrame column + # names + self.input_tensor_mapping = { + tensor_column_name: tf_graph.get_tensor_by_name(tensor_info.name) + for tensor_column_name, tensor_info in signature_def.inputs.items() + } + # We assume that output keys in the signature definition correspond to output DataFrame + # column names + self.output_tensors = { + sigdef_output: tf_graph.get_tensor_by_name(tnsr_info.name) + for sigdef_output, tnsr_info in signature_def.outputs.items() + } + + def predict(self, df): + with self.tf_graph.as_default(): + # Build the feed dict, mapping input tensors to DataFrame column values. + feed_dict = { + self.input_tensor_mapping[tensor_column_name]: df[tensor_column_name].values + for tensor_column_name in self.input_tensor_mapping.keys() + } + raw_preds = self.tf_sess.run(self.output_tensors, feed_dict=feed_dict) + pred_dict = {column_name: values.ravel() for column_name, values in raw_preds.items()} + return pandas.DataFrame(data=pred_dict) diff --git a/mlflow/utils/file_utils.py b/mlflow/utils/file_utils.py index a4b55716855b5..c2c9b30bcccb7 100644 --- a/mlflow/utils/file_utils.py +++ b/mlflow/utils/file_utils.py @@ -318,15 +318,24 @@ def ignore(_, names): return mlflow_dir -def _copy_file_or_tree(src, dst, dst_dir): - name = os.path.join(dst_dir, os.path.basename(os.path.abspath(src))) - if dst_dir: - os.mkdir(os.path.join(dst, dst_dir)) +def _copy_file_or_tree(src, dst, dst_dir=None): + """ + :return: The path to the copied artifacts, relative to `dst` + """ + dst_subpath = os.path.basename(os.path.abspath(src)) + if dst_dir is not None: + dst_subpath = os.path.join(dst_dir, dst_subpath) + dst_path = os.path.join(dst, dst_subpath) + + dst_dirpath = os.path.dirname(dst_path) + if not os.path.exists(dst_dirpath): + os.makedirs(dst_dirpath) + if os.path.isfile(src): - shutil.copy(src=src, dst=os.path.join(dst, name)) + shutil.copy(src=src, dst=dst_path) else: - shutil.copytree(src=src, dst=os.path.join(dst, name)) - return name + shutil.copytree(src=src, dst=dst_path) + return dst_subpath def get_parent_dir(path): diff --git a/tests/tensorflow/test_tensorflow_model_export.py b/tests/tensorflow/test_tensorflow_model_export.py index 0e2e38bb13b67..17259d4c06f83 100644 --- a/tests/tensorflow/test_tensorflow_model_export.py +++ b/tests/tensorflow/test_tensorflow_model_export.py @@ -4,182 +4,355 @@ import collections import os -import pandas import shutil -import unittest +import pytest +import numpy as np import pandas as pd +import pandas.testing import sklearn.datasets as datasets import tensorflow as tf import mlflow -from mlflow import tensorflow, pyfunc -from mlflow.utils.file_utils import TempDir - - -class TestModelExport(unittest.TestCase): - - def helper(self, feature_spec, tmp, estimator, df): - """ - This functions handles exporting, logging, loading back, and predicting on an estimator for - testing purposes. - """ - receiver_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(feature_spec) - saved_estimator_path = tmp.path("model") - os.makedirs(saved_estimator_path) - # Saving TensorFlow model. - saved_estimator_path = estimator.export_savedmodel(saved_estimator_path, - receiver_fn).decode("utf-8") - # Logging the TensorFlow model just saved. - tensorflow.log_saved_model(saved_model_dir=saved_estimator_path, - signature_def_key="predict", - artifact_path="hello") - # Loading the saved TensorFlow model as a pyfunc. - x = pyfunc.load_pyfunc(saved_estimator_path) - # Predicting on the dataset using the pyfunc. - return x.predict(df) - - def test_log_saved_model(self): - # This tests model logging capabilities on the sklearn.iris dataset. - iris = datasets.load_iris() - X = iris.data[:, :2] # we only take the first two features. - y = iris.target - trainingFeatures = {} - for i in range(0, 2): - # TensorFlow is fickle about feature names, so we remove offending characters - iris.feature_names[i] = iris.feature_names[i].replace(" ", "") - iris.feature_names[i] = iris.feature_names[i].replace("(", "") - iris.feature_names[i] = iris.feature_names[i].replace(")", "") - trainingFeatures[iris.feature_names[i]] = iris.data[:, i:i+1] - tf_feat_cols = [] - feature_names = iris.feature_names[:2] - # Creating TensorFlow-specific numeric columns for input. - for col in iris.feature_names[:2]: - tf_feat_cols.append(tf.feature_column.numeric_column(col)) - # Creating input training function. - input_train = tf.estimator.inputs.numpy_input_fn(trainingFeatures, - y, - shuffle=False, - batch_size=1) - # Creating Deep Neural Network Regressor. - estimator = tf.estimator.DNNRegressor(feature_columns=tf_feat_cols, - hidden_units=[1]) - # Training and creating expected predictions on training dataset. - estimator.train(input_train, steps=10) - # Saving the estimator's prediction on the training data; assume the DNNRegressor - # produces a single output column named 'predictions' - pred_col = "predictions" - estimator_preds = [s[pred_col] for s in estimator.predict(input_train)] - estimator_preds_df = pd.DataFrame({pred_col: estimator_preds}) - - old_tracking_uri = mlflow.get_tracking_uri() - # should_start_run tests whether or not calling log_model() automatically starts a run. - for should_start_run in [False, True]: - with TempDir(chdr=True, remove_on_exit=True) as tmp: - try: - # Creating dict of features names (str) to placeholders (tensors) - feature_spec = {} - for name in feature_names: - feature_spec[name] = tf.placeholder("float", name=name, shape=[150]) - mlflow.set_tracking_uri("test") - if should_start_run: - mlflow.start_run() - pyfunc_preds_df = self.helper(feature_spec, tmp, estimator, - pandas.DataFrame(data=X, columns=feature_names)) - - # Asserting that the loaded model predictions are as expected. - assert estimator_preds_df.equals(pyfunc_preds_df) - finally: - # Restoring the old logging location. - mlflow.end_run() - mlflow.set_tracking_uri(old_tracking_uri) - - def test_categorical_columns(self): - """ - This tests logging capabilities on datasets with categorical columns. - See https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/get_started/\ - regression/imports85.py - for reference code. - """ - with TempDir(chdr=False, remove_on_exit=True) as tmp: - path = os.path.abspath("tests/data/uci-autos-imports-85.data") - # Order is important for the csv-readers, so we use an OrderedDict here. - defaults = collections.OrderedDict([ - ("body-style", [""]), - ("curb-weight", [0.0]), - ("highway-mpg", [0.0]), - ("price", [0.0]) - ]) - - types = collections.OrderedDict((key, type(value[0])) - for key, value in defaults.items()) - df = pandas.read_csv(path, names=types.keys(), dtype=types, na_values="?") - df = df.dropna() - - # Extract the label from the features dataframe. - y_train = df.pop("price") - - # Creating the input training function required. - trainingFeatures = {} - - for i in df: - trainingFeatures[i] = df[i].values - - input_train = tf.estimator.inputs.numpy_input_fn(trainingFeatures, - y_train.values, - shuffle=False, - batch_size=1) - - # Creating the feature columns required for the DNNRegressor. - body_style_vocab = ["hardtop", "wagon", "sedan", "hatchback", "convertible"] - body_style = tf.feature_column.categorical_column_with_vocabulary_list( - key="body-style", vocabulary_list=body_style_vocab) - feature_columns = [ - tf.feature_column.numeric_column(key="curb-weight"), - tf.feature_column.numeric_column(key="highway-mpg"), - # Since this is a DNN model, convert categorical columns from sparse - # to dense. - # Wrap them in an `indicator_column` to create a - # one-hot vector from the input. - tf.feature_column.indicator_column(body_style) - ] - - # Build a DNNRegressor, with 2x20-unit hidden layers, with the feature columns - # defined above as input. - estimator = tf.estimator.DNNRegressor( - hidden_units=[20, 20], feature_columns=feature_columns) - - # Training the estimator. - estimator.train(input_fn=input_train, steps=10) - # Saving the estimator's prediction on the training data; assume the DNNRegressor - # produces a single output column named 'predictions' - pred_col = "predictions" - estimator_preds = [s[pred_col] for s in estimator.predict(input_train)] - estimator_preds_df = pd.DataFrame({pred_col: estimator_preds}) - # Setting the logging such that it is in the temp folder and deleted after the test. - old_tracking_dir = mlflow.get_tracking_uri() - tracking_dir = os.path.abspath(tmp.path("mlruns")) - mlflow.set_tracking_uri("file://%s" % tracking_dir) - mlflow.start_run() - try: - # Creating dict of features names (str) to placeholders (tensors) - feature_spec = {} - feature_spec["body-style"] = tf.placeholder("string", - name="body-style", - shape=[None]) - feature_spec["curb-weight"] = tf.placeholder("float", - name="curb-weight", - shape=[None]) - feature_spec["highway-mpg"] = tf.placeholder("float", - name="highway-mpg", - shape=[None]) - - pyfunc_preds_df = self.helper(feature_spec, tmp, estimator, df) - # Asserting that the loaded model predictions are as expected. Allow for some - # imprecision as this is expected with TensorFlow. - pandas.testing.assert_frame_equal( - pyfunc_preds_df, estimator_preds_df, check_less_precise=6) - finally: - # Restoring the old logging location. - mlflow.end_run() - mlflow.set_tracking_uri(old_tracking_dir) +import mlflow.tensorflow +from mlflow import pyfunc +from mlflow.models import Model +from mlflow.protos.databricks_pb2 import RESOURCE_DOES_NOT_EXIST, INVALID_PARAMETER_VALUE +from mlflow.utils.environment import _mlflow_conda_env +from mlflow.tracking.utils import _get_model_log_dir +SavedModelInfo = collections.namedtuple( + "SavedModelInfo", + ["path", "meta_graph_tags", "signature_def_key", "inference_df", "expected_results_df"]) + + +@pytest.fixture +def saved_tf_iris_model(tmpdir): + iris = datasets.load_iris() + X = iris.data[:, :2] # we only take the first two features + y = iris.target + trainingFeatures = {} + for i in range(0, 2): + # TensorFlow is fickle about feature names, so we remove offending characters + iris.feature_names[i] = iris.feature_names[i].replace(" ", "") + iris.feature_names[i] = iris.feature_names[i].replace("(", "") + iris.feature_names[i] = iris.feature_names[i].replace(")", "") + trainingFeatures[iris.feature_names[i]] = iris.data[:, i:i+1] + tf_feat_cols = [] + feature_names = iris.feature_names[:2] + # Create Tensorflow-specific numeric columns for input. + for col in iris.feature_names[:2]: + tf_feat_cols.append(tf.feature_column.numeric_column(col)) + # Create a training function for the estimator + input_train = tf.estimator.inputs.numpy_input_fn(trainingFeatures, + y, + shuffle=False, + batch_size=1) + estimator = tf.estimator.DNNRegressor(feature_columns=tf_feat_cols, + hidden_units=[1]) + # Train the estimator and obtain expected predictions on the training dataset + estimator.train(input_train, steps=10) + estimator_preds = np.array([s["predictions"] for s in estimator.predict(input_train)]).ravel() + estimator_preds_df = pd.DataFrame({"predictions": estimator_preds}) + + # Define a function for estimator inference + feature_spec = {} + for name in feature_names: + feature_spec[name] = tf.placeholder("float", name=name, shape=[150]) + receiver_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(feature_spec) + + # Save the estimator and its inference function + saved_estimator_path = str(tmpdir.mkdir("saved_model")) + saved_estimator_path = estimator.export_savedmodel(saved_estimator_path, + receiver_fn).decode("utf-8") + return SavedModelInfo(path=saved_estimator_path, + meta_graph_tags=[tf.saved_model.tag_constants.SERVING], + signature_def_key="predict", + inference_df=pd.DataFrame(data=X, columns=feature_names), + expected_results_df=estimator_preds_df) + + +@pytest.fixture +def saved_tf_categorical_model(tmpdir): + path = os.path.abspath("tests/data/uci-autos-imports-85.data") + # Order is important for the csv-readers, so we use an OrderedDict here + defaults = collections.OrderedDict([ + ("body-style", [""]), + ("curb-weight", [0.0]), + ("highway-mpg", [0.0]), + ("price", [0.0]) + ]) + types = collections.OrderedDict((key, type(value[0])) + for key, value in defaults.items()) + df = pd.read_csv(path, names=types.keys(), dtype=types, na_values="?") + df = df.dropna() + + # Extract the label from the features dataframe + y_train = df.pop("price") + + # Create the required input training function + trainingFeatures = {} + for i in df: + trainingFeatures[i] = df[i].values + input_train = tf.estimator.inputs.numpy_input_fn(trainingFeatures, + y_train.values, + shuffle=False, + batch_size=1) + + # Create the feature columns required for the DNNRegressor + body_style_vocab = ["hardtop", "wagon", "sedan", "hatchback", "convertible"] + body_style = tf.feature_column.categorical_column_with_vocabulary_list( + key="body-style", vocabulary_list=body_style_vocab) + feature_columns = [ + tf.feature_column.numeric_column(key="curb-weight"), + tf.feature_column.numeric_column(key="highway-mpg"), + # Since this is a DNN model, convert categorical columns from sparse to dense. + # Then, wrap them in an `indicator_column` to create a one-hot vector from the input + tf.feature_column.indicator_column(body_style) + ] + + # Build a DNNRegressor, with 2x20-unit hidden layers, with the feature columns + # defined above as input + estimator = tf.estimator.DNNRegressor( + hidden_units=[20, 20], feature_columns=feature_columns) + + # Train the estimator and obtain expected predictions on the training dataset + estimator.train(input_fn=input_train, steps=10) + estimator_preds = np.array([s["predictions"] for s in estimator.predict(input_train)]).ravel() + estimator_preds_df = pd.DataFrame({"predictions": estimator_preds}) + + # Define a function for estimator inference + feature_spec = { + "body-style": tf.placeholder("string", name="body-style", shape=[None]), + "curb-weight": tf.placeholder("float", name="curb-weight", shape=[None]), + "highway-mpg": tf.placeholder("float", name="highway-mpg", shape=[None]) + } + receiver_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(feature_spec) + + # Save the estimator and its inference function + saved_estimator_path = str(tmpdir.mkdir("saved_model")) + saved_estimator_path = estimator.export_savedmodel(saved_estimator_path, + receiver_fn).decode("utf-8") + return SavedModelInfo(path=saved_estimator_path, + meta_graph_tags=[tf.saved_model.tag_constants.SERVING], + signature_def_key="predict", + inference_df=df, + expected_results_df=estimator_preds_df) + + +def test_save_and_load_model_persists_and_restores_model_in_default_graph_context_successfully( + tmpdir, saved_tf_iris_model): + model_path = os.path.join(str(tmpdir), "model") + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path) + + tf_graph = tf.Graph() + tf_sess = tf.Session(graph=tf_graph) + with tf_graph.as_default(): + signature_def = mlflow.tensorflow.load_model( + path=model_path, tf_sess=tf_sess) + + for _, input_signature in signature_def.inputs.items(): + t_input = tf_graph.get_tensor_by_name(input_signature.name) + assert t_input is not None + + for _, output_signature in signature_def.outputs.items(): + t_output = tf_graph.get_tensor_by_name(output_signature.name) + assert t_output is not None + + +def test_save_and_load_model_persists_and_restores_model_in_custom_graph_context_successfully( + tmpdir, saved_tf_iris_model): + model_path = os.path.join(str(tmpdir), "model") + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path) + + tf_graph = tf.Graph() + tf_sess = tf.Session(graph=tf_graph) + custom_tf_context = tf_graph.device("/cpu:0") + with custom_tf_context: + signature_def = mlflow.tensorflow.load_model(path=model_path, tf_sess=tf_sess) + + for _, input_signature in signature_def.inputs.items(): + t_input = tf_graph.get_tensor_by_name(input_signature.name) + assert t_input is not None + + for _, output_signature in signature_def.outputs.items(): + t_output = tf_graph.get_tensor_by_name(output_signature.name) + assert t_output is not None + + +def test_iris_model_can_be_loaded_and_evaluated_successfully(tmpdir, saved_tf_iris_model): + model_path = os.path.join(str(tmpdir), "model") + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path) + + expected_input_keys = ["sepallengthcm", "sepalwidthcm"] + expected_output_keys = ["predictions"] + input_length = 10 + + def load_and_evaluate(tf_sess, tf_graph, tf_context): + with tf_context: + signature_def = mlflow.tensorflow.load_model(path=model_path, tf_sess=tf_sess) + + input_signature = signature_def.inputs.items() + assert len(input_signature) == len(expected_input_keys) + feed_dict = {} + for input_key, input_signature in signature_def.inputs.items(): + assert input_key in expected_input_keys + t_input = tf_graph.get_tensor_by_name(input_signature.name) + feed_dict[t_input] = np.array(range(input_length), dtype=np.float32) + + output_signature = signature_def.outputs.items() + assert len(output_signature) == len(expected_output_keys) + output_tensors = [] + for output_key, output_signature in signature_def.outputs.items(): + assert output_key in expected_output_keys + t_output = tf_graph.get_tensor_by_name(output_signature.name) + output_tensors.append(t_output) + + outputs_list = tf_sess.run(output_tensors, feed_dict=feed_dict) + assert len(outputs_list) == 1 + outputs = outputs_list[0] + assert len(outputs.ravel()) == input_length + + tf_graph_1 = tf.Graph() + tf_sess_1 = tf.Session(graph=tf_graph_1) + load_and_evaluate(tf_sess=tf_sess_1, tf_graph=tf_graph_1, tf_context=tf_graph_1.as_default()) + + tf_graph_2 = tf.Graph() + tf_sess_2 = tf.Session(graph=tf_graph_2) + load_and_evaluate(tf_sess=tf_sess_2, + tf_graph=tf_graph_2, + tf_context=tf_graph_1.device("/cpu:0")) + + +def test_save_model_with_invalid_path_signature_def_or_metagraph_tags_throws_exception( + tmpdir, saved_tf_iris_model): + model_path = os.path.join(str(tmpdir), "model") + + with pytest.raises(IOError) as e: + mlflow.tensorflow.save_model(tf_saved_model_dir="not_a_valid_tf_model_dir", + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path) + + with pytest.raises(RuntimeError) as e: + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=["bad tags"], + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path) + assert e.error_code == INVALID_PARAMETER_VALUE + + with pytest.raises(ValueError) as e: + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key="bad signature", + path=model_path) + assert e.error_code == INVALID_PARAMETER_VALUE + + with pytest.raises(IOError) as e: + mlflow.tensorflow.save_model(tf_saved_model_dir="bad path", + tf_meta_graph_tags="bad tags", + tf_signature_def_key="bad signature", + path=model_path) + assert e.error_code == RESOURCE_DOES_NOT_EXIST + + +def test_load_model_loads_artifacts_from_specified_model_directory(tmpdir, saved_tf_iris_model): + model_path = os.path.join(str(tmpdir), "model") + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path) + + # Verify that the MLflow model can be loaded even after deleting the Tensorflow `SavedModel` + # directory that was used to create it, implying that the artifacts were copied to and are + # loaded from the specified MLflow model path + shutil.rmtree(saved_tf_iris_model.path) + with tf.Session(graph=tf.Graph()) as tf_sess: + signature_def = mlflow.tensorflow.load_model(path=model_path, tf_sess=tf_sess) + + +def test_log_and_load_model_persists_and_restores_model_successfully(saved_tf_iris_model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.tensorflow.log_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + artifact_path=artifact_path) + + run_id = mlflow.active_run().info.run_uuid + + tf_graph = tf.Graph() + tf_sess = tf.Session(graph=tf_graph) + with tf_graph.as_default(): + signature_def = mlflow.tensorflow.load_model( + path=artifact_path, tf_sess=tf_sess, run_id=run_id) + + for _, input_signature in signature_def.inputs.items(): + t_input = tf_graph.get_tensor_by_name(input_signature.name) + assert t_input is not None + + for _, output_signature in signature_def.outputs.items(): + t_output = tf_graph.get_tensor_by_name(output_signature.name) + assert t_output is not None + + +def test_log_model_persists_conda_environment(tmpdir, saved_tf_iris_model): + conda_env_path = os.path.join(str(tmpdir), "conda_env.yaml") + _mlflow_conda_env(path=conda_env_path, additional_conda_deps=["tensorflow"]) + with open(conda_env_path, "r") as f: + conda_env_text = f.read() + + artifact_path = "model" + with mlflow.start_run(): + mlflow.tensorflow.log_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + artifact_path=artifact_path, + conda_env=conda_env_path) + + run_id = mlflow.active_run().info.run_uuid + + model_dir = _get_model_log_dir(artifact_path, run_id) + model_config = Model.load(os.path.join(model_dir, "MLmodel")) + flavor_config = model_config.flavors.get(pyfunc.FLAVOR_NAME, None) + assert flavor_config is not None + pyfunc_env_subpath = flavor_config.get(pyfunc.ENV, None) + assert pyfunc_env_subpath is not None + with open(os.path.join(model_dir, pyfunc_env_subpath), "r") as f: + persisted_env_text = f.read() + + assert persisted_env_text == conda_env_text + + +def test_iris_data_model_can_be_loaded_and_evaluated_as_pyfunc(tmpdir, saved_tf_iris_model): + model_path = os.path.join(str(tmpdir), "model") + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path) + + pyfunc_wrapper = pyfunc.load_pyfunc(model_path) + results_df = pyfunc_wrapper.predict(saved_tf_iris_model.inference_df) + assert results_df.equals(saved_tf_iris_model.expected_results_df) + + +def test_categorical_model_can_be_loaded_and_evaluated_as_pyfunc( + tmpdir, saved_tf_categorical_model): + model_path = os.path.join(str(tmpdir), "model") + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_categorical_model.path, + tf_meta_graph_tags=saved_tf_categorical_model.meta_graph_tags, + tf_signature_def_key=saved_tf_categorical_model.signature_def_key, + path=model_path) + + pyfunc_wrapper = pyfunc.load_pyfunc(model_path) + results_df = pyfunc_wrapper.predict(saved_tf_categorical_model.inference_df) + pandas.testing.assert_frame_equal( + results_df, saved_tf_categorical_model.expected_results_df, check_less_precise=6) From 41e38ef75706c04c0524e28edb42997da41322ee Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Thu, 11 Oct 2018 19:36:27 -0700 Subject: [PATCH 008/483] [UI] Add link from child run to parent (#619) --- mlflow/server/js/src/components/RunView.css | 2 +- mlflow/server/js/src/components/RunView.js | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/mlflow/server/js/src/components/RunView.css b/mlflow/server/js/src/components/RunView.css index b282b43e836ad..e188ab0091b12 100644 --- a/mlflow/server/js/src/components/RunView.css +++ b/mlflow/server/js/src/components/RunView.css @@ -26,7 +26,7 @@ } .run-info { - min-width: 440px; + min-width: 450px; margin-bottom: 12px; margin-right: 12px; } diff --git a/mlflow/server/js/src/components/RunView.js b/mlflow/server/js/src/components/RunView.js index dc1bf83a99f90..7644526240822 100644 --- a/mlflow/server/js/src/components/RunView.js +++ b/mlflow/server/js/src/components/RunView.js @@ -5,6 +5,7 @@ import { connect } from 'react-redux'; import './RunView.css'; import HtmlTableView from './HtmlTableView'; import { Link } from 'react-router-dom'; +import Routes from '../Routes'; import { Dropdown, MenuItem } from 'react-bootstrap'; import ArtifactPage from './ArtifactPage'; import { getLatestMetrics } from '../reducers/MetricReducer'; @@ -247,6 +248,18 @@ class RunView extends Component {
: null } + {tags['mlflow.parentRunId'] !== undefined ? +
+ Parent Run: + + + {tags['mlflow.parentRunId'].value} + + +
+ : null + } {tags['mlflow.databricks.runURL'] !== undefined ?
Job Output: From 105fd075a8da0baa35effe1de5e12e8b0640d52f Mon Sep 17 00:00:00 2001 From: Paul Ogilive Date: Fri, 12 Oct 2018 10:08:51 -0700 Subject: [PATCH 009/483] Fix links in README for java client (#625) Fix links in README for java client --- mlflow/java/client/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mlflow/java/client/README.md b/mlflow/java/client/README.md index c32d473666b31..79cf832246712 100644 --- a/mlflow/java/client/README.md +++ b/mlflow/java/client/README.md @@ -71,8 +71,8 @@ ListArtifacts.Response listArtifacts(String runUuid, String path) ### Java Usage -For a simple example see [QuickStartDriver.java](src/main/java/org/mlflow/client/samples/QuickStartDriver.java). -For full examples of API coverage see the [tests](src/test/java/org/mlflow/client) such as [ApiClientTest.java](src/test/java/org/mlflow/client/ApiClientTest.java). +For a simple example see [QuickStartDriver.java](src/main/java/org/mlflow/tracking/samples/QuickStartDriver.java). +For full examples of API coverage see the [tests](src/test/java/org/mlflow/tracking) such as [MlflowClientTest.java](src/test/java/org/mlflow/tracking/MlflowClientTest.java). ``` package org.mlflow.tracking.samples; From a6f61326b6d93dbf742a97f48e61fc3431cd69ab Mon Sep 17 00:00:00 2001 From: Stephanie Bodoff Date: Mon, 15 Oct 2018 09:36:50 -0700 Subject: [PATCH 010/483] Add tags and R and Java APIs to tracking topic. (#514) * Add tags, other APIs. * Fix typos * Add Java and R APIs to landing page. * Improve hierarchy, navigation, parallelism. * Add tags, other APIs. * Fix typos * Add Java and R APIs to landing page. * Improve hierarchy, navigation, parallelism. * Warn against using mlflow prefix for tags. * Fix build warnings. --- docs/source/index.rst | 3 +- docs/source/tracking.rst | 158 +++++++++++++++++++++------------------ docs/source/tutorial.rst | 8 +- 3 files changed, 92 insertions(+), 77 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 540b51e74ffa8..007fe138c7d15 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -12,7 +12,8 @@ It tackles three primary functions: MLflow is library-agnostic. You can use it with any machine learning library, and in any programming language, since all functions are accessible through a :ref:`rest-api` -and :ref:`CLI`. For convenience, the project also includes a :ref:`python-api`. +and :ref:`CLI`. For convenience, the project also includes a :ref:`python-api`, :ref:`R-api`, +and :ref:`java_api`. Get started using the :ref:`quickstart` or by reading about the :ref:`key concepts`. diff --git a/docs/source/tracking.rst b/docs/source/tracking.rst index 35bf2fdabf664..06db5c8cffead 100644 --- a/docs/source/tracking.rst +++ b/docs/source/tracking.rst @@ -1,5 +1,6 @@ .. _tracking: +=============== MLflow Tracking =============== @@ -9,10 +10,10 @@ MLflow Tracking lets you log and query experiments using both :ref:`Python `_ file) as artifacts. -Runs can be recorded from anywhere you run your code through MLflow's Python and REST APIs: for +You can record runs using MLflow Python, R, Java, and REST APIs from anywhere you run your code. For example, you can record them in a standalone program, on a remote cloud machine, or in an interactive notebook. If you record runs in an :ref:`MLflow Project `, MLflow remembers the project URI and source version. -Finally, runs can optionally be organized into *experiments*, which group together runs for a -specific task. You can create an experiment via the ``mlflow experiments`` CLI, with -:py:func:`mlflow.create_experiment`, or via the corresponding REST parameters. The MLflow API and +You can optionally organize runs into *experiments*, which group together runs for a +specific task. You can create an experiment using the ``mlflow experiments`` CLI, with +:py:func:`mlflow.create_experiment`, or using the corresponding REST parameters. The MLflow API and UI let you create and search for experiments. Once your runs have been recorded, you can query them using the :ref:`tracking_ui` or the MLflow API. -Where Runs Get Recorded ------------------------ +Where Runs Are Recorded +======================= + +MLflow runs are recorded either locally in files or remotely to a tracking server. +By default, the MLflow Python API logs runs locally to files in an ``mlruns`` directory wherever you +ran your program. You can then run ``mlflow ui`` to see the logged runs. -MLflow runs can be recorded either locally in files or remotely to a tracking server. -By default, the MLflow Python API logs runs to files in an ``mlruns`` directory wherever you -ran your program. You can then run ``mlflow ui`` to see the logged runs. Set the -``MLFLOW_TRACKING_URI`` environment variable to a server's URI or call -:py:func:`mlflow.set_tracking_uri` to log runs remotely. +To log runs remotely, set the ``MLFLOW_TRACKING_URI`` environment variable to a tracking server's URI or +call :py:func:`mlflow.set_tracking_uri`. -There are a different kinds of remote tracking URIs: +There are different kinds of remote tracking URIs: - Local file path (specified as ``file:/my/local/dir``), where data is just directly stored locally. -- HTTP server (specified as ``https://my-server:5000``), which is a server hosting :ref:`your own tracking server `. -- Databricks workspace (specified as ``databricks``, or a specific Databricks CLI profile as ``databricks://``. - For more information on configuring a Databricks CLI, see the `GitHub README `_. - This works only in workspaces for which the Databricks MLflow Tracking Server is enabled; contact Databricks if interested. +- HTTP server (specified as ``https://my-server:5000``), which is a server hosting an :ref:`MLFlow tracking server `. +- Databricks workspace (specified as ``databricks`` or as ``databricks://``, a `Databricks CLI profile `_. This works only in workspaces for which the Databricks MLflow Tracking Server is enabled; contact Databricks if interested. Logging Data to Runs --------------------- +==================== -You can log data to runs using either the MLflow Python or REST API. This section +You can log data to runs using the MLflow Python, R, Java, or REST API. This section shows the Python API. .. _basic_logging_functions: Basic Logging Functions -^^^^^^^^^^^^^^^^^^^^^^^ +----------------------- :py:func:`mlflow.set_tracking_uri` connects to a tracking URI. You can also set the ``MLFLOW_TRACKING_URI`` environment variable to have MLflow find a URI from there. In both cases, @@ -123,7 +123,7 @@ logged to. Launching Multiple Runs in One Program -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-------------------------------------- Sometimes you want to execute multiple MLflow runs in the same program: for example, maybe you are performing a hyperparameter search locally or your experiments are just very fast to run. This is @@ -142,7 +142,7 @@ The run remains open throughout the ``with`` statement, and is automatically clo statement exits, even if it exits due to an exception. Organizing Runs in Experiments ------------------------------- +============================== MLflow allows you to group runs under experiments, which can be useful for comparing runs intended to tackle a particular task. You can create experiments using the :ref:`cli` (``mlflow experiments``) or @@ -167,13 +167,14 @@ environment variable. mlflow.log_metric("b", 2) Managing Experiments and Runs with the Tracking Service API -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +----------------------------------------------------------- MLflow provides a more detailed Tracking Service API for managing experiments and runs directly, which is available through client SDK in the :py:mod:`mlflow.tracking` module. -This makes it possible to query data about past runs, log additional information about them, create experiments and more. +This makes it possible to query data about past runs, log additional information about them, create experiments, +add tags to a run, and more. -Example usage: +.. rubric:: Example .. code:: python @@ -186,13 +187,25 @@ Example usage: .. _tracking_ui: +Adding Tags to Runs +~~~~~~~~~~~~~~~~~~~ + +The :py:func:`mlflow.tracking.MlflowClient.set_tag` function lets you add custom tags to runs. For example: + +.. code:: python + + client.set_tag(run.info.run_uuid, "tag_key", "tag_value") + +.. important:: Do not use the prefix ``mlflow`` for a tag. This prefix is reserved for use by MLflow. + + Tracking UI ------------ +=========== The Tracking UI lets you visualize, search and compare runs, as well as download run artifacts or metadata for analysis in other tools. If you have been logging runs to a local ``mlruns`` directory, run ``mlflow ui`` in the directory above it, and it will load the corresponding runs. -Alternatively, the :ref:`MLflow Server ` serves the same UI, and enables remote storage of run artifacts. +Alternatively, the :ref:`MLflow tracking server ` serves the same UI and enables remote storage of run artifacts. The UI contains the following key features: @@ -204,32 +217,26 @@ The UI contains the following key features: .. _tracking_query_api: Querying Runs Programmatically ------------------------------- +============================== -All of the functions in the Tracking UI can be accessed programmatically through the -:py:mod:`mlflow.tracking` module and the :ref:`rest-api`. This makes it easy to do several -common tasks: +All of the functions in the Tracking UI can be accessed programmatically. This makes it easy to do several common tasks: * Query and compare runs using any data analysis tool of your choice, for example, **pandas**. -* Determine the artifact URI for a run to feed some of its artifacts into a new run when executing - a workflow. For an example of querying runs and constructing a multistep workflow, see the MLflow `Multistep Workflow Example project `_. -* Load artifacts from past runs as :ref:`models`. For an example of training, exporting, and loading a model, and predicting using -the model, see the MLFlow `TensorFlow example `_. -* Run automated parameter search algorithms, where you query the metrics from various runs to - submit new ones. For an example of running automated parameter search algorithms, see the MLflow `Hyperparameter Tuning Example project `_. +* Determine the artifact URI for a run to feed some of its artifacts into a new run when executing a workflow. For an example of querying runs and constructing a multistep workflow, see the MLflow `Multistep Workflow Example project `_. +* Load artifacts from past runs as :ref:`models`. For an example of training, exporting, and loading a model, and predicting using the model, see the MLFlow `TensorFlow example `_. +* Run automated parameter search algorithms, where you query the metrics from various runs to submit new ones. For an example of running automated parameter search algorithms, see the MLflow `Hyperparameter Tuning Example project `_. .. _tracking_server: -Running a Tracking Server -------------------------- +MLflow Tracking Servers +======================= -The MLflow tracking server launched using ``mlflow server`` also hosts REST APIs for tracking runs, -writing data to the local filesystem. You can specify a tracking server URI -with the ``MLFLOW_TRACKING_URI`` environment variable and MLflow tracking APIs automatically -communicate with the tracking server at that URI to create/get run information, log metrics, and so on. +.. contents:: In this section: + :local: + :depth: 2 -An example configuration for a server is as follows: +You run an MLflow tracking server using ``mlflow server``. An example configuration for a server is: .. code:: bash @@ -239,21 +246,21 @@ An example configuration for a server is as follows: --host 0.0.0.0 Storage -^^^^^^^ +------- -The tracking server has two properties related to how data is stored: File Store and Artifact Store. +An MLflow tracking server has two properties related to how data is stored: file store and artifact store. -The **File Store** (exposed as ``--file-store``) is where the *server* stores run and experiment metadata. -It defaults to the local ``./mlruns`` directory (same as when running ``mlflow run`` locally), but when +The *file store* (exposed as ``--file-store``) is where the *server* stores run and experiment metadata. +It defaults to the local ``./mlruns`` directory (the same as when running ``mlflow run`` locally), but when running a server, make sure that this points to a persistent (that is, non-ephemeral) file system location. -The **Artifact Store** is a location suitable for large data (such as an S3 bucket or shared NFS file system) -where *clients* log their artifact output (for example, models). The Artifact Store is a property +The *artifact store* is a location suitable for large data (such as an S3 bucket or shared NFS file system) +and is where *clients* log their artifact output (for example, models). The artifact store is a property of an experiment, but the ``--default-artifact-root`` flag sets the artifact root URI for newly-created experiments that do not specify one. -Once you create an experiment, the ``--default-artifact-root`` is no longer relevant to it. +Once you create an experiment, ``--default-artifact-root`` is no longer relevant to it. -To allow the clients and server to access the artifact location, you should configure your cloud +To allow the server and clients to access the artifact location, you should configure your cloud provider credentials as normal. For example, for S3, you can set the ``AWS_ACCESS_KEY_ID`` and ``AWS_SECRET_ACCESS_KEY`` environment variables, use an IAM role, or configure a default profile in ``~/.aws/credentials``. @@ -262,17 +269,18 @@ See `Set up AWS Credentials and Region for Development ``), then the artifact root - will be a path inside the File Store. Typically this is not an appropriate location, as the client and + (for example, ``mlflow experiments create --artifact-root s3://``), the artifact root + is a path inside the file store. Typically this is not an appropriate location, as the client and server will probably be referring to different physical locations (that is, the same path on different disks). Supported Artifact Stores -^^^^^^^^^^^^^^^^^^^^^^^^^ -In addition to local file paths, MLflow supports the following storage systems as artifact stores: -Amazon S3, Azure Blob Storage, Google Cloud Storage, SFTP server, and NFS. +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In addition to local file paths, MLflow supports the following storage systems as artifact stores: Amazon S3, Azure Blob Storage, Google Cloud Storage, SFTP server, and NFS. Amazon S3 -~~~~~~~~~ +^^^^^^^^^ + To store artifacts in S3, specify a URI of the form ``s3:///``. MLflow obtains credentials to access S3 from your machine's IAM role, a profile in ``~/.aws/credentials``, or the environment variables ``AWS_ACCESS_KEY_ID`` and ``AWS_SECRET_ACCESS_KEY`` depending on which of @@ -287,7 +295,8 @@ For example, if you have a Minio server at 1.2.3.4 on port 9000: export MLFLOW_S3_ENDPOINT_URL=http://1.2.3.4:9000 Azure Blob Storage -~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^ + To store artifacts in Azure Blob Storage, specify a URI of the form ``wasbs://@.blob.core.windows.net/``. MLflow expects Azure Storage access credentials in the @@ -298,7 +307,8 @@ separately (on both your client and the server) to access Azure Blob Storage; ML a dependency on this package by default. Google Cloud Storage -~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^ + To store artifacts in Google Cloud Storage, specify a URI of the form ``gs:///``. You should configure credentials for accessing the GCS container on the client and server as described in the `GCS documentation `_. @@ -306,7 +316,8 @@ Finally, you will need to ``pip install google-cloud-storage`` (on both your cli to access Google Cloud Storage; MLflow does not declare a dependency on this package by default. SFTP Server -~~~~~~~~~~~ +^^^^^^^^^^^ + To store artifacts in an SFTP server, specify a URI of the form ``sftp://user@host/path/to/directory``. You should configure the client to be able to log in to the SFTP server without a password over SSH (e.g. public key, identity file in ssh_config, etc.). @@ -315,14 +326,15 @@ The format ``sftp://user:pass@host/`` is supported for logging in. However, for When using this store, ``pysftp`` must be installed on both the server and the client. Run ``pip install pysftp`` to install the required package. NFS -~~~ +^^^ + To store artifacts in an NFS mount, specify a URI as a normal file system path, e.g., ``/mnt/nfs``. This path must the same on both the server and the client -- you may need to use symlinks or remount the client in order to enforce this property. Networking -^^^^^^^^^^ +---------- The ``--host`` option exposes the service on all interfaces. If running a server in production, we would recommend not exposing the built-in server broadly (as it is unauthenticated and unencrypted), @@ -330,16 +342,18 @@ and instead putting it behind a reverse proxy like NGINX or Apache httpd, or con Additionally, you should ensure that the ``--file-store`` (which defaults to the ``./mlruns`` directory) points to a persistent (non-ephemeral) disk. -Connecting to a Remote Server -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Once you have a server running, set ``MLFLOW_TRACKING_URI`` to the server's URI, along -with its scheme and port (for example, ``http://10.0.0.1:5000``). Then you can use ``mlflow``: +Logging to a Tracking Server +---------------------------- + +To log to a tracking server, set the ``MLFLOW_TRACKING_URI`` environment variable to the server's URI, +along with its scheme and port (for example, ``http://10.0.0.1:5000``) or call :py:func:`mlflow.set_tracking_uri`. + +The :py:func:`mlflow.start_run`, :py:func:`mlflow.log_param`, and :py:func:`mlflow.log_metric` calls +then make API requests to your remote tracking server. .. code:: python import mlflow with mlflow.start_run(): - mlflow.log_metric("a", 1) - -The :py:func:`mlflow.start_run` and :py:func:`mlflow.log_metric` calls make API requests to your remote -tracking server. + mlflow.log_param("a", 1) + mlflow.log_metric("b", 2) diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index c73f1a0711f08..01a6d4a552b70 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -426,13 +426,13 @@ Serving the Model mlflow_rfunc_serve(model_path = "model", run_uuid = "1bf3cca7f3814d8fac7be7874de1046d") - This will initialize a REST server and open a `swagger `_ interface to perform predicitons against + This will initialize a REST server and open a `swagger `_ interface to perform predictions against the REST API: .. image:: _static/images/tutorial-serving-r.png - .. note:: R - + .. note:: + By default, a model is served using the R packages available. To ensure the environment serving the prediction function matches the model, set ``restore = TRUE`` when calling ``mlflow_rfunc_serve()``. @@ -446,7 +446,7 @@ Serving the Model which should return something like:: { - "predicitons": [ + "predictions": [ [ 6.1312 ] From 3e163e299080b8afe333ced7ce8e5c5d59b416f3 Mon Sep 17 00:00:00 2001 From: Mani Parkhe Date: Mon, 15 Oct 2018 12:10:23 -0700 Subject: [PATCH 011/483] passing gunicorn options to mflow ui/server commands (#626) * passing gunicorn options to mflow ui/server commands * addressing review comments --- mlflow/cli.py | 13 +++++++++---- mlflow/server/__init__.py | 9 ++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/mlflow/cli.py b/mlflow/cli.py index 7bef5be5849b9..9a0169a552e40 100644 --- a/mlflow/cli.py +++ b/mlflow/cli.py @@ -127,7 +127,9 @@ def run(uri, entry_point, version, param_list, experiment_id, mode, cluster_spec "other machines.") @click.option("--port", "-p", default=5000, help="The port to listen on (default: 5000).") -def ui(file_store, host, port): +@click.option("--gunicorn-opts", default=None, + help="Additional command line options forwarded to gunicorn processes.") +def ui(file_store, host, port, gunicorn_opts): """ Launch the MLflow tracking UI. @@ -135,7 +137,7 @@ def ui(file_store, host, port): """ # TODO: We eventually want to disable the write path in this version of the server. try: - _run_server(file_store, file_store, host, port, 1, None) + _run_server(file_store, file_store, host, port, 1, None, gunicorn_opts) except ShellCommandException: print("Running the mlflow server failed. Please see the logs above for details.", file=sys.stderr) @@ -174,7 +176,9 @@ def _validate_static_prefix(ctx, param, value): # pylint: disable=unused-argume help="Number of gunicorn worker processes to handle requests (default: 4).") @click.option("--static-prefix", default=None, callback=_validate_static_prefix, help="A prefix which will be prepended to the path of all static paths.") -def server(file_store, default_artifact_root, host, port, workers, static_prefix): +@click.option("--gunicorn-opts", default=None, + help="Additional command line options forwarded to gunicorn processes.") +def server(file_store, default_artifact_root, host, port, workers, static_prefix, gunicorn_opts): """ Run the MLflow tracking server. @@ -183,7 +187,8 @@ def server(file_store, default_artifact_root, host, port, workers, static_prefix pass --host 0.0.0.0 to listen on all network interfaces (or a specific interface address). """ try: - _run_server(file_store, default_artifact_root, host, port, workers, static_prefix) + _run_server(file_store, default_artifact_root, host, port, workers, static_prefix, + gunicorn_opts) except ShellCommandException: print("Running the mlflow server failed. Please see the logs above for details.", file=sys.stderr) diff --git a/mlflow/server/__init__.py b/mlflow/server/__init__.py index dac8c93ebb365..ce48593643b59 100644 --- a/mlflow/server/__init__.py +++ b/mlflow/server/__init__.py @@ -1,6 +1,7 @@ import os +import shlex -from flask import Flask, send_from_directory, make_response +from flask import Flask, send_from_directory from mlflow.server import handlers from mlflow.server.handlers import get_artifact_handler @@ -50,7 +51,8 @@ def serve(): return send_from_directory(STATIC_DIR, 'index.html') -def _run_server(file_store_path, default_artifact_root, host, port, workers, static_prefix): +def _run_server(file_store_path, default_artifact_root, host, port, workers, static_prefix, + gunicorn_opts): """ Run the MLflow server, wrapping it in gunicorn :param static_prefix: If set, the index.html asset will be served from the path static_prefix. @@ -65,5 +67,6 @@ def _run_server(file_store_path, default_artifact_root, host, port, workers, sta if static_prefix: env_map[STATIC_PREFIX_ENV_VAR] = static_prefix bind_address = "%s:%s" % (host, port) - exec_cmd(["gunicorn", "-b", bind_address, "-w", "%s" % workers, "mlflow.server:app"], + opts = shlex.split(gunicorn_opts) if gunicorn_opts else [] + exec_cmd(["gunicorn"] + opts + ["-b", bind_address, "-w", "%s" % workers, "mlflow.server:app"], env=env_map, stream_output=True) From 44ce9f7197d2ea3e5c1117f0daa122f9a35dc825 Mon Sep 17 00:00:00 2001 From: tomasatdatabricks <33237569+tomasatdatabricks@users.noreply.github.com> Date: Tue, 16 Oct 2018 23:57:32 +0200 Subject: [PATCH 012/483] Fixed unicode issues in mlflow.load_keras. (#589) * Fixed unicode issues in mlflow.load_keras. * Synced with master and unpinned Keras * Removed leftover debugging code. * Reverted unintentional change. --- mlflow/keras.py | 6 +++++- test-requirements.txt | 3 +-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mlflow/keras.py b/mlflow/keras.py index 6b669815ecbd6..43f355e9cf07a 100644 --- a/mlflow/keras.py +++ b/mlflow/keras.py @@ -78,7 +78,11 @@ def log_model(keras_model, artifact_path, **kwargs): def _load_model(model_file): import keras.models - return keras.models.load_model(os.path.abspath(model_file)) + import h5py + # NOTE: Keras 2.2.3 does not work with unicode paths in python2. Pass in h5py.File instead of + # string to avoid issues. + model_file = h5py.File(os.path.abspath(model_file),) + return keras.models.load_model(model_file) class _KerasModelWrapper: diff --git a/test-requirements.txt b/test-requirements.txt index d0f49139c2031..37e738c23ad1d 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -19,5 +19,4 @@ tensorflow torch torchvision pysftp -# TODO: don't pin Keras version once https://github.com/keras-team/keras/issues/11276 is addressed -keras==2.2.2 +keras From f31839073445e8d8c4486a20a4d2ce13b2e8d1d2 Mon Sep 17 00:00:00 2001 From: tomasatdatabricks <33237569+tomasatdatabricks@users.noreply.github.com> Date: Wed, 17 Oct 2018 11:38:18 -0700 Subject: [PATCH 013/483] Fix field name in MLmodel spec produced by R to match python; time_created -> utc_time_created. (#634) --- mlflow/R/mlflow/R/model.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlflow/R/mlflow/R/model.R b/mlflow/R/mlflow/R/model.R index 47d2a13a8c9e0..47b8306b06a7f 100644 --- a/mlflow/R/mlflow/R/model.R +++ b/mlflow/R/mlflow/R/model.R @@ -51,7 +51,7 @@ mlflow_timestamp <- function() { } mlflow_write_model_spec <- function(path, content) { - content$time_created <- mlflow_timestamp() + content$utc_time_created <- mlflow_timestamp() content$run_id <- active_run_id() write_yaml( From d7f92085943dca8a1c925c8d2bbacac111b91f81 Mon Sep 17 00:00:00 2001 From: Stephanie Bodoff Date: Wed, 17 Oct 2018 23:37:08 -0700 Subject: [PATCH 014/483] Improve model deployment headings and discussion (#635) * Improve model deployment headings and discussion --- docs/source/models.rst | 72 ++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/docs/source/models.rst b/docs/source/models.rst index 6b1d61fa46c61..41d7739056d50 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -243,15 +243,16 @@ for your flavor. MLflow tools ignore flavors in the MLmodel file that they do no Built-In Deployment Tools ------------------------- -MLflow provides tools for deploying models on a local machine and several production environments. -You can use these tools to easily apply your models in a production environment. Not all deployment -methods are available for all model flavors. Deployment is supported for the Python function format and all compatible formats. +MLflow provides tools for deploying models on a local machine and to several production environments. +Not all deployment methods are available for all model flavors. Deployment is supported for the +Python Function format and all compatible formats. + +Deploy a ``python_function`` model as a local REST API endpoint +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Local -^^^^^ MLflow can deploy models locally as local REST API endpoints or to directly score CSV files. -This functionality is a convenient way of testing models before uploading to a remote model server. -You deploy the Python Function flavor locally via the CLI interface to the :py:mod:`mlflow.pyfunc` module. +This functionality is a convenient way of testing models before deploying to a remote model server. +You deploy the Python Function flavor locally using the CLI interface to the :py:mod:`mlflow.pyfunc` module. * :py:func:`serve ` deploys the model as a local REST API server. * :py:func:`predict ` uses the model to generate a prediction for a local @@ -265,23 +266,23 @@ For more info, see: mlflow pyfunc serve --help mlflow pyfunc predict --help -Microsoft AzureML -^^^^^^^^^^^^^^^^^ -The :py:mod:`mlflow.azureml` module can export ``python_function`` models as Azure ML compatible models. It -can also be used to directly deploy and serve models on Azure ML, provided the environment has -been correctly set up. +Deploy a ``python_function`` model on Microsoft AzureML +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :py:mod:`mlflow.azureml` module can export ``python_function`` models as Azure ML models and +directly deploy and serve models on Azure ML, provided the environment has been set up. -* :py:func:`export ` exports the model in Azure ML-compatible format. - MLflow will output a directory with the dependencies necessary to deploy the model. +* :py:func:`export ` exports the model as a + directory with the dependencies necessary to deploy the model on Azure ML. * :py:func:`deploy ` deploys the model directly to Azure ML. - You first need to set up your environment to work with the Azure ML CLI. You can do this by + You need to set up your environment to work with the Azure ML CLI. You can do this by starting a shell from the Azure ML Workbench application. You also have to set up all accounts required to run and deploy on Azure ML. Where the model is deployed is dependent on your active Azure ML environment. If the active environment is set up for local deployment, the model - will be deployed locally in a Docker container (Docker is required). + is deployed locally in a Docker container (Docker is required). -Model export example: +.. rubric:: Model export example .. code:: bash @@ -312,24 +313,24 @@ For more info, see: mlflow azureml export --help mlflow azureml deploy --help -Amazon SageMaker -^^^^^^^^^^^^^^^^ -The :py:mod:`mlflow.sagemaker` module can deploy ``python_function`` models on SageMaker -or locally in a Docker container with SageMaker compatible environment. -You have to set up your environment and user accounts first in order to -deploy to SageMaker with MLflow. Also, in order to export a custom model to SageMaker, you need a -MLflow-compatible Docker image to be available on Amazon ECR. MLflow provides a default Docker -image definition; however, it is up to you to build the actual image and upload it to ECR. -MLflow includes a utility function to perform this step. Once built and uploaded, the MLflow -container can be used for all MLflow models. +Deploy a ``python_function`` model on Amazon SageMaker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -* The :py:func:`build-and-push-container ` CLI command builds an MLfLow - Docker image and uploads it to ECR. The caller must have the correct permissions set up. The image - is built locally and requires Docker to be present on the machine that performs this step. +The :py:mod:`mlflow.sagemaker` module can deploy ``python_function`` models locally in a Docker +container with SageMaker compatible environment and remotely on SageMaker. +To deploy remotely to SageMaker you need to set up your environment and user accounts. +To export a custom model to SageMaker, you need a MLflow-compatible Docker image to be available on Amazon ECR. +MLflow provides a default Docker image definition; however, it is up to you to build the image and upload it to ECR. +MLflow includes the utility function ``build_and_push_container`` to perform this step. Once built and uploaded, you can use the MLflow +container for all MLflow models. * :py:func:`run-local ` deploys the model locally in a Docker container. The image and the environment should be identical to how the model would be run remotely and it is therefore useful for testing the model prior to deployment. + +* The :py:func:`build-and-push-container ` CLI command builds an MLfLow + Docker image and uploads it to ECR. The caller must have the correct permissions set up. The image + is built locally and requires Docker to be present on the machine that performs this step. * :py:func:`deploy ` deploys the model on Amazon SageMaker. MLflow uploads the Python Function model into S3 and starts an Amazon SageMaker endpoint serving @@ -341,7 +342,7 @@ container can be used for all MLflow models. mlflow sagemaker build-and-push-container - build the container (only needs to be called once) mlflow sagemaker run-local -m - test the model locally - mlflow sagemaker deploy - deploy the model to the cloud + mlflow sagemaker deploy - deploy the model remotely For more info, see: @@ -354,10 +355,11 @@ For more info, see: mlflow sagemaker deploy --help -Apache Spark -^^^^^^^^^^^^ -MLfLow can output a ``python_function`` model as an Apache Spark UDF, which can be uploaded to a Spark cluster and -used to score the model. +Export a ``python_function`` model as an Apache Spark UDF +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can output a ``python_function`` model as an Apache Spark UDF, which can be uploaded to a +Spark cluster and used to score the model. .. rubric:: Example From 0dd13a9feb82d4a87f0e2ec58120650c4793a447 Mon Sep 17 00:00:00 2001 From: tomasatdatabricks <33237569+tomasatdatabricks@users.noreply.github.com> Date: Thu, 18 Oct 2018 17:34:58 -0700 Subject: [PATCH 015/483] Removed anaconda channels to fix tests. (#646) * Removed anaconda channels to fix tests. The anaconda repo.json appears to be broken right now (several packages have null info). * Removed more anaconda channel references --- mlflow/sagemaker/__init__.py | 4 ++-- mlflow/sagemaker/container/__init__.py | 2 +- mlflow/utils/environment.py | 1 - tests/resources/example_project/conda.yaml | 1 - 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mlflow/sagemaker/__init__.py b/mlflow/sagemaker/__init__.py index f073322466415..103e388be9954 100644 --- a/mlflow/sagemaker/__init__.py +++ b/mlflow/sagemaker/__init__.py @@ -66,8 +66,8 @@ ENV PATH="/miniconda/bin:${PATH}" ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 -RUN conda install -c anaconda gunicorn;\ - conda install -c anaconda gevent;\ +RUN conda install gunicorn;\ + conda install gevent;\ %s diff --git a/mlflow/sagemaker/container/__init__.py b/mlflow/sagemaker/container/__init__.py index 5acd30991af51..8293dd7eee5c2 100644 --- a/mlflow/sagemaker/container/__init__.py +++ b/mlflow/sagemaker/container/__init__.py @@ -59,7 +59,7 @@ def _server_dependencies_cmds(): :return: List of commands. """ # TODO: Should we reinstall MLflow? What if there is MLflow in the user's conda environment? - return ["conda install -c anaconda gunicorn", "conda install -c anaconda gevent", + return ["conda install gunicorn", "conda install gevent", "pip install /opt/mlflow/." if _container_includes_mlflow_source() else "pip install mlflow=={}".format(MLFLOW_VERSION)] diff --git a/mlflow/utils/environment.py b/mlflow/utils/environment.py index 88acb2c0489c7..5f9c8a86f1d13 100644 --- a/mlflow/utils/environment.py +++ b/mlflow/utils/environment.py @@ -5,7 +5,6 @@ _conda_header = """\ name: mlflow-env channels: - - anaconda - defaults """ diff --git a/tests/resources/example_project/conda.yaml b/tests/resources/example_project/conda.yaml index a8679489271fa..cb29b86499c66 100644 --- a/tests/resources/example_project/conda.yaml +++ b/tests/resources/example_project/conda.yaml @@ -2,7 +2,6 @@ # conda.yaml files in the test environment. name: tutorial channels: - - anaconda - defaults dependencies: - python=3.6 From bfb6512243d198a769ec7ce353a6371074b3c781 Mon Sep 17 00:00:00 2001 From: Marcus Rehm Date: Fri, 19 Oct 2018 14:22:32 -0300 Subject: [PATCH 016/483] address path separator in azure blob artifact repo when runing in windows (#642) --- mlflow/store/azure_blob_artifact_repo.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mlflow/store/azure_blob_artifact_repo.py b/mlflow/store/azure_blob_artifact_repo.py index 88c5f17b78745..0afe311da4ebe 100644 --- a/mlflow/store/azure_blob_artifact_repo.py +++ b/mlflow/store/azure_blob_artifact_repo.py @@ -1,5 +1,6 @@ import os import re +import posixpath from six.moves import urllib @@ -83,7 +84,9 @@ def list_artifacts(self, path=None): (container, _, artifact_path) = self.parse_wasbs_uri(self.artifact_uri) dest_path = artifact_path if path: - dest_path = build_path(dest_path, path) + # Separator needs to be fixed as '/' because of azure blob storage pattern. + # Do not change to os.path.join because in Windows system path separator is '\' + dest_path = posixpath.join(dest_path, path) infos = [] prefix = dest_path + "/" marker = None # Used to make next list request if this one exceeded the result limit @@ -107,5 +110,7 @@ def list_artifacts(self, path=None): def _download_file(self, remote_file_path, local_path): (container, _, remote_root_path) = self.parse_wasbs_uri(self.artifact_uri) - remote_full_path = build_path(remote_root_path, remote_file_path) + # Separator needs to be fixed as '/' because of azure blob storage pattern. + # Do not change to os.path.join because in Windows system path separator is '\' + remote_full_path = posixpath.join(remote_root_path, remote_file_path) self.client.get_blob_to_path(container, remote_full_path, local_path) From 3e8f7349c76dd2372bc0590f0a342367be170919 Mon Sep 17 00:00:00 2001 From: Sergei Chipiga Date: Fri, 19 Oct 2018 20:24:11 +0300 Subject: [PATCH 017/483] Start experiment ID with 0 if no experiments found (#641) --- mlflow/store/file_store.py | 2 +- tests/store/test_file_store.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/mlflow/store/file_store.py b/mlflow/store/file_store.py index 492a91bf193d2..fdafd5a0540d1 100644 --- a/mlflow/store/file_store.py +++ b/mlflow/store/file_store.py @@ -160,7 +160,7 @@ def create_experiment(self, name, artifact_location=None): # Get all existing experiments and find the one with largest ID. # len(list_all(..)) would not work when experiments are deleted. experiments_ids = [e.experiment_id for e in self.list_experiments(ViewType.ALL)] - experiment_id = max(experiments_ids) + 1 + experiment_id = max(experiments_ids) + 1 if experiments_ids else 0 return self._create_experiment_with_id(name, experiment_id, artifact_location) def _has_experiment(self, experiment_id): diff --git a/tests/store/test_file_store.py b/tests/store/test_file_store.py index ed6d9ab193a13..98d5a4bb6bfa1 100644 --- a/tests/store/test_file_store.py +++ b/tests/store/test_file_store.py @@ -2,11 +2,11 @@ # -*- coding: utf-8 -*- import os import shutil +import time import unittest import uuid -import time - +import mock import pytest from mlflow.entities import Experiment, Metric, Param, RunTag, ViewType, RunInfo @@ -148,6 +148,15 @@ def test_get_experiment_by_name(self): exp = fs.get_experiment_by_name(exp_names) self.assertIsNone(exp) + def test_create_first_experiment(self): + fs = FileStore(self.test_root) + fs.list_experiments = mock.Mock(return_value=[]) + fs._create_experiment_with_id = mock.Mock() + fs.create_experiment(random_str(1)) + fs._create_experiment_with_id.assert_called_once() + experiment_id = fs._create_experiment_with_id.call_args[0][1] + self.assertEqual(experiment_id, 0) + def test_create_experiment(self): fs = FileStore(self.test_root) From 43faef575f64e9a0ef3df7c602db27c37cd0b56a Mon Sep 17 00:00:00 2001 From: Mani Parkhe Date: Fri, 19 Oct 2018 11:18:02 -0700 Subject: [PATCH 018/483] Error handling for experiment or run: meta.yaml is not found (#632) * Error handling when experiment or run meta.yaml is not found * test for malformed runs and experiments * review comments --- mlflow/exceptions.py | 5 +++ mlflow/store/file_store.py | 74 +++++++++++++++++++++------------- mlflow/utils/file_utils.py | 8 ++-- tests/store/test_file_store.py | 41 ++++++++++++++++++- 4 files changed, 96 insertions(+), 32 deletions(-) diff --git a/mlflow/exceptions.py b/mlflow/exceptions.py index 689431f810ccd..9b0906f133ac6 100644 --- a/mlflow/exceptions.py +++ b/mlflow/exceptions.py @@ -40,3 +40,8 @@ class IllegalArtifactPathError(MlflowException): class ExecutionException(MlflowException): """Exception thrown when executing a project fails.""" pass + + +class MissingConfigException(MlflowException): + """Exception thrown when expected configuration file/directory not found""" + pass diff --git a/mlflow/store/file_store.py b/mlflow/store/file_store.py index fdafd5a0540d1..a2843b4c960aa 100644 --- a/mlflow/store/file_store.py +++ b/mlflow/store/file_store.py @@ -1,3 +1,4 @@ +import logging import os import uuid @@ -5,9 +6,8 @@ from mlflow.entities import Experiment, Metric, Param, Run, RunData, RunInfo, RunStatus, RunTag, \ ViewType -from mlflow.entities.run_info import check_run_is_active, \ - check_run_is_deleted -from mlflow.exceptions import MlflowException +from mlflow.entities.run_info import check_run_is_active, check_run_is_deleted +from mlflow.exceptions import MlflowException, MissingConfigException, ExecutionException import mlflow.protos.databricks_pb2 as databricks_pb2 from mlflow.store.abstract_store import AbstractStore from mlflow.utils.validation import _validate_metric_name, _validate_param_name, _validate_run_id, \ @@ -19,7 +19,6 @@ write_to, append_to, make_containing_dirs, mv, get_parent_dir, list_all) from mlflow.utils.mlflow_tags import MLFLOW_RUN_NAME, MLFLOW_PARENT_RUN_ID - from mlflow.utils.search_utils import does_run_match_clause _TRACKING_DIR_ENV_VAR = "MLFLOW_TRACKING_DIR" @@ -138,7 +137,17 @@ def list_experiments(self, view_type=ViewType.ACTIVE_ONLY): rsl += self._get_active_experiments(full_path=False) if view_type == ViewType.DELETED_ONLY or view_type == ViewType.ALL: rsl += self._get_deleted_experiments(full_path=False) - return [self._get_experiment(exp_id, view_type) for exp_id in rsl] + experiments = [] + for exp_id in rsl: + try: + # trap and warn known issues, will raise unexpected exceptions to caller + experiment = self._get_experiment(exp_id, view_type) + experiments.append(experiment) + except MissingConfigException as rnfe: + # Trap malformed experiments and log warnings. + logging.warning("Malformed experiment '%s'. Detailed error %s", + str(exp_id), str(rnfe), **{"exc_info": True}) + return experiments def _create_experiment_with_id(self, name, experiment_id, artifact_uri): self._check_root_dir() @@ -217,6 +226,7 @@ def restore_experiment(self, experiment_id): def rename_experiment(self, experiment_id, new_name): meta_dir = os.path.join(self.root_directory, str(experiment_id)) + # if experiment is malformed, will raise error experiment = self._get_experiment(experiment_id) experiment._set_name(new_name) if experiment.lifecycle_stage != Experiment.ACTIVE_LIFECYCLE: @@ -437,37 +447,45 @@ def get_all_tags(self, run_uuid): tags.append(self._get_tag_from_file(parent_path, tag_file)) return tags - def _list_run_uuids(self, experiment_id, run_view_type): + def _lifecycle_stage_valid_for_view_type(self, view_type, lifecycle_stage): + if view_type == ViewType.ALL: + return True + elif view_type == ViewType.ACTIVE_ONLY: + return lifecycle_stage == RunInfo.ACTIVE_LIFECYCLE + elif view_type == ViewType.DELETED_ONLY: + return lifecycle_stage == RunInfo.DELETED_LIFECYCLE + else: + raise ExecutionException("Invalid view type '%s'" % str(view_type)) + + def _list_run_infos(self, experiment_id, view_type): self._check_root_dir() experiment_dir = self._get_experiment_path(experiment_id, assert_exists=True) run_uuids = list_all(experiment_dir, os.path.isdir, full_path=False) - if run_view_type == ViewType.ALL: - return run_uuids - elif run_view_type == ViewType.ACTIVE_ONLY: - return [r_id for r_id in run_uuids - if self._get_run_info(r_id).lifecycle_stage == RunInfo.ACTIVE_LIFECYCLE] - else: - return [r_id for r_id in run_uuids - if self._get_run_info(r_id).lifecycle_stage == RunInfo.DELETED_LIFECYCLE] + run_infos = [] + for r_id in run_uuids: + try: + # trap and warn known issues, will raise unexpected exceptions to caller + run_info = self._get_run_info(r_id) + if self._lifecycle_stage_valid_for_view_type(view_type, run_info.lifecycle_stage): + run_infos.append(run_info) + except MissingConfigException as rnfe: + # trap malformed run exception and log warning + kwargs = {"exc_info": True} + logging.warning("Malformed run '%s'. Detailed error %s", r_id, str(rnfe), **kwargs) + return run_infos def search_runs(self, experiment_ids, search_expressions, run_view_type): - run_uuids = [] + runs = [] + for experiment_id in experiment_ids: + run_infos = self._list_run_infos(experiment_id, run_view_type) + runs.extend(self.get_run(r.run_uuid) for r in run_infos) if len(search_expressions) == 0: - for experiment_id in experiment_ids: - run_uuids.extend(self._list_run_uuids(experiment_id, run_view_type)) - else: - for experiment_id in experiment_ids: - for run_uuid in self._list_run_uuids(experiment_id, run_view_type): - run = self.get_run(run_uuid) - if all([does_run_match_clause(run, s) for s in search_expressions]): - run_uuids.append(run_uuid) - return [self.get_run(run_uuid) for run_uuid in run_uuids] + return runs + return [run for run in runs if + all([does_run_match_clause(run, s) for s in search_expressions])] def list_run_infos(self, experiment_id, run_view_type): - run_infos = [] - for run_uuid in self._list_run_uuids(experiment_id, run_view_type): - run_infos.append(self._get_run_info(run_uuid)) - return run_infos + return self._list_run_infos(experiment_id, run_view_type) def log_metric(self, run_uuid, metric): _validate_run_id(run_uuid) diff --git a/mlflow/utils/file_utils.py b/mlflow/utils/file_utils.py index c2c9b30bcccb7..c462b6d82c34b 100644 --- a/mlflow/utils/file_utils.py +++ b/mlflow/utils/file_utils.py @@ -8,6 +8,7 @@ import yaml from mlflow.entities import FileInfo +from mlflow.exceptions import MissingConfigException ENCODING = "utf-8" @@ -124,7 +125,7 @@ def write_yaml(root, file_name, data, overwrite=False): :param overwrite: If True, will overwrite existing files """ if not exists(root): - raise Exception("Parent directory '%s' does not exist." % root) + raise MissingConfigException("Parent directory '%s' does not exist." % root) file_path = os.path.join(root, file_name) yaml_file_name = file_path if file_path.endswith(".yaml") else file_path + ".yaml" @@ -149,11 +150,12 @@ def read_yaml(root, file_name): :return: Data in yaml file as dictionary """ if not exists(root): - raise Exception("Cannot read '%s'. Parent dir '%s' does not exist." % (file_name, root)) + raise MissingConfigException( + "Cannot read '%s'. Parent dir '%s' does not exist." % (file_name, root)) file_path = os.path.join(root, file_name) if not exists(file_path): - raise Exception("Yaml file '%s' does not exist." % file_path) + raise MissingConfigException("Yaml file '%s' does not exist." % file_path) try: with open(file_path, 'r') as yaml_file: diff --git a/tests/store/test_file_store.py b/tests/store/test_file_store.py index 98d5a4bb6bfa1..c1821be6e3488 100644 --- a/tests/store/test_file_store.py +++ b/tests/store/test_file_store.py @@ -10,7 +10,7 @@ import pytest from mlflow.entities import Experiment, Metric, Param, RunTag, ViewType, RunInfo -from mlflow.exceptions import MlflowException +from mlflow.exceptions import MlflowException, MissingConfigException from mlflow.store.file_store import FileStore from mlflow.utils.file_utils import write_yaml from mlflow.utils.mlflow_tags import MLFLOW_PARENT_RUN_ID @@ -462,3 +462,42 @@ def test_default_experiment_initialization(self): fs.delete_experiment(Experiment.DEFAULT_EXPERIMENT_ID) fs = FileStore(self.test_root) assert fs.get_experiment(0).lifecycle_stage == Experiment.DELETED_LIFECYCLE + + def test_malformed_experiment(self): + fs = FileStore(self.test_root) + exp_0 = fs.get_experiment(Experiment.DEFAULT_EXPERIMENT_ID) + assert exp_0.experiment_id == Experiment.DEFAULT_EXPERIMENT_ID + + experiments = len(fs.list_experiments(ViewType.ALL)) + + # delete metadata file. + path = os.path.join(self.test_root, str(exp_0.experiment_id), "meta.yaml") + os.remove(path) + with pytest.raises(MissingConfigException) as e: + fs.get_experiment(Experiment.DEFAULT_EXPERIMENT_ID) + assert e.message.contains("does not exist") + + assert len(fs.list_experiments(ViewType.ALL)) == experiments - 1 + + def test_malformed_run(self): + fs = FileStore(self.test_root) + exp_0 = fs.get_experiment(Experiment.DEFAULT_EXPERIMENT_ID) + all_runs = fs.search_runs([exp_0.experiment_id], [], run_view_type=ViewType.ALL) + + all_run_ids = self.exp_data[exp_0.experiment_id]["runs"] + assert len(all_runs) == len(all_run_ids) + + # delete metadata file. + bad_run_id = self.exp_data[exp_0.experiment_id]['runs'][0] + path = os.path.join(self.test_root, str(exp_0.experiment_id), str(bad_run_id), "meta.yaml") + os.remove(path) + with pytest.raises(MissingConfigException) as e: + fs.get_run(bad_run_id) + assert e.message.contains("does not exist") + + valid_runs = fs.search_runs([exp_0.experiment_id], [], run_view_type=ViewType.ALL) + assert len(valid_runs) == len(all_runs) - 1 + + for rid in all_run_ids: + if rid != bad_run_id: + fs.get_run(rid) From 4dfb14bd7f95c44deb7eae857c8b6c05343b11cd Mon Sep 17 00:00:00 2001 From: Mani Parkhe Date: Fri, 19 Oct 2018 12:46:29 -0700 Subject: [PATCH 019/483] follow up change to #632: styling fix dict to kwargs (#649) --- mlflow/store/file_store.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mlflow/store/file_store.py b/mlflow/store/file_store.py index a2843b4c960aa..42dc1e2c3a1c4 100644 --- a/mlflow/store/file_store.py +++ b/mlflow/store/file_store.py @@ -146,7 +146,7 @@ def list_experiments(self, view_type=ViewType.ACTIVE_ONLY): except MissingConfigException as rnfe: # Trap malformed experiments and log warnings. logging.warning("Malformed experiment '%s'. Detailed error %s", - str(exp_id), str(rnfe), **{"exc_info": True}) + str(exp_id), str(rnfe), exc_info=True) return experiments def _create_experiment_with_id(self, name, experiment_id, artifact_uri): @@ -470,8 +470,8 @@ def _list_run_infos(self, experiment_id, view_type): run_infos.append(run_info) except MissingConfigException as rnfe: # trap malformed run exception and log warning - kwargs = {"exc_info": True} - logging.warning("Malformed run '%s'. Detailed error %s", r_id, str(rnfe), **kwargs) + logging.warning("Malformed run '%s'. Detailed error %s", r_id, str(rnfe), + exc_info=True) return run_infos def search_runs(self, experiment_ids, search_expressions, run_view_type): From d8be41f8ee74808fc4533ae16b7498b201b4f5eb Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Fri, 19 Oct 2018 15:56:44 -0700 Subject: [PATCH 020/483] Remove superfluous print statement in file store (#650) --- mlflow/store/file_store.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mlflow/store/file_store.py b/mlflow/store/file_store.py index 42dc1e2c3a1c4..944f2e6fab693 100644 --- a/mlflow/store/file_store.py +++ b/mlflow/store/file_store.py @@ -62,7 +62,6 @@ def __init__(self, root_directory=None, artifact_root_uri=None): # Create root directory if needed if not exists(self.root_directory): mkdir(self.root_directory) - print("here") self._create_experiment_with_id(name="Default", experiment_id=Experiment.DEFAULT_EXPERIMENT_ID, artifact_uri=None) From eebeea121d69c0322bba4a977351394a982245d4 Mon Sep 17 00:00:00 2001 From: Sergei Chipiga Date: Mon, 22 Oct 2018 19:29:15 +0300 Subject: [PATCH 021/483] Do not create zero id experiment if it exists (#658) --- mlflow/tracking/fluent.py | 2 +- test-requirements.txt | 1 + tests/conftest.py | 16 ++++++++++++ tests/tracking/conftest.py | 8 ++++++ tests/tracking/test_tracking.py | 46 ++++++++++++++++++++------------- 5 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 tests/tracking/conftest.py diff --git a/mlflow/tracking/fluent.py b/mlflow/tracking/fluent.py index 3acff19010720..951b1e0aa0c68 100644 --- a/mlflow/tracking/fluent.py +++ b/mlflow/tracking/fluent.py @@ -40,7 +40,7 @@ def set_experiment(experiment_name): client = MlflowClient() experiment = client.get_experiment_by_name(experiment_name) exp_id = experiment.experiment_id if experiment else None - if not exp_id: + if exp_id is None: # id can be 0 print("INFO: '{}' does not exist. Creating a new experiment".format(experiment_name)) exp_id = client.create_experiment(experiment_name) global _active_experiment_id diff --git a/test-requirements.txt b/test-requirements.txt index 37e738c23ad1d..68f4e43891a36 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -20,3 +20,4 @@ torch torchvision pysftp keras +attrdict==2.0.0 diff --git a/tests/conftest.py b/tests/conftest.py index e69de29bb2d1d..effc22a7007f2 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -0,0 +1,16 @@ +import pytest + + +@pytest.fixture +def reset_mock(): + cache = [] + + def set_mock(obj, attr, mock): + cache.append((obj, attr, getattr(obj, attr))) + setattr(obj, attr, mock) + + yield set_mock + + for obj, attr, value in cache: + setattr(obj, attr, value) + cache[:] = [] diff --git a/tests/tracking/conftest.py b/tests/tracking/conftest.py new file mode 100644 index 0000000000000..0951337cc3b9a --- /dev/null +++ b/tests/tracking/conftest.py @@ -0,0 +1,8 @@ +import mlflow +import pytest + + +@pytest.fixture +def reset_active_experiment(): + yield + mlflow.tracking.fluent._active_experiment_id = None diff --git a/tests/tracking/test_tracking.py b/tests/tracking/test_tracking.py index 217312696df35..d2438b2f05f59 100644 --- a/tests/tracking/test_tracking.py +++ b/tests/tracking/test_tracking.py @@ -3,12 +3,15 @@ import random import tempfile +import attrdict +import mock import pytest import mlflow from mlflow import tracking from mlflow.entities import RunStatus from mlflow.exceptions import MlflowException +from mlflow.tracking.client import MlflowClient from mlflow.tracking.fluent import start_run, end_run from mlflow.utils.mlflow_tags import MLFLOW_PARENT_RUN_ID from tests.projects.utils import tracking_uri_mock @@ -29,7 +32,7 @@ def test_create_experiment(tracking_uri_mock): assert exp_id is not None -def test_set_experiment(tracking_uri_mock): +def test_set_experiment(tracking_uri_mock, reset_active_experiment): with pytest.raises(TypeError): mlflow.set_experiment() @@ -39,23 +42,30 @@ def test_set_experiment(tracking_uri_mock): with pytest.raises(Exception): mlflow.set_experiment("") - try: - name = "random_exp" - exp_id = mlflow.create_experiment(name) - mlflow.set_experiment(name) - run = start_run() - assert run.info.experiment_id == exp_id - end_run() - - another_name = "another_experiment" - mlflow.set_experiment(another_name) - exp_id2 = mlflow.tracking.MlflowClient().get_experiment_by_name(another_name) - another_run = start_run() - assert another_run.info.experiment_id == exp_id2.experiment_id - end_run() - finally: - # Need to do this to clear active experiment to restore state - mlflow.tracking.fluent._active_experiment_id = None + name = "random_exp" + exp_id = mlflow.create_experiment(name) + mlflow.set_experiment(name) + run = start_run() + assert run.info.experiment_id == exp_id + end_run() + + another_name = "another_experiment" + mlflow.set_experiment(another_name) + exp_id2 = mlflow.tracking.MlflowClient().get_experiment_by_name(another_name) + another_run = start_run() + assert another_run.info.experiment_id == exp_id2.experiment_id + end_run() + + +def test_set_experiment_with_zero_id(reset_mock, reset_active_experiment): + reset_mock(MlflowClient, "get_experiment_by_name", + mock.Mock(return_value=attrdict.AttrDict(experiment_id=0))) + reset_mock(MlflowClient, "create_experiment", mock.Mock()) + + mlflow.set_experiment("my_exp") + + MlflowClient.get_experiment_by_name.assert_called_once() + MlflowClient.create_experiment.assert_not_called() def test_start_run_context_manager(tracking_uri_mock): From bb62bfb0a316db92f0f7ed1b558f98e7a8617658 Mon Sep 17 00:00:00 2001 From: Mani Parkhe Date: Mon, 22 Oct 2018 16:07:31 -0700 Subject: [PATCH 022/483] ignore experiment if id recorded in meta data does not match (#654) * ignore experiment if id recorded in meta data does not match * unit test * unused import * Addressing review concerns raised by @smurching. --- mlflow/store/file_store.py | 27 +++++++++++++++++++++++---- mlflow/utils/validation.py | 9 +++++++++ tests/store/test_file_store.py | 22 ++++++++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/mlflow/store/file_store.py b/mlflow/store/file_store.py index 944f2e6fab693..c0712a8a9fbb1 100644 --- a/mlflow/store/file_store.py +++ b/mlflow/store/file_store.py @@ -11,7 +11,7 @@ import mlflow.protos.databricks_pb2 as databricks_pb2 from mlflow.store.abstract_store import AbstractStore from mlflow.utils.validation import _validate_metric_name, _validate_param_name, _validate_run_id, \ - _validate_tag_name + _validate_tag_name, _validate_experiment_id from mlflow.utils.env import get_env from mlflow.utils.file_utils import (is_directory, list_subdirs, mkdir, exists, write_yaml, @@ -95,6 +95,8 @@ def _get_experiment_path(self, experiment_id, view_type=ViewType.ALL, assert_exi def _get_run_dir(self, experiment_id, run_uuid): _validate_run_id(run_uuid) + if not self._has_experiment(experiment_id): + return None return build_path(self._get_experiment_path(experiment_id, assert_exists=True), run_uuid) def _get_metric_path(self, experiment_id, run_uuid, metric_key): @@ -141,7 +143,8 @@ def list_experiments(self, view_type=ViewType.ACTIVE_ONLY): try: # trap and warn known issues, will raise unexpected exceptions to caller experiment = self._get_experiment(exp_id, view_type) - experiments.append(experiment) + if experiment: + experiments.append(experiment) except MissingConfigException as rnfe: # Trap malformed experiments and log warnings. logging.warning("Malformed experiment '%s'. Detailed error %s", @@ -176,6 +179,7 @@ def _has_experiment(self, experiment_id): def _get_experiment(self, experiment_id, view_type=ViewType.ALL): self._check_root_dir() + _validate_experiment_id(experiment_id) experiment_dir = self._get_experiment_path(experiment_id, view_type) if experiment_dir is None: raise MlflowException("Could not find experiment with ID %s" % experiment_id, @@ -185,7 +189,13 @@ def _get_experiment(self, experiment_id, view_type=ViewType.ALL): meta['lifecycle_stage'] = Experiment.DELETED_LIFECYCLE else: meta['lifecycle_stage'] = Experiment.ACTIVE_LIFECYCLE - return Experiment.from_dictionary(meta) + experiment = Experiment.from_dictionary(meta) + if int(experiment_id) != experiment.experiment_id: + logging.warning("Experiment ID mismatch for exp %s. ID recorded as '%s' in meta data. " + "Experiment will be ignored.", + str(experiment_id), str(experiment.experiment_id), exc_info=True) + return None + return experiment def get_experiment(self, experiment_id): """ @@ -194,7 +204,11 @@ def get_experiment(self, experiment_id): :param experiment_id: Integer id for the experiment :return: A single Experiment object if it exists, otherwise raises an Exception. """ - return self._get_experiment(experiment_id) + experiment = self._get_experiment(experiment_id) + if experiment is None: + raise MlflowException("Experiment '%s' does not exist." % experiment_id, + databricks_pb2.RESOURCE_DOES_NOT_EXIST) + return experiment def get_experiment_by_name(self, name): self._check_root_dir() @@ -227,6 +241,9 @@ def rename_experiment(self, experiment_id, new_name): meta_dir = os.path.join(self.root_directory, str(experiment_id)) # if experiment is malformed, will raise error experiment = self._get_experiment(experiment_id) + if experiment is None: + raise MlflowException("Experiment '%s' does not exist." % experiment_id, + databricks_pb2.RESOURCE_DOES_NOT_EXIST) experiment._set_name(new_name) if experiment.lifecycle_stage != Experiment.ACTIVE_LIFECYCLE: raise Exception("Cannot rename experiment in non-active lifecycle stage." @@ -458,6 +475,8 @@ def _lifecycle_stage_valid_for_view_type(self, view_type, lifecycle_stage): def _list_run_infos(self, experiment_id, view_type): self._check_root_dir() + if not self._has_experiment(experiment_id): + return [] experiment_dir = self._get_experiment_path(experiment_id, assert_exists=True) run_uuids = list_all(experiment_dir, os.path.isdir, full_path=False) run_infos = [] diff --git a/mlflow/utils/validation.py b/mlflow/utils/validation.py index 0869a9f967848..0bc779b79109c 100644 --- a/mlflow/utils/validation.py +++ b/mlflow/utils/validation.py @@ -59,3 +59,12 @@ def _validate_run_id(run_id): """Check that `run_id` is a valid run ID and raise an exception if it isn't.""" if _RUN_ID_REGEX.match(run_id) is None: raise MlflowException("Invalid run ID: '%s'" % run_id, error_code=INVALID_PARAMETER_VALUE) + + +def _validate_experiment_id(exp_id): + """Check that `experiment_id`is a valid integer and raise an exception if it isn't.""" + try: + int(exp_id) + except ValueError: + raise MlflowException("Invalid experiment ID: '%s'" % exp_id, + error_code=INVALID_PARAMETER_VALUE) diff --git a/tests/store/test_file_store.py b/tests/store/test_file_store.py index c1821be6e3488..929b47d256c44 100644 --- a/tests/store/test_file_store.py +++ b/tests/store/test_file_store.py @@ -501,3 +501,25 @@ def test_malformed_run(self): for rid in all_run_ids: if rid != bad_run_id: fs.get_run(rid) + + def test_mismatching_experiment_id(self): + fs = FileStore(self.test_root) + exp_0 = fs.get_experiment(Experiment.DEFAULT_EXPERIMENT_ID) + assert exp_0.experiment_id == Experiment.DEFAULT_EXPERIMENT_ID + + experiments = len(fs.list_experiments(ViewType.ALL)) + + # mv experiment folder + target = 1 + path_orig = os.path.join(self.test_root, str(exp_0.experiment_id)) + path_new = os.path.join(self.test_root, str(target)) + os.rename(path_orig, path_new) + + with pytest.raises(MlflowException) as e: + fs.get_experiment(Experiment.DEFAULT_EXPERIMENT_ID) + assert e.message.contains("Could not find experiment with ID") + + with pytest.raises(MlflowException) as e: + fs.get_experiment(target) + assert e.message.contains("does not exist") + assert len(fs.list_experiments(ViewType.ALL)) == experiments - 1 From da24f26871374bbbb41bb46a2dc7f0c7338a2370 Mon Sep 17 00:00:00 2001 From: Mani Parkhe Date: Mon, 22 Oct 2018 22:59:35 -0700 Subject: [PATCH 023/483] ignore run if experiment_id recorded in meta data does not match folder structure (#661) * handling error for run meta data pointing to wrong experiment + unit test --- mlflow/store/file_store.py | 44 ++++++++++++++++++++++++---------- tests/store/test_file_store.py | 28 +++++++++++++++++++++- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/mlflow/store/file_store.py b/mlflow/store/file_store.py index c0712a8a9fbb1..522f7ef99f58e 100644 --- a/mlflow/store/file_store.py +++ b/mlflow/store/file_store.py @@ -252,12 +252,18 @@ def rename_experiment(self, experiment_id, new_name): def delete_run(self, run_id): run_info = self._get_run_info(run_id) + if run_info is None: + raise MlflowException("Run '%s' metadata is in invalid state." % run_id, + databricks_pb2.INVALID_STATE) check_run_is_active(run_info) new_info = run_info._copy_with_overrides(lifecycle_stage=RunInfo.DELETED_LIFECYCLE) self._overwrite_run_info(new_info) def restore_run(self, run_id): run_info = self._get_run_info(run_id) + if run_info is None: + raise MlflowException("Run '%s' metadata is in invalid state." % run_id, + databricks_pb2.INVALID_STATE) check_run_is_deleted(run_info) new_info = run_info._copy_with_overrides(lifecycle_stage=RunInfo.ACTIVE_LIFECYCLE) self._overwrite_run_info(new_info) @@ -279,8 +285,8 @@ def _find_run_root(self, run_uuid): runs = find(experiment_dir, run_uuid, full_path=True) if len(runs) == 0: continue - return runs[0] - return None + return os.path.basename(os.path.abspath(experiment_dir)), runs[0] + return None, None def update_run_info(self, run_uuid, run_status, end_time): _validate_run_id(run_uuid) @@ -342,6 +348,9 @@ def get_run(self, run_uuid): """ _validate_run_id(run_uuid) run_info = self._get_run_info(run_uuid) + if run_info is None: + raise MlflowException("Run '%s' metadata is in invalid state." % run_uuid, + databricks_pb2.INVALID_STATE) metrics = self.get_all_metrics(run_uuid) params = self.get_all_params(run_uuid) tags = self.get_all_tags(run_uuid) @@ -351,15 +360,26 @@ def _get_run_info(self, run_uuid): """ Will get both active and deleted runs. """ - run_dir = self._find_run_root(run_uuid) - if run_dir is not None: - meta = read_yaml(run_dir, FileStore.META_DATA_FILE_NAME) - return _read_persisted_run_info_dict(meta) - raise MlflowException("Run '%s' not found" % run_uuid, - databricks_pb2.RESOURCE_DOES_NOT_EXIST) + exp_id, run_dir = self._find_run_root(run_uuid) + if run_dir is None: + raise MlflowException("Run '%s' not found" % run_uuid, + databricks_pb2.RESOURCE_DOES_NOT_EXIST) + + meta = read_yaml(run_dir, FileStore.META_DATA_FILE_NAME) + run_info = _read_persisted_run_info_dict(meta) + if str(run_info.experiment_id) != str(exp_id): + logging.warning("Wrong experiment ID (%s) recorded for run '%s'. It should be %s. " + "Run will be ignored.", str(run_info.experiment_id), + str(run_info.run_uuid), str(exp_id), exc_info=True) + return None + return run_info def _get_run_files(self, run_uuid, resource_type): _validate_run_id(run_uuid) + run_info = self._get_run_info(run_uuid) + if run_info is None: + raise MlflowException("Run '%s' metadata is in invalid state." % run_uuid, + databricks_pb2.INVALID_STATE) if resource_type == "metric": subfolder_name = FileStore.METRICS_FOLDER_NAME elif resource_type == "param": @@ -368,10 +388,8 @@ def _get_run_files(self, run_uuid, resource_type): subfolder_name = FileStore.TAGS_FOLDER_NAME else: raise Exception("Looking for unknown resource under run.") - run_dir = self._find_run_root(run_uuid) - if run_dir is None: - raise MlflowException("Run '%s' not found" % run_uuid, - databricks_pb2.RESOURCE_DOES_NOT_EXIST) + _, run_dir = self._find_run_root(run_uuid) + # run_dir exists since run validity has been confirmed above. source_dirs = find(run_dir, subfolder_name, full_path=True) if len(source_dirs) == 0: return run_dir, [] @@ -484,6 +502,8 @@ def _list_run_infos(self, experiment_id, view_type): try: # trap and warn known issues, will raise unexpected exceptions to caller run_info = self._get_run_info(r_id) + if run_info is None: + continue if self._lifecycle_stage_valid_for_view_type(view_type, run_info.lifecycle_stage): run_infos.append(run_info) except MissingConfigException as rnfe: diff --git a/tests/store/test_file_store.py b/tests/store/test_file_store.py index 929b47d256c44..2bd8f9ec9202e 100644 --- a/tests/store/test_file_store.py +++ b/tests/store/test_file_store.py @@ -12,7 +12,7 @@ from mlflow.entities import Experiment, Metric, Param, RunTag, ViewType, RunInfo from mlflow.exceptions import MlflowException, MissingConfigException from mlflow.store.file_store import FileStore -from mlflow.utils.file_utils import write_yaml +from mlflow.utils.file_utils import write_yaml, read_yaml from mlflow.utils.mlflow_tags import MLFLOW_PARENT_RUN_ID from tests.helper_functions import random_int, random_str @@ -523,3 +523,29 @@ def test_mismatching_experiment_id(self): fs.get_experiment(target) assert e.message.contains("does not exist") assert len(fs.list_experiments(ViewType.ALL)) == experiments - 1 + + def test_bad_experiment_id_recorded_for_run(self): + fs = FileStore(self.test_root) + exp_0 = fs.get_experiment(Experiment.DEFAULT_EXPERIMENT_ID) + all_runs = fs.search_runs([exp_0.experiment_id], [], run_view_type=ViewType.ALL) + + all_run_ids = self.exp_data[exp_0.experiment_id]["runs"] + assert len(all_runs) == len(all_run_ids) + + # change experiment pointer in run + bad_run_id = str(self.exp_data[exp_0.experiment_id]['runs'][0]) + path = os.path.join(self.test_root, str(exp_0.experiment_id), bad_run_id) + experiment_data = read_yaml(path, "meta.yaml") + experiment_data["experiment_id"] = 1 + write_yaml(path, "meta.yaml", experiment_data, True) + + with pytest.raises(MlflowException) as e: + fs.get_run(bad_run_id) + assert e.message.contains("not found") + + valid_runs = fs.search_runs([exp_0.experiment_id], [], run_view_type=ViewType.ALL) + assert len(valid_runs) == len(all_runs) - 1 + + for rid in all_run_ids: + if rid != bad_run_id: + fs.get_run(rid) From 2ffddd603ba87e4fab8fe6d427be16fb0a0961da Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Tue, 23 Oct 2018 12:01:49 -0700 Subject: [PATCH 024/483] Add support for optional cloudpickle serialization to sklearn module (#653) * Cloudpickle support * Convert test to pytest * Cloudpickle support * Linter * Explanatory comment * Address comments * Example fix * lint fix * Add cloudpickle as test dependency --- mlflow/sklearn.py | 88 +++++++-- test-requirements.txt | 3 +- tests/sklearn/test_sklearn_model_export.py | 213 ++++++++++++++------- 3 files changed, 222 insertions(+), 82 deletions(-) diff --git a/mlflow/sklearn.py b/mlflow/sklearn.py index c5beac6b64975..f220f67619d50 100644 --- a/mlflow/sklearn.py +++ b/mlflow/sklearn.py @@ -23,11 +23,22 @@ from mlflow.utils import cli_args from mlflow import pyfunc +from mlflow.exceptions import MlflowException from mlflow.models import Model +from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE, INTERNAL_ERROR import mlflow.tracking +SERIALIZATION_FORMAT_PICKLE = "pickle" +SERIALIZATION_FORMAT_CLOUDPICKLE = "cloudpickle" -def save_model(sk_model, path, conda_env=None, mlflow_model=Model()): +SUPPORTED_SERIALIZATION_FORMATS = [ + SERIALIZATION_FORMAT_PICKLE, + SERIALIZATION_FORMAT_CLOUDPICKLE +] + + +def save_model(sk_model, path, conda_env=None, mlflow_model=Model(), + serialization_format=SERIALIZATION_FORMAT_CLOUDPICKLE): """ Save a scikit-learn model to a path on the local file system. @@ -37,36 +48,61 @@ def save_model(sk_model, path, conda_env=None, mlflow_model=Model()): this model should be run in. At minimum, it should specify python, scikit-learn, and mlflow with appropriate versions. :param mlflow_model: :py:mod:`mlflow.models.Model` this flavor is being added to. - + :param serialization_format: The format in which to serialize the model. This should be one of + the formats listed in + `mlflow.sklearn.SUPPORTED_SERIALIZATION_FORMATS`. The Cloudpickle + format, `mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE`, provides + better cross-system compatibility by identifying and packaging + code dependencies with the serialized model. >>> import mlflow.sklearn >>> from sklearn.datasets import load_iris >>> from sklearn import tree >>> iris = load_iris() >>> sk_model = tree.DecisionTreeClassifier() >>> sk_model = sk_model.fit(iris.data, iris.target) + >>> #Save the model in cloudpickle format >>> #set path to location for persistence - >>> sk_path_dir = ... - >>> mlflow.sklearn.save_model(sk_model, sk_path_dir) + >>> sk_path_dir_1 = ... + >>> mlflow.sklearn.save_model( + >>> sk_model, sk_path_dir_1, + >>> serialization_format=mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE) + >>> + >>> #Save the model in pickle format + >>> #set path to location for persistence + >>> sk_path_dir_2 = ... + >>> mlflow.sklearn.save_model(sk_model, sk_path_dir_2, + >>> serialization_format=mlflow.sklearn.SERIALIZATION_FORMAT_PICKLE) """ + if serialization_format not in SUPPORTED_SERIALIZATION_FORMATS: + raise MlflowException( + message=( + "Unrecognized serialization format: {serialization_format}. Please specify one" + " of the following supported formats: {supported_formats}.".format( + serialization_format=serialization_format, + supported_formats=SUPPORTED_SERIALIZATION_FORMATS)), + error_code=INVALID_PARAMETER_VALUE) + if os.path.exists(path): raise Exception("Path '{}' already exists".format(path)) os.makedirs(path) - model_file = os.path.join(path, "model.pkl") - with open(model_file, "wb") as out: - pickle.dump(sk_model, out) + model_data_subpath = "model.pkl" + _save_model(sk_model=sk_model, output_path=os.path.join(path, model_data_subpath), + serialization_format=serialization_format) model_conda_env = None if conda_env: model_conda_env = os.path.basename(os.path.abspath(conda_env)) shutil.copyfile(conda_env, os.path.join(path, model_conda_env)) - pyfunc.add_to_model(mlflow_model, loader_module="mlflow.sklearn", data="model.pkl", + pyfunc.add_to_model(mlflow_model, loader_module="mlflow.sklearn", data=model_data_subpath, env=model_conda_env) mlflow_model.add_flavor("sklearn", - pickled_model="model.pkl", - sklearn_version=sklearn.__version__) + pickled_model=model_data_subpath, + sklearn_version=sklearn.__version__, + serialization_format=serialization_format) mlflow_model.save(os.path.join(path, "MLmodel")) -def log_model(sk_model, artifact_path, conda_env=None): +def log_model(sk_model, artifact_path, conda_env=None, + serialization_format=SERIALIZATION_FORMAT_PICKLE): """ Log a scikit-learn model as an MLflow artifact for the current run. @@ -75,6 +111,9 @@ def log_model(sk_model, artifact_path, conda_env=None): :param conda_env: Path to a Conda environment file. If provided, this decribes the environment this model should be run in. At minimum, it should specify python, scikit-learn, and mlflow with appropriate versions. + :param serialization_format: The format in which to serialize the model. This should be one of + the following: `mlflow.sklearn.SERIALIZATION_FORMAT_PICKLE`, + `mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE`. >>> import mlflow >>> import mlflow.sklearn @@ -93,7 +132,8 @@ def log_model(sk_model, artifact_path, conda_env=None): return Model.log(artifact_path=artifact_path, flavor=mlflow.sklearn, sk_model=sk_model, - conda_env=conda_env) + conda_env=conda_env, + serialization_format=serialization_format) def _load_model_from_local_file(path): @@ -103,6 +143,9 @@ def _load_model_from_local_file(path): assert "sklearn" in model.flavors params = model.flavors["sklearn"] with open(os.path.join(path, params["pickled_model"]), "rb") as f: + # Models serialized with Cloudpickle can be deserialized using Pickle; in fact, + # Cloudpickle.load() is just a redefinition of pickle.load(). Therefore, we do + # not need to check the serialization format of the model before deserializing. return pickle.load(f) @@ -114,6 +157,27 @@ def _load_pyfunc(path): return pickle.load(f) +def _save_model(sk_model, output_path, serialization_format): + """ + :param sk_model: The Scikit-learn model to serialize. + :param output_path: The file path to which to write the serialized model. + :param serialization_format: The format in which to serialize the model. This should be one of + the following: `mlflow.sklearn.SERIALIZATION_FORMAT_PICKLE`, + `mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE`. + """ + with open(output_path, "wb") as out: + if serialization_format == SERIALIZATION_FORMAT_PICKLE: + pickle.dump(sk_model, out) + elif serialization_format == SERIALIZATION_FORMAT_CLOUDPICKLE: + import cloudpickle + cloudpickle.dump(sk_model, out) + else: + raise MlflowException( + message="Unrecognized serialization format: {serialization_format}".format( + serialization_format=serialization_format), + error_code=INTERNAL_ERROR) + + def load_model(path, run_id=None): """ Load a scikit-learn model from a local file (if ``run_id`` is None) or a run. diff --git a/test-requirements.txt b/test-requirements.txt index 68f4e43891a36..fd80a0a06ff5e 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -20,4 +20,5 @@ torch torchvision pysftp keras -attrdict==2.0.0 +cloudpickle +attrdict==2.0.0 \ No newline at end of file diff --git a/tests/sklearn/test_sklearn_model_export.py b/tests/sklearn/test_sklearn_model_export.py index 44306deab4f94..ba8dc158ac914 100644 --- a/tests/sklearn/test_sklearn_model_export.py +++ b/tests/sklearn/test_sklearn_model_export.py @@ -1,86 +1,161 @@ from __future__ import print_function +import sys import os import pickle -import tempfile -import unittest +import pytest +from collections import namedtuple import numpy as np import sklearn.datasets as datasets import sklearn.linear_model as glm import sklearn.neighbors as knn +from sklearn.pipeline import Pipeline as SKPipeline +from sklearn.preprocessing import FunctionTransformer as SKFunctionTransformer -from mlflow import sklearn, pyfunc -import mlflow +import mlflow.sklearn +from mlflow import pyfunc +from mlflow.exceptions import MlflowException +from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE from mlflow.models import Model from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils.file_utils import TempDir from mlflow.utils.environment import _mlflow_conda_env -def _load_pyfunc(path): - with open(path, "rb") as f: - return pickle.load(f) - - -class TestModelExport(unittest.TestCase): - def setUp(self): - self._tmp = tempfile.mkdtemp() - iris = datasets.load_iris() - self._X = iris.data[:, :2] # we only take the first two features. - self._y = iris.target - self._knn = knn.KNeighborsClassifier() - self._knn.fit(self._X, self._y) - self._knn_predict = self._knn.predict(self._X) - self._linear_lr = glm.LogisticRegression() - self._linear_lr.fit(self._X, self._y) - self._linear_lr_predict = self._linear_lr.predict(self._X) - - def test_model_save_load(self): - with TempDir(chdr=True, remove_on_exit=True) as tmp: - model_path = tmp.path("knn.pkl") - with open(model_path, "wb") as f: - pickle.dump(self._knn, f) - path = tmp.path("knn") - sklearn.save_model(self._knn, path=path) - x = sklearn.load_model(path) - xpred = x.predict(self._X) - np.testing.assert_array_equal(self._knn_predict, xpred) - # sklearn should also be stored as a valid pyfunc model - # test pyfunc compatibility - y = pyfunc.load_pyfunc(path) - ypred = y.predict(self._X) - np.testing.assert_array_equal(self._knn_predict, ypred) - - def test_model_log(self): - old_uri = mlflow.get_tracking_uri() - # should_start_run tests whether or not calling log_model() automatically starts a run. +ModelWithData = namedtuple("ModelWithData", ["model", "inference_data"]) + + +@pytest.fixture(scope="session") +def sklearn_knn_model(): + iris = datasets.load_iris() + X = iris.data[:, :2] # we only take the first two features. + y = iris.target + knn_model = knn.KNeighborsClassifier() + knn_model.fit(X, y) + return ModelWithData(model=knn_model, inference_data=X) + + +@pytest.fixture(scope="session") +def sklearn_logreg_model(): + iris = datasets.load_iris() + X = iris.data[:, :2] # we only take the first two features. + y = iris.target + linear_lr = glm.LogisticRegression() + linear_lr.fit(X, y) + return ModelWithData(model=linear_lr, inference_data=X) + + +@pytest.fixture(scope="session") +def sklearn_custom_transformer_model(sklearn_knn_model): + def transform(vec): + print("Invoking custom transformer!") + return vec + 1 + + transformer = SKFunctionTransformer(transform, validate=True) + pipeline = SKPipeline([("custom_transformer", transformer), ("knn", sklearn_knn_model.model)]) + return ModelWithData(pipeline, inference_data=datasets.load_iris().data[:, :2]) + + +@pytest.fixture +def model_path(tmpdir): + return os.path.join(str(tmpdir), "model") + + +def test_model_save_load(sklearn_knn_model, model_path): + knn_model = sklearn_knn_model.model + + mlflow.sklearn.save_model(sk_model=knn_model, path=model_path) + reloaded_knn_model = mlflow.sklearn.load_model(path=model_path) + reloaded_knn_pyfunc = pyfunc.load_pyfunc(path=model_path) + + np.testing.assert_array_equal( + knn_model.predict(sklearn_knn_model.inference_data), + reloaded_knn_model.predict(sklearn_knn_model.inference_data)) + + np.testing.assert_array_equal( + reloaded_knn_model.predict(sklearn_knn_model.inference_data), + reloaded_knn_pyfunc.predict(sklearn_knn_model.inference_data)) + + +def test_model_log(sklearn_logreg_model, model_path): + old_uri = mlflow.get_tracking_uri() + with TempDir(chdr=True, remove_on_exit=True) as tmp: for should_start_run in [False, True]: - with TempDir(chdr=True, remove_on_exit=True) as tmp: - try: - mlflow.set_tracking_uri("test") - if should_start_run: - mlflow.start_run() - artifact_path = "linear" - conda_env = os.path.join(tmp.path(), "conda_env.yaml") - _mlflow_conda_env(conda_env, additional_pip_deps=["sklearn"]) - sklearn.log_model(sk_model=self._linear_lr, - artifact_path=artifact_path, - conda_env=conda_env) - x = sklearn.load_model(artifact_path, run_id=mlflow.active_run().info.run_uuid) - model_path = _get_model_log_dir( - artifact_path, mlflow.active_run().info.run_uuid) - model_config = Model.load(os.path.join(model_path, "MLmodel")) - assert pyfunc.FLAVOR_NAME in model_config.flavors - assert pyfunc.ENV in model_config.flavors[pyfunc.FLAVOR_NAME] - env_path = model_config.flavors[pyfunc.FLAVOR_NAME][pyfunc.ENV] - assert os.path.exists(os.path.join(model_path, env_path)) - xpred = x.predict(self._X) - np.testing.assert_array_equal(self._linear_lr_predict, xpred) - finally: - mlflow.end_run() - mlflow.set_tracking_uri(old_uri) - - -if __name__ == '__main__': - unittest.main() + try: + mlflow.set_tracking_uri("test") + if should_start_run: + mlflow.start_run() + + artifact_path = "linear" + conda_env = os.path.join(tmp.path(), "conda_env.yaml") + _mlflow_conda_env(conda_env, additional_pip_deps=["sklearn"]) + + mlflow.sklearn.log_model( + sk_model=sklearn_logreg_model.model, + artifact_path=artifact_path, + conda_env=conda_env) + run_id = mlflow.active_run().info.run_uuid + + reloaded_logreg_model = mlflow.sklearn.load_model(artifact_path, run_id) + np.testing.assert_array_equal( + sklearn_logreg_model.model.predict(sklearn_logreg_model.inference_data), + reloaded_logreg_model.predict(sklearn_logreg_model.inference_data)) + + model_path = _get_model_log_dir( + artifact_path, + run_id=run_id) + model_config = Model.load(os.path.join(model_path, "MLmodel")) + assert pyfunc.FLAVOR_NAME in model_config.flavors + assert pyfunc.ENV in model_config.flavors[pyfunc.FLAVOR_NAME] + env_path = model_config.flavors[pyfunc.FLAVOR_NAME][pyfunc.ENV] + assert os.path.exists(os.path.join(model_path, env_path)) + + finally: + mlflow.end_run() + mlflow.set_tracking_uri(old_uri) + + +def test_custom_transformer_can_be_saved_and_loaded_with_cloudpickle_format( + sklearn_custom_transformer_model, tmpdir): + custom_transformer_model = sklearn_custom_transformer_model.model + + # Because the model contains a customer transformer that is not defined at the top level of the + # current test module, we expect pickle to fail when attempting to serialize it. In contrast, + # we expect cloudpickle to successfully locate the transformer definition and serialize the + # model successfully. + if sys.version_info >= (3, 0): + expect_exception_context = pytest.raises(AttributeError) + else: + expect_exception_context = pytest.raises(pickle.PicklingError) + with expect_exception_context: + pickle_format_model_path = os.path.join(str(tmpdir), "pickle_model") + mlflow.sklearn.save_model(sk_model=custom_transformer_model, + path=pickle_format_model_path, + serialization_format=mlflow.sklearn.SERIALIZATION_FORMAT_PICKLE) + + cloudpickle_format_model_path = os.path.join(str(tmpdir), "cloud_pickle_model") + mlflow.sklearn.save_model(sk_model=custom_transformer_model, + path=cloudpickle_format_model_path, + serialization_format=mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE) + + reloaded_custom_transformer_model = mlflow.sklearn.load_model( + path=cloudpickle_format_model_path) + + np.testing.assert_array_equal( + custom_transformer_model.predict(sklearn_custom_transformer_model.inference_data), + reloaded_custom_transformer_model.predict( + sklearn_custom_transformer_model.inference_data)) + + +def test_save_model_throws_exception_if_serialization_format_is_unrecognized( + sklearn_knn_model, model_path): + with pytest.raises(MlflowException) as exc: + mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path, + serialization_format="not a valid format") + + # The unsupported serialization format should have been detected prior to the execution of + # any directory creation or state-mutating persistence logic that would prevent a second + # serialization call with the same model path from succeeding + assert not os.path.exists(model_path) + mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path) From 45998776057758b3387b0d30eeea75bb1c4045e6 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Wed, 24 Oct 2018 13:56:21 -0700 Subject: [PATCH 025/483] Model deployment: Support for Azure ML SDK (#631) * Build image command * Remove deploy method * fixes * Mlflow_home support * Working * Tags updates * Docs * Docs, rename * Lint * unasterisk doc * Register model * Register model fixes * Py27 support progress * Py27 progress 2 * Remove py27 * CLI, documentation, tagging fixes * Tests * Fixes * Docs fix * Test import fix * small tweaks * Appease linter * Revert version * Py2 fix * Lints * Add py version validation * Test py version * Add CLI tests * Docs updates * Lint * Add azureml-sdk to test requirements * Add run() method test * explanatory comment * Lint * Make CLI available to python2 * Lint * Small simplification * Add clarity to usage example in docs, print build status uri * fixes * curl example in docs, remove init main * Example doc * Tempfile comment * Comment adjust * Lint * Use copy project * Get scoring uri in example * Added dev check * Lint * fix underline length * Space docs * Address comments * Fix tests * Test utils for unique resource id * Progress on conda mock test * Address comments * Add example * Lint fix * Rename variable to run_relative_model_path and add comment * Add clarity to tagged model path * Only install azureml-sdk as a test dependency for python3 * Fix lint errors * Only run azure tests in py3 * Fix lint errors --- docs/source/models.rst | 158 ++++++--- mlflow/azureml/__init__.py | 354 ++++++++++++++----- mlflow/azureml/cli.py | 78 ++-- mlflow/cli.py | 2 +- mlflow/sagemaker/__init__.py | 30 +- mlflow/utils/__init__.py | 30 ++ test-requirements.txt | 3 +- tests/azureml/test_image_creation.py | 508 +++++++++++++++++++++++++++ tests/azureml/test_model_export.py | 66 ---- tests/utils/test_utils.py | 17 + 10 files changed, 985 insertions(+), 261 deletions(-) create mode 100644 tests/azureml/test_image_creation.py delete mode 100644 tests/azureml/test_model_export.py create mode 100644 tests/utils/test_utils.py diff --git a/docs/source/models.rst b/docs/source/models.rst index 41d7739056d50..0654b37335837 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -5,7 +5,7 @@ MLflow Models An MLflow Model is a standard format for packaging machine learning models that can be used in a variety of downstream tools---for example, real-time serving through a REST API or batch inference -on Apache Spark. The format defines a convention that lets you save a model in different "flavors" +on Apache Spark. The format defines a convention that lets you save a model in different "flavors" that can be understood by different downstream tools. .. contents:: Table of Contents @@ -162,9 +162,9 @@ A ``python_function`` model directory must contain an ``MLmodel`` file in its ro .. code:: bash tree example/sklearn_iris/mlruns/run1/outputs/linear-lr - + :: - + ├── MLmodel ├── code │   ├── sklearn_iris.py @@ -176,9 +176,9 @@ A ``python_function`` model directory must contain an ``MLmodel`` file in its ro .. code:: bash cat example/sklearn_iris/mlruns/run1/outputs/linear-lr/MLmodel - + :: - + python_function: code: code data: data/model.pkl @@ -215,7 +215,7 @@ Scikit-learn (``sklearn``) The ``sklearn`` model flavor provides an easy to use interface for handling scikit-learn models with no external dependencies. It saves and loads models using Python's pickle module and also generates a valid -``python_function`` flavor model. For more information, see :py:mod:`mlflow.sklearn`. +``python_function`` flavor model. For more information, see :py:mod:`mlflow.sklearn`. Spark MLlib (``spark``) @@ -244,7 +244,7 @@ Built-In Deployment Tools ------------------------- MLflow provides tools for deploying models on a local machine and to several production environments. -Not all deployment methods are available for all model flavors. Deployment is supported for the +Not all deployment methods are available for all model flavors. Deployment is supported for the Python Function format and all compatible formats. Deploy a ``python_function`` model as a local REST API endpoint @@ -266,60 +266,132 @@ For more info, see: mlflow pyfunc serve --help mlflow pyfunc predict --help -Deploy a ``python_function`` model on Microsoft AzureML -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The :py:mod:`mlflow.azureml` module can export ``python_function`` models as Azure ML models and -directly deploy and serve models on Azure ML, provided the environment has been set up. - -* :py:func:`export ` exports the model as a - directory with the dependencies necessary to deploy the model on Azure ML. +Microsoft Azure ML +^^^^^^^^^^^^^^^^^^ +The :py:mod:`mlflow.azureml` module can package ``python_function`` models into Azure ML container images. +These images can be deployed to Azure Kubernetes Service (AKS) and the Azure Container Instances (ACI) +platform for real-time serving. -* :py:func:`deploy ` deploys the model directly to Azure ML. - You need to set up your environment to work with the Azure ML CLI. You can do this by - starting a shell from the Azure ML Workbench application. You also have to set up all accounts - required to run and deploy on Azure ML. Where the model is deployed is dependent on your - active Azure ML environment. If the active environment is set up for local deployment, the model - is deployed locally in a Docker container (Docker is required). +* :py:func:`build_image ` registers an MLflow model with an existing Azure ML + workspace and builds an Azure ML container image for deployment to AKS and ACI. The `Azure ML SDK`_ is + required in order to use this function. **The Azure ML SDK requires Python 3. It cannot be installed with + earlier versions of Python.** -.. rubric:: Model export example + .. _Azure ML SDK: https://docs.microsoft.com/en-us/python/api/overview/azure/ml/intro?view=azure-ml-py -.. code:: bash - - mlflow azureml export -m -o test-output - tree test-output +.. rubric:: Deployment example (Python API): -:: - - test-output - ├── create_service.sh - use this script to upload the model to Azure ML - ├── score.py - main module required by Azure ML - └── test-output - directory containing MLflow model in Python Function flavor +.. code:: python -.. rubric:: Example workflow using the MLflow CLI + import mlflow.azureml + + from azureml.core import Workspace + from azureml.core.webservice import AciWebservice, Webservice + + + # Create or load an existing Azure ML workspace. You can also load an existing workspace using + # Workspace.get(name="") + workspace_name = "" + subscription_id = "" + resource_group = "" + location = "" + azure_workspace = Workspace.create(name=workspace_name, + subscription_id=subscription_id, + resource_group=resource_group, + location=location, + create_resource_group=True, + exist_okay=True) + + # Build an Azure ML container image for deployment + azure_image, azure_model = mlflow.azureml.build_image(model_path="", + workspace=azure_workspace, + description="Wine regression model 1", + synchronous=True) + # If your image build failed, you can access build logs at the following URI: + print("Access the following URI for build logs: {}".format(azure_image.image_build_log_uri)) + + # Deploy the container image to ACI + webservice_deployment_config = AciWebservice.deploy_configuration() + webservice = Webservice.deploy_from_image( + image=azure_image, workspace=azure_workspace, name="") + webservice.wait_for_deployment() + + # After the image deployment completes, requests can be posted via HTTP to the new ACI + # webservice's scoring URI. The following example posts a sample input from the wine dataset + # used in the MLflow ElasticNet example: + # https://github.com/mlflow/mlflow/tree/master/examples/sklearn_elasticnet_wine + print("Scoring URI is: %s", webservice.scoring_uri) + + import requests + import json + sample_input = { + "residual sugar": {"0": 20.7}, + "alcohol": {"0": 8.8}, + "chlorides": {"0": 0.045}, + "density": {"0": 1.001}, + "sulphates": {"0": 0.45}, + "total sulfur dioxide": {"0": 170.0}, + "fixed acidity": {"0": 7.0}, + "citric acid": {"0": 0.36}, + "pH": {"0": 3.0}, + "volatile acidity": {"0": 0.27}, + "free sulfur dioxide": {"0": 45.0} + } + response = requests.post( + url=webservice.scoring_uri, data=json.dumps(sample_input), + headers={"Content-type": "application/json"}) + response_json = json.loads(response.text) + print(response_json) + +.. rubric:: Deployment example (CLI): .. code:: bash - az ml env set -n -g - set environment to local deployment - mlflow azureml deploy - deploy locally to test the model - az ml env set -n -g - set environment to cluster - mlflow azureml deploy - deploy to the cloud + mlflow azureml build-image -w -m -d "Wine regression model 1" + + az ml service create aci -n --image-id : + + # After the image deployment completes, requests can be posted via HTTP to the new ACI + # webservice's scoring URI. The following example posts a sample input from the wine dataset + # used in the MLflow ElasticNet example: + # https://github.com/mlflow/mlflow/tree/master/examples/sklearn_elasticnet_wine + + scoring_uri=$(az ml service show --name -v | jq -r ".scoringUri") + + sample_input=' + { + "residual sugar": {"0": 20.7}, + "alcohol": {"0": 8.8}, + "chlorides": {"0": 0.045}, + "density": {"0": 1.001}, + "sulphates": {"0": 0.45}, + "total sulfur dioxide": {"0": 170.0}, + "fixed acidity": {"0": 7.0}, + "citric acid": {"0": 0.36}, + "pH": {"0": 3.0}, + "volatile acidity": {"0": 0.27}, + "free sulfur dioxide": {"0": 45.0} + }' + + echo $sample_input | curl -s -X POST $scoring_uri\ + -H 'Cache-Control: no-cache'\ + -H 'Content-Type: application/json'\ + -d @- For more info, see: .. code:: bash mlflow azureml --help - mlflow azureml export --help - mlflow azureml deploy --help + mlflow azureml build-image --help Deploy a ``python_function`` model on Amazon SageMaker ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The :py:mod:`mlflow.sagemaker` module can deploy ``python_function`` models locally in a Docker +The :py:mod:`mlflow.sagemaker` module can deploy ``python_function`` models locally in a Docker container with SageMaker compatible environment and remotely on SageMaker. To deploy remotely to SageMaker you need to set up your environment and user accounts. -To export a custom model to SageMaker, you need a MLflow-compatible Docker image to be available on Amazon ECR. +To export a custom model to SageMaker, you need a MLflow-compatible Docker image to be available on Amazon ECR. MLflow provides a default Docker image definition; however, it is up to you to build the image and upload it to ECR. MLflow includes the utility function ``build_and_push_container`` to perform this step. Once built and uploaded, you can use the MLflow container for all MLflow models. @@ -327,7 +399,7 @@ container for all MLflow models. * :py:func:`run-local ` deploys the model locally in a Docker container. The image and the environment should be identical to how the model would be run remotely and it is therefore useful for testing the model prior to deployment. - + * The :py:func:`build-and-push-container ` CLI command builds an MLfLow Docker image and uploads it to ECR. The caller must have the correct permissions set up. The image is built locally and requires Docker to be present on the machine that performs this step. @@ -358,7 +430,7 @@ For more info, see: Export a ``python_function`` model as an Apache Spark UDF ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -You can output a ``python_function`` model as an Apache Spark UDF, which can be uploaded to a +You can output a ``python_function`` model as an Apache Spark UDF, which can be uploaded to a Spark cluster and used to score the model. .. rubric:: Example diff --git a/mlflow/azureml/__init__.py b/mlflow/azureml/__init__.py index b8752586e4537..df6b0ac946b9d 100644 --- a/mlflow/azureml/__init__.py +++ b/mlflow/azureml/__init__.py @@ -4,135 +4,313 @@ """ from __future__ import print_function - +import sys import os import shutil +import tempfile + +from distutils.version import StrictVersion import mlflow from mlflow import pyfunc +from mlflow.exceptions import MlflowException from mlflow.models import Model +from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils import PYTHON_VERSION, get_unique_resource_id from mlflow.utils.logging_utils import eprint -from mlflow.utils.file_utils import TempDir +from mlflow.utils.file_utils import TempDir, _copy_file_or_tree, _copy_project +from mlflow.utils.environment import _mlflow_conda_env from mlflow.version import VERSION as mlflow_version -def deploy(app_name, model_path, run_id=None, mlflow_home=None): +def build_image(model_path, workspace, run_id=None, image_name=None, model_name=None, + mlflow_home=None, description=None, tags=None, synchronous=True): """ - Deploy an MLflow model to Azure Machine Learning. - - NOTE: - - - This command must be called from a console launched from Azure Machine Learning Workbench. - Caller is reponsible for setting up Azure Machine Learning environment and accounts. + Register an MLflow model with Azure ML and build an Azure ML ContainerImage for deployment. + The resulting image can be deployed as a web service to Azure Container Instances (ACI) or + Azure Kubernetes Service (AKS). - - Azure Machine Learning cannot handle any Conda environment. In particular the Python - version is fixed. If the model contains Conda environment and it has been trained outside - of Azure Machine Learning, the Conda environment might need to be edited to work with - Azure Machine Learning. - - :param app_name: Name of the deployed application. - :param model_path: Local or MLflow-run-relative path to the model to be deployed. + :param model_path: The path to MLflow model for which the image will be built. If a run id + is specified, this is should be a run-relative path. Otherwise, it + should be a local path. :param run_id: MLflow run ID. - :param mlflow_home: Directory containing checkout of the MLflow GitHub project or - current directory if not specified. + :param image_name: The name to assign the Azure Container Image that will be created. If + unspecified, a unique image name will be generated. + :param model_name: The name to assign the Azure Model will be created. If unspecified, + a unique model name will be generated. + :param workspace: The AzureML workspace in which to build the image. This is a + `azureml.core.Workspace` object. + :param mlflow_home: Path to a local copy of the MLflow GitHub repository. If specified, the + image will install MLflow from this directory. Otherwise, it will install + MLflow from pip. + :param description: A string description to associate with the Azure Container Image and the + Azure Model that will be created. For more information, see + ``_ and + ``_. + :param tags: A collection of tags, represented as a dictionary of string key-value pairs, to + associate with the Azure Container Image and the Azure Model that will be created. + These tags will be added to a set of default tags that include the model path, + the model run id (if specified), and more. For more information, see + ``_ and + ``_. + :param synchronous: If `True`, this method will block until the image creation procedure + terminates before returning. If `False`, the method will return immediately, + but the returned image will not be available until the asynchronous + creation process completes. The `azureml.core.Image.wait_for_creation()` + function can be used to wait for the creation process to complete. + :return: A tuple containing the following elements in order: + - An `azureml.core.image.ContainerImage` object containing metadata for the new image. + - An `azureml.core.model.Model` object containing metadata for the new model. + + >>> import mlflow.azureml + >>> from azureml.core import Workspace + >>> from azureml.core.webservice import AciWebservice, Webservice + >>> + >>> # Load or create an Azure ML Workspace + >>> workspace_name = "" + >>> subscription_id = "" + >>> resource_group = "" + >>> location = "" + >>> azure_workspace = Workspace.create(name=workspace_name, + >>> subscription_id=subscription_id, + >>> resource_group=resource_group, + >>> location=location, + >>> create_resource_group=True, + >>> exist_okay=True) + >>> + >>> # Build an Azure ML Container Image for an MLflow model + >>> azure_image, azure_model = mlflow.azureml.build_image( + >>> model_path="", + >>> workspace=azure_workspace, + >>> synchronous=True) + >>> # If your image build failed, you can access build logs at the following URI: + >>> print("Access the following URI for build logs: {}".format(azure_image.image_build_log_uri)) + >>> + >>> # Deploy the image to Azure Container Instances (ACI) for real-time serving + >>> webservice_deployment_config = AciWebservice.deploy_configuration() + >>> webservice = Webservice.deploy_from_image( + >>> image=azure_image, workspace=azure_workspace, name="") + >>> webservice.wait_for_deployment() """ - if run_id: - model_path = _get_model_log_dir(model_path, run_id) - model_path = os.path.abspath(model_path) - with TempDir(chdr=True, remove_on_exit=True): - exec_str = _export(app_name, model_path, mlflow_home=mlflow_home) - eprint("executing", '"{}"'.format(exec_str)) - # Use os.system instead of subprocess due to the fact that currently all azureml commands - # have to be called within the same shell (launched from azureml workbench app by the user). - # We can change this once there is a python api (or general cli) available. - os.system(exec_str) - - -def export(output, model_path, run_id=None, mlflow_home=None): + # The Azure ML SDK is only compatible with Python 3. However, the `mlflow.azureml` module should + # still be accessible for import from Python 2. Therefore, we will only import from the SDK + # upon method invocation. + # pylint: disable=import-error + from azureml.core.image import ContainerImage + from azureml.core.model import Model as AzureModel + + if run_id is not None: + absolute_model_path = _get_model_log_dir(model_name=model_path, run_id=run_id) + else: + absolute_model_path = os.path.abspath(model_path) + + model_pyfunc_conf = _load_pyfunc_conf(model_path=absolute_model_path) + model_python_version = model_pyfunc_conf.get(pyfunc.PY_VERSION, None) + if model_python_version is not None and\ + StrictVersion(model_python_version) < StrictVersion("3.0.0"): + raise MlflowException( + message="Azure ML can only deploy models trained in Python 3 or above!", + error_code=INVALID_PARAMETER_VALUE) + + tags = _build_tags(relative_model_path=model_path, run_id=run_id, + model_python_version=model_python_version, user_tags=tags) + + if image_name is None: + image_name = _get_mlflow_azure_resource_name() + if model_name is None: + model_name = _get_mlflow_azure_resource_name() + + with TempDir(chdr=True) as tmp: + model_directory_path = tmp.path("model") + tmp_model_path = os.path.join( + model_directory_path, + _copy_file_or_tree(src=absolute_model_path, dst=model_directory_path)) + + registered_model = AzureModel.register(workspace=workspace, model_path=tmp_model_path, + model_name=model_name, tags=tags, + description=description) + eprint("Registered an Azure Model with name: `{model_name}` and version:" + " `{model_version}`".format(model_name=registered_model.name, + model_version=registered_model.version)) + + # Create an execution script (entry point) for the image's model server. Azure ML requires + # the container's execution script to be located in the current working directory during + # image creation, so we create the execution script as a temporary file in the current + # working directory. + execution_script_path = tmp.path("execution_script.py") + _create_execution_script(output_path=execution_script_path, azure_model=registered_model) + # Azure ML copies the execution script into the image's application root directory by + # prepending "/var/azureml-app" to the specified script path. The script is then executed + # by referencing its path relative to the "/var/azureml-app" directory. Unfortunately, + # if the script path is an absolute path, Azure ML attempts to reference it directly, + # resulting in a failure. To circumvent this problem, we provide Azure ML with the relative + # script path. Because the execution script was created in the current working directory, + # this relative path is the script path's base name. + execution_script_path = os.path.basename(execution_script_path) + + if mlflow_home is not None: + eprint("Copying the specified mlflow_home directory: `{mlflow_home}` to a temporary" + " location for container creation".format(mlflow_home=mlflow_home)) + mlflow_home = os.path.join(tmp.path(), + _copy_project(src_path=mlflow_home, dst_path=tmp.path())) + image_file_dependencies = [mlflow_home] + else: + image_file_dependencies = None + dockerfile_path = tmp.path("Dockerfile") + _create_dockerfile(output_path=dockerfile_path, mlflow_path=mlflow_home) + + conda_env_path = None + if pyfunc.ENV in model_pyfunc_conf: + conda_env_path = os.path.join(tmp_model_path, model_pyfunc_conf[pyfunc.ENV]) + + image_configuration = ContainerImage.image_configuration( + execution_script=execution_script_path, + runtime="python", + docker_file=dockerfile_path, + dependencies=image_file_dependencies, + conda_file=conda_env_path, + description=description, + tags=tags, + ) + image = ContainerImage.create(workspace=workspace, + name=image_name, + image_config=image_configuration, + models=[registered_model]) + eprint("Building an Azure Container Image with name: `{image_name}` and version:" + " `{image_version}`".format( + image_name=image.name, + image_version=image.version)) + if synchronous: + image.wait_for_creation(show_output=True) + return image, registered_model + + +def _build_tags(relative_model_path, run_id, model_python_version=None, user_tags=None): """ - Export an MLflow model with everything needed to deploy on Azure Machine Learning. - Output includes sh script with command to deploy the generated model to Azure Machine Learning. - - NOTE: - - - This command does not need an Azure Machine Learning environment to run. - - - Azure Machine Learning cannot handle any Conda environment. In particular the Python - version is fixed. If the model contains Conda environment and it has been trained outside - of Azure Machine Learning, the Conda environment might need to be edited to work with - Azure Machine Learning. - - :param output: Output folder where the model is going to be exported to. - :param model_path: Local or MLflow run relative path to the model to be exported. + :param model_path: The path to MLflow model for which the image is being built. If a run id + is specified, this is a run-relative path. Otherwise, it is a local path. :param run_id: MLflow run ID. - :param mlflow_home: Directory containing checkout of the MLflow GitHub project or - current directory if not specified. + :param model_pyfunc_conf: The configuration for the `python_function` flavor within the + specified model's "MLmodel" configuration. + :param user_tags: A collection of user-specified tags to append to the set of default tags. """ - output = os.path.abspath(output) - if os.path.exists(output): - raise Exception("output folder {} already exists".format(output)) - os.mkdir(output) - if run_id: - model_path = _get_model_log_dir(model_path, run_id) - model_path = os.path.abspath(model_path) - curr_dir = os.path.abspath(os.getcwd()) - os.chdir(output) - try: - exec_str = _export("$1", model_path, mlflow_home=mlflow_home) - with open("create_service.sh", "w") as f: - f.write("\n".join(["#! /bin/sh", "cd {}".format(output), exec_str, ""])) - finally: - os.chdir(curr_dir) + tags = dict(user_tags) if user_tags is not None else {} + tags["model_path"] = relative_model_path if run_id is not None\ + else os.path.abspath(relative_model_path) + if run_id is not None: + tags["run_id"] = run_id + if model_python_version is not None: + tags["python_version"] = model_python_version + return tags -def _export(app_name, model_path, mlflow_home): - conf = _load_conf(model_path) - score_py = "score.py" # NOTE: azure ml requires the main module to be in the current directory +def _create_execution_script(output_path, azure_model): + """ + Creates an Azure-compatibele execution script (entry point) for a model server backed by + the specified model. This script is created as a temporary file in the current working + directory. - with open(score_py, "w") as f: - f.write(SCORE_SRC) + :param output_path: The path where the execution script will be written. + :param azure_model: The Azure Model that the execution script will load for inference. + :return: A reference to the temporary file containing the execution script. + """ + execution_script_text = SCORE_SRC.format( + model_name=azure_model.name, model_version=azure_model.version) - deps = "" - mlflow_dep = "mlflow=={}".format(mlflow_version) + with open(output_path, "w") as f: + f.write(execution_script_text) - if mlflow_home: - eprint("MLFLOW_HOME =", mlflow_home) - # copy current version of mlflow - mlflow_dir = mlflow.utils.file_utils._copy_project(src_path=mlflow_home, dst_path="./") - deps = "-d {}".format(mlflow_dir) - mlflow_dep = "-e /var/azureml-app/{}".format(mlflow_dir) - with open("requirements.txt", "w") as f: - f.write(mlflow_dep + "\n") +def _create_dockerfile(output_path, mlflow_path=None): + """ + Creates a Dockerfile containing additional Docker build steps to execute + when building the Azure container image. These build steps perform the following tasks: - shutil.copytree(src=model_path, dst="model") + - Install MLflow + + :param output_path: The path where the Dockerfile will be written. + :param mlflow_path: Path to a local copy of the MLflow GitHub repository. If specified, the + Dockerfile command for MLflow installation will install MLflow from this + directory. Otherwise, it will install MLflow from pip. + """ + docker_cmds = ["RUN pip install azureml-sdk"] + + if mlflow_path is not None: + mlflow_install_cmd = "RUN pip install -e {mlflow_path}".format( + mlflow_path=_get_container_path(mlflow_path)) + elif not mlflow_version.endswith("dev"): + mlflow_install_cmd = "RUN pip install mlflow=={mlflow_version}".format( + mlflow_version=mlflow_version) + else: + raise MlflowException( + "You are running a 'dev' version of MLflow: `{mlflow_version}` that cannot be" + " installed from pip. In order to build a container image, either specify the" + " path to a local copy of the MLflow GitHub repository using the `mlflow_home`" + " parameter or install a release version of MLflow from pip".format( + mlflow_version=mlflow_version)) + docker_cmds.append(mlflow_install_cmd) + + with open(output_path, "w") as f: + f.write("\n".join(docker_cmds)) + + +def _get_container_path(local_path): + """ + Given a local path to a resource, obtains the path at which this resource will exist + when it is copied into the Azure ML container image. + """ + if local_path.startswith("/"): + local_path = local_path[1:] + return os.path.join("/var/azureml-app", local_path) - env = "-c {}".format(os.path.join("model", conf[pyfunc.ENV])) \ - if pyfunc.ENV in conf else "" - cmd = "az ml service create realtime -n {name} " + \ - "--model-file model -f score.py {conda_env} {deps} -r python -p requirements.txt" - return cmd.format(name=app_name, conda_env=env, deps=deps) +def _load_pyfunc_conf(model_path): + """ + Loads the `python_function` flavor configuration for the specified model or throws an exception + if the model does not contain the `python_function` flavor. -def _load_conf(path): - path = os.path.abspath(path) - model = Model.load(os.path.join(path, "MLmodel")) + :param model_path: The absolute path to the model. + :return: The model's `python_function` flavor configuration. + """ + model_path = os.path.abspath(model_path) + model = Model.load(os.path.join(model_path, "MLmodel")) if pyfunc.FLAVOR_NAME not in model.flavors: - raise Exception("Supports only pyfunc format.") + raise MlflowException( + message=("The specified model does not contain the `python_function` flavor. This " + " flavor is required for model deployment required for model deployment."), + error_code=INVALID_PARAMETER_VALUE) return model.flavors[pyfunc.FLAVOR_NAME] +def _get_mlflow_azure_resource_name(): + """ + :return: A unique name for an Azure resource indicating that the resource was created by + MLflow + """ + azureml_max_resource_length = 32 + resource_prefix = "mlflow-" + unique_id = get_unique_resource_id( + max_length=(azureml_max_resource_length - len(resource_prefix))) + return resource_prefix + unique_id + + SCORE_SRC = """ import pandas as pd +from azureml.core.model import Model from mlflow.pyfunc import load_pyfunc from mlflow.utils import get_jsonable_obj def init(): global model - model = load_pyfunc("model") + model_path = Model.get_model_path(model_name="{model_name}", version={model_version}) + model = load_pyfunc(model_path) def run(s): diff --git a/mlflow/azureml/cli.py b/mlflow/azureml/cli.py index 9d327d6931c9f..7f4dc37735b1b 100644 --- a/mlflow/azureml/cli.py +++ b/mlflow/azureml/cli.py @@ -3,20 +3,18 @@ """ from __future__ import print_function -import os +import json import click -import mlflow import mlflow.azureml - from mlflow.utils import cli_args @click.group("azureml") def commands(): """ - Serve models on Azure ML. + Serve models on Azure ML. **These commands require that MLflow be installed with Python 3.** To serve a model associated with a run on a tracking server, set the MLFLOW_TRACKING_URI environment variable to the URL of the desired server. @@ -24,42 +22,46 @@ def commands(): pass -@commands.command("deploy") -@click.option("--app-name", "-n", default=None, - help="The application name under which should this model be deployed. " - "Translates to service name on Azure ML", required=True) +@commands.command("build-image") @cli_args.MODEL_PATH +@click.option("--workspace-name", "-w", required=True, + help="The name of the Azure Workspace in which to build the image.") +@click.option("--subscription-id", "-s", default=None, + help=("The subscription id associated with the Azure Workspace in which to build" + " the image")) @cli_args.RUN_ID +@click.option("--image-name", "-i", default=None, + help=("The name to assign the Azure Container Image that is created. If unspecified," + " a unique image name will be generated.")) +@click.option("--model-name", "-n", default=None, + help=("The name to assign the Azure Model that is created. If unspecified," + " a unique image name will be generated.")) @cli_args.MLFLOW_HOME -def deploy(app_name, model_path, run_id, mlflow_home): - """Deploy MLflow model to Azure ML. - - NOTE: This command must be run from console launched from Azure ML Workbench. - Caller is reponsible for setting up Azure ML environment and accounts. - - NOTE: Azure ML cannot handle any Conda environment. In particular the Python version is - fixed. If the model contains Conda environment and it has been trained outside of Azure - ML, the Conda environment might need to be edited to work with Azure ML. +@click.option("--description", "-d", default=None, + help=("A string description to associate with the Azure Container Image and the" + " Azure Model that are created.")) +@click.option("--tags", "-t", default=None, + help=("A collection of tags, represented as a JSON-formatted dictionary of string" + " key-value pairs, to associate with the Azure Container Image and the Azure" + " Model that are created. These tags will be added to a set of default tags" + " that include the model path, the model run id (if specified), and more.")) +def build_image(model_path, workspace_name, subscription_id, run_id, image_name, model_name, + mlflow_home, description, tags): """ - mlflow.azureml.deploy(app_name=app_name, model_path=model_path, run_id=run_id, - mlflow_home=os.path.abspath(mlflow_home) if mlflow_home else None) - - -@commands.command("export") -@click.option("--output", "-o", default=None, help="Output directory.", required=True) -@cli_args.MODEL_PATH -@cli_args.RUN_ID -@cli_args.MLFLOW_HOME -def export(output, model_path, run_id, mlflow_home): - """Export MLflow model as Azure ML compatible model ready to be deployed. - - Export MLflow model with everything needed to deploy on Azure ML. - Output includes sh script with command to deploy the generated model to Azure ML. - - NOTE: This command does not need Azure ML environment to run. - - NOTE: Azure ML can not handle any Conda environment. If the model contains Conda environment - and it has been trained outside of Azure ML, the Conda environment might need to be edited. + Register an MLflow model with Azure ML and build an Azure ML ContainerImage for deployment. + The resulting image can be deployed as a web service to Azure Container Instances (ACI) or + Azure Kubernetes Service (AKS). """ - mlflow.azureml.export(output=output, model_path=model_path, run_id=run_id, - mlflow_home=os.path.abspath(mlflow_home) if mlflow_home else None) + # The Azure ML SDK is only compatible with Python 3. However, this CLI should still be + # accessible for inspection rom Python 2. Therefore, we will only import from the SDK + # upon command invocation. + # pylint: disable=import-error + from azureml.core import Workspace + + workspace = Workspace.get(name=workspace_name, subscription_id=subscription_id) + if tags is not None: + tags = json.loads(tags) + mlflow.azureml.build_image( + model_path=model_path, workspace=workspace, run_id=run_id, image_name=image_name, + model_name=model_name, mlflow_home=mlflow_home, description=description, tags=tags, + synchronous=True) diff --git a/mlflow/cli.py b/mlflow/cli.py index 9a0169a552e40..5eb58d5fd256b 100644 --- a/mlflow/cli.py +++ b/mlflow/cli.py @@ -200,9 +200,9 @@ def server(file_store, default_artifact_root, host, port, workers, static_prefix cli.add_command(mlflow.pyfunc.cli.commands) cli.add_command(mlflow.rfunc.cli.commands) cli.add_command(mlflow.sagemaker.cli.commands) -cli.add_command(mlflow.azureml.cli.commands) cli.add_command(mlflow.experiments.commands) cli.add_command(mlflow.store.cli.commands) +cli.add_command(mlflow.azureml.cli.commands) if __name__ == '__main__': cli() diff --git a/mlflow/sagemaker/__init__.py b/mlflow/sagemaker/__init__.py index 103e388be9954..f9ad856ffda9e 100644 --- a/mlflow/sagemaker/__init__.py +++ b/mlflow/sagemaker/__init__.py @@ -19,6 +19,7 @@ from mlflow import pyfunc, mleap from mlflow.models import Model from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils import get_unique_resource_id from mlflow.utils.logging_utils import eprint from mlflow.utils.file_utils import TempDir, _copy_project from mlflow.sagemaker.container import SUPPORTED_FLAVORS as SUPPORTED_DEPLOYMENT_FLAVORS @@ -112,8 +113,9 @@ def build_image(name=DEFAULT_IMAGE_NAME, mlflow_home=None): The image is built locally and it requires Docker to run. :param name: Docker image name. - :param mlflow_home: Directory containing checkout of the MLflow GitHub project or - current directory if not specified. + :param mlflow_home: Path to a local copy of the MLflow GitHub repository. If specified, the + image will install MLflow from this directory. Otherwise, it will install + MLflow from pip. """ with TempDir() as tmp: cwd = tmp.path() @@ -617,32 +619,12 @@ def _deploy(role, image_url, app_name, model_s3_path, run_id, region_name, mode, sage_client=sage_client) -def _get_sagemaker_resource_unique_id(): - """ - :return: A unique identifier that can be appended to a user-readable resource name to avoid - naming collisions. - """ - uuid_bytes = uuid.uuid4().bytes - # Use base64 encoding to shorten the UUID length. Note that the replacement of the - # unsupported '+' symbol maintains uniqueness because the UUID byte string is of a fixed, - # 32-byte length - uuid_b64 = base64.b64encode(uuid_bytes) - if sys.version_info >= (3, 0): - # In Python3, `uuid_b64` is a `bytes` object. It needs to be - # converted to a string - uuid_b64 = uuid_b64.decode("ascii") - uuid_b64 = uuid_b64.rstrip('=\n').replace("/", "-").replace("+", "AB") - return uuid_b64 - - def _get_sagemaker_model_name(endpoint_name): - unique_id = _get_sagemaker_resource_unique_id() - return "{en}-model-{uid}".format(en=endpoint_name, uid=unique_id) + return "{en}-model-{uid}".format(en=endpoint_name, uid=get_unique_resource_id()) def _get_sagemaker_config_name(endpoint_name): - unique_id = _get_sagemaker_resource_unique_id() - return "{en}-config-{uid}".format(en=endpoint_name, uid=unique_id) + return "{en}-config-{uid}".format(en=endpoint_name, uid=get_unique_resource_id()) def _create_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, flavor, diff --git a/mlflow/utils/__init__.py b/mlflow/utils/__init__.py index 77aa71ee997e9..ce1f55f20a1fd 100644 --- a/mlflow/utils/__init__.py +++ b/mlflow/utils/__init__.py @@ -40,3 +40,33 @@ def get_jsonable_obj(data): def get_major_minor_py_version(py_version): return ".".join(py_version.split(".")[:2]) + + +def get_unique_resource_id(max_length=None): + """ + Obtains a unique id that can be included in a resource name. This unique id is a valid + DNS subname. + + :param max_length: The maximum length of the identifier + :return: A unique identifier that can be appended to a user-readable resource name to avoid + naming collisions. + """ + import uuid + import base64 + if max_length is not None and max_length <= 0: + raise ValueError( + "The specified maximum length for the unique resource id must be positive!") + + uuid_bytes = uuid.uuid4().bytes + # Use base64 encoding to shorten the UUID length. Note that the replacement of the + # unsupported '+' symbol maintains uniqueness because the UUID byte string is of a fixed, + # 16-byte length + uuid_b64 = base64.b64encode(uuid_bytes) + if version_info >= (3, 0): + # In Python3, `uuid_b64` is a `bytes` object. It needs to be + # converted to a string + uuid_b64 = uuid_b64.decode("ascii") + unique_id = uuid_b64.rstrip('=\n').replace("/", "-").replace("+", "AB").lower() + if max_length is not None: + unique_id = unique_id[:int(max_length)] + return unique_id diff --git a/test-requirements.txt b/test-requirements.txt index fd80a0a06ff5e..96c6df93f1784 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -20,5 +20,6 @@ torch torchvision pysftp keras +attrdict==2.0.0 +azureml-sdk; python_version >= "3.0" cloudpickle -attrdict==2.0.0 \ No newline at end of file diff --git a/tests/azureml/test_image_creation.py b/tests/azureml/test_image_creation.py new file mode 100644 index 0000000000000..d51f2586715bc --- /dev/null +++ b/tests/azureml/test_image_creation.py @@ -0,0 +1,508 @@ +from __future__ import print_function + +import sys +import os +import json +import pytest +import mock +from mock import Mock + +import pandas as pd +import sklearn.datasets as datasets +import sklearn.linear_model as glm +from click.testing import CliRunner + +import mlflow +import mlflow.azureml +import mlflow.azureml.cli +import mlflow.sklearn +from mlflow import pyfunc +from mlflow.exceptions import MlflowException +from mlflow.models import Model +from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE +from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils.file_utils import TempDir + + +pytestmark = pytest.mark.skipif( + (sys.version_info < (3, 0)), + reason="Tests require Python 3 to run!") + + +class AzureMLMocks: + + def __init__(self): + self.mocks = { + "register_model": mock.patch("azureml.core.model.Model.register"), + "get_model_path": mock.patch("azureml.core.model.Model.get_model_path"), + "create_image": mock.patch("azureml.core.Image.create"), + "load_workspace": mock.patch("azureml.core.Workspace.get"), + } + + def __getitem__(self, key): + return self.mocks[key] + + def __enter__(self): + for key, mock in self.mocks.items(): + self.mocks[key] = mock.__enter__() + return self + + def __exit__(self, *args): + for mock in self.mocks.values(): + mock.__exit__(*args) + + +def get_azure_workspace(): + # pylint: disable=import-error + from azureml.core import Workspace + return Workspace.get("test_workspace") + + +@pytest.fixture(scope="session") +def sklearn_model(): + iris = datasets.load_iris() + X = iris.data[:, :2] # we only take the first two features. + y = iris.target + linear_lr = glm.LogisticRegression() + linear_lr.fit(X, y) + return linear_lr + + +@pytest.fixture +def model_path(tmpdir): + return os.path.join(str(tmpdir), "model") + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_with_absolute_model_path_calls_expected_azure_routines( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks() as aml_mocks: + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=model_path, workspace=workspace) + + assert aml_mocks["register_model"].call_count == 1 + assert aml_mocks["create_image"].call_count == 1 + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_with_run_relative_model_path_calls_expected_azure_routines(sklearn_model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.sklearn.log_model(sk_model=sklearn_model, artifact_path=artifact_path) + run_id = mlflow.active_run().info.run_uuid + + with AzureMLMocks() as aml_mocks: + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=artifact_path, run_id=run_id, workspace=workspace) + + assert aml_mocks["register_model"].call_count == 1 + assert aml_mocks["create_image"].call_count == 1 + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_synchronous_build_image_awaits_azure_image_creation(sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks(): + workspace = get_azure_workspace() + image, _ = mlflow.azureml.build_image( + model_path=model_path, workspace=workspace, synchronous=True) + image.wait_for_creation.assert_called_once() + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_asynchronous_build_image_does_not_await_azure_image_creation(sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks(): + workspace = get_azure_workspace() + image, _ = mlflow.azureml.build_image( + model_path=model_path, workspace=workspace, synchronous=False) + image.wait_for_creation.assert_not_called() + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_registers_model_and_creates_image_with_specified_names( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks() as aml_mocks: + workspace = get_azure_workspace() + model_name = "MODEL_NAME_1" + image_name = "IMAGE_NAME_1" + mlflow.azureml.build_image( + model_path=model_path, workspace=workspace, model_name=model_name, + image_name=image_name) + + register_model_call_args = aml_mocks["register_model"].call_args_list + assert len(register_model_call_args) == 1 + _, register_model_call_kwargs = register_model_call_args[0] + assert register_model_call_kwargs["model_name"] == model_name + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + assert create_image_call_kwargs["name"] == image_name + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_generates_model_and_image_names_meeting_azureml_resource_naming_requirements( + sklearn_model, model_path): + aml_resource_name_max_length = 32 + + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks() as aml_mocks: + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=model_path, workspace=workspace) + + register_model_call_args = aml_mocks["register_model"].call_args_list + assert len(register_model_call_args) == 1 + _, register_model_call_kwargs = register_model_call_args[0] + called_model_name = register_model_call_kwargs["model_name"] + assert len(called_model_name) <= aml_resource_name_max_length + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + called_image_name = create_image_call_kwargs["name"] + assert len(called_image_name) <= aml_resource_name_max_length + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_passes_model_conda_environment_to_azure_image_creation_routine( + sklearn_model, model_path): + sklearn_conda_env_text = """\ + name: sklearn-env + dependencies: + - scikit-learn + """ + with TempDir(chdr=True) as tmp: + sklearn_conda_env_path = tmp.path("conda.yaml") + with open(sklearn_conda_env_path, "w") as f: + f.write(sklearn_conda_env_text) + + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path, + conda_env=sklearn_conda_env_path) + + # Mock the TempDir.__exit__ function to ensure that the enclosing temporary + # directory is not deleted + with AzureMLMocks() as aml_mocks,\ + mock.patch("mlflow.utils.file_utils.TempDir.path") as tmpdir_path_mock,\ + mock.patch("mlflow.utils.file_utils.TempDir.__exit__"): + def get_mock_path(subpath): + # Our current working directory is a temporary directory. Therefore, it is safe to + # directly return the specified subpath. + return subpath + tmpdir_path_mock.side_effect = get_mock_path + + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=model_path, workspace=workspace) + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + image_config = create_image_call_kwargs["image_config"] + assert image_config.conda_file is not None + with open(image_config.conda_file, "r") as f: + assert f.read() == sklearn_conda_env_text + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_includes_default_metadata_in_azure_image_and_model_tags(sklearn_model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.sklearn.log_model(sk_model=sklearn_model, artifact_path=artifact_path) + run_id = mlflow.active_run().info.run_uuid + model_config = Model.load(os.path.join(_get_model_log_dir(artifact_path, run_id), "MLmodel")) + + with AzureMLMocks() as aml_mocks: + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=artifact_path, run_id=run_id, workspace=workspace) + + register_model_call_args = aml_mocks["register_model"].call_args_list + assert len(register_model_call_args) == 1 + _, register_model_call_kwargs = register_model_call_args[0] + called_tags = register_model_call_kwargs["tags"] + assert called_tags["run_id"] == run_id + assert called_tags["model_path"] == artifact_path + assert called_tags["python_version"] ==\ + model_config.flavors[pyfunc.FLAVOR_NAME][pyfunc.PY_VERSION] + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + image_config = create_image_call_kwargs["image_config"] + assert image_config.tags["run_id"] == run_id + assert image_config.tags["model_path"] == artifact_path + assert image_config.tags["python_version"] ==\ + model_config.flavors[pyfunc.FLAVOR_NAME][pyfunc.PY_VERSION] + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_includes_user_specified_tags_in_azure_image_and_model_tags( + sklearn_model, model_path): + custom_tags = { + "User": "Corey", + "Date": "Today", + "Other": "Entry", + } + + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks() as aml_mocks: + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=model_path, workspace=workspace, tags=custom_tags) + + register_model_call_args = aml_mocks["register_model"].call_args_list + assert len(register_model_call_args) == 1 + _, register_model_call_kwargs = register_model_call_args[0] + called_tags = register_model_call_kwargs["tags"] + assert custom_tags.items() <= called_tags.items() + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + image_config = create_image_call_kwargs["image_config"] + assert custom_tags.items() <= image_config.tags.items() + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_includes_user_specified_description_in_azure_image_and_model_tags( + sklearn_model, model_path): + custom_description = "a custom description" + + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks() as aml_mocks: + workspace = get_azure_workspace() + mlflow.azureml.build_image( + model_path=model_path, workspace=workspace, description=custom_description) + + register_model_call_args = aml_mocks["register_model"].call_args_list + assert len(register_model_call_args) == 1 + _, register_model_call_kwargs = register_model_call_args[0] + assert register_model_call_kwargs["description"] == custom_description + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + image_config = create_image_call_kwargs["image_config"] + assert image_config.description == custom_description + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_throws_exception_if_model_does_not_contain_pyfunc_flavor( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + model_config_path = os.path.join(model_path, "MLmodel") + model_config = Model.load(model_config_path) + del model_config.flavors[pyfunc.FLAVOR_NAME] + model_config.save(model_config_path) + + with AzureMLMocks(), pytest.raises(MlflowException) as exc: + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=model_path, workspace=workspace) + assert exc.error_code == INVALID_PARAMETER_VALUE + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_throws_exception_if_model_python_version_is_less_than_three( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + model_config_path = os.path.join(model_path, "MLmodel") + model_config = Model.load(model_config_path) + model_config.flavors[pyfunc.FLAVOR_NAME][pyfunc.PY_VERSION] = "2.7.6" + model_config.save(model_config_path) + + with AzureMLMocks(), pytest.raises(MlflowException) as exc: + workspace = get_azure_workspace() + mlflow.azureml.build_image(model_path=model_path, workspace=workspace) + assert exc.error_code == INVALID_PARAMETER_VALUE + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_build_image_includes_mlflow_home_as_file_dependency_if_specified( + sklearn_model, model_path): + def mock_create_dockerfile(output_path, *args, **kwargs): + # pylint: disable=unused-argument + with open(output_path, "w") as f: + f.write("Dockerfile contents") + + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks() as aml_mocks, TempDir() as tmp,\ + mock.patch("mlflow.azureml._create_dockerfile") as create_dockerfile_mock: + create_dockerfile_mock.side_effect = mock_create_dockerfile + + # Write a mock `setup.py` file to the mlflow home path so that it will be recognized + # as a viable MLflow source directory during the image build process + mlflow_home = tmp.path() + with open(os.path.join(mlflow_home, "setup.py"), "w") as f: + f.write("setup instructions") + + workspace = get_azure_workspace() + mlflow.azureml.build_image( + model_path=model_path, workspace=workspace, mlflow_home=mlflow_home) + + assert len(create_dockerfile_mock.call_args_list) == 1 + _, create_dockerfile_kwargs = create_dockerfile_mock.call_args_list[0] + # The path to MLflow that is referenced by the Docker container may differ from the + # user-specified `mlflow_home` path if the directory is copied before image building + # for safety + dockerfile_mlflow_path = create_dockerfile_kwargs["mlflow_path"] + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + image_config = create_image_call_kwargs["image_config"] + assert dockerfile_mlflow_path in image_config.dependencies + + +def test_execution_script_init_method_attempts_to_load_correct_azure_ml_model( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + + model_name = "test_model_name" + model_version = 1 + + model_mock = Mock() + model_mock.name = model_name + model_mock.version = model_version + + with TempDir() as tmp: + execution_script_path = tmp.path("dest") + mlflow.azureml._create_execution_script( + output_path=execution_script_path, azure_model=model_mock) + + with open(execution_script_path, "r") as f: + execution_script = f.read() + + # Define the `init` and `score` methods contained in the execution script + # pylint: disable=exec-used + exec(execution_script, globals()) + with AzureMLMocks() as aml_mocks: + aml_mocks["get_model_path"].side_effect = lambda *args, **kwargs: model_path + # Execute the `init` method of the execution script. + # pylint: disable=undefined-variable + init() + + assert aml_mocks["get_model_path"].call_count == 1 + get_model_path_call_args = aml_mocks["get_model_path"].call_args_list + assert len(get_model_path_call_args) == 1 + _, get_model_path_call_kwargs = get_model_path_call_args[0] + assert get_model_path_call_kwargs["model_name"] == model_name + assert get_model_path_call_kwargs["version"] == model_version + + +def test_execution_script_run_method_scores_pandas_dataframes_successfully( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + + model_mock = Mock() + model_mock.name = "model_name" + model_mock.version = 1 + + with TempDir() as tmp: + execution_script_path = tmp.path("dest") + mlflow.azureml._create_execution_script( + output_path=execution_script_path, azure_model=model_mock) + + with open(execution_script_path, "r") as f: + execution_script = f.read() + + # Define the `init` and `score` methods contained in the execution script + # pylint: disable=exec-used + exec(execution_script, globals()) + with AzureMLMocks() as aml_mocks: + aml_mocks["get_model_path"].side_effect = lambda *args, **kwargs: model_path + # Execute the `init` method of the execution script and load the sklearn model from the + # mocked path + # pylint: disable=undefined-variable + init() + + # Invoke the `run` method of the execution script with sample input data and verify that + # reasonable output data is produced + input_data = datasets.load_iris().data[:, :2] + # pylint: disable=undefined-variable + output_data = run(pd.DataFrame(data=input_data).to_json(orient="records")) + assert len(output_data) == len(input_data) + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_cli_build_image_with_absolute_model_path_calls_expected_azure_routines( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model, path=model_path) + with AzureMLMocks() as aml_mocks: + result = CliRunner(env={"LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8"}).invoke( + mlflow.azureml.cli.commands, + [ + 'build-image', + '-m', model_path, + '-w', "test_workspace", + '-i', "image_name", + '-n', "model_name", + ]) + assert result.exit_code == 0 + + assert aml_mocks["register_model"].call_count == 1 + assert aml_mocks["create_image"].call_count == 1 + assert aml_mocks["load_workspace"].call_count == 1 + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_cli_build_image_with_run_relative_model_path_calls_expected_azure_routines(sklearn_model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.sklearn.log_model(sk_model=sklearn_model, artifact_path=artifact_path) + run_id = mlflow.active_run().info.run_uuid + + with AzureMLMocks() as aml_mocks: + result = CliRunner(env={"LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8"}).invoke( + mlflow.azureml.cli.commands, + [ + 'build-image', + '-m', artifact_path, + '-r', run_id, + '-w', 'test_workspace', + '-i', 'image_name', + '-n', 'model_name', + ]) + assert result.exit_code == 0 + + assert aml_mocks["register_model"].call_count == 1 + assert aml_mocks["create_image"].call_count == 1 + assert aml_mocks["load_workspace"].call_count == 1 + + +@mock.patch("mlflow.azureml.mlflow_version", "0.7.0") +def test_cli_build_image_parses_and_includes_user_specified_tags_in_azureml_image_and_model_tags( + sklearn_model): + custom_tags = { + "User": "Corey", + "Date": "Today", + "Other": "Entry", + } + + artifact_path = "model" + with mlflow.start_run(): + mlflow.sklearn.log_model(sk_model=sklearn_model, artifact_path=artifact_path) + run_id = mlflow.active_run().info.run_uuid + + with AzureMLMocks() as aml_mocks: + result = CliRunner(env={"LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8"}).invoke( + mlflow.azureml.cli.commands, + [ + 'build-image', + '-m', artifact_path, + '-r', run_id, + '-w', 'test_workspace', + '-t', json.dumps(custom_tags), + ]) + assert result.exit_code == 0 + + register_model_call_args = aml_mocks["register_model"].call_args_list + assert len(register_model_call_args) == 1 + _, register_model_call_kwargs = register_model_call_args[0] + called_tags = register_model_call_kwargs["tags"] + assert custom_tags.items() <= called_tags.items() + + create_image_call_args = aml_mocks["create_image"].call_args_list + assert len(create_image_call_args) == 1 + _, create_image_call_kwargs = create_image_call_args[0] + image_config = create_image_call_kwargs["image_config"] + assert custom_tags.items() <= image_config.tags.items() diff --git a/tests/azureml/test_model_export.py b/tests/azureml/test_model_export.py deleted file mode 100644 index 6ad1090d3af40..0000000000000 --- a/tests/azureml/test_model_export.py +++ /dev/null @@ -1,66 +0,0 @@ -from __future__ import print_function - -import importlib -import os -import pickle -import tempfile -import unittest - -import sklearn.datasets as datasets -import sklearn.linear_model as glm -from click.testing import CliRunner - -from mlflow.utils.file_utils import TempDir -from mlflow import pyfunc -from mlflow.azureml import cli - - -def _load_pyfunc(path): - with open(path, "rb") as f: - return pickle.load(f) - - -class TestModelExport(unittest.TestCase): - def setUp(self): - self._tmp = tempfile.mkdtemp() - iris = datasets.load_iris() - self._X = iris.data[:, :2] # we only take the first two features. - self._y = iris.target - self._linear_lr = glm.LogisticRegression() - self._linear_lr.fit(self._X, self._y) - self._linear_lr_predict = self._linear_lr.predict(self._X) - - def test_model_export(self): - with TempDir(chdr=True, remove_on_exit=True) as tmp: - model_pkl = tmp.path("model.pkl") - with open(model_pkl, "wb") as f: - pickle.dump(self._linear_lr, f) - input_path = tmp.path("input_model") - pyfunc.save_model(input_path, loader_module="test_model_export", code_path=[__file__], - data_path=model_pkl) - output_path = tmp.path("output_model") - result = CliRunner( - env={"LC_ALL": "en_US.UTF-8", "LANG": "en_US.UTF-8"}).invoke(cli.commands, - ['export', '-m', - input_path, '-o', - output_path]) - if result.exit_code: - print('non-zero return code, output:', result.output, result.exception, - result.exc_info) - self.assertEqual(0, result.exit_code) - os.chdir(output_path) - import sys - sys.path.insert(0, '') - print(sys.path) - score = importlib.import_module("score") - score.init() - for i in range(0, len(self._linear_lr_predict)): - json = '[{"col1":%f, "col2":%f}]' % tuple(self._X[i, :]) - x = score.run(json) - self.assertEqual(self._linear_lr_predict[i], x[0]) - print("current dir", os.getcwd()) - assert os.path.exists(os.getcwd()) - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py new file mode 100644 index 0000000000000..989667ffde8f7 --- /dev/null +++ b/tests/utils/test_utils.py @@ -0,0 +1,17 @@ +import pytest + +from mlflow.utils import get_unique_resource_id + + +def test_get_unique_resource_id_respects_max_length(): + for max_length in range(5, 30, 5): + for _ in range(10000): + assert len(get_unique_resource_id(max_length=max_length)) <= max_length + + +def test_get_unique_resource_id_with_invalid_max_length_throws_exception(): + with pytest.raises(ValueError): + get_unique_resource_id(max_length=-50) + + with pytest.raises(ValueError): + get_unique_resource_id(max_length=0) From 8ccc546299d913f758557d1a36195da5589e9ca3 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Wed, 24 Oct 2018 18:32:04 -0700 Subject: [PATCH 026/483] Azure Deployment: Add reference to open Python2 support issue in exception message (#669) --- mlflow/azureml/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mlflow/azureml/__init__.py b/mlflow/azureml/__init__.py index df6b0ac946b9d..ece9b4c187571 100644 --- a/mlflow/azureml/__init__.py +++ b/mlflow/azureml/__init__.py @@ -114,7 +114,10 @@ def build_image(model_path, workspace, run_id=None, image_name=None, model_name= if model_python_version is not None and\ StrictVersion(model_python_version) < StrictVersion("3.0.0"): raise MlflowException( - message="Azure ML can only deploy models trained in Python 3 or above!", + message=("Azure ML can only deploy models trained in Python 3 or above! Please see" + " the following MLflow GitHub issue for a thorough explanation of this" + " limitation and a workaround to enable support for deploying models" + " trained in Python 2: https://github.com/mlflow/mlflow/issues/668"), error_code=INVALID_PARAMETER_VALUE) tags = _build_tags(relative_model_path=model_path, run_id=run_id, From 4edde91d0fa9909f5894bf84529b3416d52d83f6 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Fri, 26 Oct 2018 11:07:00 -0700 Subject: [PATCH 027/483] Use absolute path for MLeap bundle serialization (#671) --- mlflow/mleap.py | 3 ++ tests/spark/test_spark_model_export.py | 42 ++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/mlflow/mleap.py b/mlflow/mleap.py index 00c03df321de9..21c4b58ece7a9 100644 --- a/mlflow/mleap.py +++ b/mlflow/mleap.py @@ -136,6 +136,9 @@ def add_to_model(mlflow_model, path, spark_model, sample_input): raise Exception("The sample input must be a PySpark dataframe of type `{df_type}`".format( df_type=DataFrame.__module__)) + # MLeap's model serialization routine requires an absolute output path + path = os.path.abspath(path) + mleap_path_full = os.path.join(path, "mleap") mleap_datapath_sub = os.path.join("mleap", "model") mleap_datapath_full = os.path.join(path, mleap_datapath_sub) diff --git a/tests/spark/test_spark_model_export.py b/tests/spark/test_spark_model_export.py index 8db58ce35d7d0..036882c617cb7 100644 --- a/tests/spark/test_spark_model_export.py +++ b/tests/spark/test_spark_model_export.py @@ -21,6 +21,7 @@ from mlflow import active_run, pyfunc, mleap from mlflow import spark as sparkm from mlflow.models import Model +from mlflow.utils.file_utils import TempDir from mlflow.utils.environment import _mlflow_conda_env from tests.helper_functions import score_model_in_sagemaker_docker_container @@ -47,8 +48,8 @@ def spark_conda_env(tmpdir): def spark_context(): conf = pyspark.SparkConf() conf.set(key="spark.jars.packages", - value='ml.combust.mleap:mleap-spark-base_2.11:0.10.0,' - 'ml.combust.mleap:mleap-spark_2.11:0.10.0') + value='ml.combust.mleap:mleap-spark-base_2.11:0.12.0,' + 'ml.combust.mleap:mleap-spark_2.11:0.12.0') conf.set(key="spark_session.python.worker.reuse", value=True) sc = pyspark.SparkContext(master="local-cluster[2, 1, 1024]", conf=conf).getOrCreate() return sc @@ -236,8 +237,43 @@ def _transform(self, dataset): sample_input=spark_model_iris.spark_df) -def test_mleap_module_model_save_with_valid_sample_input_produces_mleap_flavor( +def test_spark_module_model_save_with_relative_path_and_valid_sample_input_produces_mleap_flavor( + spark_model_iris): + with TempDir(chdr=True) as tmp: + model_path = os.path.basename(tmp.path("model")) + mlflow_model = Model() + sparkm.save_model(spark_model=spark_model_iris.model, + path=model_path, + sample_input=spark_model_iris.spark_df, + mlflow_model=mlflow_model) + assert mleap.FLAVOR_NAME in mlflow_model.flavors + + config_path = os.path.join(model_path, "MLmodel") + assert os.path.exists(config_path) + config = Model.load(config_path) + assert mleap.FLAVOR_NAME in config.flavors + + +def test_mleap_module_model_save_with_relative_path_and_valid_sample_input_produces_mleap_flavor( + spark_model_iris): + with TempDir(chdr=True) as tmp: + model_path = os.path.basename(tmp.path("model")) + mlflow_model = Model() + mleap.save_model(spark_model=spark_model_iris.model, + path=model_path, + sample_input=spark_model_iris.spark_df, + mlflow_model=mlflow_model) + assert mleap.FLAVOR_NAME in mlflow_model.flavors + + config_path = os.path.join(model_path, "MLmodel") + assert os.path.exists(config_path) + config = Model.load(config_path) + assert mleap.FLAVOR_NAME in config.flavors + + +def test_mleap_module_model_save_with_absolute_path_and_valid_sample_input_produces_mleap_flavor( spark_model_iris, model_path): + model_path = os.path.abspath(model_path) mlflow_model = Model() mleap.save_model(spark_model=spark_model_iris.model, path=model_path, From 5bed79c33ae100f0df6897c978d51b1892b3e9ab Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Sun, 28 Oct 2018 22:29:56 -0700 Subject: [PATCH 028/483] Remove O(numMetrics * numRuns) metric range computation from generation of each table row (#662) --- .../components/ExperimentRunsTableMultiColumnView.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js b/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js index be8d90fb899e5..650fd301e8ffe 100644 --- a/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js +++ b/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import { Table } from 'react-bootstrap'; import ExperimentViewUtil from './ExperimentViewUtil'; @@ -35,6 +36,7 @@ class ExperimentRunsTableMultiColumnView extends Component { sortState: PropTypes.object.isRequired, runsSelected: PropTypes.object.isRequired, runsExpanded: PropTypes.object.isRequired, + metricRanges: PropTypes.object.isRequired, }; getRow({ idx, isParent, hasExpander, expanderOpen, childrenIds }) { @@ -49,8 +51,8 @@ class ExperimentRunsTableMultiColumnView extends Component { runsSelected, tagsList, onExpand, + metricRanges, } = this.props; - const metricRanges = ExperimentViewUtil.computeMetricRanges(metricsList); const runInfo = runInfos[idx]; const paramsMap = ExperimentViewUtil.toParamsMap(paramsList[idx]); const metricsMap = ExperimentViewUtil.toMetricsMap(metricsList[idx]); @@ -233,4 +235,9 @@ const styles = { }, }; -export default ExperimentRunsTableMultiColumnView; +const mapStateToProps = (state, ownProps) => { + const { metricsList } = ownProps; + return {metricRanges: ExperimentViewUtil.computeMetricRanges(metricsList)}; +}; + +export default connect(mapStateToProps)(ExperimentRunsTableMultiColumnView); From 052b4623c900542c3d399b7e77c5d867658286b0 Mon Sep 17 00:00:00 2001 From: Marcio Vinicius dos Santos Date: Mon, 29 Oct 2018 14:19:28 -0700 Subject: [PATCH 029/483] Fixing small details in the docs (#657) * Fixing small details in the docs * Update quickstart.rst * Update quickstart.rst --- docs/source/quickstart.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 2fa85636382de..b9512b443085b 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -157,12 +157,12 @@ simple REST server for scikit-learn models: .. code:: bash - mlflow sklearn serve -r model + mlflow sklearn serve -r -m model .. note:: By default the server runs on port 5000. If that port is already in use, use the `--port` option to - specify a different port. For example: ``mlflow sklearn serve --port 1234 -r model`` + specify a different port. For example: ``mlflow sklearn serve --port 1234 -r -m model`` Once you have started the server, you can pass it some sample data with ``curl`` and see the predictions: From fc4bac8b9ef04f3d9f0d1622dbde8bba9cb6b5de Mon Sep 17 00:00:00 2001 From: Stephanie Bodoff Date: Mon, 29 Oct 2018 14:23:55 -0700 Subject: [PATCH 030/483] Move common content outside code containers (#529) * Move common content outside code containers * too many ` --- docs/source/tutorial.rst | 316 +++++++++++++++++++-------------------- 1 file changed, 150 insertions(+), 166 deletions(-) diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index 01a6d4a552b70..82066832e333b 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -21,231 +21,223 @@ is from UCI's `machine learning repository `_ - Clone (download) the MLflow repository via ``git clone https://github.com/mlflow/mlflow`` - - `cd` into the ``examples`` directory within your clone of MLflow - we'll use this working + - ``cd`` into the ``examples`` directory within your clone of MLflow - we'll use this working directory for running the tutorial. We avoid running directly from our clone of MLflow as doing - so would cause the tutorial to use MLflow from source, rather than your PyPi installation of + so would cause the tutorial to use MLflow from source, rather than your PyPI installation of MLflow. .. container:: R - To run this tutorial, you'll need to: - - Install `conda `_ - Install the MLflow package (via ``devtools::install_github("mlflow/mlflow", subdir = "mlflow/R/mlflow")``) - Install MLflow (via ``mlflow::mlflow_install()``) - Clone (download) the MLflow repository via ``git clone https://github.com/mlflow/mlflow`` - - `setwd()` into the directory within your clone of MLflow - we'll use this working + - ``setwd()`` into the ``example`` directory within your clone of MLflow - we'll use this working directory for running the tutorial. We avoid running directly from our clone of MLflow as doing - so would cause the tutorial to use MLflow from source, rather than your PyPi installation of + so would cause the tutorial to use MLflow from source, rather than your PyPI installation of MLflow. Training the Model ------------------ + +First, train a linear regression model that takes two hyperparameters: ``alpha`` and ``l1_ratio``. + .. plain-section:: - .. container:: python + .. container:: python - First, train a linear regression model that takes two hyperparameters: ``alpha`` and ``l1_ratio``. The code is located at ``examples/sklearn_elasticnet_wine/train.py`` and is reproduced below. + The code is located at ``examples/sklearn_elasticnet_wine/train.py`` and is reproduced below. - .. code:: python + .. code:: python - import os - import sys + import os + import sys - import pandas as pd - import numpy as np - from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score - from sklearn.model_selection import train_test_split - from sklearn.linear_model import ElasticNet + import pandas as pd + import numpy as np + from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score + from sklearn.model_selection import train_test_split + from sklearn.linear_model import ElasticNet - import mlflow - import mlflow.sklearn - # Run from the root of MLflow - # Read the wine-quality csv file - wine_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "wine-quality.csv") - data = pd.read_csv(wine_path) + import mlflow + import mlflow.sklearn + # Run from the root of MLflow + # Read the wine-quality csv file + wine_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "wine-quality.csv") + data = pd.read_csv(wine_path) - # Split the data into training and test sets. (0.75, 0.25) split. - train, test = train_test_split(data) + # Split the data into training and test sets. (0.75, 0.25) split. + train, test = train_test_split(data) - # The predicted column is "quality" which is a scalar from [3, 9] - train_x = train.drop(["quality"], axis=1) - test_x = test.drop(["quality"], axis=1) - train_y = train[["quality"]] - test_y = test[["quality"]] + # The predicted column is "quality" which is a scalar from [3, 9] + train_x = train.drop(["quality"], axis=1) + test_x = test.drop(["quality"], axis=1) + train_y = train[["quality"]] + test_y = test[["quality"]] - alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5 - l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.5 + alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5 + l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.5 - with mlflow.start_run(): - lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42) - lr.fit(train_x, train_y) + with mlflow.start_run(): + lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42) + lr.fit(train_x, train_y) - predicted_qualities = lr.predict(test_x) + predicted_qualities = lr.predict(test_x) - (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities) + (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities) - print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio)) - print(" RMSE: %s" % rmse) - print(" MAE: %s" % mae) - print(" R2: %s" % r2) + print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio)) + print(" RMSE: %s" % rmse) + print(" MAE: %s" % mae) + print(" R2: %s" % r2) - mlflow.log_param("alpha", alpha) - mlflow.log_param("l1_ratio", l1_ratio) - mlflow.log_metric("rmse", rmse) - mlflow.log_metric("r2", r2) - mlflow.log_metric("mae", mae) + mlflow.log_param("alpha", alpha) + mlflow.log_param("l1_ratio", l1_ratio) + mlflow.log_metric("rmse", rmse) + mlflow.log_metric("r2", r2) + mlflow.log_metric("mae", mae) - mlflow.sklearn.log_model(lr, "model") + mlflow.sklearn.log_model(lr, "model") - This example uses the familiar pandas, numpy, and sklearn APIs to create a simple machine learning - model. The :doc:`MLflow tracking APIs` log information about each - training run, like the hyperparameters ``alpha`` and ``l1_ratio``, used to train the model and metrics, like - the root mean square error, used to evaluate the model. The example also serializes the - model in a format that MLflow knows how to deploy. + This example uses the familiar pandas, numpy, and sklearn APIs to create a simple machine learning + model. The :doc:`MLflow tracking APIs` log information about each + training run, like the hyperparameters ``alpha`` and ``l1_ratio``, used to train the model and metrics, like + the root mean square error, used to evaluate the model. The example also serializes the + model in a format that MLflow knows how to deploy. - You can run the example with default hyperparameters as follows: + You can run the example with default hyperparameters as follows: - .. code:: bash + .. code:: bash - python examples/sklearn_elasticnet_wine/train.py + python examples/sklearn_elasticnet_wine/train.py - Try out some other values for ``alpha`` and ``l1_ratio`` by passing them as arguments to ``train.py``: + Try out some other values for ``alpha`` and ``l1_ratio`` by passing them as arguments to ``train.py``: - .. code:: bash + .. code:: bash - python examples/sklearn_elasticnet_wine/train.py + python examples/sklearn_elasticnet_wine/train.py - Each time you run the example, MLflow logs information about your experiment runs in the directory ``mlruns``. + Each time you run the example, MLflow logs information about your experiment runs in the directory ``mlruns``. - .. note:: - If you would like to use the Jupyter notebook version of ``train.py``, try out the tutorial notebook at ``examples/sklearn_elasticnet_wine/train.ipynb``. + .. note:: + If you would like to use the Jupyter notebook version of ``train.py``, try out the tutorial notebook at ``examples/sklearn_elasticnet_wine/train.ipynb``. - .. container:: R + .. container:: R - First, train a linear regression model that takes two hyperparameters: ``alpha`` and ``lambda``. The code is located at ``examples/r_wine/train.R`` and is reproduced below. + The code is located at ``examples/r_wine/train.R`` and is reproduced below. - .. code:: R + .. code:: R - library(mlflow) - library(glmnet) + library(mlflow) + library(glmnet) - # Read the wine-quality csv file - data <- read.csv("../wine-quality.csv") + # Read the wine-quality csv file + data <- read.csv("../wine-quality.csv") - # Split the data into training and test sets. (0.75, 0.25) split. - sampled <- sample(1:nrow(data), 0.75 * nrow(data)) - train <- data[sampled, ] - test <- data[-sampled, ] + # Split the data into training and test sets. (0.75, 0.25) split. + sampled <- sample(1:nrow(data), 0.75 * nrow(data)) + train <- data[sampled, ] + test <- data[-sampled, ] - # The predicted column is "quality" which is a scalar from [3, 9] - train_x <- as.matrix(train[, !(names(train) == "quality")]) - test_x <- as.matrix(test[, !(names(train) == "quality")]) - train_y <- train[, "quality"] - test_y <- test[, "quality"] - - alpha <- mlflow_param("alpha", 0.5, "numeric") - lambda <- mlflow_param("lambda", 0.5, "numeric") - - with(mlflow_start_run(), { - model <- glmnet(train_x, train_y, alpha = alpha, lambda = lambda, family = "gaussian") - predictor <- crate(~ glmnet::predict.glmnet(model, as.matrix(.x)), model) - predicted <- predictor(test_x) - - rmse <- sqrt(mean((predicted - test_y) ^ 2)) - mae <- mean(abs(predicted - test_y)) - r2 <- as.numeric(cor(predicted, test_y) ^ 2) - - message("Elasticnet model (alpha=", alpha, ", lambda=", lambda, "):") - message(" RMSE: ", rmse) - message(" MAE: ", mae) - message(" R2: ", r2) - - mlflow_log_param("alpha", alpha) - mlflow_log_param("lambda", lambda) - mlflow_log_metric("rmse", rmse) - mlflow_log_metric("r2", r2) - mlflow_log_metric("mae", mae) + # The predicted column is "quality" which is a scalar from [3, 9] + train_x <- as.matrix(train[, !(names(train) == "quality")]) + test_x <- as.matrix(test[, !(names(train) == "quality")]) + train_y <- train[, "quality"] + test_y <- test[, "quality"] - mlflow_log_model(predictor, "model") - }) + alpha <- mlflow_param("alpha", 0.5, "numeric") + lambda <- mlflow_param("lambda", 0.5, "numeric") - This example uses the familiar `glmnet` package to create a simple machine learning - model. The :doc:`MLflow tracking APIs` log information about each - training run, like the hyperparameters ``alpha`` and ``lambda``, used to train the model and metrics, like - the root mean square error, used to evaluate the model. The example also serializes the - model in a format that MLflow knows how to deploy. + with(mlflow_start_run(), { + model <- glmnet(train_x, train_y, alpha = alpha, lambda = lambda, family = "gaussian") + predictor <- crate(~ glmnet::predict.glmnet(model, as.matrix(.x)), model) + predicted <- predictor(test_x) - You can run the example with default hyperparameters as follows: + rmse <- sqrt(mean((predicted - test_y) ^ 2)) + mae <- mean(abs(predicted - test_y)) + r2 <- as.numeric(cor(predicted, test_y) ^ 2) - .. code:: R + message("Elasticnet model (alpha=", alpha, ", lambda=", lambda, "):") + message(" RMSE: ", rmse) + message(" MAE: ", mae) + message(" R2: ", r2) - mlflow_run(uri = "examples/r_wine", entry_point = "train.R") + mlflow_log_param("alpha", alpha) + mlflow_log_param("lambda", lambda) + mlflow_log_metric("rmse", rmse) + mlflow_log_metric("r2", r2) + mlflow_log_metric("mae", mae) - Try out some other values for ``alpha`` and ``lambda`` by passing them as arguments to ``train.R``: + mlflow_log_model(predictor, "model") + }) - .. code:: R + This example uses the familiar `glmnet` package to create a simple machine learning + model. The :doc:`MLflow tracking APIs` log information about each + training run, like the hyperparameters ``alpha`` and ``lambda``, used to train the model and metrics, like + the root mean square error, used to evaluate the model. The example also serializes the + model in a format that MLflow knows how to deploy. - mlflow_run(uri = "examples/r_wine", entry_point = "train.R", param_list = list(alpha = 0.1, lambda = 0.5)) + You can run the example with default hyperparameters as follows: - Each time you run the example, MLflow logs information about your experiment runs in the directory ``mlruns``. + .. code:: R - .. note:: - If you would like to use the R notebook version of ``train.R``, try out the tutorial notebook at ``examples/r_wine/train.Rmd``. + mlflow_run(uri = "tutorial", entry_point = "train.R") -Comparing the Models --------------------- + Try out some other values for ``alpha`` and ``lambda`` by passing them as arguments to ``train.R``: -.. plain-section:: + .. code:: R - .. container:: python + mlflow_run(uri = "", entry_point = "train.R", param_list = list(alpha = 0.1, lambda = 0.5)) - Next, use the MLflow UI to compare the models that you have produced. Run ``mlflow ui`` - in the same current working directory as the one that contains the ``mlruns`` directory and - open http://localhost:5000 in your browser. + Each time you run the example, MLflow logs information about your experiment runs in the directory ``mlruns``. - On this page, you can see a list of experiment runs with metrics you can use to compare the models. + .. note:: + If you would like to use an R notebook version of ``train.R``, try the tutorial notebook at ``examples/r_wine/train.Rmd``. - .. image:: _static/images/tutorial-compare.png +Comparing the Models +-------------------- - You can see that the lower ``alpha`` is, the better the model. You can also - use the search feature to quickly filter out many models. For example, the query ``metrics.rmse < 0.8`` - returns all the models with root mean squared error less than 0.8. For more complex manipulations, - you can download this table as a CSV and use your favorite data munging software to analyze it. - .. container:: R +Next, use the MLflow UI to compare the models that you have produced. Run ``mlflow_ui()`` +in the same current working directory as the one that contains the ``mlruns``. + +On this page, you can see a list of experiment runs with metrics you can use to compare the models. + +.. plain-section:: - Next, use the MLflow UI to compare the models that you have produced. Run ``mlflow_ui()`` - in the same current working directory as the one that contains the ``mlruns``. + .. container:: python - On this page, you can see a list of experiment runs with metrics you can use to compare the models. + .. image:: _static/images/tutorial-compare.png + .. container:: R + .. image:: _static/images/tutorial-compare-R.png - You can use the search feature to quickly filter out many models. For example, the query ``metrics.rmse < 0.8`` - returns all the models with root mean squared error less than 0.8. For more complex manipulations, - you can download this table as a CSV and use your favorite data munging software to analyze it. +You can use the search feature to quickly filter out many models. For example, the query ``metrics.rmse < 0.8`` +returns all the models with root mean squared error less than 0.8. For more complex manipulations, +you can download this table as a CSV and use your favorite data munging software to analyze it. + Packaging the Training Code --------------------------- +Now that you have your training code, you can package it so that other data scientists can easily reuse the model, or so that you can run the training remotely, for example on Databricks. + .. plain-section:: .. container:: python - Now that you have your training code, you can package it so that other data scientists can easily reuse the model, or so that you can run the training remotely, for example on Databricks. You do this by using :doc:`projects` conventions to specify the - dependencies and entry points to your code. The ``tutorial/MLproject`` file specifies that the project has the dependencies located in a - `Conda environment file `_ + You do this by using :doc:`projects` conventions to specify the dependencies and entry points to your code. The ``tutorial/MLproject`` file specifies that the project has the dependencies located in a `Conda environment file `_ called ``conda.yaml`` and has one entry point that takes two parameters: ``alpha`` and ``l1_ratio``. .. code:: yaml @@ -289,7 +281,7 @@ Packaging the Training Code .. container:: R - Now that you have your training code, you can package it so that other data scientists can easily reuse the model, or so that you can run the training remotely, for example on Databricks. You do this by running ``mlflow_snapshot()`` to create an `R dependencies packrat file `_ called ``r-dependencies.txt``. + You do this by running ``mlflow_snapshot()`` to create an `R dependencies packrat file `_ called ``r-dependencies.txt``. The R dependencies file lists the dependencies: @@ -343,17 +335,17 @@ Packaging the Training Code Serving the Model ----------------- -.. plain-section:: +Now that you have packaged your model using the MLproject convention and have identified the best model, +it is time to deploy the model using :doc:`models`. An MLflow Model is a standard format for +packaging machine learning models that can be used in a variety of downstream tools — for example, +real-time serving through a REST API or batch inference on Apache Spark. - .. container:: python +In the example training code, after training the linear regression model, a function +in MLflow saved the model as an artifact within the run. - Now that you have packaged your model using the MLproject convention and have identified the best model, - it is time to deploy the model using :doc:`models`. An MLflow Model is a standard format for - packaging machine learning models that can be used in a variety of downstream tools — for example, - real-time serving through a REST API or batch inference on Apache Spark. +.. plain-section:: - In the example training code, after training the linear regression model, a function - in MLflow saved the model as an artifact within the run. + .. container:: python .. code:: @@ -396,14 +388,6 @@ Serving the Model .. container:: R - Now that you have packaged your model using the MLproject convention and have identified the best model, - it is time to deploy the model using :doc:`models`. An MLflow Model is a standard format for - packaging machine learning models that can be used in a variety of downstream tools — for example, - real-time serving through a REST API or batch inference on Apache Spark. - - In the example training code, after training the linear regression model, a function - in MLflow saved the model as an artifact within the run. - .. code:: R mlflow_log_model(predictor, "model") @@ -426,7 +410,7 @@ Serving the Model mlflow_rfunc_serve(model_path = "model", run_uuid = "1bf3cca7f3814d8fac7be7874de1046d") - This will initialize a REST server and open a `swagger `_ interface to perform predictions against + This initializes a REST server and opens a `Swagger `_ interface to perform predictions against the REST API: .. image:: _static/images/tutorial-serving-r.png @@ -445,18 +429,18 @@ Serving the Model which should return something like:: - { - "predictions": [ - [ - 6.1312 - ] + { + "predictions": [ + [ + 6.1312 ] - } + ] + } More Resources -------------- -Congratulations on finishing the tutorial! For more reading, see :doc:`tracking`, :doc:`projects`, :doc:`models`, -and more. + +Congratulations on finishing the tutorial! For more reading, see :doc:`tracking`, :doc:`projects`, :doc:`models`, and more. .. [1] P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis. Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009. From e18d8c4fd4a2fa79efcca3f94e983aa11544033a Mon Sep 17 00:00:00 2001 From: Mohamed Laradji Date: Mon, 29 Oct 2018 14:24:47 -0700 Subject: [PATCH 031/483] Fix `train_predict.py` (#670) Running the tensorflow example via `python tensorflow/train_predict.py` results in the following error: ``` Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/boston_housing.npz 57344/57026 [==============================] - 0s 1us/step INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpqza4q6ig INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpqza4q6ig', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_service': None, '_cluster_spec': , '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} Traceback (most recent call last): File "tensorflow/train_predict.py", line 54, in tf.app.run(main=main) File "/home/mlaradji/.conda/envs/neupy/lib/python3.6/site-packages/tensorflow/python/platform/app.py", line 125, in run _sys.exit(main(argv)) File "tensorflow/train_predict.py", line 25, in main with tracking.start_run() as tracked_run: AttributeError: module 'mlflow.tracking' has no attribute 'start_run' ``` It seems that the `start_run` function has been moved from `mlflow.tracking` to `mlflow`. This pull request simply changes `with tracking.start_run() as tracked_run:` to `with mlflow.start_run() as tracked_run:`. --- examples/tensorflow/train_predict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tensorflow/train_predict.py b/examples/tensorflow/train_predict.py index c21c2c51eaec9..34c0224932529 100644 --- a/examples/tensorflow/train_predict.py +++ b/examples/tensorflow/train_predict.py @@ -22,7 +22,7 @@ def main(argv): steps = 1000 regressor = tf.estimator.DNNRegressor(hidden_units=hidden_units, feature_columns=feat_cols) train_input_fn = tf.estimator.inputs.numpy_input_fn({"features": x_train}, y_train, num_epochs=None, shuffle=True) - with tracking.start_run() as tracked_run: + with mlflow.start_run() as tracked_run: mlflow.log_param("Hidden Units", hidden_units) mlflow.log_param("Steps", steps) regressor.train(train_input_fn, steps=steps) From 5adc84ce5e4270a08846975b4e3952bc99a3715f Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Wed, 31 Oct 2018 11:17:42 -0700 Subject: [PATCH 032/483] Make CLI treat experiment IDs as integers (#679) * Add type to CLI arg * Fix rename, restore cli argument handling * Add tests * Test fix * RunInfo fix * Lint --- mlflow/entities/run_info.py | 15 +++-- mlflow/experiments.py | 8 ++- tests/tracking/test_rest_tracking.py | 94 ++++++++++++++++++++++------ 3 files changed, 90 insertions(+), 27 deletions(-) diff --git a/mlflow/entities/run_info.py b/mlflow/entities/run_info.py index 38816655ef3e9..dc992905813f2 100644 --- a/mlflow/entities/run_info.py +++ b/mlflow/entities/run_info.py @@ -168,10 +168,17 @@ def to_proto(self): @classmethod def from_proto(cls, proto): - return cls(proto.run_uuid, proto.experiment_id, proto.name, proto.source_type, - proto.source_name, proto.entry_point_name, proto.user_id, proto.status, - proto.start_time, proto.end_time, proto.source_version, proto.lifecycle_stage, - proto.artifact_uri) + end_time = proto.end_time + # The proto2 default scalar value of zero indicates that the run's end time is absent. + # An absent end time is represented with a NoneType in the `RunInfo` class + if end_time == 0: + end_time = None + return cls(run_uuid=proto.run_uuid, experiment_id=proto.experiment_id, name=proto.name, + source_type=proto.source_type, source_name=proto.source_name, + entry_point_name=proto.entry_point_name, user_id=proto.user_id, + status=proto.status, start_time=proto.start_time, end_time=end_time, + source_version=proto.source_version, lifecycle_stage=proto.lifecycle_stage, + artifact_uri=proto.artifact_uri) @classmethod def _properties(cls): diff --git a/mlflow/experiments.py b/mlflow/experiments.py index 4be42b7f5e3cf..cf3cd98b349db 100644 --- a/mlflow/experiments.py +++ b/mlflow/experiments.py @@ -9,6 +9,8 @@ from mlflow.entities import ViewType from mlflow.tracking import _get_store +EXPERIMENT_ID = click.argument("experiment_id", type=click.INT) + @click.group("experiments") def commands(): @@ -53,7 +55,7 @@ def list_experiments(view): @commands.command("delete") -@click.argument("experiment_id") +@EXPERIMENT_ID def delete_experiment(experiment_id): """ Mark an experiment for deletion. Return an error if the experiment does not exist or @@ -66,7 +68,7 @@ def delete_experiment(experiment_id): @commands.command("restore") -@click.argument("experiment_id") +@EXPERIMENT_ID def restore_experiment(experiment_id): """ Restore a deleted experiment. @@ -78,7 +80,7 @@ def restore_experiment(experiment_id): @commands.command("rename") -@click.argument("experiment_id") +@EXPERIMENT_ID @click.argument("new_name") def rename_experiment(experiment_id, new_name): """ diff --git a/tests/tracking/test_rest_tracking.py b/tests/tracking/test_rest_tracking.py index 6d22789339e29..c679ad46b31bc 100644 --- a/tests/tracking/test_rest_tracking.py +++ b/tests/tracking/test_rest_tracking.py @@ -10,10 +10,13 @@ import socket import time import tempfile -import unittest -from mlflow.server import app, FILE_STORE_ENV_VAR +from click.testing import CliRunner + +import mlflow.experiments from mlflow.entities import RunStatus +from mlflow.protos.service_pb2 import LOCAL as SOURCE_TYPE_LOCAL +from mlflow.server import app, FILE_STORE_ENV_VAR from mlflow.tracking import MlflowClient from mlflow.utils.mlflow_tags import MLFLOW_RUN_NAME, MLFLOW_PARENT_RUN_ID @@ -86,9 +89,26 @@ def init_and_tear_down_server(request): @pytest.fixture() -def mlflow_client(): - """Provides an MLflow Tracking API client pointed at the local server.""" - return MlflowClient("%s:%s" % (LOCALHOST, SERVER_PORT)) +def tracking_server_uri(): + """Provides a tracking URI for communicating with the local tracking server.""" + return "http://{hostname}:{port}".format(hostname=LOCALHOST, port=SERVER_PORT) + + +@pytest.fixture() +def mlflow_client(tracking_server_uri): + """Provides an MLflow Tracking API client pointed at the local tracking server.""" + return MlflowClient(tracking_server_uri) + + +@pytest.fixture() +def cli_env(tracking_server_uri): + """Provides an environment for the MLflow CLI pointed at the local tracking server.""" + cli_env = { + "LC_ALL": "en_US.UTF-8", + "LANG": "en_US.UTF-8", + "MLFLOW_TRACKING_URI": tracking_server_uri, + } + return cli_env def test_create_get_list_experiment(mlflow_client): @@ -99,7 +119,7 @@ def test_create_get_list_experiment(mlflow_client): assert exp.artifact_location == 'my_location' experiments = mlflow_client.list_experiments() - assert set([e.name for e in experiments]) == {'My Experiment', 'Default'} + assert set([e.name for e in experiments]) == {'My Experiment'} def test_delete_restore_experiment(mlflow_client): @@ -111,6 +131,17 @@ def test_delete_restore_experiment(mlflow_client): assert mlflow_client.get_experiment(experiment_id).lifecycle_stage == 'active' +def test_delete_restore_experiment_cli(mlflow_client, cli_env): + experiment_name = "DeleteriousCLI" + CliRunner(env=cli_env).invoke(mlflow.experiments.commands, ['create', experiment_name]) + experiment_id = mlflow_client.get_experiment_by_name(experiment_name).experiment_id + assert mlflow_client.get_experiment(experiment_id).lifecycle_stage == 'active' + CliRunner(env=cli_env).invoke(mlflow.experiments.commands, ['delete', str(experiment_id)]) + assert mlflow_client.get_experiment(experiment_id).lifecycle_stage == 'deleted' + CliRunner(env=cli_env).invoke(mlflow.experiments.commands, ['restore', str(experiment_id)]) + assert mlflow_client.get_experiment(experiment_id).lifecycle_stage == 'active' + + def test_rename_experiment(mlflow_client): experiment_id = mlflow_client.create_experiment('BadName') assert mlflow_client.get_experiment(experiment_id).name == 'BadName' @@ -118,29 +149,52 @@ def test_rename_experiment(mlflow_client): assert mlflow_client.get_experiment(experiment_id).name == 'GoodName' +def test_rename_experiment_cli(mlflow_client, cli_env): + bad_experiment_name = "BadName" + good_experiment_name = "GoodName" + + CliRunner(env=cli_env).invoke(mlflow.experiments.commands, ['create', bad_experiment_name]) + experiment_id = mlflow_client.get_experiment_by_name(bad_experiment_name).experiment_id + assert mlflow_client.get_experiment(experiment_id).name == bad_experiment_name + CliRunner(env=cli_env).invoke( + mlflow.experiments.commands, + ['rename', str(experiment_id), good_experiment_name]) + assert mlflow_client.get_experiment(experiment_id).name == good_experiment_name + + def test_create_run_all_args(mlflow_client): + create_run_kwargs = { + "user_id": "123", + "run_name": "My name", + "source_type": "LOCAL", + "source_name": "Hello", + "entry_point_name": "entry", + "start_time": 456, + "source_version": "abc", + "tags": { + "my": "tag", + "other": "tag", + }, + "parent_run_id": "7", + } experiment_id = mlflow_client.create_experiment('Run A Lot') - expected_tags = {'my': 'tag', 'other': 'tag'} - created_run = mlflow_client.create_run( - experiment_id, user_id=123, run_name='My name', source_type='LOCAL', - source_name='Hello', entry_point_name='entry', start_time=456, - source_version='abc', tags=expected_tags, parent_run_id=7) + created_run = mlflow_client.create_run(experiment_id, **create_run_kwargs) run_id = created_run.info.run_uuid print("Run id=%s" % run_id) run = mlflow_client.get_run(run_id) assert run.info.run_uuid == run_id assert run.info.experiment_id == experiment_id - assert run.info.user_id == 123 - assert run.info.source_type == 'LOCAL' - assert run.info.source_name == 'Hello' - assert run.info.entry_point_name == 'entry' - assert run.info.start_time == 456 - assert run.info.source_version == 'abc' + assert run.info.user_id == create_run_kwargs["user_id"] + assert run.info.source_type == SOURCE_TYPE_LOCAL + assert run.info.source_name == create_run_kwargs["source_name"] + assert run.info.entry_point_name == create_run_kwargs["entry_point_name"] + assert run.info.start_time == create_run_kwargs["start_time"] + assert run.info.source_version == create_run_kwargs["source_version"] actual_tags = {t.key: t.value for t in run.data.tags} - for tag in expected_tags: + for tag in create_run_kwargs["tags"]: assert tag in actual_tags - assert actual_tags.get(MLFLOW_RUN_NAME) == 'My name' - assert actual_tags.get(MLFLOW_PARENT_RUN_ID) == '7' + assert actual_tags.get(MLFLOW_RUN_NAME) == create_run_kwargs["run_name"] + assert actual_tags.get(MLFLOW_PARENT_RUN_ID) == create_run_kwargs["parent_run_id"] assert mlflow_client.list_run_infos(experiment_id) == [run.info] From ac954e209a397efd1b91a7d84710e1e6b0cb0566 Mon Sep 17 00:00:00 2001 From: Matei Zaharia Date: Thu, 1 Nov 2018 17:11:36 -0700 Subject: [PATCH 033/483] Upgrade version of merge package (#682) --- mlflow/server/js/package-lock.json | 8 ++++---- mlflow/server/js/package.json | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mlflow/server/js/package-lock.json b/mlflow/server/js/package-lock.json index d1a37005d1be2..56baa95e6145c 100644 --- a/mlflow/server/js/package-lock.json +++ b/mlflow/server/js/package-lock.json @@ -4007,7 +4007,7 @@ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "requires": { - "merge": "1.2.0" + "merge": "1.2.1" } }, "execa": { @@ -7627,9 +7627,9 @@ } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" }, "merge-descriptors": { "version": "1.0.1", diff --git a/mlflow/server/js/package.json b/mlflow/server/js/package.json index 495e1c0a7741a..886d8aac4b8cf 100644 --- a/mlflow/server/js/package.json +++ b/mlflow/server/js/package.json @@ -13,6 +13,7 @@ "immutable": "3.8.1", "jquery": "3.0.0", "json-bigint": "databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", + "merge": "1.2.1", "prop-types": "15.6.1", "qs": "6.5.2", "react": "16.5.2", From 827d4e0ebebb4dd1320ea1632c5880cdfd1b368e Mon Sep 17 00:00:00 2001 From: Stephanie Bodoff Date: Fri, 2 Nov 2018 10:04:26 -0700 Subject: [PATCH 034/483] Clarify when you see runs in mlflow ui (#684) --- docs/source/quickstart.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index b9512b443085b..771aa68cbf276 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -120,9 +120,9 @@ either a local directory or a GitHub URI: mlflow run git@github.com:mlflow/mlflow-example.git -P alpha=5 There's a sample project in ``tutorial``, including a ``MLproject`` file that -specifies its dependencies. All projects that run also log their Tracking API data in the local -``mlruns`` directory (or on your tracking server if you've configured one), so you should be able -to see these runs using ``mlflow ui``. +specifies its dependencies. if you haven't configured a :ref:`tracking server `, +projects log their Tracking API data in the local ``mlruns`` directory so you can see these +runs using ``mlflow ui``. .. note:: By default ``mlflow run`` installs all dependencies using `conda `_. From 8057763e524670cd0449115079ebffa5205e92d1 Mon Sep 17 00:00:00 2001 From: vfdev Date: Fri, 2 Nov 2018 18:09:31 +0100 Subject: [PATCH 035/483] Remove deprecated in pytorch Variables (#678) --- mlflow/pytorch.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mlflow/pytorch.py b/mlflow/pytorch.py index f14de88d73746..675195fb41d16 100644 --- a/mlflow/pytorch.py +++ b/mlflow/pytorch.py @@ -37,13 +37,12 @@ def log_model(pytorch_model, artifact_path, conda_env=None, **kwargs): :param kwargs: kwargs to pass to ``torch.save`` method. >>> import torch - >>> from torch.autograd import Variable >>> import mlflow >>> import mlflow.pytorch >>> # X data - >>> x_data = Variable(torch.Tensor([[1.0], [2.0], [3.0]])) + >>> x_data = torch.Tensor([[1.0], [2.0], [3.0]]) >>> # Y data with its expected value: labels - >>> y_data = Variable(torch.Tensor([[2.0], [4.0], [6.0]])) + >>> y_data = torch.Tensor([[2.0], [4.0], [6.0]]) >>> # Partial Model example modified from Sung Kim >>> # https://github.com/hunkim/PyTorchZeroToAll >>> class Model(torch.nn.Module): @@ -70,9 +69,9 @@ def log_model(pytorch_model, artifact_path, conda_env=None, **kwargs): >>> optimizer.step() >>> # After training >>> for hv in [4.0, 5.0, 6.0]: - >>> hour_var = Variable(torch.Tensor([[hv]])) + >>> hour_var = torch.Tensor([[hv]]) >>> y_pred = model(hour_var) - >>> print("predict (after training)", hv, model(hour_var ).data[0][0]) + >>> print("predict (after training)", hv, model(hour_var).data[0][0]) >>> # log the model >>> with mlflow.start_run() as run: >>> mlflow.log_param("epochs", 500) From 419181837475ac3689e326a0cc5bc8c272f60307 Mon Sep 17 00:00:00 2001 From: Hiroaki Yutani Date: Sat, 3 Nov 2018 06:33:22 +0900 Subject: [PATCH 036/483] Update mlflow installation instruction using R (#596) --- docs/source/quickstart.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 771aa68cbf276..65cd3c174e97c 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -16,7 +16,7 @@ You install MLflow by running: .. code-block:: R devtools::install_github("mlflow/mlflow", subdir = "mlflow/R/mlflow") - mlflow_install() + mlflow::mlflow_install() .. note:: From 27d2c011e6d2279a688dc4dc4b4caefdefb6086c Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Sat, 3 Nov 2018 14:46:29 -0700 Subject: [PATCH 037/483] Updates to runs table view (#665) Enable splitting metrics/params out into their own columns from within the compact runs-table view --- .../ExperimentRunsTableCompactView.js | 227 +++++++++++++++--- .../ExperimentRunsTableMultiColumnView.js | 45 +--- .../js/src/components/ExperimentView.js | 115 ++++++--- .../js/src/components/ExperimentViewUtil.js | 51 ++++ tests/generate_ui_test_data.py | 5 + 5 files changed, 329 insertions(+), 114 deletions(-) diff --git a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js index 65ead862a878f..46e1d54905de5 100644 --- a/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js +++ b/mlflow/server/js/src/components/ExperimentRunsTableCompactView.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import ExperimentViewUtil from "./ExperimentViewUtil"; import { RunInfo } from '../sdk/MlflowMessages'; @@ -24,6 +25,9 @@ const styles = { display: "inline-block", maxWidth: 120, }, + metricParamNameContainer: { + verticalAlign: "middle", + }, }; /** @@ -43,8 +47,6 @@ class ExperimentRunsTableCompactView extends Component { paramsList: PropTypes.arrayOf(Array).isRequired, // List of list of metrics in all the visible runs metricsList: PropTypes.arrayOf(Array).isRequired, - paramKeyList: PropTypes.arrayOf(PropTypes.string).isRequired, - metricKeyList: PropTypes.arrayOf(PropTypes.string).isRequired, // List of tags dictionary in all the visible runs. tagsList: PropTypes.arrayOf(Object).isRequired, // Function which takes one parameter (runId) @@ -57,6 +59,19 @@ class ExperimentRunsTableCompactView extends Component { runsSelected: PropTypes.object.isRequired, runsExpanded: PropTypes.object.isRequired, setSortByHandler: PropTypes.func.isRequired, + paramKeyList: PropTypes.arrayOf(String).isRequired, + metricKeyList: PropTypes.arrayOf(String).isRequired, + metricRanges: PropTypes.object.isRequired, + // Handler for adding a metric or parameter to the set of bagged columns. All bagged metrics + // are displayed in a single column, while each unbagged metric has its own column. Similar + // logic applies for params. + onAddBagged: PropTypes.func.isRequired, + // Handler for removing a metric or parameter from the set of bagged columns. + onRemoveBagged: PropTypes.func.isRequired, + // Array of keys corresponding to unbagged params + unbaggedParams: PropTypes.arrayOf(String).isRequired, + // Array of keys corresponding to unbagged metrics + unbaggedMetrics: PropTypes.arrayOf(String).isRequired, }; state = { @@ -67,19 +82,24 @@ class ExperimentRunsTableCompactView extends Component { this.setState({ hoverState: {isParam, isMetric, key} }); } + /** Returns a row of table content (i.e. a non-header row) corresponding to a single run. */ getRow({ idx, isParent, hasExpander, expanderOpen, childrenIds }) { const { runInfos, paramsList, metricsList, - paramKeyList, - metricKeyList, onCheckbox, sortState, runsSelected, tagsList, setSortByHandler, onExpand, + paramKeyList, + metricKeyList, + metricRanges, + unbaggedMetrics, + unbaggedParams, + onRemoveBagged, } = this.props; const hoverState = this.state.hoverState; const runInfo = runInfos[idx]; @@ -93,12 +113,24 @@ class ExperimentRunsTableCompactView extends Component { ]; ExperimentViewUtil.getRunInfoCellsForRow(runInfo, tagsList[idx], isParent) .forEach((col) => rowContents.push(col)); - const filteredParamKeys = paramKeyList.filter((paramKey) => paramsMap[paramKey] !== undefined); - const paramsCellContents = filteredParamKeys.map((paramKey) => { + + const unbaggedParamSet = new Set(unbaggedParams); + const unbaggedMetricSet = new Set(unbaggedMetrics); + const baggedParams = paramKeyList.filter((paramKey) => + !unbaggedParamSet.has(paramKey) && paramsMap[paramKey] !== undefined); + const baggedMetrics = metricKeyList.filter((metricKey) => + !unbaggedMetricSet.has(metricKey) && metricsMap[metricKey] !== undefined); + + // Add params (unbagged, then bagged) + unbaggedParams.forEach((paramKey) => { + rowContents.push(ExperimentViewUtil.getUnbaggedParamCell(paramKey, paramsMap)); + }); + // Add bagged params + const paramsCellContents = baggedParams.map((paramKey) => { const cellClass = classNames("metric-param-content", { highlighted: hoverState.isParam && hoverState.key === paramKey }); const keyname = "param-" + paramKey; - const sortIcon = ExperimentViewUtil.getSortIcon(sortState, true, false, paramKey); + const sortIcon = ExperimentViewUtil.getSortIcon(sortState, false, true, paramKey); return (
Sort descending + onRemoveBagged(true, paramKey)} + > + Display in own column +
); }); - rowContents.push( -
{paramsCellContents}
); - const filteredMetricKeys = metricKeyList.filter((key) => metricsMap[key] !== undefined); - const metricsCellContents = filteredMetricKeys.map((metricKey) => { + if (this.shouldShowBaggedColumn(true)) { + rowContents.push( + +
{paramsCellContents}
+ ); + } + + // Add metrics (unbagged, then bagged) + unbaggedMetrics.forEach((metricKey) => { + rowContents.push( + ExperimentViewUtil.getUnbaggedMetricCell(metricKey, metricsMap, metricRanges)); + }); + + // Add bagged metrics + const metricsCellContents = baggedMetrics.map((metricKey) => { const keyname = "metric-" + metricKey; const cellClass = classNames("metric-param-content", { highlighted: hoverState.isMetric && hoverState.key === metricKey }); @@ -211,20 +260,27 @@ class ExperimentRunsTableCompactView extends Component { > Sort descending + onRemoveBagged(false, metricKey)} + > + Display in own column + ); }); - rowContents.push( - -
- {metricsCellContents} -
- - ); - + if (this.shouldShowBaggedColumn(false)) { + rowContents.push( + +
+ {metricsCellContents} +
+ + ); + } const sortValue = ExperimentViewUtil.computeSortValue( sortState, metricsMap, paramsMap, runInfo, tagsList[idx]); return { @@ -256,6 +312,101 @@ class ExperimentRunsTableCompactView extends Component { return undefined; } + /** + * Returns true if our table should contain a column for displaying bagged params (if isParam is + * truthy) or bagged metrics. + */ + shouldShowBaggedColumn(isParam) { + const { metricKeyList, paramKeyList, unbaggedMetrics, unbaggedParams } = this.props; + if (isParam) { + return unbaggedParams.length !== paramKeyList.length || paramKeyList.length === 0; + } + return unbaggedMetrics.length !== metricKeyList.length || metricKeyList.length === 0; + } + + /** + * Returns an array of header-row cells (DOM elements) corresponding to metric / parameter + * columns. + */ + getMetricParamHeaderCells() { + const { + setSortByHandler, + sortState, + paramKeyList, + metricKeyList, + unbaggedMetrics, + unbaggedParams, + onAddBagged, + } = this.props; + const columns = []; + const getHeaderCell = (isParam, key, i) => { + const isMetric = !isParam; + const sortIcon = ExperimentViewUtil.getSortIcon(sortState, isMetric, isParam, key); + const className = classNames("bottom-row", { "left-border": i === 0 }); + const elemKey = (isParam ? "param-" : "metric-") + key; + return ( + + + + + {key} + {sortIcon} + + + setSortByHandler(!isParam, isParam, key, true)} + > + Sort ascending + + setSortByHandler(!isParam, isParam, key, false)} + > + Sort descending + + onAddBagged(isParam, key)} + > + Collapse column + + + + + ); + }; + + const paramClassName = classNames("bottom-row", {"left-border": unbaggedParams.length === 0}); + const metricClassName = classNames("bottom-row", {"left-border": unbaggedMetrics.length === 0}); + unbaggedParams.forEach((paramKey, i) => { + columns.push(getHeaderCell(true, paramKey, i)); + }); + + if (this.shouldShowBaggedColumn(true)) { + columns.push( + {paramKeyList.length !== 0 ? "" : "(n/a)"} + ); + } + unbaggedMetrics.forEach((metricKey, i) => { + columns.push(getHeaderCell(false, metricKey, i)); + }); + if (this.shouldShowBaggedColumn(false)) { + columns.push( + {metricKeyList.length !== 0 ? "" : "(n/a)"} + ); + } + return columns; + } + render() { const { runInfos, @@ -265,6 +416,8 @@ class ExperimentRunsTableCompactView extends Component { sortState, tagsList, runsExpanded, + unbaggedMetrics, + unbaggedParams, } = this.props; const rows = ExperimentViewUtil.getRows({ runInfos, @@ -280,39 +433,41 @@ class ExperimentRunsTableCompactView extends Component { ]; ExperimentViewUtil.getRunMetadataHeaderCells(onSortBy, sortState) .forEach((headerCell) => headerCells.push(headerCell)); + this.getMetricParamHeaderCells().forEach((cell) => headerCells.push(cell)); return ( - - + + - {headerCells} + - + + {headerCells} + {ExperimentViewUtil.renderRows(rows)}
-
Parameters
-
- {this.getSortInfo(false, true)} -
+ Parameters
-
Metrics
-
- {this.getSortInfo(true, false)} -
+ Metrics
); } } -export default ExperimentRunsTableCompactView; +const mapStateToProps = (state, ownProps) => { + const { metricsList } = ownProps; + return {metricRanges: ExperimentViewUtil.computeMetricRanges(metricsList)}; +}; + +export default connect(mapStateToProps)(ExperimentRunsTableCompactView); diff --git a/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js b/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js index 650fd301e8ffe..34388537a3390 100644 --- a/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js +++ b/mlflow/server/js/src/components/ExperimentRunsTableMultiColumnView.js @@ -4,7 +4,6 @@ import PropTypes from 'prop-types'; import { Table } from 'react-bootstrap'; import ExperimentViewUtil from './ExperimentViewUtil'; import classNames from 'classnames'; -import Utils from '../utils/Utils'; import { RunInfo } from '../sdk/MlflowMessages'; /** @@ -66,49 +65,15 @@ class ExperimentRunsTableMultiColumnView extends Component { ]; ExperimentViewUtil.getRunInfoCellsForRow(runInfo, tagsList[idx], isParent).forEach((col) => rowContents.push(col)); - paramKeyList.forEach((paramKey, i) => { - const className = (i === 0 ? "left-border" : "") + " run-table-container"; - const keyName = "param-" + paramKey; - if (paramsMap[paramKey]) { - rowContents.push( -
- {paramsMap[paramKey].getValue()} -
- ); - } else { - rowContents.push(); - } + paramKeyList.forEach((paramKey) => { + rowContents.push(ExperimentViewUtil.getUnbaggedParamCell(paramKey, paramsMap)); }); if (numParams === 0) { rowContents.push(); } - metricKeyList.forEach((metricKey, i) => { - const className = (i === 0 ? "left-border" : "") + " run-table-container"; - const keyName = "metric-" + metricKey; - if (metricsMap[metricKey]) { - const metric = metricsMap[metricKey].getValue(); - const range = metricRanges[metricKey]; - let fraction = 1.0; - if (range.max > range.min) { - fraction = (metric - range.min) / (range.max - range.min); - } - const percent = (fraction * 100) + "%"; - rowContents.push( - - {/* We need the extra div because metric-filler-bg is inline-block */} -
-
-
-
- {Utils.formatMetric(metric)} -
-
-
- - ); - } else { - rowContents.push(); - } + metricKeyList.forEach((metricKey) => { + rowContents.push( + ExperimentViewUtil.getUnbaggedMetricCell(metricKey, metricsMap, metricRanges)); }); if (numMetrics === 0) { rowContents.push(); diff --git a/mlflow/server/js/src/components/ExperimentView.js b/mlflow/server/js/src/components/ExperimentView.js index 4f1544f367cf0..0ec4c2ecd7e4e 100644 --- a/mlflow/server/js/src/components/ExperimentView.js +++ b/mlflow/server/js/src/components/ExperimentView.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; import { connect } from 'react-redux'; import './ExperimentView.css'; import { getApis, getExperiment, getParams, getRunInfos, getRunTags } from '../reducers/Reducers'; @@ -8,7 +9,6 @@ import Routes from '../Routes'; import { Button, ButtonGroup, DropdownButton, MenuItem } from 'react-bootstrap'; import { Experiment, RunInfo } from '../sdk/MlflowMessages'; import { SearchUtils } from '../utils/SearchUtils'; -import classNames from 'classnames'; import { saveAs } from 'file-saver'; import { getLatestMetrics } from '../reducers/MetricReducer'; import KeyFilter from '../utils/KeyFilter'; @@ -46,6 +46,8 @@ class ExperimentView extends Component { this.onCloseDeleteRunModal = this.onCloseDeleteRunModal.bind(this); this.onCloseRestoreRunModal = this.onCloseRestoreRunModal.bind(this); this.onExpand = this.onExpand.bind(this); + this.addBagged = this.addBagged.bind(this); + this.removeBagged = this.removeBagged.bind(this); } static propTypes = { @@ -97,6 +99,11 @@ class ExperimentView extends Component { showMultiColumns: true, showDeleteRunModal: false, showRestoreRunModal: false, + // Arrays of "unbagged", or split-out metrics and parameters. We maintain these as lists to help + // keep them ordered (i.e. splitting out a column shouldn't change the ordering of columns + // that have already been split out) + unbaggedMetrics: [], + unbaggedParams: [], }; shouldComponentUpdate(nextProps, nextState) { @@ -150,6 +157,33 @@ class ExperimentView extends Component { this.setState({ showRestoreRunModal: false }); } + /** + * Mark a column as bagged by removing it from the appropriate array of unbagged columns. + * @param isParam If true, the column is assumed to be a metric column; if false, the column is + * assumed to be a param column. + * @param colName Name of the column (metric or param key). + */ + addBagged(isParam, colName) { + const unbagged = isParam ? this.state.unbaggedParams : this.state.unbaggedMetrics; + const idx = unbagged.indexOf(colName); + const newUnbagged = idx >= 0 ? + unbagged.slice(0, idx).concat(unbagged.slice(idx + 1, unbagged.length)) : unbagged; + const stateKey = isParam ? "unbaggedParams" : "unbaggedMetrics"; + this.setState({[stateKey]: newUnbagged}); + } + + /** + * Mark a column as unbagged by adding it to the appropriate array of unbagged columns. + * @param isParam If true, the column is assumed to be a metric column; if false, the column is + * assumed to be a param column. + * @param colName Name of the column (metric or param key). + */ + removeBagged(isParam, colName) { + const unbagged = isParam ? this.state.unbaggedParams : this.state.unbaggedMetrics; + const stateKey = isParam ? "unbaggedParams" : "unbaggedMetrics"; + this.setState({[stateKey]: unbagged.concat([colName])}); + } + render() { const { experiment_id, name, artifact_location } = this.props.experiment; const { @@ -290,7 +324,7 @@ class ExperimentView extends Component { - + - +
- {this.state.showMultiColumns ? - : - - } + {this.state.showMultiColumns ? + : + + }
); diff --git a/mlflow/server/js/src/components/ExperimentViewUtil.js b/mlflow/server/js/src/components/ExperimentViewUtil.js index c850ff850e71f..161d566667a6d 100644 --- a/mlflow/server/js/src/components/ExperimentViewUtil.js +++ b/mlflow/server/js/src/components/ExperimentViewUtil.js @@ -135,6 +135,57 @@ export default class ExperimentViewUtil { />; } + + /** + * Returns a table cell corresponding to a single metric value. The metric is assumed to be + * unbagged (marked to be displayed in its own column). + * @param metricKey The key of the desired metric + * @param metricsMap Object mapping metric keys to their latest values for a single run + * @param metricRanges Object mapping metric keys to objects of the form {min: ..., max: ...} + * containing min and max values of the metric across all visible runs. + */ + static getUnbaggedMetricCell(metricKey, metricsMap, metricRanges) { + const className = "left-border run-table-container"; + const keyName = "metric-" + metricKey; + if (metricsMap[metricKey]) { + const metric = metricsMap[metricKey].getValue(); + const range = metricRanges[metricKey]; + let fraction = 1.0; + if (range.max > range.min) { + fraction = (metric - range.min) / (range.max - range.min); + } + const percent = (fraction * 100) + "%"; + return ( + + {/* We need the extra div because metric-filler-bg is inline-block */} +
+
+
+
+ {Utils.formatMetric(metric)} +
+
+
+ + ); + } + return ; + } + + static getUnbaggedParamCell(paramKey, paramsMap) { + const className = "left-border run-table-container"; + const keyName = "param-" + paramKey; + if (paramsMap[paramKey]) { + return +
+ {paramsMap[paramKey].getValue()} +
+ ; + } else { + return ; + } + } + static isSortedBy(sortState, isMetric, isParam, key) { return (sortState.isMetric === isMetric && sortState.isParam === isParam && sortState.key === key); diff --git a/tests/generate_ui_test_data.py b/tests/generate_ui_test_data.py index b9db19bec2c03..8494f535e7fb4 100644 --- a/tests/generate_ui_test_data.py +++ b/tests/generate_ui_test_data.py @@ -138,3 +138,8 @@ def log_params(parameters): for i in range(100): with mlflow.start_run(source_name='child-{}'.format(i), nested=True): pass + mlflow.create_experiment("my-empty-experiment") + mlflow.set_experiment("runs-but-no-metrics-params") + for i in range(100): + with mlflow.start_run(source_name="empty-run-{}".format(i)): + pass From 14b7f58eff5f2d5ad6f1988c728d2dba87b5c150 Mon Sep 17 00:00:00 2001 From: shenggan Date: Mon, 5 Nov 2018 12:18:43 +0800 Subject: [PATCH 038/483] ftp:// support for artifact store (#287) Add support for storing artifacts in an FTP server --- docs/source/tracking.rst | 5 + mlflow/store/artifact_repo.py | 3 + mlflow/store/ftp_artifact_repo.py | 150 +++++++++++++++++++ tests/store/test_ftp_artifact_repo.py | 198 ++++++++++++++++++++++++++ 4 files changed, 356 insertions(+) create mode 100644 mlflow/store/ftp_artifact_repo.py create mode 100644 tests/store/test_ftp_artifact_repo.py diff --git a/docs/source/tracking.rst b/docs/source/tracking.rst index 06db5c8cffead..b7a7fbcc90d3b 100644 --- a/docs/source/tracking.rst +++ b/docs/source/tracking.rst @@ -315,6 +315,11 @@ in the `GCS documentation Date: Mon, 5 Nov 2018 10:20:33 -0800 Subject: [PATCH 039/483] [UI] Allow linking to specific notebook snapshot (#681) --- mlflow/server/js/src/utils/Utils.js | 8 +++++++- mlflow/server/js/src/utils/Utils.test.js | 10 +++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/mlflow/server/js/src/utils/Utils.js b/mlflow/server/js/src/utils/Utils.js index a464d094ce50d..fc8dad22dc673 100644 --- a/mlflow/server/js/src/utils/Utils.js +++ b/mlflow/server/js/src/utils/Utils.js @@ -132,12 +132,18 @@ class Utils { } return res; } else if (run.source_type === "NOTEBOOK") { + const revisionIdTag = 'mlflow.databricks.notebookRevisionID'; const notebookIdTag = 'mlflow.databricks.notebookID'; const webappUrlTag = 'mlflow.databricks.webappURL'; + const revisionId = tags && tags[revisionIdTag] && tags[revisionIdTag].value; const notebookId = tags && tags[notebookIdTag] && tags[notebookIdTag].value; const webappUrl = tags && tags[webappUrlTag] && tags[webappUrlTag].value; if (notebookId && webappUrl) { - res = ( + let url = `${webappUrl}/#notebook/${notebookId}`; + if (revisionId) { + url += `/revision/${revisionId}`; + } + res = ( {Utils.baseName(run.source_name)} ); } diff --git a/mlflow/server/js/src/utils/Utils.test.js b/mlflow/server/js/src/utils/Utils.test.js index 1bb78bcc23b62..591b3d2f66991 100644 --- a/mlflow/server/js/src/utils/Utils.test.js +++ b/mlflow/server/js/src/utils/Utils.test.js @@ -116,7 +116,6 @@ test("formatSource & renderSource", () => { expect(Utils.renderSource(github_url)).toEqual( mlflow-apps:entry); - const databricksRun = RunInfo.fromJs({ "source_name": "/Users/admin/test", "source_type": "NOTEBOOK" @@ -128,6 +127,15 @@ test("formatSource & renderSource", () => { const wrapper = shallow(Utils.renderSource(databricksRun, databricksRunTags)); expect(wrapper.is("a")).toEqual(true); expect(wrapper.props().href).toEqual("https://databricks.com/#notebook/13"); + + const databricksRunRevisionTags = { + "mlflow.databricks.notebookRevisionID": { value: "42" }, + "mlflow.databricks.notebookID": { value: "13" }, + "mlflow.databricks.webappURL": { value: "https://databricks.com" }, + }; + const wrapper2 = shallow(Utils.renderSource(databricksRun, databricksRunRevisionTags)); + expect(wrapper2.is("a")).toEqual(true); + expect(wrapper2.props().href).toEqual("https://databricks.com/#notebook/13/revision/42"); }); test("dropExtension", () => { From 0041a847c33579b7094f56e9ee847ecace92478e Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Mon, 5 Nov 2018 11:23:13 -0800 Subject: [PATCH 040/483] Add ability to specify Databricks cluster spec as JSON string, dict in CLI, Python API (#663) --- mlflow/cli.py | 15 ++++++++++++--- mlflow/projects/__init__.py | 16 ++++++++++++--- mlflow/projects/databricks.py | 10 +--------- tests/projects/test_databricks.py | 30 ++++++++++++++++++++++++----- tests/projects/test_projects_cli.py | 28 +++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 20 deletions(-) diff --git a/mlflow/cli.py b/mlflow/cli.py index 5eb58d5fd256b..74062328bbb29 100644 --- a/mlflow/cli.py +++ b/mlflow/cli.py @@ -1,5 +1,7 @@ from __future__ import print_function +import json +import os import sys import click @@ -54,8 +56,8 @@ def cli(): "See https://github.com/databricks/databricks-cli for more info on configuring " "a Databricks CLI profile.") @click.option("--cluster-spec", "-c", metavar="FILE", - help="Path to JSON file describing the cluster to use when launching a run on " - "Databricks. See " + help="Path to JSON file (must end in '.json') or JSON string describing the cluster" + "to use when launching a run on Databricks. See " "https://docs.databricks.com/api/latest/jobs.html#jobsclusterspecnewcluster for " "more info. Note that MLflow runs are currently launched against a new cluster.") @click.option("--git-username", metavar="USERNAME", envvar="MLFLOW_GIT_USERNAME", @@ -96,6 +98,13 @@ def run(uri, entry_point, version, param_list, experiment_id, mode, cluster_spec print("Repeated parameter: '%s'" % name, file=sys.stderr) sys.exit(1) param_dict[name] = value + cluster_spec_arg = cluster_spec + if cluster_spec is not None and os.path.splitext(cluster_spec)[-1] != ".json": + try: + cluster_spec_arg = json.loads(cluster_spec) + except ValueError as e: + print("Invalid cluster spec JSON. Parse error: %s" % e) + raise try: projects.run( uri, @@ -104,7 +113,7 @@ def run(uri, entry_point, version, param_list, experiment_id, mode, cluster_spec experiment_id=experiment_id, parameters=param_dict, mode=mode, - cluster_spec=cluster_spec, + cluster_spec=cluster_spec_arg, git_username=git_username, git_password=git_password, use_conda=(not no_conda), diff --git a/mlflow/projects/__init__.py b/mlflow/projects/__init__.py index 44b95eaa162bb..f8703a3a22b86 100644 --- a/mlflow/projects/__init__.py +++ b/mlflow/projects/__init__.py @@ -114,8 +114,8 @@ def run(uri, entry_point="main", version=None, parameters=None, experiment_id=No :param version: For Git-based projects, either a commit hash or a branch name. :param experiment_id: ID of experiment under which to launch the run. :param mode: Execution mode of the run: "local" or "databricks". - :param cluster_spec: When ``mode`` is "databricks", path to a JSON file containing a - `Databricks cluster specification + :param cluster_spec: When ``mode`` is "databricks", dictionary or path to a JSON file + containing a `Databricks cluster specification `_ to use when launching a run. :param git_username: Username for HTTP(S) authentication with Git. @@ -138,9 +138,19 @@ def run(uri, entry_point="main", version=None, parameters=None, experiment_id=No :return: :py:class:`mlflow.projects.SubmittedRun` exposing information (e.g. run ID) about the launched run. """ + cluster_spec_dict = cluster_spec + if (cluster_spec and type(cluster_spec) != dict + and os.path.splitext(cluster_spec)[-1] == ".json"): + with open(cluster_spec, 'r') as handle: + try: + cluster_spec_dict = json.load(handle) + except ValueError: + eprint("Error when attempting to load and parse JSON cluster spec from file " + "%s. " % cluster_spec) + raise submitted_run_obj = _run( uri=uri, entry_point=entry_point, version=version, parameters=parameters, - experiment_id=experiment_id, mode=mode, cluster_spec=cluster_spec, + experiment_id=experiment_id, mode=mode, cluster_spec=cluster_spec_dict, git_username=git_username, git_password=git_password, use_conda=use_conda, storage_dir=storage_dir, block=block, run_id=run_id) if block: diff --git a/mlflow/projects/databricks.py b/mlflow/projects/databricks.py index e469624da0268..cb997fa9bdcb5 100644 --- a/mlflow/projects/databricks.py +++ b/mlflow/projects/databricks.py @@ -139,8 +139,7 @@ def _run_shell_command_job(self, project_uri, command, env_vars, cluster_spec): :param project_uri: URI of the project from which the shell command originates. :param command: Shell command to run. :param env_vars: Environment variables to set in the process running ``command``. - :param cluster_spec: Path to a JSON file containing a - `Databricks cluster specification + :param cluster_spec: Dictionary containing a `Databricks cluster specification `_ to use when launching a run. :return: ID of the Databricks job run. Can be used to query the run's status via the @@ -174,13 +173,6 @@ def run_databricks(self, uri, entry_point, work_dir, parameters, experiment_id, } eprint("=== Running entry point %s of project %s on Databricks ===" % (entry_point, uri)) # Launch run on Databricks - with open(cluster_spec, 'r') as handle: - try: - cluster_spec = json.load(handle) - except ValueError: - eprint("Error when attempting to load and parse JSON cluster spec from file " - "%s. " % cluster_spec) - raise command = _get_databricks_run_cmd(dbfs_fuse_uri, run_id, entry_point, parameters) return self._run_shell_command_job(uri, command, env_vars, cluster_spec) diff --git a/tests/projects/test_databricks.py b/tests/projects/test_databricks.py index 494178c1fea17..64a08ff3f1270 100644 --- a/tests/projects/test_databricks.py +++ b/tests/projects/test_databricks.py @@ -115,10 +115,10 @@ def mock_runs_get_result(succeeded): return {"state": run_state, "run_page_url": "test_url"} -def run_databricks_project(cluster_spec_path, block=False): +def run_databricks_project(cluster_spec, **kwargs): return mlflow.projects.run( - uri=TEST_PROJECT_DIR, mode="databricks", cluster_spec=cluster_spec_path, block=block, - parameters={"alpha": "0.4"}) + uri=TEST_PROJECT_DIR, mode="databricks", cluster_spec=cluster_spec, + parameters={"alpha": "0.4"}, **kwargs) def test_upload_project_to_dbfs( @@ -194,7 +194,7 @@ def test_run_databricks( # Test that MLflow gets the correct run status when performing a Databricks run for run_succeeded, expect_status in [(True, RunStatus.FINISHED), (False, RunStatus.FAILED)]: runs_get_mock.return_value = mock_runs_get_result(succeeded=run_succeeded) - submitted_run = run_databricks_project(cluster_spec_mock) + submitted_run = run_databricks_project(cluster_spec_mock, block=False) assert submitted_run.wait() == run_succeeded assert submitted_run.run_id is not None assert runs_submit_mock.call_count == 1 @@ -213,6 +213,26 @@ def test_run_databricks( validate_exit_status(submitted_run.get_status(), expect_status) +def test_run_databricks_cluster_spec_json( + before_run_validations_mock, # pylint: disable=unused-argument + tracking_uri_mock, runs_cancel_mock, dbfs_mocks, # pylint: disable=unused-argument + runs_submit_mock, runs_get_mock, + cluster_spec_mock, set_tag_mock): # pylint: disable=unused-argument + with mock.patch.dict(os.environ, {'DATABRICKS_HOST': 'test-host', 'DATABRICKS_TOKEN': 'foo'}): + runs_get_mock.return_value = mock_runs_get_result(succeeded=True) + cluster_spec = { + "spark_version": "5.0.x-scala2.11", + "num_workers": 2, + "node_type_id": "i3.xlarge", + } + # Run project synchronously, verify that it succeeds (doesn't throw) + run_databricks_project(cluster_spec=cluster_spec, block=True) + assert runs_submit_mock.call_count == 1 + runs_submit_args, _ = runs_submit_mock.call_args_list[0] + req_body = runs_submit_args[0] + assert req_body["new_cluster"] == cluster_spec + + def test_run_databricks_cancel( before_run_validations_mock, tracking_uri_mock, # pylint: disable=unused-argument runs_submit_mock, dbfs_mocks, set_tag_mock, # pylint: disable=unused-argument @@ -222,7 +242,7 @@ def test_run_databricks_cancel( # waiting for run status. with mock.patch.dict(os.environ, {'DATABRICKS_HOST': 'test-host', 'DATABRICKS_TOKEN': 'foo'}): runs_get_mock.return_value = mock_runs_get_result(succeeded=False) - submitted_run = run_databricks_project(cluster_spec_mock) + submitted_run = run_databricks_project(cluster_spec_mock, block=False) submitted_run.cancel() validate_exit_status(submitted_run.get_status(), RunStatus.FAILED) assert runs_cancel_mock.call_count == 1 diff --git a/tests/projects/test_projects_cli.py b/tests/projects/test_projects_cli.py index 4c9969bd69d57..a965f8cf8488c 100644 --- a/tests/projects/test_projects_cli.py +++ b/tests/projects/test_projects_cli.py @@ -1,6 +1,9 @@ +import json import hashlib +import mock import os +from click.testing import CliRunner import pytest from mlflow import cli @@ -61,3 +64,28 @@ def test_run_git_ssh(tracking_uri_mock): # pylint: disable=unused-argument assert SSH_PROJECT_URI.startswith("git@") invoke_cli_runner(cli.run, [SSH_PROJECT_URI, "--no-conda", "-P", "alpha=0.5"]) invoke_cli_runner(cli.run, [SSH_PROJECT_URI, "--no-conda", "-P", "alpha=0.5"]) + + +def test_run_databricks_cluster_spec(tmpdir): + cluster_spec = { + "spark_version": "5.0.x-scala2.11", + "num_workers": 2, + "node_type_id": "i3.xlarge", + } + cluster_spec_path = str(tmpdir.join("cluster-spec.json")) + with open(cluster_spec_path, "w") as handle: + json.dump(cluster_spec, handle) + + with mock.patch("mlflow.projects._run") as run_mock: + for cluster_spec_arg in [json.dumps(cluster_spec), cluster_spec_path]: + invoke_cli_runner( + cli.run, [TEST_PROJECT_DIR, "-m", "databricks", "--cluster-spec", + cluster_spec_arg, "-e", "greeter", "-P", "name=hi"]) + assert run_mock.call_count == 1 + _, run_kwargs = run_mock.call_args_list[0] + assert run_kwargs["cluster_spec"] == cluster_spec + run_mock.reset_mock() + res = CliRunner().invoke( + cli.run, [TEST_PROJECT_DIR, "-m", "databricks", "--cluster-spec", + json.dumps(cluster_spec) + "JUNK", "-e", "greeter", "-P", "name=hi"]) + assert res.exit_code != 0 From 9bd0e03c6d66a8e84d1d9196eb601c1e4738d01b Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Wed, 7 Nov 2018 11:44:10 -0800 Subject: [PATCH 041/483] Fix removal of get_signature_def_by_key API (#692) --- mlflow/tensorflow.py | 8 +++----- tests/tensorflow/test_tensorflow_model_export.py | 13 +++++-------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/mlflow/tensorflow.py b/mlflow/tensorflow.py index 82b0fe967c3fe..1bd535b79551a 100644 --- a/mlflow/tensorflow.py +++ b/mlflow/tensorflow.py @@ -189,11 +189,9 @@ def _load_model(tf_saved_model_dir, tf_sess, tf_meta_graph_tags, tf_signature_de sess=tf_sess, tags=tf_meta_graph_tags, export_dir=tf_saved_model_dir) - # TODO: Stop relying on `tf.contrib` when it becomes deprecated. For reference, see the - # Tensorflow roadmap: https://www.tensorflow.org/community/roadmap#roadmap_2. - signature_def = tf.contrib.saved_model.get_signature_def_by_key( - meta_graph_def, tf_signature_def_key) - return signature_def + if tf_signature_def_key not in meta_graph_def.signature_def: + raise MlflowException("Could not find signature def key %s" % tf_signature_def_key) + return meta_graph_def.signature_def[tf_signature_def_key] def _load_pyfunc(path): diff --git a/tests/tensorflow/test_tensorflow_model_export.py b/tests/tensorflow/test_tensorflow_model_export.py index 17259d4c06f83..14ecd8f7bfff8 100644 --- a/tests/tensorflow/test_tensorflow_model_export.py +++ b/tests/tensorflow/test_tensorflow_model_export.py @@ -15,9 +15,9 @@ import mlflow import mlflow.tensorflow +from mlflow.exceptions import MlflowException from mlflow import pyfunc from mlflow.models import Model -from mlflow.protos.databricks_pb2 import RESOURCE_DOES_NOT_EXIST, INVALID_PARAMETER_VALUE from mlflow.utils.environment import _mlflow_conda_env from mlflow.tracking.utils import _get_model_log_dir SavedModelInfo = collections.namedtuple( @@ -236,32 +236,29 @@ def test_save_model_with_invalid_path_signature_def_or_metagraph_tags_throws_exc tmpdir, saved_tf_iris_model): model_path = os.path.join(str(tmpdir), "model") - with pytest.raises(IOError) as e: + with pytest.raises(IOError): mlflow.tensorflow.save_model(tf_saved_model_dir="not_a_valid_tf_model_dir", tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, path=model_path) - with pytest.raises(RuntimeError) as e: + with pytest.raises(RuntimeError): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=["bad tags"], tf_signature_def_key=saved_tf_iris_model.signature_def_key, path=model_path) - assert e.error_code == INVALID_PARAMETER_VALUE - with pytest.raises(ValueError) as e: + with pytest.raises(MlflowException): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key="bad signature", path=model_path) - assert e.error_code == INVALID_PARAMETER_VALUE - with pytest.raises(IOError) as e: + with pytest.raises(IOError): mlflow.tensorflow.save_model(tf_saved_model_dir="bad path", tf_meta_graph_tags="bad tags", tf_signature_def_key="bad signature", path=model_path) - assert e.error_code == RESOURCE_DOES_NOT_EXIST def test_load_model_loads_artifacts_from_specified_model_directory(tmpdir, saved_tf_iris_model): From 2783f6b1f2506d286d054499314ee7beba533121 Mon Sep 17 00:00:00 2001 From: Javier Luraschi Date: Wed, 7 Nov 2018 14:31:38 -0800 Subject: [PATCH 042/483] [Docs] Use CRAN installation and fix toggling bug in docs (#686) * update docs to install from CRAN * fix bug while toggling between R and Bash or Python --- docs/source/languagesections/languagesections.js | 6 +++--- docs/source/quickstart.rst | 2 +- docs/source/tutorial.rst | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/languagesections/languagesections.js b/docs/source/languagesections/languagesections.js index fa42ac1fe29cb..c990be39ee05e 100644 --- a/docs/source/languagesections/languagesections.js +++ b/docs/source/languagesections/languagesections.js @@ -62,10 +62,10 @@ $(function() { var my_sel_class = sel_class; // When the target language is not available, default to bash or python. if (!$('div.' + sel_class, parent).length) { - if ($('div.bash', parent).length) - my_sel_class = 'bash'; + if ($('div.highlight-bash', parent).length) + my_sel_class = 'highlight-bash'; else - my_sel_class = 'python'; + my_sel_class = 'highlight-python'; } $('div.example', parent).hide(); diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 65cd3c174e97c..7ccbfc5bdc13b 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -15,7 +15,7 @@ You install MLflow by running: .. code-block:: R - devtools::install_github("mlflow/mlflow", subdir = "mlflow/R/mlflow") + install.packages("mlflow") mlflow::mlflow_install() .. note:: diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index 82066832e333b..56183bcfeaaf5 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -38,7 +38,7 @@ To run this tutorial, you'll need to: .. container:: R - Install `conda `_ - - Install the MLflow package (via ``devtools::install_github("mlflow/mlflow", subdir = "mlflow/R/mlflow")``) + - Install the MLflow package (via ``install.packages("mlflow")``) - Install MLflow (via ``mlflow::mlflow_install()``) - Clone (download) the MLflow repository via ``git clone https://github.com/mlflow/mlflow`` - ``setwd()`` into the ``example`` directory within your clone of MLflow - we'll use this working From 228dbfb4543efac8ea82c3a7a03c11978375971e Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Wed, 7 Nov 2018 19:21:27 -0800 Subject: [PATCH 043/483] Save last runs table UI settings for each experiment in localstorage (#687) Data persisted in localstorage must be managed in a specific way to ensure backwards compatibility. See `mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js` for more details. --- mlflow/server/js/package-lock.json | 6725 +++++++++-------- mlflow/server/js/package.json | 1 + .../js/src/components/ExperimentPage.js | 89 +- .../js/src/components/ExperimentView.js | 193 +- .../js/src/sdk/MlflowLocalStorageMessages.js | 62 + .../sdk/MlflowLocalStorageMessages.test.js | 19 + mlflow/server/js/src/setupTests.js | 3 + .../server/js/src/utils/LocalStorageUtils.js | 69 + .../js/src/utils/LocalStorageUtils.test.js | 34 + 9 files changed, 3755 insertions(+), 3440 deletions(-) create mode 100644 mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js create mode 100644 mlflow/server/js/src/sdk/MlflowLocalStorageMessages.test.js create mode 100644 mlflow/server/js/src/utils/LocalStorageUtils.js create mode 100644 mlflow/server/js/src/utils/LocalStorageUtils.test.js diff --git a/mlflow/server/js/package-lock.json b/mlflow/server/js/package-lock.json index 56baa95e6145c..f9ad42e4da03f 100644 --- a/mlflow/server/js/package-lock.json +++ b/mlflow/server/js/package-lock.json @@ -20,10 +20,10 @@ "dev": true, "requires": { "@babel/types": "7.0.0-rc.1", - "jsesc": "2.5.1", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -75,9 +75,9 @@ "integrity": "sha512-5PgPDV6F5s69XNznTcP0za3qH7qgBkr9DVQTXfZtpF+3iEyuIZB1Mjxu52F5CFxgzQUQJoBYHVxtH4Itdb5MgA==", "dev": true, "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" }, "dependencies": { "chalk": { @@ -86,9 +86,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } @@ -104,7 +104,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", "requires": { - "regenerator-runtime": "0.12.1" + "regenerator-runtime": "^0.12.0" }, "dependencies": { "regenerator-runtime": { @@ -123,7 +123,7 @@ "@babel/code-frame": "7.0.0-rc.1", "@babel/parser": "7.0.0-rc.1", "@babel/types": "7.0.0-rc.1", - "lodash": "4.17.10" + "lodash": "^4.17.10" } }, "@babel/traverse": { @@ -138,9 +138,9 @@ "@babel/helper-split-export-declaration": "7.0.0-rc.1", "@babel/parser": "7.0.0-rc.1", "@babel/types": "7.0.0-rc.1", - "debug": "3.1.0", - "globals": "11.7.0", - "lodash": "4.17.10" + "debug": "^3.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" }, "dependencies": { "debug": { @@ -166,9 +166,9 @@ "integrity": "sha512-MBwO1JQKin9BwKTGydrYe4VDJbStCUy35IhJzeZt3FByOdx/q3CYaqMRrH70qVD2RA7+Xk8e3RN0mzKZkYBYuQ==", "dev": true, "requires": { - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" }, "dependencies": { "to-fast-properties": { @@ -195,7 +195,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" } }, @@ -209,7 +209,7 @@ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -224,7 +224,7 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.4" }, "dependencies": { "acorn": { @@ -239,7 +239,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -259,10 +259,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -275,9 +275,9 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" }, "dependencies": { "kind-of": { @@ -285,7 +285,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -305,7 +305,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" } }, "ansi-escapes": { @@ -328,7 +328,7 @@ "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.1" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -336,8 +336,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" }, "dependencies": { "arr-diff": { @@ -345,7 +345,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -358,9 +358,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -368,7 +368,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -376,7 +376,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -384,7 +384,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -392,19 +392,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -414,7 +414,7 @@ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "argparse": { @@ -422,7 +422,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "aria-query": { @@ -431,7 +431,7 @@ "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", "requires": { "ast-types-flow": "0.0.7", - "commander": "2.15.1" + "commander": "^2.11.0" } }, "arr-diff": { @@ -479,8 +479,8 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-map": { @@ -498,7 +498,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -517,9 +517,9 @@ "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" } }, "arrify": { @@ -542,9 +542,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -575,7 +575,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.10" + "lodash": "^4.14.0" } }, "async-each": { @@ -598,12 +598,12 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000839", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.22", - "postcss-value-parser": "3.3.0" + "browserslist": "^2.5.1", + "caniuse-lite": "^1.0.30000748", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.13", + "postcss-value-parser": "^3.2.3" } }, "aws-sign2": { @@ -629,9 +629,9 @@ "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" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-core": { @@ -639,25 +639,25 @@ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" }, "dependencies": { "source-map": { @@ -673,12 +673,12 @@ "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-rc.1", - "@babel/traverse": "7.0.0-rc.1", - "@babel/types": "7.0.0-rc.1", - "babylon": "7.0.0-beta.47", - "eslint-scope": "3.7.3", - "eslint-visitor-keys": "1.0.0" + "@babel/code-frame": "^7.0.0-beta.40", + "@babel/traverse": "^7.0.0-beta.40", + "@babel/types": "^7.0.0-beta.40", + "babylon": "^7.0.0-beta.40", + "eslint-scope": "~3.7.1", + "eslint-visitor-keys": "^1.0.0" }, "dependencies": { "babylon": { @@ -694,14 +694,14 @@ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "source-map": { @@ -716,9 +716,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-builder-react-jsx": { @@ -726,9 +726,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" } }, "babel-helper-call-delegate": { @@ -736,10 +736,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -747,10 +747,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -758,9 +758,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -768,11 +768,11 @@ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -780,8 +780,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -789,8 +789,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -798,8 +798,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -807,9 +807,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -817,11 +817,11 @@ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -829,12 +829,12 @@ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -842,8 +842,8 @@ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-jest": { @@ -851,9 +851,9 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", "requires": { - "babel-core": "6.26.0", - "babel-plugin-istanbul": "4.1.6", - "babel-preset-jest": "20.0.3" + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^20.0.3" } }, "babel-loader": { @@ -861,9 +861,9 @@ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" } }, "babel-messages": { @@ -871,7 +871,7 @@ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -879,7 +879,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-dynamic-import-node": { @@ -887,9 +887,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-istanbul": { @@ -897,10 +897,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "find-up": "2.1.0", - "istanbul-lib-instrument": "1.10.1", - "test-exclude": "4.2.1" + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" } }, "babel-plugin-jest-hoist": { @@ -953,9 +953,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-properties": { @@ -963,10 +963,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -974,7 +974,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -982,7 +982,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -990,11 +990,11 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -1002,15 +1002,15 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -1018,8 +1018,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -1027,7 +1027,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -1035,8 +1035,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -1044,7 +1044,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -1052,9 +1052,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -1062,7 +1062,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -1070,9 +1070,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -1080,10 +1080,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -1091,9 +1091,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -1101,9 +1101,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -1111,8 +1111,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -1120,12 +1120,12 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -1133,8 +1133,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -1142,7 +1142,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -1150,9 +1150,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -1160,7 +1160,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -1168,7 +1168,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -1176,9 +1176,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -1186,9 +1186,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -1196,8 +1196,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -1205,8 +1205,8 @@ "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.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-react-constant-elements": { @@ -1214,7 +1214,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-display-name": { @@ -1222,7 +1222,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx": { @@ -1230,9 +1230,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-self": { @@ -1240,8 +1240,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-react-jsx-source": { @@ -1249,8 +1249,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { @@ -1258,7 +1258,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-runtime": { @@ -1266,7 +1266,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-strict-mode": { @@ -1274,8 +1274,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-polyfill": { @@ -1283,9 +1283,9 @@ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "core-js": { @@ -1305,36 +1305,36 @@ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.11.3", - "invariant": "2.2.4", - "semver": "5.5.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, "babel-preset-flow": { @@ -1342,7 +1342,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" + "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, "babel-preset-jest": { @@ -1350,7 +1350,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", "requires": { - "babel-plugin-jest-hoist": "20.0.3" + "babel-plugin-jest-hoist": "^20.0.3" } }, "babel-preset-react": { @@ -1358,12 +1358,12 @@ "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" } }, "babel-preset-react-app": { @@ -1391,13 +1391,13 @@ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.6", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { "core-js": { @@ -1412,8 +1412,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.6", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" }, "dependencies": { "core-js": { @@ -1428,11 +1428,11 @@ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1440,15 +1440,15 @@ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1456,10 +1456,10 @@ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1477,13 +1477,13 @@ "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.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "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": { @@ -1491,7 +1491,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1499,7 +1499,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1507,7 +1507,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1515,9 +1515,9 @@ "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" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -1538,7 +1538,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -1572,15 +1572,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.16" + "type-is": "~1.6.15" }, "dependencies": { "iconv-lite": { @@ -1600,12 +1600,12 @@ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" + "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": { @@ -1618,7 +1618,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "bowser": { @@ -1631,13 +1631,13 @@ "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.1.0", - "chalk": "2.4.1", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "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": { "camelcase": { @@ -1650,9 +1650,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } @@ -1662,7 +1662,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1671,16 +1671,16 @@ "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.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "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": { @@ -1688,7 +1688,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1718,12 +1718,12 @@ "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.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "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": { @@ -1731,9 +1731,9 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.1", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -1741,9 +1741,9 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -1751,8 +1751,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -1760,13 +1760,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1774,7 +1774,7 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "browserslist": { @@ -1782,8 +1782,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "1.0.30000839", - "electron-to-chromium": "1.3.45" + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" } }, "bser": { @@ -1791,7 +1791,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "requires": { - "node-int64": "0.4.0" + "node-int64": "^0.4.0" } }, "buffer": { @@ -1799,9 +1799,9 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.11", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-from": { @@ -1839,15 +1839,15 @@ "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" + "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" } }, "caller-path": { @@ -1855,7 +1855,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -1868,8 +1868,8 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { @@ -1882,8 +1882,8 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" }, "dependencies": { "camelcase": { @@ -1898,10 +1898,10 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000839", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" }, "dependencies": { "browserslist": { @@ -1909,8 +1909,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000839", - "electron-to-chromium": "1.3.45" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } } } @@ -1945,8 +1945,8 @@ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -1954,11 +1954,11 @@ "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.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" }, "dependencies": { "ansi-styles": { @@ -1984,12 +1984,12 @@ "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.9.2", - "lodash": "4.17.10", - "parse5": "3.0.3" + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" }, "dependencies": { "domhandler": { @@ -1998,7 +1998,7 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "htmlparser2": { @@ -2007,12 +2007,12 @@ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "dev": true, "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.2", - "domutils": "1.5.1", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "parse5": { @@ -2021,7 +2021,7 @@ "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "dev": true, "requires": { - "@types/node": "10.9.2" + "@types/node": "*" } } } @@ -2031,18 +2031,18 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.3", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.0.5" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.1.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" }, "dependencies": { "anymatch": { @@ -2050,8 +2050,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "glob-parent": { @@ -2059,8 +2059,8 @@ "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.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -2068,7 +2068,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -2083,7 +2083,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } } } @@ -2098,8 +2098,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "circular-json": { @@ -2112,7 +2112,7 @@ "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { - "chalk": "1.1.3" + "chalk": "^1.1.3" } }, "class-utils": { @@ -2120,10 +2120,10 @@ "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.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -2131,7 +2131,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -2146,7 +2146,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { - "source-map": "0.5.7" + "source-map": "0.5.x" }, "dependencies": { "source-map": { @@ -2166,7 +2166,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -2179,8 +2179,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -2206,7 +2206,7 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { - "q": "1.5.1" + "q": "^1.1.2" } }, "code-point-at": { @@ -2219,8 +2219,8 @@ "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.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { @@ -2228,9 +2228,9 @@ "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { - "clone": "1.0.4", - "color-convert": "1.9.1", - "color-string": "0.3.0" + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" } }, "color-convert": { @@ -2238,7 +2238,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -2251,7 +2251,7 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { - "color-name": "1.1.3" + "color-name": "^1.0.0" } }, "colormin": { @@ -2259,9 +2259,9 @@ "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { - "color": "0.11.4", + "color": "^0.11.0", "css-color-names": "0.0.4", - "has": "1.0.1" + "has": "^1.0.1" } }, "colors": { @@ -2274,7 +2274,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -2302,7 +2302,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "requires": { - "mime-db": "1.33.0" + "mime-db": ">= 1.33.0 < 2" } }, "compression": { @@ -2310,13 +2310,13 @@ "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "bytes": "3.0.0", - "compressible": "2.0.13", + "compressible": "~2.0.13", "debug": "2.6.9", - "on-headers": "1.0.1", + "on-headers": "~1.0.1", "safe-buffer": "5.1.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "safe-buffer": { @@ -2336,10 +2336,10 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -2347,12 +2347,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "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" } }, "connect-history-api-fallback": { @@ -2365,7 +2365,7 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -2428,13 +2428,13 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" }, "dependencies": { "minimist": { @@ -2449,8 +2449,8 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-error-class": { @@ -2458,7 +2458,7 @@ "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" + "capture-stack-trace": "^1.0.0" } }, "create-hash": { @@ -2466,11 +2466,11 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.4", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "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": { @@ -2478,12 +2478,12 @@ "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.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "create-react-context": { @@ -2491,8 +2491,8 @@ "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", "requires": { - "fbjs": "0.8.16", - "gud": "1.0.0" + "fbjs": "^0.8.0", + "gud": "^1.0.0" } }, "cross-spawn": { @@ -2500,9 +2500,9 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -2510,7 +2510,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -2518,7 +2518,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -2528,17 +2528,17 @@ "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.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.16", - "public-encrypt": "4.0.2", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "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": { @@ -2556,20 +2556,20 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" + "babel-code-frame": "^6.11.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": ">=2.6.1 <4", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.0.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.0.0", + "postcss-modules-local-by-default": "^1.0.1", + "postcss-modules-scope": "^1.0.0", + "postcss-modules-values": "^1.1.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" }, "dependencies": { "has-flag": { @@ -2582,10 +2582,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -2598,7 +2598,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -2608,10 +2608,10 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.1" + "nth-check": "~1.0.1" } }, "css-selector-tokenizer": { @@ -2619,9 +2619,9 @@ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" }, "dependencies": { "regexpu-core": { @@ -2629,9 +2629,9 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } } } @@ -2651,38 +2651,38 @@ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" }, "dependencies": { "autoprefixer": { @@ -2690,12 +2690,12 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000839", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" } }, "browserslist": { @@ -2703,8 +2703,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000839", - "electron-to-chromium": "1.3.45" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } }, "has-flag": { @@ -2717,10 +2717,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -2733,7 +2733,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -2743,8 +2743,8 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "clap": "^1.0.9", + "source-map": "^0.5.3" }, "dependencies": { "source-map": { @@ -2764,7 +2764,7 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, "currently-unhandled": { @@ -2772,7 +2772,7 @@ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "d": { @@ -2780,7 +2780,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.42" + "es5-ext": "^0.10.9" } }, "d3-array": { @@ -2808,7 +2808,7 @@ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", "requires": { - "d3-color": "1.2.0" + "d3-color": "1" } }, "d3-path": { @@ -2821,13 +2821,13 @@ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz", "integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=", "requires": { - "d3-array": "1.2.1", - "d3-collection": "1.0.4", - "d3-color": "1.2.0", - "d3-format": "1.3.0", - "d3-interpolate": "1.2.0", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1" + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-color": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" } }, "d3-shape": { @@ -2835,7 +2835,7 @@ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", "requires": { - "d3-path": "1.0.5" + "d3-path": "1" } }, "d3-time": { @@ -2848,7 +2848,7 @@ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", "requires": { - "d3-time": "1.0.8" + "d3-time": "1" } }, "damerau-levenshtein": { @@ -2861,7 +2861,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "date-now": { @@ -2917,7 +2917,7 @@ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" } }, "define-properties": { @@ -2925,8 +2925,8 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "define-property": { @@ -2934,8 +2934,8 @@ "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" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2943,7 +2943,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2951,7 +2951,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2959,9 +2959,9 @@ "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" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -2976,13 +2976,13 @@ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -3000,8 +3000,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { @@ -3014,7 +3014,7 @@ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-node": { @@ -3027,8 +3027,8 @@ "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.3", - "debug": "2.6.9" + "address": "^1.0.1", + "debug": "^2.6.0" } }, "diff": { @@ -3041,9 +3041,9 @@ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "discontinuous-range": { @@ -3062,8 +3062,8 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.2" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, "dns-txt": { @@ -3071,7 +3071,7 @@ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "doctrine": { @@ -3079,7 +3079,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "dom-converter": { @@ -3087,7 +3087,7 @@ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { - "utila": "0.3.3" + "utila": "~0.3" }, "dependencies": { "utila": { @@ -3107,8 +3107,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { @@ -3123,7 +3123,7 @@ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "requires": { - "urijs": "1.19.1" + "urijs": "^1.16.1" } }, "domain-browser": { @@ -3141,7 +3141,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { @@ -3149,8 +3149,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-prop": { @@ -3158,7 +3158,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotenv": { @@ -3176,9 +3176,9 @@ "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz", "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==", "requires": { - "fbjs": "0.8.16", - "immutable": "3.7.6", - "object-assign": "4.1.1" + "fbjs": "^0.8.15", + "immutable": "~3.7.4", + "object-assign": "^4.1.0" }, "dependencies": { "immutable": { @@ -3204,7 +3204,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -3222,13 +3222,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emoji-regex": { @@ -3251,7 +3251,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.23" + "iconv-lite": "~0.4.13" } }, "enhanced-resolve": { @@ -3259,10 +3259,10 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "entities": { @@ -3276,24 +3276,24 @@ "integrity": "sha512-I51gsZvXiUjrJC3oJ9wo1tvKyWQrrLD+7esOwTw5sZeQ6a+GVcQYVroXBF13hB/kJQ4vurtxEm35+5T1Q8R2Pw==", "dev": true, "requires": { - "array.prototype.flat": "1.2.1", - "cheerio": "1.0.0-rc.2", - "function.prototype.name": "1.1.0", - "has": "1.0.3", - "is-boolean-object": "1.0.0", - "is-callable": "1.1.4", - "is-number-object": "1.0.3", - "is-string": "1.0.4", - "is-subset": "0.1.1", - "lodash.escape": "4.0.1", - "lodash.isequal": "4.5.0", - "object-inspect": "1.6.0", - "object-is": "1.0.1", - "object.assign": "4.1.0", - "object.entries": "1.0.4", - "object.values": "1.0.4", - "raf": "3.4.0", - "rst-selector-parser": "2.2.3" + "array.prototype.flat": "^1.2.1", + "cheerio": "^1.0.0-rc.2", + "function.prototype.name": "^1.1.0", + "has": "^1.0.3", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.4", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-subset": "^0.1.1", + "lodash.escape": "^4.0.1", + "lodash.isequal": "^4.5.0", + "object-inspect": "^1.6.0", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4", + "object.values": "^1.0.4", + "raf": "^3.4.0", + "rst-selector-parser": "^2.2.3" }, "dependencies": { "has": { @@ -3302,7 +3302,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "is-callable": { @@ -3319,13 +3319,13 @@ "integrity": "sha512-TRX+Y5QPreGmqfFU3bPsJUmqNZX9paQCmQ93kj7hnfQoZzufO/pahGN/OviWn60YcgaQojhf0AWv3PxrIDARbA==", "dev": true, "requires": { - "enzyme-adapter-utils": "1.6.0", - "function.prototype.name": "1.1.0", - "object.assign": "4.1.0", - "object.values": "1.0.4", - "prop-types": "15.6.2", - "react-is": "16.4.2", - "react-test-renderer": "16.4.2" + "enzyme-adapter-utils": "^1.6.0", + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "object.values": "^1.0.4", + "prop-types": "^15.6.2", + "react-is": "^16.4.2", + "react-test-renderer": "^16.0.0-0" }, "dependencies": { "prop-types": { @@ -3334,8 +3334,8 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "react-is": { @@ -3352,9 +3352,9 @@ "integrity": "sha512-8bzxmmBwYNqgEVVpTgONW3IzH3eYHiLZp+V+JL1GPKLVbIMnXSPChsQ7EKMdIimf6+aSHzANUEsGXG+zSRS23w==", "dev": true, "requires": { - "function.prototype.name": "1.1.0", - "object.assign": "4.1.0", - "prop-types": "15.6.2" + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "prop-types": "^15.6.2" }, "dependencies": { "prop-types": { @@ -3363,8 +3363,8 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } } } @@ -3374,7 +3374,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -3382,7 +3382,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -3390,11 +3390,11 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -3402,9 +3402,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -3412,9 +3412,9 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "1" } }, "es6-iterator": { @@ -3422,9 +3422,9 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -3432,12 +3432,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-promise": { @@ -3450,11 +3450,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -3462,8 +3462,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -3471,10 +3471,10 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -3492,11 +3492,11 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { @@ -3511,10 +3511,10 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -3523,43 +3523,43 @@ "integrity": "sha512-gPSfpSRCHre1GLxGmO68tZNxOlL2y7xBd95VcLD+Eo4S2js31YoMum3CAQIOaxY24hqYOMksMvW38xuuWKQTgw==", "dev": true, "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.3", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.4", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.7.0", - "ignore": "3.3.10", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.3", - "text-table": "0.2.0" + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.2", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "^4.0.1", + "text-table": "~0.2.0" }, "dependencies": { "ansi-regex": { @@ -3574,9 +3574,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "debug": { @@ -3606,8 +3606,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "strip-ansi": { @@ -3616,7 +3616,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -3627,7 +3627,7 @@ "integrity": "sha512-rQqOvAzrMC3BBCH6Dd/1RenDi+RW4vdgnh8xcPf6sgd324ad6aX7hSZ52L1SfDGe2VsZR2yB5uPvDfXYvxHZmA==", "dev": true, "requires": { - "eslint-restricted-globals": "0.1.1" + "eslint-restricted-globals": "^0.1.1" } }, "eslint-config-react-app": { @@ -3646,8 +3646,8 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "requires": { - "debug": "2.6.9", - "resolve": "1.6.0" + "debug": "^2.6.9", + "resolve": "^1.5.0" } }, "eslint-import-resolver-webpack": { @@ -3656,17 +3656,17 @@ "integrity": "sha512-b6JxR57ruiMxq2tIu4T/SrYED5RKJfeBEs8u3+JWF+O2RxDmFpUH84c5uS1T5qiP0K4r0SL7CXhvd41hXdDlAg==", "dev": true, "requires": { - "array-find": "1.0.0", - "debug": "2.6.9", - "enhanced-resolve": "0.9.1", - "find-root": "0.1.2", - "has": "1.0.1", - "interpret": "1.1.0", - "is-absolute": "0.2.6", - "lodash.get": "3.7.0", - "node-libs-browser": "2.1.0", - "resolve": "1.6.0", - "semver": "5.5.0" + "array-find": "^1.0.0", + "debug": "^2.6.8", + "enhanced-resolve": "~0.9.0", + "find-root": "^0.1.1", + "has": "^1.0.1", + "interpret": "^1.0.0", + "is-absolute": "^0.2.3", + "lodash.get": "^3.7.0", + "node-libs-browser": "^1.0.0 || ^2.0.0", + "resolve": "^1.2.0", + "semver": "^5.3.0" }, "dependencies": { "enhanced-resolve": { @@ -3675,9 +3675,9 @@ "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.2.0", - "tapable": "0.1.10" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.2.0", + "tapable": "^0.1.8" } }, "memory-fs": { @@ -3699,11 +3699,11 @@ "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", "requires": { - "loader-fs-cache": "1.0.1", - "loader-utils": "1.1.0", - "object-assign": "4.1.1", - "object-hash": "1.3.0", - "rimraf": "2.6.2" + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" } }, "eslint-module-utils": { @@ -3711,8 +3711,8 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "requires": { - "debug": "2.6.9", - "pkg-dir": "1.0.0" + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" }, "dependencies": { "find-up": { @@ -3720,8 +3720,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -3729,7 +3729,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "pkg-dir": { @@ -3737,7 +3737,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } } } @@ -3759,7 +3759,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz", "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", "requires": { - "lodash": "4.17.10" + "lodash": "^4.15.0" } }, "eslint-plugin-import": { @@ -3767,16 +3767,16 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.6.9", + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "0.3.2", - "eslint-module-utils": "2.2.0", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "minimatch": "3.0.4", - "read-pkg-up": "2.0.0" + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.1.1", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "minimatch": "^3.0.3", + "read-pkg-up": "^2.0.0" }, "dependencies": { "doctrine": { @@ -3784,8 +3784,8 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "load-json-file": { @@ -3793,10 +3793,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "path-type": { @@ -3804,7 +3804,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { @@ -3812,9 +3812,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -3822,8 +3822,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "strip-bom": { @@ -3838,13 +3838,13 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", "requires": { - "aria-query": "0.7.1", - "array-includes": "3.0.3", + "aria-query": "^0.7.0", + "array-includes": "^3.0.3", "ast-types-flow": "0.0.7", - "axobject-query": "0.1.0", - "damerau-levenshtein": "1.0.4", - "emoji-regex": "6.5.1", - "jsx-ast-utils": "1.4.1" + "axobject-query": "^0.1.0", + "damerau-levenshtein": "^1.0.0", + "emoji-regex": "^6.1.0", + "jsx-ast-utils": "^1.4.0" } }, "eslint-plugin-node": { @@ -3853,9 +3853,9 @@ "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", "dev": true, "requires": { - "ignore": "3.3.10", - "minimatch": "3.0.4", - "resolve": "1.6.0", + "ignore": "^3.3.6", + "minimatch": "^3.0.4", + "resolve": "^1.3.3", "semver": "5.3.0" }, "dependencies": { @@ -3878,10 +3878,10 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", "requires": { - "doctrine": "2.1.0", - "has": "1.0.1", - "jsx-ast-utils": "2.0.1", - "prop-types": "15.6.1" + "doctrine": "^2.0.0", + "has": "^1.0.1", + "jsx-ast-utils": "^2.0.0", + "prop-types": "^15.5.10" }, "dependencies": { "jsx-ast-utils": { @@ -3889,7 +3889,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "requires": { - "array-includes": "3.0.3" + "array-includes": "^3.0.3" } } } @@ -3911,8 +3911,8 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-visitor-keys": { @@ -3926,8 +3926,8 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "requires": { - "acorn": "5.5.3", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -3940,7 +3940,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -3948,7 +3948,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -3971,8 +3971,8 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.42" + "d": "1", + "es5-ext": "~0.10.14" } }, "eventemitter3": { @@ -3990,7 +3990,7 @@ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { - "original": "1.0.0" + "original": ">=0.0.5" } }, "evp_bytestokey": { @@ -3998,8 +3998,8 @@ "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.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "exec-sh": { @@ -4007,7 +4007,7 @@ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "requires": { - "merge": "1.2.1" + "merge": "^1.1.3" } }, "execa": { @@ -4015,13 +4015,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "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" } }, "exenv": { @@ -4034,13 +4034,13 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { "define-property": { @@ -4048,7 +4048,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -4056,7 +4056,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -4066,7 +4066,7 @@ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { @@ -4074,11 +4074,11 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "is-number": { @@ -4086,7 +4086,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "isobject": { @@ -4102,7 +4102,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4112,7 +4112,7 @@ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "express": { @@ -4120,36 +4120,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.3.1", "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", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", + "proxy-addr": "~2.0.3", "qs": "6.5.1", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "array-flatten": { @@ -4184,8 +4184,8 @@ "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" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -4193,7 +4193,7 @@ "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" + "is-plain-object": "^2.0.4" } } } @@ -4203,9 +4203,9 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.23", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -4213,14 +4213,14 @@ "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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": { @@ -4228,7 +4228,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -4236,7 +4236,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -4244,7 +4244,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -4252,7 +4252,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -4260,9 +4260,9 @@ "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" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -4272,10 +4272,10 @@ "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "requires": { - "async": "2.6.0", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0", - "webpack-sources": "1.1.0" + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" } }, "extsprintf": { @@ -4308,7 +4308,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } }, "fb-watchman": { @@ -4316,7 +4316,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "requires": { - "bser": "2.0.0" + "bser": "^2.0.0" } }, "fbjs": { @@ -4324,13 +4324,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.18" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.9" } }, "figures": { @@ -4338,7 +4338,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -4346,8 +4346,8 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-loader": { @@ -4355,8 +4355,8 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" } }, "file-saver": { @@ -4374,8 +4374,8 @@ "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, "filesize": { @@ -4388,10 +4388,10 @@ "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.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -4399,7 +4399,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -4410,12 +4410,12 @@ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" } }, "find-cache-dir": { @@ -4423,9 +4423,9 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "find-root": { @@ -4439,7 +4439,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { @@ -4447,10 +4447,10 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "flatten": { @@ -4468,7 +4468,7 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { - "debug": "3.1.0" + "debug": "^3.1.0" }, "dependencies": { "debug": { @@ -4491,7 +4491,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -4509,9 +4509,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "formik": { @@ -4519,15 +4519,15 @@ "resolved": "https://registry.npmjs.org/formik/-/formik-1.2.0.tgz", "integrity": "sha512-WtVCIf5LrFdv2lhhReWPVbKkUai4BEoHCKTjdIklKAk/MjhrnAXJkOJMFq0aA8g8B2KWNs/oXBTkIeEWCIlVuA==", "requires": { - "create-react-context": "0.2.3", - "deepmerge": "2.1.1", - "hoist-non-react-statics": "2.5.5", - "lodash.clonedeep": "4.5.0", + "create-react-context": "^0.2.2", + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^2.5.5", + "lodash.clonedeep": "^4.5.0", "lodash.topath": "4.5.2", - "prop-types": "15.6.1", - "react-fast-compare": "1.0.0", - "tslib": "1.9.3", - "warning": "3.0.0" + "prop-types": "^15.6.1", + "react-fast-compare": "^1.0.0", + "tslib": "^1.9.3", + "warning": "^3.0.0" }, "dependencies": { "hoist-non-react-statics": { @@ -4547,7 +4547,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { @@ -4560,9 +4560,9 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" } }, "fs.realpath": { @@ -4576,8 +4576,8 @@ "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.9.1" + "nan": "^2.9.2", + "node-pre-gyp": "^0.9.0" }, "dependencies": { "abbrev": { @@ -4603,8 +4603,8 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { @@ -4617,7 +4617,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -4681,7 +4681,7 @@ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -4696,14 +4696,14 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -4712,12 +4712,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -4732,7 +4732,7 @@ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ignore-walk": { @@ -4741,7 +4741,7 @@ "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -4750,8 +4750,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -4770,7 +4770,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -4784,7 +4784,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -4797,8 +4797,8 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, "minizlib": { @@ -4807,7 +4807,7 @@ "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "mkdirp": { @@ -4830,9 +4830,9 @@ "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -4841,16 +4841,16 @@ "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.6", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -4859,8 +4859,8 @@ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -4875,8 +4875,8 @@ "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -4885,10 +4885,10 @@ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -4907,7 +4907,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -4928,8 +4928,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -4950,10 +4950,10 @@ "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -4970,13 +4970,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { - "core-util-is": "1.0.2", - "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.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -4985,7 +4985,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -5028,9 +5028,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -5039,7 +5039,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -5047,7 +5047,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -5062,13 +5062,13 @@ "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -5083,7 +5083,7 @@ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -5109,9 +5109,9 @@ "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "is-callable": "1.1.3" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "is-callable": "^1.1.3" } }, "functional-red-black-tree": { @@ -5144,7 +5144,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -5152,12 +5152,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -5165,8 +5165,8 @@ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -5174,7 +5174,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "global-dirs": { @@ -5182,7 +5182,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "global-modules": { @@ -5190,9 +5190,9 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -5200,11 +5200,11 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { @@ -5217,12 +5217,12 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "got": { @@ -5230,17 +5230,17 @@ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "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" } }, "graceful-fs": { @@ -5263,7 +5263,7 @@ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { - "duplexer": "0.1.1" + "duplexer": "^0.1.1" } }, "handle-thing": { @@ -5276,10 +5276,10 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { @@ -5292,7 +5292,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "uglify-js": { @@ -5301,9 +5301,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "source-map": { @@ -5320,9 +5320,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -5338,8 +5338,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has": { @@ -5347,7 +5347,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -5355,7 +5355,7 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -5374,9 +5374,9 @@ "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.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -5384,8 +5384,8 @@ "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" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -5393,7 +5393,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5403,8 +5403,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -5412,8 +5412,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hawk": { @@ -5421,10 +5421,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "he": { @@ -5437,11 +5437,11 @@ "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", "requires": { - "invariant": "2.2.4", - "loose-envify": "1.3.1", - "resolve-pathname": "2.2.0", - "value-equal": "0.4.0", - "warning": "3.0.0" + "invariant": "^2.2.1", + "loose-envify": "^1.2.0", + "resolve-pathname": "^2.2.0", + "value-equal": "^0.4.0", + "warning": "^3.0.0" } }, "hmac-drbg": { @@ -5449,9 +5449,9 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -5469,8 +5469,8 @@ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { @@ -5478,7 +5478,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -5491,10 +5491,10 @@ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { - "inherits": "2.0.3", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "wbuf": "1.7.3" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, "html-comment-regex": { @@ -5507,7 +5507,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "html-entities": { @@ -5520,13 +5520,13 @@ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz", "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==", "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.11", - "commander": "2.15.1", - "he": "1.1.1", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.3.24" + "camel-case": "3.0.x", + "clean-css": "4.1.x", + "commander": "2.15.x", + "he": "1.1.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.3.x" } }, "html-webpack-plugin": { @@ -5534,12 +5534,12 @@ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.15", - "loader-utils": "0.2.17", - "lodash": "4.17.10", - "pretty-error": "2.1.1", - "toposort": "1.0.7" + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" }, "dependencies": { "loader-utils": { @@ -5547,10 +5547,10 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } @@ -5560,10 +5560,10 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" }, "dependencies": { "domutils": { @@ -5571,7 +5571,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "isarray": { @@ -5584,10 +5584,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -5607,10 +5607,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.4.0" + "statuses": ">= 1.4.0 < 2" } }, "http-parser-js": { @@ -5623,9 +5623,9 @@ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "requires": { - "eventemitter3": "3.1.0", - "follow-redirects": "1.4.1", - "requires-port": "1.0.0" + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-proxy-middleware": { @@ -5633,10 +5633,10 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "requires": { - "http-proxy": "1.17.0", - "is-glob": "3.1.0", - "lodash": "4.17.10", - "micromatch": "2.3.11" + "http-proxy": "^1.16.2", + "is-glob": "^3.1.0", + "lodash": "^4.17.2", + "micromatch": "^2.3.11" }, "dependencies": { "arr-diff": { @@ -5644,7 +5644,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -5657,9 +5657,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -5667,7 +5667,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -5675,7 +5675,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" }, "dependencies": { "is-extglob": { @@ -5695,7 +5695,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } }, "kind-of": { @@ -5703,7 +5703,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -5711,19 +5711,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" }, "dependencies": { "is-extglob": { @@ -5736,7 +5736,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -5748,9 +5748,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -5768,7 +5768,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "icss-replace-symbols": { @@ -5781,7 +5781,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { - "postcss": "6.0.22" + "postcss": "^6.0.1" } }, "ieee754": { @@ -5809,8 +5809,8 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { @@ -5823,7 +5823,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexes-of": { @@ -5841,8 +5841,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -5860,8 +5860,8 @@ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz", "integrity": "sha1-wVPH6I/YT+9cYC6VqBaLJ3BnH+c=", "requires": { - "bowser": "1.9.3", - "hyphenate-style-name": "1.0.2" + "bowser": "^1.0.0", + "hyphenate-style-name": "^1.0.1" } }, "inquirer": { @@ -5869,20 +5869,20 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.10", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -5895,9 +5895,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "strip-ansi": { @@ -5905,7 +5905,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -5915,7 +5915,7 @@ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "requires": { - "meow": "3.7.0" + "meow": "^3.3.0" } }, "interpret": { @@ -5928,7 +5928,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -5952,8 +5952,8 @@ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "dev": true, "requires": { - "is-relative": "0.2.1", - "is-windows": "0.2.0" + "is-relative": "^0.2.1", + "is-windows": "^0.2.0" }, "dependencies": { "is-windows": { @@ -5974,7 +5974,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5982,7 +5982,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5997,7 +5997,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-boolean-object": { @@ -6016,7 +6016,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { @@ -6029,7 +6029,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-data-descriptor": { @@ -6037,7 +6037,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6045,7 +6045,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6060,9 +6060,9 @@ "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.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -6087,7 +6087,7 @@ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -6105,7 +6105,7 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -6118,7 +6118,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-installed-globally": { @@ -6126,8 +6126,8 @@ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-npm": { @@ -6140,7 +6140,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6148,7 +6148,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6169,7 +6169,7 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -6189,7 +6189,7 @@ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -6197,7 +6197,7 @@ "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.2" + "path-is-inside": "^1.0.1" } }, "is-plain-obj": { @@ -6210,7 +6210,7 @@ "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" + "isobject": "^3.0.1" } }, "is-posix-bracket": { @@ -6238,7 +6238,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-relative": { @@ -6247,7 +6247,7 @@ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "dev": true, "requires": { - "is-unc-path": "0.1.2" + "is-unc-path": "^0.1.1" } }, "is-resolvable": { @@ -6287,7 +6287,7 @@ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { - "html-comment-regex": "1.1.1" + "html-comment-regex": "^1.1.0" } }, "is-symbol": { @@ -6306,7 +6306,7 @@ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "dev": true, "requires": { - "unc-path-regex": "0.1.2" + "unc-path-regex": "^0.1.0" } }, "is-utf8": { @@ -6344,8 +6344,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.4" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" } }, "isstream": { @@ -6358,18 +6358,18 @@ "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "requires": { - "async": "2.6.0", - "compare-versions": "3.1.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.4", - "istanbul-reports": "1.3.0", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "once": "1.4.0" + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" }, "dependencies": { "debug": { @@ -6385,11 +6385,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" } }, "source-map": { @@ -6409,7 +6409,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -6417,13 +6417,13 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -6431,10 +6431,10 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "has-flag": { @@ -6447,7 +6447,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -6457,11 +6457,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -6484,7 +6484,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "jest": { @@ -6492,7 +6492,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", "requires": { - "jest-cli": "20.0.4" + "jest-cli": "^20.0.4" }, "dependencies": { "ansi-escapes": { @@ -6505,7 +6505,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6518,9 +6518,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "callsites": { @@ -6533,7 +6533,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6541,7 +6541,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "jest-cli": { @@ -6549,36 +6549,36 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", "requires": { - "ansi-escapes": "1.4.0", - "callsites": "2.0.0", - "chalk": "1.1.3", - "graceful-fs": "4.1.11", - "is-ci": "1.1.0", - "istanbul-api": "1.3.1", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-source-maps": "1.2.3", - "jest-changed-files": "20.0.3", - "jest-config": "20.0.4", - "jest-docblock": "20.0.3", - "jest-environment-jsdom": "20.0.3", - "jest-haste-map": "20.0.5", - "jest-jasmine2": "20.0.4", - "jest-message-util": "20.0.3", - "jest-regex-util": "20.0.3", - "jest-resolve-dependencies": "20.0.3", - "jest-runtime": "20.0.4", - "jest-snapshot": "20.0.3", - "jest-util": "20.0.3", - "micromatch": "2.3.11", - "node-notifier": "5.2.1", - "pify": "2.3.0", - "slash": "1.0.0", - "string-length": "1.0.1", - "throat": "3.2.0", - "which": "1.3.0", - "worker-farm": "1.6.0", - "yargs": "7.1.0" + "ansi-escapes": "^1.4.0", + "callsites": "^2.0.0", + "chalk": "^1.1.3", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.1", + "istanbul-lib-coverage": "^1.0.1", + "istanbul-lib-instrument": "^1.4.2", + "istanbul-lib-source-maps": "^1.1.0", + "jest-changed-files": "^20.0.3", + "jest-config": "^20.0.4", + "jest-docblock": "^20.0.3", + "jest-environment-jsdom": "^20.0.3", + "jest-haste-map": "^20.0.4", + "jest-jasmine2": "^20.0.4", + "jest-message-util": "^20.0.3", + "jest-regex-util": "^20.0.3", + "jest-resolve-dependencies": "^20.0.3", + "jest-runtime": "^20.0.4", + "jest-snapshot": "^20.0.3", + "jest-util": "^20.0.3", + "micromatch": "^2.3.11", + "node-notifier": "^5.0.2", + "pify": "^2.3.0", + "slash": "^1.0.0", + "string-length": "^1.0.1", + "throat": "^3.0.0", + "which": "^1.2.12", + "worker-farm": "^1.3.1", + "yargs": "^7.0.2" } }, "kind-of": { @@ -6586,7 +6586,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6594,19 +6594,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -6621,16 +6621,16 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", "requires": { - "chalk": "1.1.3", - "glob": "7.1.2", - "jest-environment-jsdom": "20.0.3", - "jest-environment-node": "20.0.3", - "jest-jasmine2": "20.0.4", - "jest-matcher-utils": "20.0.3", - "jest-regex-util": "20.0.3", - "jest-resolve": "20.0.4", - "jest-validate": "20.0.3", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "glob": "^7.1.1", + "jest-environment-jsdom": "^20.0.3", + "jest-environment-node": "^20.0.3", + "jest-jasmine2": "^20.0.4", + "jest-matcher-utils": "^20.0.3", + "jest-regex-util": "^20.0.3", + "jest-resolve": "^20.0.4", + "jest-validate": "^20.0.3", + "pretty-format": "^20.0.3" } }, "jest-diff": { @@ -6638,10 +6638,10 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", "requires": { - "chalk": "1.1.3", - "diff": "3.5.0", - "jest-matcher-utils": "20.0.3", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "diff": "^3.2.0", + "jest-matcher-utils": "^20.0.3", + "pretty-format": "^20.0.3" } }, "jest-docblock": { @@ -6654,9 +6654,9 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", "requires": { - "jest-mock": "20.0.3", - "jest-util": "20.0.3", - "jsdom": "9.12.0" + "jest-mock": "^20.0.3", + "jest-util": "^20.0.3", + "jsdom": "^9.12.0" } }, "jest-environment-node": { @@ -6664,8 +6664,8 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", "requires": { - "jest-mock": "20.0.3", - "jest-util": "20.0.3" + "jest-mock": "^20.0.3", + "jest-util": "^20.0.3" } }, "jest-haste-map": { @@ -6673,12 +6673,12 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "20.0.3", - "micromatch": "2.3.11", - "sane": "1.6.0", - "worker-farm": "1.6.0" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^20.0.3", + "micromatch": "^2.3.11", + "sane": "~1.6.0", + "worker-farm": "^1.3.1" }, "dependencies": { "arr-diff": { @@ -6686,7 +6686,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6699,9 +6699,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -6709,7 +6709,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6717,7 +6717,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -6725,7 +6725,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6733,19 +6733,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -6755,24 +6755,30 @@ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", "requires": { - "chalk": "1.1.3", - "graceful-fs": "4.1.11", - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-matchers": "20.0.3", - "jest-message-util": "20.0.3", - "jest-snapshot": "20.0.3", - "once": "1.4.0", - "p-map": "1.2.0" + "chalk": "^1.1.3", + "graceful-fs": "^4.1.11", + "jest-diff": "^20.0.3", + "jest-matcher-utils": "^20.0.3", + "jest-matchers": "^20.0.3", + "jest-message-util": "^20.0.3", + "jest-snapshot": "^20.0.3", + "once": "^1.4.0", + "p-map": "^1.1.1" } }, + "jest-localstorage-mock": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.3.0.tgz", + "integrity": "sha512-Lk+awEPuIz0PSERHtnsXyMVLvf/4mZ3sZBEjKG5sJHvey2/i2JfQmmb/NHhialMbHXZILBORzuH64YXhWGlLsQ==", + "dev": true + }, "jest-matcher-utils": { "version": "20.0.3", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", "requires": { - "chalk": "1.1.3", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "pretty-format": "^20.0.3" } }, "jest-matchers": { @@ -6780,10 +6786,10 @@ "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", "requires": { - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-message-util": "20.0.3", - "jest-regex-util": "20.0.3" + "jest-diff": "^20.0.3", + "jest-matcher-utils": "^20.0.3", + "jest-message-util": "^20.0.3", + "jest-regex-util": "^20.0.3" } }, "jest-message-util": { @@ -6791,9 +6797,9 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", "requires": { - "chalk": "1.1.3", - "micromatch": "2.3.11", - "slash": "1.0.0" + "chalk": "^1.1.3", + "micromatch": "^2.3.11", + "slash": "^1.0.0" }, "dependencies": { "arr-diff": { @@ -6801,7 +6807,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6814,9 +6820,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -6824,7 +6830,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6832,7 +6838,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -6840,7 +6846,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6848,19 +6854,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -6880,9 +6886,9 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", "requires": { - "browser-resolve": "1.11.2", - "is-builtin-module": "1.0.0", - "resolve": "1.6.0" + "browser-resolve": "^1.11.2", + "is-builtin-module": "^1.0.0", + "resolve": "^1.3.2" } }, "jest-resolve-dependencies": { @@ -6890,7 +6896,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", "requires": { - "jest-regex-util": "20.0.3" + "jest-regex-util": "^20.0.3" } }, "jest-runtime": { @@ -6898,21 +6904,21 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", "requires": { - "babel-core": "6.26.0", - "babel-jest": "20.0.3", - "babel-plugin-istanbul": "4.1.6", - "chalk": "1.1.3", - "convert-source-map": "1.5.1", - "graceful-fs": "4.1.11", - "jest-config": "20.0.4", - "jest-haste-map": "20.0.5", - "jest-regex-util": "20.0.3", - "jest-resolve": "20.0.4", - "jest-util": "20.0.3", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", + "babel-core": "^6.0.0", + "babel-jest": "^20.0.3", + "babel-plugin-istanbul": "^4.0.0", + "chalk": "^1.1.3", + "convert-source-map": "^1.4.0", + "graceful-fs": "^4.1.11", + "jest-config": "^20.0.4", + "jest-haste-map": "^20.0.4", + "jest-regex-util": "^20.0.3", + "jest-resolve": "^20.0.4", + "jest-util": "^20.0.3", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", "strip-bom": "3.0.0", - "yargs": "7.1.0" + "yargs": "^7.0.2" }, "dependencies": { "arr-diff": { @@ -6920,7 +6926,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6933,9 +6939,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -6943,7 +6949,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6951,7 +6957,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "kind-of": { @@ -6959,7 +6965,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -6967,19 +6973,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "strip-bom": { @@ -6994,12 +7000,12 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", "requires": { - "chalk": "1.1.3", - "jest-diff": "20.0.3", - "jest-matcher-utils": "20.0.3", - "jest-util": "20.0.3", - "natural-compare": "1.4.0", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "jest-diff": "^20.0.3", + "jest-matcher-utils": "^20.0.3", + "jest-util": "^20.0.3", + "natural-compare": "^1.4.0", + "pretty-format": "^20.0.3" } }, "jest-util": { @@ -7007,13 +7013,13 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", "requires": { - "chalk": "1.1.3", - "graceful-fs": "4.1.11", - "jest-message-util": "20.0.3", - "jest-mock": "20.0.3", - "jest-validate": "20.0.3", - "leven": "2.1.0", - "mkdirp": "0.5.1" + "chalk": "^1.1.3", + "graceful-fs": "^4.1.11", + "jest-message-util": "^20.0.3", + "jest-mock": "^20.0.3", + "jest-validate": "^20.0.3", + "leven": "^2.1.0", + "mkdirp": "^0.5.1" } }, "jest-validate": { @@ -7021,10 +7027,10 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", "requires": { - "chalk": "1.1.3", - "jest-matcher-utils": "20.0.3", - "leven": "2.1.0", - "pretty-format": "20.0.3" + "chalk": "^1.1.3", + "jest-matcher-utils": "^20.0.3", + "leven": "^2.1.0", + "pretty-format": "^20.0.3" } }, "jquery": { @@ -7047,8 +7053,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "jsbn": { @@ -7062,25 +7068,25 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "requires": { - "abab": "1.0.4", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.2", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "nwmatcher": "1.4.4", - "parse5": "1.5.1", - "request": "2.85.0", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-url": "4.8.0", - "xml-name-validator": "2.0.1" + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" }, "dependencies": { "acorn": { @@ -7097,8 +7103,9 @@ }, "json-bigint": { "version": "github:databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", + "from": "json-bigint@github:databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", "requires": { - "bignumber.js": "4.1.0" + "bignumber.js": "^4.0.0" } }, "json-loader": { @@ -7121,7 +7128,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stable-stringify-without-jsonify": { @@ -7150,7 +7157,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -7194,7 +7201,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "latest-version": { @@ -7202,7 +7209,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-cache": { @@ -7215,7 +7222,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "leven": { @@ -7228,8 +7235,8 @@ "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" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { @@ -7237,11 +7244,11 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "loader-fs-cache": { @@ -7249,7 +7256,7 @@ "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", "requires": { - "find-cache-dir": "0.1.1", + "find-cache-dir": "^0.1.1", "mkdirp": "0.5.1" }, "dependencies": { @@ -7258,9 +7265,9 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-up": { @@ -7268,8 +7275,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -7277,7 +7284,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "pkg-dir": { @@ -7285,7 +7292,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } } } @@ -7300,9 +7307,9 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -7310,8 +7317,8 @@ "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-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -7346,7 +7353,7 @@ "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", "dev": true, "requires": { - "lodash.isarray": "3.0.4" + "lodash.isarray": "^3.0.0" } }, "lodash.camelcase": { @@ -7392,8 +7399,8 @@ "integrity": "sha1-POaK4skWg7KBzFOUEoMDy/deaR8=", "dev": true, "requires": { - "lodash._baseget": "3.7.2", - "lodash._topath": "3.8.1" + "lodash._baseget": "^3.0.0", + "lodash._topath": "^3.0.0" } }, "lodash.isarguments": { @@ -7427,9 +7434,9 @@ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "lodash.memoize": { @@ -7447,8 +7454,8 @@ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { @@ -7456,7 +7463,7 @@ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "requires": { - "lodash._reinterpolate": "3.0.0" + "lodash._reinterpolate": "~3.0.0" } }, "lodash.topath": { @@ -7484,7 +7491,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "loud-rejection": { @@ -7492,8 +7499,8 @@ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lower-case": { @@ -7511,8 +7518,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "macaddress": { @@ -7525,7 +7532,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -7540,7 +7547,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "requires": { - "tmpl": "1.0.4" + "tmpl": "1.0.x" } }, "map-cache": { @@ -7558,7 +7565,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "math-expression-evaluator": { @@ -7576,8 +7583,8 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "media-typer": { @@ -7590,7 +7597,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "memory-fs": { @@ -7598,8 +7605,8 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "meow": { @@ -7607,16 +7614,16 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "minimist": { @@ -7646,19 +7653,19 @@ "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.2", - "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.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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" } }, "miller-rabin": { @@ -7666,8 +7673,8 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { @@ -7685,7 +7692,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -7708,7 +7715,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -7721,8 +7728,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -7730,7 +7737,7 @@ "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" + "is-plain-object": "^2.0.4" } } } @@ -7759,8 +7766,8 @@ "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" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { @@ -7784,18 +7791,18 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "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-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "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-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "natural-compare": { @@ -7809,11 +7816,11 @@ "integrity": "sha512-8IUY/rUrKz2mIynUGh8k+tul1awMKEjeHHC5G3FHvvyAW6oq4mQfNp2c0BMea+sYZJvYcrrM6GmZVIle/GRXGw==", "dev": true, "requires": { - "moo": "0.4.3", - "nomnom": "1.6.2", - "railroad-diagrams": "1.0.0", + "moo": "^0.4.3", + "nomnom": "~1.6.2", + "railroad-diagrams": "^1.0.0", "randexp": "0.4.6", - "semver": "5.5.0" + "semver": "^5.4.1" } }, "negotiator": { @@ -7836,7 +7843,7 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-fetch": { @@ -7844,8 +7851,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "is-stream": "^1.0.1" } }, "node-forge": { @@ -7863,28 +7870,28 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "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": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.2", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "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.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -7900,10 +7907,10 @@ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", "requires": { - "growly": "1.3.0", - "semver": "5.5.0", - "shellwords": "0.1.1", - "which": "1.3.0" + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" } }, "nomnom": { @@ -7912,8 +7919,8 @@ "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", "dev": true, "requires": { - "colors": "0.5.1", - "underscore": "1.4.4" + "colors": "0.5.x", + "underscore": "~1.4.4" }, "dependencies": { "colors": { @@ -7929,10 +7936,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -7940,7 +7947,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { @@ -7953,10 +7960,10 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" }, "dependencies": { "query-string": { @@ -7964,8 +7971,8 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "strict-uri-encode": { @@ -7980,124 +7987,124 @@ "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz", "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==", "requires": { - "JSONStream": "1.3.4", - "abbrev": "1.1.1", - "ansicolors": "0.3.2", - "ansistyles": "0.1.3", - "aproba": "1.2.0", - "archy": "1.0.0", - "bin-links": "1.1.2", - "bluebird": "3.5.1", - "byte-size": "4.0.3", - "cacache": "11.2.0", - "call-limit": "1.1.0", - "chownr": "1.0.1", - "ci-info": "1.4.0", - "cli-columns": "3.1.2", - "cli-table3": "0.5.0", - "cmd-shim": "2.0.2", - "columnify": "1.5.4", - "config-chain": "1.1.11", - "debuglog": "1.0.1", - "detect-indent": "5.0.0", - "detect-newline": "2.1.0", - "dezalgo": "1.0.3", - "editor": "1.0.0", - "figgy-pudding": "3.4.1", - "find-npm-prefix": "1.0.2", - "fs-vacuum": "1.2.10", - "fs-write-stream-atomic": "1.0.10", - "gentle-fs": "2.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "has-unicode": "2.0.1", - "hosted-git-info": "2.7.1", - "iferr": "1.0.2", - "imurmurhash": "0.1.4", - "inflight": "1.0.6", - "inherits": "2.0.3", - "ini": "1.3.5", - "init-package-json": "1.10.3", - "is-cidr": "2.0.6", - "json-parse-better-errors": "1.0.2", - "lazy-property": "1.0.0", - "libcipm": "2.0.2", - "libnpmhook": "4.0.1", - "libnpx": "10.2.0", - "lock-verify": "2.0.2", - "lockfile": "1.0.4", - "lodash._baseindexof": "3.1.0", - "lodash._baseuniq": "4.6.0", - "lodash._bindcallback": "3.0.1", - "lodash._cacheindexof": "3.0.2", - "lodash._createcache": "3.1.2", - "lodash._getnative": "3.9.1", - "lodash.clonedeep": "4.5.0", - "lodash.restparam": "3.6.1", - "lodash.union": "4.6.0", - "lodash.uniq": "4.5.0", - "lodash.without": "4.4.0", - "lru-cache": "4.1.3", - "meant": "1.0.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "node-gyp": "3.8.0", - "nopt": "4.0.1", - "normalize-package-data": "2.4.0", - "npm-audit-report": "1.3.1", - "npm-cache-filename": "1.0.2", - "npm-install-checks": "3.0.0", - "npm-lifecycle": "2.1.0", - "npm-package-arg": "6.1.0", - "npm-packlist": "1.1.11", - "npm-pick-manifest": "2.1.0", - "npm-profile": "3.0.2", - "npm-registry-client": "8.6.0", - "npm-registry-fetch": "1.1.0", - "npm-user-validate": "1.0.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "opener": "1.5.0", - "osenv": "0.1.5", - "pacote": "8.1.6", - "path-is-inside": "1.0.2", - "promise-inflight": "1.0.1", - "qrcode-terminal": "0.12.0", - "query-string": "6.1.0", - "qw": "1.0.1", - "read": "1.0.7", - "read-cmd-shim": "1.0.1", - "read-installed": "4.0.3", - "read-package-json": "2.0.13", - "read-package-tree": "5.2.1", - "readable-stream": "2.3.6", - "readdir-scoped-modules": "1.0.2", - "request": "2.88.0", - "retry": "0.12.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.2", - "semver": "5.5.0", - "sha": "2.0.1", - "slide": "1.1.6", - "sorted-object": "2.0.1", - "sorted-union-stream": "2.1.3", - "ssri": "6.0.0", - "stringify-package": "1.0.0", - "tar": "4.4.6", - "text-table": "0.2.0", - "tiny-relative-date": "1.3.0", + "JSONStream": "^1.3.4", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "~1.2.0", + "archy": "~1.0.0", + "bin-links": "^1.1.2", + "bluebird": "~3.5.1", + "byte-size": "^4.0.3", + "cacache": "^11.2.0", + "call-limit": "~1.1.0", + "chownr": "~1.0.1", + "ci-info": "^1.4.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.0", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "~1.1.11", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.4.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.0.1", + "glob": "~7.1.2", + "graceful-fs": "~4.1.11", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.7.1", + "iferr": "^1.0.2", + "imurmurhash": "*", + "inflight": "~1.0.6", + "inherits": "~2.0.3", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^2.0.6", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^2.0.2", + "libnpmhook": "^4.0.1", + "libnpx": "^10.2.0", + "lock-verify": "^2.0.2", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^4.1.3", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "~0.5.1", + "move-concurrently": "^1.0.1", + "node-gyp": "^3.8.0", + "nopt": "~4.0.1", + "normalize-package-data": "~2.4.0", + "npm-audit-report": "^1.3.1", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-lifecycle": "^2.1.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.11", + "npm-pick-manifest": "^2.1.0", + "npm-profile": "^3.0.2", + "npm-registry-client": "^8.6.0", + "npm-registry-fetch": "^1.1.0", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.0", + "osenv": "^0.1.5", + "pacote": "^8.1.6", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.1.0", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "^2.0.13", + "read-package-tree": "^5.2.1", + "readable-stream": "^2.3.6", + "readdir-scoped-modules": "*", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "~2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.0", + "stringify-package": "^1.0.0", + "tar": "^4.4.6", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", "uid-number": "0.0.6", - "umask": "1.1.0", - "unique-filename": "1.1.0", - "unpipe": "1.0.0", - "update-notifier": "2.5.0", - "uuid": "3.3.2", - "validate-npm-package-license": "3.0.4", - "validate-npm-package-name": "3.0.0", - "which": "1.3.1", - "worker-farm": "1.6.0", - "write-file-atomic": "2.3.0" + "umask": "~1.1.0", + "unique-filename": "~1.1.0", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.6.0", + "write-file-atomic": "^2.3.0" }, "dependencies": { "JSONStream": { @@ -8105,8 +8112,8 @@ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, "abbrev": { @@ -8119,7 +8126,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" } }, "agentkeepalive": { @@ -8127,7 +8134,7 @@ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.4.1.tgz", "integrity": "sha512-MPIwsZU9PP9kOrZpyu2042kYA8Fdt/AedQYkYXucHgF9QoD9dXVp0ypuGnHXSR0hTstBxdt85Xkh4JolYfK5wg==", "requires": { - "humanize-ms": "1.2.1" + "humanize-ms": "^1.2.1" } }, "ajv": { @@ -8135,10 +8142,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ansi-align": { @@ -8146,7 +8153,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" } }, "ansi-regex": { @@ -8159,7 +8166,7 @@ "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.1" + "color-convert": "^1.9.0" } }, "ansicolors": { @@ -8187,8 +8194,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asap": { @@ -8201,7 +8208,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "assert-plus": { @@ -8235,7 +8242,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "bin-links": { @@ -8243,11 +8250,11 @@ "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-1.1.2.tgz", "integrity": "sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg==", "requires": { - "bluebird": "3.5.1", - "cmd-shim": "2.0.2", - "gentle-fs": "2.0.1", - "graceful-fs": "4.1.11", - "write-file-atomic": "2.3.0" + "bluebird": "^3.5.0", + "cmd-shim": "^2.0.2", + "gentle-fs": "^2.0.0", + "graceful-fs": "^4.1.11", + "write-file-atomic": "^2.3.0" } }, "block-stream": { @@ -8255,7 +8262,7 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "bluebird": { @@ -8268,13 +8275,13 @@ "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.1.0", - "chalk": "2.4.1", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "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" } }, "brace-expansion": { @@ -8282,7 +8289,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -8316,20 +8323,20 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "figgy-pudding": "3.4.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.3", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "6.0.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" } }, "call-limit": { @@ -8357,9 +8364,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chownr": { @@ -8377,7 +8384,7 @@ "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.9.tgz", "integrity": "sha512-F7/fBRUU45FnvSPjXdpIrc++WRSBdCiSTlyq4ZNhLKOlHFNWgtzZ0Fd+zrqI/J1j0wmlx/f5ZQDmD2GcbrNcmw==", "requires": { - "ip-regex": "2.1.0" + "ip-regex": "^2.1.0" } }, "cli-boxes": { @@ -8390,8 +8397,8 @@ "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz", "integrity": "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=", "requires": { - "string-width": "2.1.1", - "strip-ansi": "3.0.1" + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" } }, "cli-table3": { @@ -8399,9 +8406,9 @@ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.0.tgz", "integrity": "sha512-c7YHpUyO1SaKaO7kYtxd5NZ8FjAmSK3LpKkuzdwn+2CwpFxBpdoQLm+OAnnCfoEl7onKhN9PKQi1lsHuAIUqGQ==", "requires": { - "colors": "1.1.2", - "object-assign": "4.1.1", - "string-width": "2.1.1" + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" } }, "cliui": { @@ -8409,9 +8416,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -8424,7 +8431,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -8439,8 +8446,8 @@ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1" + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" } }, "co": { @@ -8458,7 +8465,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -8477,8 +8484,8 @@ "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "requires": { - "strip-ansi": "3.0.1", - "wcwidth": "1.0.1" + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" } }, "combined-stream": { @@ -8486,7 +8493,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -8499,10 +8506,10 @@ "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.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "config-chain": { @@ -8510,8 +8517,8 @@ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "requires": { - "ini": "1.3.5", - "proto-list": "1.2.4" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, "configstore": { @@ -8519,12 +8526,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.3.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "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" } }, "console-control-strings": { @@ -8537,12 +8544,12 @@ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "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": { "iferr": { @@ -8562,7 +8569,7 @@ "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" + "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { @@ -8570,9 +8577,9 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.3", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-random-string": { @@ -8590,7 +8597,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "debug": { @@ -8633,7 +8640,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "requires": { - "clone": "1.0.4" + "clone": "^1.0.2" } }, "delayed-stream": { @@ -8661,8 +8668,8 @@ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { - "asap": "2.0.6", - "wrappy": "1.0.2" + "asap": "^2.0.0", + "wrappy": "1" } }, "dot-prop": { @@ -8670,7 +8677,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "dotenv": { @@ -8688,10 +8695,10 @@ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "ecc-jsbn": { @@ -8700,8 +8707,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "editor": { @@ -8714,7 +8721,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "0.4.23" + "iconv-lite": "~0.4.13" } }, "end-of-stream": { @@ -8722,7 +8729,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "err-code": { @@ -8735,7 +8742,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "es6-promise": { @@ -8748,7 +8755,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "4.2.4" + "es6-promise": "^4.0.3" } }, "escape-string-regexp": { @@ -8761,13 +8768,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "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" } }, "extend": { @@ -8805,7 +8812,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "flush-write-stream": { @@ -8813,8 +8820,8 @@ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" } }, "forever-agent": { @@ -8827,9 +8834,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.19" + "mime-types": "^2.1.12" } }, "from2": { @@ -8837,8 +8844,8 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-minipass": { @@ -8846,7 +8853,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "requires": { - "minipass": "2.3.3" + "minipass": "^2.2.1" } }, "fs-vacuum": { @@ -8854,9 +8861,9 @@ "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.10.tgz", "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", "requires": { - "graceful-fs": "4.1.11", - "path-is-inside": "1.0.2", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" } }, "fs-write-stream-atomic": { @@ -8864,10 +8871,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.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" }, "dependencies": { "iferr": { @@ -8887,10 +8894,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "gauge": { @@ -8898,14 +8905,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "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": { "string-width": { @@ -8913,9 +8920,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -8930,14 +8937,14 @@ "resolved": "https://registry.npmjs.org/gentle-fs/-/gentle-fs-2.0.1.tgz", "integrity": "sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew==", "requires": { - "aproba": "1.2.0", - "fs-vacuum": "1.2.10", - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "path-is-inside": "1.0.2", - "read-cmd-shim": "1.0.1", - "slide": "1.1.6" + "aproba": "^1.1.2", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" }, "dependencies": { "iferr": { @@ -8962,7 +8969,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -8970,12 +8977,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "global-dirs": { @@ -8983,7 +8990,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "got": { @@ -8991,17 +8998,17 @@ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.2", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "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" } }, "graceful-fs": { @@ -9019,8 +9026,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.3.0", + "har-schema": "^2.0.0" } }, "has-flag": { @@ -9048,7 +9055,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "requires": { - "agent-base": "4.2.0", + "agent-base": "4", "debug": "3.1.0" } }, @@ -9057,9 +9064,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-proxy-agent": { @@ -9067,8 +9074,8 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" + "agent-base": "^4.1.0", + "debug": "^3.1.0" } }, "humanize-ms": { @@ -9076,7 +9083,7 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "requires": { - "ms": "2.1.1" + "ms": "^2.0.0" } }, "iconv-lite": { @@ -9084,7 +9091,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "iferr": { @@ -9097,7 +9104,7 @@ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "import-lazy": { @@ -9115,8 +9122,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -9134,14 +9141,14 @@ "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", "requires": { - "glob": "7.1.2", - "npm-package-arg": "6.1.0", - "promzard": "0.3.0", - "read": "1.0.7", - "read-package-json": "2.0.13", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.4", - "validate-npm-package-name": "3.0.0" + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" } }, "invert-kv": { @@ -9164,7 +9171,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-ci": { @@ -9172,7 +9179,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "1.4.0" + "ci-info": "^1.0.0" } }, "is-cidr": { @@ -9180,7 +9187,7 @@ "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-2.0.6.tgz", "integrity": "sha512-A578p1dV22TgPXn6NCaDAPj6vJvYsBgAzUrAd28a4oldeXJjWqEUuSZOLIW3im51mazOKsoyVp8NU/OItlWacw==", "requires": { - "cidr-regex": "2.0.9" + "cidr-regex": "^2.0.8" } }, "is-fullwidth-code-point": { @@ -9188,7 +9195,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-installed-globally": { @@ -9196,8 +9203,8 @@ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-npm": { @@ -9215,7 +9222,7 @@ "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.2" + "path-is-inside": "^1.0.1" } }, "is-redirect": { @@ -9300,7 +9307,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-property": { @@ -9313,7 +9320,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "libcipm": { @@ -9321,20 +9328,20 @@ "resolved": "https://registry.npmjs.org/libcipm/-/libcipm-2.0.2.tgz", "integrity": "sha512-9uZ6/LAflVEijksTRq/RX0e+pGA4mr8tND9Cmk2JMg7j2fFUBrs8PpFX2DOAJR/XoxPzz+5h8bkWmtIYLunKAg==", "requires": { - "bin-links": "1.1.2", - "bluebird": "3.5.1", - "find-npm-prefix": "1.0.2", - "graceful-fs": "4.1.11", - "lock-verify": "2.0.2", - "mkdirp": "0.5.1", - "npm-lifecycle": "2.1.0", - "npm-logical-tree": "1.2.1", - "npm-package-arg": "6.1.0", - "pacote": "8.1.6", - "protoduck": "5.0.0", - "read-package-json": "2.0.13", - "rimraf": "2.6.2", - "worker-farm": "1.6.0" + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^2.0.3", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^8.1.6", + "protoduck": "^5.0.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" } }, "libnpmhook": { @@ -9342,8 +9349,8 @@ "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-4.0.1.tgz", "integrity": "sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg==", "requires": { - "figgy-pudding": "3.4.1", - "npm-registry-fetch": "3.1.1" + "figgy-pudding": "^3.1.0", + "npm-registry-fetch": "^3.0.0" }, "dependencies": { "npm-registry-fetch": { @@ -9351,11 +9358,11 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.1.1.tgz", "integrity": "sha512-xBobENeenvjIG8PgQ1dy77AXTI25IbYhmA3DusMIfw/4EL5BaQ5e1V9trkPrqHvyjR3/T0cnH6o0Wt/IzcI5Ag==", "requires": { - "bluebird": "3.5.1", - "figgy-pudding": "3.4.1", - "lru-cache": "4.1.3", - "make-fetch-happen": "4.0.1", - "npm-package-arg": "6.1.0" + "bluebird": "^3.5.1", + "figgy-pudding": "^3.1.0", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^4.0.0", + "npm-package-arg": "^6.0.0" } } } @@ -9365,14 +9372,14 @@ "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.0.tgz", "integrity": "sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ==", "requires": { - "dotenv": "5.0.1", - "npm-package-arg": "6.1.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.2", - "update-notifier": "2.5.0", - "which": "1.3.1", - "y18n": "4.0.0", - "yargs": "11.0.0" + "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": "^11.0.0" } }, "locate-path": { @@ -9380,8 +9387,8 @@ "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-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lock-verify": { @@ -9389,8 +9396,8 @@ "resolved": "https://registry.npmjs.org/lock-verify/-/lock-verify-2.0.2.tgz", "integrity": "sha512-QNVwK0EGZBS4R3YQ7F1Ox8p41Po9VGl2QG/2GsuvTbkJZYSsPeWHKMbbH6iZMCHWSMww5nrJroZYnGzI4cePuw==", "requires": { - "npm-package-arg": "6.1.0", - "semver": "5.5.0" + "npm-package-arg": "^5.1.2 || 6", + "semver": "^5.4.1" } }, "lockfile": { @@ -9398,7 +9405,7 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "requires": { - "signal-exit": "3.0.2" + "signal-exit": "^3.0.2" } }, "lodash._baseindexof": { @@ -9411,8 +9418,8 @@ "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "requires": { - "lodash._createset": "4.0.3", - "lodash._root": "3.0.1" + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" } }, "lodash._bindcallback": { @@ -9430,7 +9437,7 @@ "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "requires": { - "lodash._getnative": "3.9.1" + "lodash._getnative": "^3.0.0" } }, "lodash._createset": { @@ -9483,8 +9490,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -9492,7 +9499,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "make-fetch-happen": { @@ -9500,17 +9507,17 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", "requires": { - "agentkeepalive": "3.4.1", - "cacache": "11.2.0", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.1.0", - "https-proxy-agent": "2.2.1", - "lru-cache": "4.1.3", - "mississippi": "3.0.0", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "4.0.1", - "ssri": "6.0.0" + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" } }, "meant": { @@ -9523,7 +9530,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "mime-db": { @@ -9536,7 +9543,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "requires": { - "mime-db": "1.35.0" + "mime-db": "~1.35.0" } }, "mimic-fn": { @@ -9549,7 +9556,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -9562,8 +9569,8 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.2" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" }, "dependencies": { "yallist": { @@ -9578,7 +9585,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "requires": { - "minipass": "2.3.3" + "minipass": "^2.2.1" } }, "mississippi": { @@ -9586,16 +9593,16 @@ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.0", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.2", - "through2": "2.0.3" + "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" } }, "mkdirp": { @@ -9611,12 +9618,12 @@ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { @@ -9634,9 +9641,9 @@ "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", "requires": { - "encoding": "0.1.12", - "json-parse-better-errors": "1.0.2", - "safe-buffer": "5.1.2" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" } }, "node-gyp": { @@ -9644,18 +9651,18 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.88.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.1" + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" }, "dependencies": { "nopt": { @@ -9663,7 +9670,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { - "abbrev": "1.1.1" + "abbrev": "1" } }, "semver": { @@ -9676,9 +9683,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } } } @@ -9688,8 +9695,8 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "normalize-package-data": { @@ -9697,10 +9704,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "2.7.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.4" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "npm-audit-report": { @@ -9708,8 +9715,8 @@ "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.1.tgz", "integrity": "sha512-SjTF8ZP4rOu3JiFrTMi4M1CmVo2tni2sP4TzhyCMHwnMGf6XkdGLZKt9cdZ12esKf0mbQqFyU9LtY0SoeahL7g==", "requires": { - "cli-table3": "0.5.0", - "console-control-strings": "1.1.0" + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" } }, "npm-bundled": { @@ -9727,7 +9734,7 @@ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-3.0.0.tgz", "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { - "semver": "5.5.0" + "semver": "^2.3.0 || 3.x || 4 || 5" } }, "npm-lifecycle": { @@ -9735,14 +9742,14 @@ "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz", "integrity": "sha512-QbBfLlGBKsktwBZLj6AviHC6Q9Y3R/AY4a2PYSIRhSKSS0/CxRyD/PfxEX6tPeOCXQgMSNdwGeECacstgptc+g==", "requires": { - "byline": "5.0.0", - "graceful-fs": "4.1.11", - "node-gyp": "3.8.0", - "resolve-from": "4.0.0", - "slide": "1.1.6", + "byline": "^5.0.0", + "graceful-fs": "^4.1.11", + "node-gyp": "^3.8.0", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", "uid-number": "0.0.6", - "umask": "1.1.0", - "which": "1.3.1" + "umask": "^1.1.0", + "which": "^1.3.1" } }, "npm-logical-tree": { @@ -9755,10 +9762,10 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", "requires": { - "hosted-git-info": "2.7.1", - "osenv": "0.1.5", - "semver": "5.5.0", - "validate-npm-package-name": "3.0.0" + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" } }, "npm-packlist": { @@ -9766,8 +9773,8 @@ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.5" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npm-pick-manifest": { @@ -9775,8 +9782,8 @@ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", "requires": { - "npm-package-arg": "6.1.0", - "semver": "5.5.0" + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" } }, "npm-profile": { @@ -9784,8 +9791,8 @@ "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-3.0.2.tgz", "integrity": "sha512-rEJOFR6PbwOvvhGa2YTNOJQKNuc6RovJ6T50xPU7pS9h/zKPNCJ+VHZY2OFXyZvEi+UQYtHRTp8O/YM3tUD20A==", "requires": { - "aproba": "1.2.0", - "make-fetch-happen": "4.0.1" + "aproba": "^1.1.2 || 2", + "make-fetch-happen": "^2.5.0 || 3 || 4" } }, "npm-registry-client": { @@ -9793,18 +9800,18 @@ "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", "requires": { - "concat-stream": "1.6.2", - "graceful-fs": "4.1.11", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.1.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "request": "2.88.0", - "retry": "0.10.1", - "safe-buffer": "5.1.2", - "semver": "5.5.0", - "slide": "1.1.6", - "ssri": "5.3.0" + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" }, "dependencies": { "retry": { @@ -9817,7 +9824,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.1" } } } @@ -9827,12 +9834,12 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-1.1.0.tgz", "integrity": "sha512-XJPIBfMtgaooRtZmuA42xCeLf3tkxdIX0xqRsGWwNrcVvJ9UYFccD7Ho7QWCzvkM3i/QrkUC37Hu0a+vDBmt5g==", "requires": { - "bluebird": "3.5.1", - "figgy-pudding": "2.0.1", - "lru-cache": "4.1.3", - "make-fetch-happen": "3.0.0", - "npm-package-arg": "6.1.0", - "safe-buffer": "5.1.2" + "bluebird": "^3.5.1", + "figgy-pudding": "^2.0.1", + "lru-cache": "^4.1.2", + "make-fetch-happen": "^3.0.0", + "npm-package-arg": "^6.0.0", + "safe-buffer": "^5.1.1" }, "dependencies": { "cacache": { @@ -9840,19 +9847,19 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.3", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" }, "dependencies": { "mississippi": { @@ -9860,16 +9867,16 @@ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.0", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.2", - "through2": "2.0.3" + "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": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } } } @@ -9884,17 +9891,17 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz", "integrity": "sha512-FmWY7gC0mL6Z4N86vE14+m719JKE4H0A+pyiOH18B025gF/C113pyfb4gHDDYP5cqnRMHOz06JGdmffC/SES+w==", "requires": { - "agentkeepalive": "3.4.1", - "cacache": "10.0.4", - "http-cache-semantics": "3.8.1", - "http-proxy-agent": "2.1.0", - "https-proxy-agent": "2.2.1", - "lru-cache": "4.1.3", - "mississippi": "3.0.0", - "node-fetch-npm": "2.0.2", - "promise-retry": "1.1.1", - "socks-proxy-agent": "3.0.1", - "ssri": "5.3.0" + "agentkeepalive": "^3.4.1", + "cacache": "^10.0.4", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^3.0.1", + "ssri": "^5.2.4" } }, "pump": { @@ -9902,8 +9909,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "smart-buffer": { @@ -9916,8 +9923,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" } }, "socks-proxy-agent": { @@ -9925,8 +9932,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" + "agent-base": "^4.1.0", + "socks": "^1.1.10" } }, "ssri": { @@ -9934,7 +9941,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.1" } } } @@ -9944,7 +9951,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npm-user-validate": { @@ -9957,10 +9964,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -9983,7 +9990,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "opener": { @@ -10001,9 +10008,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -10016,8 +10023,8 @@ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "p-finally": { @@ -10030,7 +10037,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -10038,7 +10045,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -10051,10 +10058,10 @@ "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.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "pacote": { @@ -10062,31 +10069,31 @@ "resolved": "https://registry.npmjs.org/pacote/-/pacote-8.1.6.tgz", "integrity": "sha512-wTOOfpaAQNEQNtPEx92x9Y9kRWVu45v583XT8x2oEV2xRB74+xdqMZIeGW4uFvAyZdmSBtye+wKdyyLaT8pcmw==", "requires": { - "bluebird": "3.5.1", - "cacache": "11.2.0", - "get-stream": "3.0.0", - "glob": "7.1.2", - "lru-cache": "4.1.3", - "make-fetch-happen": "4.0.1", - "minimatch": "3.0.4", - "minipass": "2.3.3", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.1.0", - "npm-packlist": "1.1.11", - "npm-pick-manifest": "2.1.0", - "osenv": "0.1.5", - "promise-inflight": "1.0.1", - "promise-retry": "1.1.1", - "protoduck": "5.0.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.2", - "semver": "5.5.0", - "ssri": "6.0.0", - "tar": "4.4.6", - "unique-filename": "1.1.0", - "which": "1.3.1" + "bluebird": "^3.5.1", + "cacache": "^11.0.2", + "get-stream": "^3.0.0", + "glob": "^7.1.2", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.10", + "npm-pick-manifest": "^2.1.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "ssri": "^6.0.0", + "tar": "^4.4.3", + "unique-filename": "^1.1.0", + "which": "^1.3.0" } }, "parallel-transform": { @@ -10094,9 +10101,9 @@ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "path-exists": { @@ -10149,8 +10156,8 @@ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "requires": { - "err-code": "1.1.2", - "retry": "0.10.1" + "err-code": "^1.0.0", + "retry": "^0.10.0" }, "dependencies": { "retry": { @@ -10165,7 +10172,7 @@ "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "requires": { - "read": "1.0.7" + "read": "1" } }, "proto-list": { @@ -10178,7 +10185,7 @@ "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", "requires": { - "genfun": "4.0.1" + "genfun": "^4.0.1" } }, "prr": { @@ -10201,8 +10208,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -10210,9 +10217,9 @@ "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.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" }, "dependencies": { "pump": { @@ -10220,8 +10227,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -10246,8 +10253,8 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.1.0.tgz", "integrity": "sha512-pNB/Gr8SA8ff8KpUFM36o/WFAlthgaThka5bV19AD9PNTH20Pwq5Zxodif2YyHwrctp6SkL4GqlOot0qR/wGaw==", "requires": { - "decode-uri-component": "0.2.0", - "strict-uri-encode": "2.0.0" + "decode-uri-component": "^0.2.0", + "strict-uri-encode": "^2.0.0" } }, "qw": { @@ -10260,10 +10267,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -10278,7 +10285,7 @@ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "requires": { - "mute-stream": "0.0.7" + "mute-stream": "~0.0.4" } }, "read-cmd-shim": { @@ -10286,7 +10293,7 @@ "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.2" } }, "read-installed": { @@ -10294,13 +10301,13 @@ "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { - "debuglog": "1.0.1", - "graceful-fs": "4.1.11", - "read-package-json": "2.0.13", - "readdir-scoped-modules": "1.0.2", - "semver": "5.5.0", - "slide": "1.1.6", - "util-extend": "1.0.3" + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" } }, "read-package-json": { @@ -10308,11 +10315,11 @@ "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", "requires": { - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "json-parse-better-errors": "1.0.2", - "normalize-package-data": "2.4.0", - "slash": "1.0.0" + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" } }, "read-package-tree": { @@ -10320,11 +10327,11 @@ "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "once": "1.4.0", - "read-package-json": "2.0.13", - "readdir-scoped-modules": "1.0.2" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" } }, "readable-stream": { @@ -10332,13 +10339,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "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" } }, "readdir-scoped-modules": { @@ -10346,10 +10353,10 @@ "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { - "debuglog": "1.0.1", - "dezalgo": "1.0.3", - "graceful-fs": "4.1.11", - "once": "1.4.0" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" } }, "registry-auth-token": { @@ -10357,8 +10364,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "1.2.7", - "safe-buffer": "5.1.2" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -10366,7 +10373,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "1.2.7" + "rc": "^1.0.1" } }, "request": { @@ -10374,26 +10381,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "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.0", - "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.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "require-directory": { @@ -10421,7 +10428,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "run-queue": { @@ -10429,7 +10436,7 @@ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "safe-buffer": { @@ -10452,7 +10459,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "5.5.0" + "semver": "^5.0.3" } }, "set-blocking": { @@ -10465,8 +10472,8 @@ "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", "requires": { - "graceful-fs": "4.1.11", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" } }, "shebang-command": { @@ -10474,7 +10481,7 @@ "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": "^1.0.0" } }, "shebang-regex": { @@ -10507,8 +10514,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.0.tgz", "integrity": "sha512-uRKV9uXQ9ytMbGm2+DilS1jB7N3AC0mmusmW5TVWjNuBZjxS8+lX38fasKVY9I4opv/bY/iqTbcpFFaTwpfwRg==", "requires": { - "ip": "1.1.5", - "smart-buffer": "4.0.1" + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" } }, "socks-proxy-agent": { @@ -10516,8 +10523,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", "requires": { - "agent-base": "4.2.0", - "socks": "2.2.0" + "agent-base": "~4.2.0", + "socks": "~2.2.0" } }, "sorted-object": { @@ -10530,8 +10537,8 @@ "resolved": "https://registry.npmjs.org/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz", "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", "requires": { - "from2": "1.3.0", - "stream-iterate": "1.2.0" + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" }, "dependencies": { "from2": { @@ -10539,8 +10546,8 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-1.3.0.tgz", "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" } }, "isarray": { @@ -10553,10 +10560,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "string_decoder": { @@ -10571,8 +10578,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -10585,8 +10592,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -10599,15 +10606,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "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": { @@ -10620,8 +10627,8 @@ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-iterate": { @@ -10629,8 +10636,8 @@ "resolved": "https://registry.npmjs.org/stream-iterate/-/stream-iterate-1.2.0.tgz", "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", "requires": { - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" } }, "stream-shift": { @@ -10648,8 +10655,8 @@ "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -10667,7 +10674,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -10677,7 +10684,7 @@ "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.2" + "safe-buffer": "~5.1.0" } }, "stringify-package": { @@ -10690,7 +10697,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-eof": { @@ -10708,7 +10715,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "tar": { @@ -10716,13 +10723,13 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.3", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.3", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" }, "dependencies": { "yallist": { @@ -10737,7 +10744,7 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "text-table": { @@ -10755,8 +10762,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "timed-out": { @@ -10774,8 +10781,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "1.1.29", - "punycode": "1.4.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -10783,7 +10790,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -10812,7 +10819,7 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "requires": { - "unique-slug": "2.0.0" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -10820,7 +10827,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unique-string": { @@ -10828,7 +10835,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "unpipe": { @@ -10846,16 +10853,16 @@ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "requires": { - "boxen": "1.3.0", - "chalk": "2.4.1", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "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" } }, "url-parse-lax": { @@ -10863,7 +10870,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "util-deprecate": { @@ -10886,8 +10893,8 @@ "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" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "validate-npm-package-name": { @@ -10895,7 +10902,7 @@ "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" + "builtins": "^1.0.3" } }, "verror": { @@ -10903,9 +10910,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "wcwidth": { @@ -10913,7 +10920,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "requires": { - "defaults": "1.0.3" + "defaults": "^1.0.3" } }, "which": { @@ -10921,7 +10928,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -10934,7 +10941,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" }, "dependencies": { "string-width": { @@ -10942,9 +10949,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -10954,7 +10961,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "worker-farm": { @@ -10962,7 +10969,7 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -10970,8 +10977,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "string-width": { @@ -10979,9 +10986,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -10996,9 +11003,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -11026,18 +11033,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" }, "dependencies": { "y18n": { @@ -11052,7 +11059,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -11062,7 +11069,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "nth-check": { @@ -11070,7 +11077,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "num2fraction": { @@ -11103,9 +11110,9 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -11113,7 +11120,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "kind-of": { @@ -11121,7 +11128,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -11153,7 +11160,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.assign": { @@ -11162,10 +11169,10 @@ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "object-keys": "1.0.11" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "object.entries": { @@ -11174,10 +11181,10 @@ "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1", - "has": "1.0.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" } }, "object.omit": { @@ -11185,8 +11192,8 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -11194,7 +11201,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "object.values": { @@ -11203,10 +11210,10 @@ "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1", - "has": "1.0.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.6.1", + "function-bind": "^1.1.0", + "has": "^1.0.1" } }, "obuf": { @@ -11232,7 +11239,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -11240,7 +11247,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "opn": { @@ -11248,7 +11255,7 @@ "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "optimist": { @@ -11256,8 +11263,8 @@ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { @@ -11272,12 +11279,12 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "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", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "original": { @@ -11285,7 +11292,7 @@ "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", "requires": { - "url-parse": "1.0.5" + "url-parse": "1.0.x" }, "dependencies": { "url-parse": { @@ -11293,8 +11300,8 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" + "querystringify": "0.0.x", + "requires-port": "1.0.x" } } } @@ -11314,7 +11321,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "1.0.0" + "lcid": "^1.0.0" } }, "os-tmpdir": { @@ -11332,7 +11339,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -11340,7 +11347,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-map": { @@ -11358,10 +11365,10 @@ "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.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "pako": { @@ -11374,7 +11381,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { @@ -11382,11 +11389,11 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.16" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { @@ -11394,10 +11401,10 @@ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -11405,7 +11412,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { @@ -11483,9 +11490,9 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pbkdf2": { @@ -11493,11 +11500,11 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "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": { @@ -11520,7 +11527,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -11528,7 +11535,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } }, "pluralize": { @@ -11541,9 +11548,9 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "async": { @@ -11563,9 +11570,9 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" }, "dependencies": { "chalk": { @@ -11573,9 +11580,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } @@ -11585,9 +11592,9 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" }, "dependencies": { "has-flag": { @@ -11600,10 +11607,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11616,7 +11623,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11626,9 +11633,9 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "has-flag": { @@ -11641,10 +11648,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11657,7 +11664,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11667,8 +11674,8 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" }, "dependencies": { "has-flag": { @@ -11681,10 +11688,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11697,7 +11704,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11707,7 +11714,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" }, "dependencies": { "has-flag": { @@ -11720,10 +11727,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11736,7 +11743,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11746,7 +11753,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "has-flag": { @@ -11759,10 +11766,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11775,7 +11782,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11785,7 +11792,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" }, "dependencies": { "has-flag": { @@ -11798,10 +11805,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11814,7 +11821,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11824,7 +11831,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.16" }, "dependencies": { "has-flag": { @@ -11837,10 +11844,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11853,7 +11860,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11863,8 +11870,8 @@ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" + "postcss": "^5.0.14", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { @@ -11877,10 +11884,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11893,7 +11900,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11903,8 +11910,8 @@ "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "requires": { - "postcss": "5.2.18", - "uniqid": "4.1.1" + "postcss": "^5.0.4", + "uniqid": "^4.0.0" }, "dependencies": { "has-flag": { @@ -11917,10 +11924,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -11933,7 +11940,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -11943,7 +11950,7 @@ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz", "integrity": "sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==", "requires": { - "postcss": "6.0.22" + "postcss": "^6.0.1" } }, "postcss-load-config": { @@ -11951,10 +11958,10 @@ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" } }, "postcss-load-options": { @@ -11962,8 +11969,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" } }, "postcss-load-plugins": { @@ -11971,8 +11978,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" } }, "postcss-loader": { @@ -11980,10 +11987,10 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.22", - "postcss-load-config": "1.2.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^1.2.0", + "schema-utils": "^0.3.0" } }, "postcss-merge-idents": { @@ -11991,9 +11998,9 @@ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" }, "dependencies": { "has-flag": { @@ -12006,10 +12013,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12022,7 +12029,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12032,7 +12039,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "has-flag": { @@ -12045,10 +12052,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12061,7 +12068,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12071,11 +12078,11 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.2" + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" }, "dependencies": { "browserslist": { @@ -12083,8 +12090,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000839", - "electron-to-chromium": "1.3.45" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } }, "has-flag": { @@ -12097,10 +12104,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12113,7 +12120,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12128,9 +12135,9 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" }, "dependencies": { "has-flag": { @@ -12143,10 +12150,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12159,7 +12166,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12169,8 +12176,8 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" }, "dependencies": { "has-flag": { @@ -12183,10 +12190,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12199,7 +12206,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12209,10 +12216,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { @@ -12225,10 +12232,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12241,7 +12248,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12251,10 +12258,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" }, "dependencies": { "has-flag": { @@ -12267,10 +12274,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12283,7 +12290,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12293,7 +12300,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { - "postcss": "6.0.22" + "postcss": "^6.0.1" } }, "postcss-modules-local-by-default": { @@ -12301,8 +12308,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.22" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-scope": { @@ -12310,8 +12317,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.22" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-values": { @@ -12319,8 +12326,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.22" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" } }, "postcss-normalize-charset": { @@ -12328,7 +12335,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.5" }, "dependencies": { "has-flag": { @@ -12341,10 +12348,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12357,7 +12364,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12367,10 +12374,10 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" }, "dependencies": { "has-flag": { @@ -12383,10 +12390,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12399,7 +12406,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12409,8 +12416,8 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" }, "dependencies": { "has-flag": { @@ -12423,10 +12430,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12439,7 +12446,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12449,8 +12456,8 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" }, "dependencies": { "has-flag": { @@ -12463,10 +12470,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12479,7 +12486,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12489,7 +12496,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" }, "dependencies": { "has-flag": { @@ -12502,10 +12509,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12518,7 +12525,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12528,9 +12535,9 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" }, "dependencies": { "has-flag": { @@ -12543,10 +12550,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12559,7 +12566,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12569,9 +12576,9 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { @@ -12579,10 +12586,10 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" }, "dependencies": { "has-flag": { @@ -12595,10 +12602,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12611,7 +12618,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12621,9 +12628,9 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { @@ -12636,10 +12643,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12652,7 +12659,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12667,9 +12674,9 @@ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" }, "dependencies": { "has-flag": { @@ -12682,10 +12689,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.3", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" } }, "source-map": { @@ -12698,7 +12705,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -12728,8 +12735,8 @@ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, "pretty-format": { @@ -12737,8 +12744,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", "requires": { - "ansi-regex": "2.1.1", - "ansi-styles": "3.2.1" + "ansi-regex": "^2.1.1", + "ansi-styles": "^3.0.0" } }, "private": { @@ -12766,7 +12773,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "prop-types": { @@ -12774,9 +12781,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } }, "prop-types-extra": { @@ -12784,8 +12791,8 @@ "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", "requires": { - "react-is": "16.3.2", - "warning": "3.0.0" + "react-is": "^16.3.2", + "warning": "^3.0.0" } }, "property-expr": { @@ -12798,7 +12805,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.6.0" } }, @@ -12817,11 +12824,11 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { @@ -12859,10 +12866,10 @@ "resolved": "https://registry.npmjs.org/radium/-/radium-0.19.6.tgz", "integrity": "sha512-IABYntqCwYelUUIwA52maSCgJbqtJjHKIoD21wgpw3dGhIUbJ5chDShDGdaFiEzdF03hN9jfQqlmn0bF4YhfrQ==", "requires": { - "array-find": "1.0.0", - "exenv": "1.2.2", - "inline-style-prefixer": "2.0.5", - "prop-types": "15.6.1" + "array-find": "^1.0.0", + "exenv": "^1.2.1", + "inline-style-prefixer": "^2.0.5", + "prop-types": "^15.5.8" } }, "raf": { @@ -12870,7 +12877,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", "requires": { - "performance-now": "2.1.0" + "performance-now": "^2.1.0" } }, "railroad-diagrams": { @@ -12886,7 +12893,7 @@ "dev": true, "requires": { "discontinuous-range": "1.0.0", - "ret": "0.1.15" + "ret": "~0.1.10" } }, "randomatic": { @@ -12894,9 +12901,9 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -12911,7 +12918,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -12919,8 +12926,8 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { @@ -12952,7 +12959,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" } }, "iconv-lite": { @@ -12972,10 +12979,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -12990,10 +12997,10 @@ "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "schedule": "0.5.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "schedule": "^0.5.0" }, "dependencies": { "prop-types": { @@ -13001,8 +13008,8 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" } } } @@ -13012,7 +13019,7 @@ "resolved": "https://registry.npmjs.org/react-app-rewire-polyfills/-/react-app-rewire-polyfills-0.2.0.tgz", "integrity": "sha1-GMmn9ISdXA267ONVzxjBo8JVH9Q=", "requires": { - "babel-polyfill": "6.26.0" + "babel-polyfill": "^6.20.0" } }, "react-app-rewired": { @@ -13021,8 +13028,8 @@ "integrity": "sha512-/cbaFBaSYvCcj2BnolCh2Cx0J8QwFECg5RssXFPckhdzC9iEb5BKJGqt71ZTOF35gv6ebo4CPKJR4nZajzW4Sw==", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "dotenv": "4.0.0" + "cross-spawn": "^5.1.0", + "dotenv": "^4.0.0" } }, "react-bootstrap": { @@ -13030,18 +13037,18 @@ "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.32.1.tgz", "integrity": "sha512-RbfzKUbsukWsToWqGHfCCyMFq9QQI0TznutdyxyJw6dih2NvIne25Mrssg8LZsprqtPpyQi8bN0L0Fx3fUsL8Q==", "requires": { - "babel-runtime": "6.26.0", - "classnames": "2.2.6", - "dom-helpers": "3.3.1", - "invariant": "2.2.4", - "keycode": "2.2.0", - "prop-types": "15.6.1", - "prop-types-extra": "1.1.0", - "react-overlays": "0.8.3", - "react-prop-types": "0.4.0", - "react-transition-group": "2.3.1", - "uncontrollable": "4.1.0", - "warning": "3.0.0" + "babel-runtime": "^6.11.6", + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "invariant": "^2.2.1", + "keycode": "^2.1.2", + "prop-types": "^15.5.10", + "prop-types-extra": "^1.0.1", + "react-overlays": "^0.8.0", + "react-prop-types": "^0.4.0", + "react-transition-group": "^2.0.0", + "uncontrollable": "^4.1.0", + "warning": "^3.0.0" } }, "react-dev-utils": { @@ -13061,7 +13068,7 @@ "inquirer": "3.3.0", "is-root": "1.0.0", "opn": "5.2.0", - "react-error-overlay": "4.0.0", + "react-error-overlay": "^4.0.0", "recursive-readdir": "2.2.1", "shell-quote": "1.6.1", "sockjs-client": "1.1.4", @@ -13074,10 +13081,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.1" + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" } }, "react-error-overlay": { @@ -13105,8 +13112,8 @@ "resolved": "https://registry.npmjs.org/react-mde/-/react-mde-5.8.0.tgz", "integrity": "sha512-/iLBMrnw9T8fdqf3qlK8gybIUlYhjDCVEQ/gxtD0rIncG0cS2oPmumRj6aaULQYkmqsjUGmFVUga6C/7g3cHWQ==", "requires": { - "classnames": "2.2.6", - "npm": "6.4.1" + "classnames": "^2.2.5", + "npm": "^6.1.0" } }, "react-modal": { @@ -13114,10 +13121,10 @@ "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.4.4.tgz", "integrity": "sha512-5VYNvy301Z0xxGBQhPmDdzOcyEkUG8sU7bpRsAPI4OHgEUkbBFrpjzs/ocNI0m824/lOqTxddXzwgmDJXx3s3Q==", "requires": { - "exenv": "1.2.2", - "prop-types": "15.6.1", - "react-lifecycles-compat": "3.0.4", - "warning": "3.0.0" + "exenv": "^1.2.0", + "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.0", + "warning": "^3.0.0" } }, "react-overlays": { @@ -13125,12 +13132,12 @@ "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.8.3.tgz", "integrity": "sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA==", "requires": { - "classnames": "2.2.6", - "dom-helpers": "3.3.1", - "prop-types": "15.6.1", - "prop-types-extra": "1.1.0", - "react-transition-group": "2.3.1", - "warning": "3.0.0" + "classnames": "^2.2.5", + "dom-helpers": "^3.2.1", + "prop-types": "^15.5.10", + "prop-types-extra": "^1.0.1", + "react-transition-group": "^2.2.0", + "warning": "^3.0.0" } }, "react-prop-types": { @@ -13138,7 +13145,7 @@ "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", "requires": { - "warning": "3.0.0" + "warning": "^3.0.0" } }, "react-redux": { @@ -13146,12 +13153,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", "requires": { - "hoist-non-react-statics": "2.5.0", - "invariant": "2.2.4", - "lodash": "4.17.10", - "lodash-es": "4.17.10", - "loose-envify": "1.3.1", - "prop-types": "15.6.1" + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.0.0", + "lodash": "^4.17.5", + "lodash-es": "^4.17.5", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.0" } }, "react-resize-detector": { @@ -13159,7 +13166,7 @@ "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-1.1.0.tgz", "integrity": "sha512-68KVcQlhcWQGXMAie82YueCa4f4yqwEoiQbVyYlSgJEin1zMtNBLLeU/+6FLNf1TTgjwSfpbMTJTw/uU0HNgtQ==", "requires": { - "prop-types": "15.6.1" + "prop-types": "^15.5.10" } }, "react-router": { @@ -13167,13 +13174,13 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", "requires": { - "history": "4.7.2", - "hoist-non-react-statics": "2.5.0", - "invariant": "2.2.4", - "loose-envify": "1.3.1", - "path-to-regexp": "1.7.0", - "prop-types": "15.6.1", - "warning": "3.0.0" + "history": "^4.7.2", + "hoist-non-react-statics": "^2.3.0", + "invariant": "^2.2.2", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.5.4", + "warning": "^3.0.0" } }, "react-router-dom": { @@ -13181,12 +13188,12 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", "requires": { - "history": "4.7.2", - "invariant": "2.2.4", - "loose-envify": "1.3.1", - "prop-types": "15.6.1", - "react-router": "4.2.0", - "warning": "3.0.0" + "history": "^4.7.2", + "invariant": "^2.2.2", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.4", + "react-router": "^4.2.0", + "warning": "^3.0.0" } }, "react-router-redux": { @@ -13204,7 +13211,7 @@ "babel-eslint": "7.2.3", "babel-jest": "20.0.3", "babel-loader": "7.1.2", - "babel-preset-react-app": "3.1.1", + "babel-preset-react-app": "^3.1.1", "babel-runtime": "6.26.0", "case-sensitive-paths-webpack-plugin": "2.1.1", "chalk": "1.1.3", @@ -13212,7 +13219,7 @@ "dotenv": "4.0.0", "dotenv-expand": "4.2.0", "eslint": "4.10.0", - "eslint-config-react-app": "2.1.0", + "eslint-config-react-app": "^2.1.0", "eslint-loader": "1.9.0", "eslint-plugin-flowtype": "2.39.1", "eslint-plugin-import": "2.8.0", @@ -13221,7 +13228,7 @@ "extract-text-webpack-plugin": "3.0.2", "file-loader": "1.1.5", "fs-extra": "3.0.1", - "fsevents": "1.2.3", + "fsevents": "^1.1.3", "html-webpack-plugin": "2.29.0", "jest": "20.0.4", "object-assign": "4.1.1", @@ -13229,7 +13236,7 @@ "postcss-loader": "2.0.8", "promise": "8.0.1", "raf": "3.4.0", - "react-dev-utils": "5.0.1", + "react-dev-utils": "^5.0.1", "resolve": "1.6.0", "style-loader": "0.19.0", "sw-precache-webpack-plugin": "0.11.4", @@ -13250,10 +13257,10 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "requires": { - "babel-code-frame": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0" + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.17.0" } }, "debug": { @@ -13269,43 +13276,43 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.3", - "espree": "3.5.4", - "esquery": "1.0.1", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.10", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.12.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.3", - "text-table": "0.2.0" + "ajv": "^5.2.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.0.1", + "doctrine": "^2.0.0", + "eslint-scope": "^3.7.1", + "espree": "^3.5.1", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^9.17.0", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "^4.0.1", + "text-table": "~0.2.0" }, "dependencies": { "chalk": { @@ -13313,9 +13320,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } @@ -13330,8 +13337,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "promise": { @@ -13339,7 +13346,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "strip-ansi": { @@ -13347,7 +13354,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "whatwg-fetch": { @@ -13362,10 +13369,10 @@ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.0.tgz", "integrity": "sha1-sp2+vd3bBtIbWwiWIWf7nqwYl9g=", "requires": { - "lodash": "4.17.10", - "prop-types": "15.6.1", - "raf": "3.4.0", - "react-transition-group": "2.3.1" + "lodash": "~4.17.4", + "prop-types": "^15.6.0", + "raf": "^3.2.0", + "react-transition-group": "^2.2.1" } }, "react-sticky": { @@ -13373,8 +13380,8 @@ "resolved": "https://registry.npmjs.org/react-sticky/-/react-sticky-6.0.2.tgz", "integrity": "sha512-eXsij6ifE2k1d6eCwQzil0JRS3VLP6BYfiF7qEbVPL3GLqciedGJfbavpXx5T95x5HvhuAA4FChYEDv83r1NyQ==", "requires": { - "prop-types": "15.6.1", - "raf": "3.4.0" + "prop-types": "^15.5.8", + "raf": "^3.3.0" } }, "react-test-renderer": { @@ -13383,10 +13390,10 @@ "integrity": "sha512-vdTPnRMDbxfv4wL4lzN4EkVGXyYs7LE2uImOsqh1FKiP6L5o1oJl8nore5sFi9vxrP9PK3l4rgb/fZ4PVUaWSA==", "dev": true, "requires": { - "fbjs": "0.8.16", - "object-assign": "4.1.1", - "prop-types": "15.6.1", - "react-is": "16.4.2" + "fbjs": "^0.8.16", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0", + "react-is": "^16.4.2" }, "dependencies": { "react-is": { @@ -13402,9 +13409,9 @@ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.3.1.tgz", "integrity": "sha512-hu4/LAOFSKjWt1+1hgnOv3ldxmt6lvZGTWz4KUkFrqzXrNDIVSu6txIcPszw7PNduR8en9YTN55JLRyd/L1ZiQ==", "requires": { - "dom-helpers": "3.3.1", - "loose-envify": "1.3.1", - "prop-types": "15.6.1" + "dom-helpers": "^3.3.1", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.1" } }, "react-treebeard": { @@ -13412,12 +13419,12 @@ "resolved": "https://registry.npmjs.org/react-treebeard/-/react-treebeard-2.1.0.tgz", "integrity": "sha512-unoy8IJL1NR5jgTtK+CqOCZKZylh/Tlid0oYajW9bLZCbFelxzmCsF8Y2hyS6pvHqM4W501oOm5O/jvg3VZCrg==", "requires": { - "babel-runtime": "6.26.0", - "deep-equal": "1.0.1", - "prop-types": "15.6.1", - "radium": "0.19.6", - "shallowequal": "0.2.2", - "velocity-react": "1.4.1" + "babel-runtime": "^6.23.0", + "deep-equal": "^1.0.1", + "prop-types": "^15.5.8", + "radium": "^0.19.0", + "shallowequal": "^0.2.2", + "velocity-react": "^1.3.1" } }, "react-virtualized": { @@ -13425,12 +13432,12 @@ "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.19.0.tgz", "integrity": "sha512-aeOGF964AnR7rcKtl2mQF8Ci2s3OJI2a4lmcCTTj1tNBk0V3xKjlhQETrnHs1xU66yNx2+CMTgS4CV82Pf/oNQ==", "requires": { - "babel-runtime": "6.26.0", - "classnames": "2.2.6", - "dom-helpers": "3.3.1", - "loose-envify": "1.3.1", - "prop-types": "15.6.1", - "react-lifecycles-compat": "1.1.4" + "babel-runtime": "^6.26.0", + "classnames": "^2.2.3", + "dom-helpers": "^2.4.0 || ^3.0.0", + "loose-envify": "^1.3.0", + "prop-types": "^15.6.0", + "react-lifecycles-compat": "^1.0.2" }, "dependencies": { "react-lifecycles-compat": { @@ -13445,9 +13452,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -13455,8 +13462,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "dependencies": { "find-up": { @@ -13464,8 +13471,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -13473,7 +13480,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -13483,13 +13490,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -13497,10 +13504,10 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "recharts": { @@ -13510,11 +13517,11 @@ "requires": { "classnames": "2.2.5", "core-js": "2.5.1", - "d3-interpolate": "1.2.0", + "d3-interpolate": "^1.1.5", "d3-scale": "1.0.6", "d3-shape": "1.2.0", - "lodash": "4.17.10", - "prop-types": "15.6.1", + "lodash": "~4.17.4", + "prop-types": "^15.6.0", "react-resize-detector": "1.1.0", "react-smooth": "1.0.0", "recharts-scale": "0.3.2", @@ -13551,7 +13558,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.0.0" } } } @@ -13561,8 +13568,8 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "reduce-css-calc": { @@ -13570,9 +13577,9 @@ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" }, "dependencies": { "balanced-match": { @@ -13587,7 +13594,7 @@ "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { - "balanced-match": "0.4.2" + "balanced-match": "^0.4.2" }, "dependencies": { "balanced-match": { @@ -13602,10 +13609,10 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "lodash": "4.17.10", - "lodash-es": "4.17.10", - "loose-envify": "1.3.1", - "symbol-observable": "1.2.0" + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" } }, "redux-promise-middleware": { @@ -13633,9 +13640,9 @@ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -13643,7 +13650,7 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -13651,8 +13658,8 @@ "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" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -13660,9 +13667,9 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { @@ -13670,8 +13677,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "1.2.7", - "safe-buffer": "5.1.2" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -13679,7 +13686,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "1.2.7" + "rc": "^1.0.1" } }, "regjsgen": { @@ -13692,7 +13699,7 @@ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -13717,11 +13724,11 @@ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" + "css-select": "^1.1.0", + "dom-converter": "~0.1", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "~0.3" }, "dependencies": { "utila": { @@ -13746,7 +13753,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -13754,28 +13761,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "require-directory": { @@ -13798,8 +13805,8 @@ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "requires-port": { @@ -13812,7 +13819,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-cwd": { @@ -13820,7 +13827,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" }, "dependencies": { "resolve-from": { @@ -13835,8 +13842,8 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -13859,8 +13866,8 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -13873,7 +13880,7 @@ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -13881,7 +13888,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "ripemd160": { @@ -13889,8 +13896,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "rst-selector-parser": { @@ -13899,8 +13906,8 @@ "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", "dev": true, "requires": { - "lodash.flattendeep": "4.4.0", - "nearley": "2.15.1" + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" } }, "run-async": { @@ -13908,7 +13915,7 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -13921,7 +13928,7 @@ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { @@ -13934,7 +13941,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -13947,13 +13954,13 @@ "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", "requires": { - "anymatch": "1.3.2", - "exec-sh": "0.2.1", - "fb-watchman": "1.9.2", - "minimatch": "3.0.4", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.10.0" + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^1.8.0", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.10.0" }, "dependencies": { "bser": { @@ -13961,7 +13968,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", "requires": { - "node-int64": "0.4.0" + "node-int64": "^0.4.0" } }, "fb-watchman": { @@ -13984,16 +13991,16 @@ "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.18.5.tgz", "integrity": "sha512-z0MV+AqOnDZVSQQHr/vwimRykKVyPuGZnjWDzIiV1mdgQEG9HMx9qrEapcOQeUmSsPvHZ04BXTuXQkB/vvbU9A==", "requires": { - "chalk": "2.4.1", - "htmlparser2": "3.9.2", - "lodash.clonedeep": "4.5.0", - "lodash.escaperegexp": "4.1.2", - "lodash.isplainobject": "4.0.6", - "lodash.isstring": "4.0.1", - "lodash.mergewith": "4.6.1", - "postcss": "6.0.22", - "srcset": "1.0.0", - "xtend": "4.0.1" + "chalk": "^2.3.0", + "htmlparser2": "^3.9.0", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.mergewith": "^4.6.0", + "postcss": "^6.0.14", + "srcset": "^1.0.0", + "xtend": "^4.0.0" }, "dependencies": { "chalk": { @@ -14001,9 +14008,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "domhandler": { @@ -14011,7 +14018,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "htmlparser2": { @@ -14019,12 +14026,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.2", - "domutils": "1.5.1", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } } } @@ -14039,7 +14046,7 @@ "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", "requires": { - "object-assign": "4.1.1" + "object-assign": "^4.1.1" } }, "schema-utils": { @@ -14047,7 +14054,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" } }, "select-hose": { @@ -14073,7 +14080,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "5.5.0" + "semver": "^5.0.3" } }, "send": { @@ -14082,18 +14089,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "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", + "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.6.3", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { "mime": { @@ -14108,13 +14115,13 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.18", - "parseurl": "1.3.2" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" } }, "serve-static": { @@ -14122,9 +14129,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", "send": "0.16.2" } }, @@ -14148,10 +14155,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -14159,7 +14166,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -14179,8 +14186,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shallowequal": { @@ -14188,7 +14195,7 @@ "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", "requires": { - "lodash.keys": "3.1.2" + "lodash.keys": "^3.1.2" } }, "shebang-command": { @@ -14196,7 +14203,7 @@ "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": "^1.0.0" } }, "shebang-regex": { @@ -14209,10 +14216,10 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "shellwords": { @@ -14225,7 +14232,7 @@ "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.8.6.tgz", "integrity": "sha1-kepO47elRIqspoIKTifmkMatdxw=", "requires": { - "yargs": "10.1.2" + "yargs": "^10.0.3" }, "dependencies": { "ansi-regex": { @@ -14243,9 +14250,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "os-locale": { @@ -14253,9 +14260,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "strip-ansi": { @@ -14263,7 +14270,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "which-module": { @@ -14276,18 +14283,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.1.0" } }, "yargs-parser": { @@ -14295,7 +14302,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -14315,7 +14322,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "snapdragon": { @@ -14323,14 +14330,14 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.0" + "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": { "define-property": { @@ -14338,7 +14345,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -14346,7 +14353,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "source-map": { @@ -14361,9 +14368,9 @@ "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.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -14371,7 +14378,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -14379,7 +14386,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -14387,7 +14394,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -14395,9 +14402,9 @@ "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" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -14407,7 +14414,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { @@ -14415,7 +14422,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -14425,7 +14432,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "sockjs": { @@ -14433,8 +14440,8 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" + "faye-websocket": "^0.10.0", + "uuid": "^2.0.2" }, "dependencies": { "faye-websocket": { @@ -14442,7 +14449,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } }, "uuid": { @@ -14457,12 +14464,12 @@ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { - "debug": "2.6.9", + "debug": "^2.6.6", "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.4.3" + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" } }, "sort-keys": { @@ -14470,7 +14477,7 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -14488,11 +14495,11 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -14500,7 +14507,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" }, "dependencies": { "source-map": { @@ -14520,8 +14527,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -14534,8 +14541,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -14548,12 +14555,12 @@ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.2", - "select-hose": "2.0.0", - "spdy-transport": "2.1.0" + "debug": "^2.6.8", + "handle-thing": "^1.2.5", + "http-deceiver": "^1.2.7", + "safe-buffer": "^5.0.1", + "select-hose": "^2.0.0", + "spdy-transport": "^2.0.18" } }, "spdy-transport": { @@ -14561,13 +14568,13 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "2.3.6", - "safe-buffer": "5.1.2", - "wbuf": "1.7.3" + "debug": "^2.6.8", + "detect-node": "^2.0.3", + "hpack.js": "^2.1.6", + "obuf": "^1.1.1", + "readable-stream": "^2.2.9", + "safe-buffer": "^5.0.1", + "wbuf": "^1.7.2" } }, "split-string": { @@ -14575,7 +14582,7 @@ "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.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -14588,8 +14595,8 @@ "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", "requires": { - "array-uniq": "1.0.3", - "number-is-nan": "1.0.1" + "array-uniq": "^1.0.2", + "number-is-nan": "^1.0.0" } }, "sshpk": { @@ -14597,14 +14604,14 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "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", + "tweetnacl": "~0.14.0" } }, "static-extend": { @@ -14612,8 +14619,8 @@ "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" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -14621,7 +14628,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -14636,8 +14643,8 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -14645,11 +14652,11 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "string-length": { @@ -14657,7 +14664,7 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", "requires": { - "strip-ansi": "3.0.1" + "strip-ansi": "^3.0.0" } }, "string-width": { @@ -14665,8 +14672,8 @@ "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" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -14679,7 +14686,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -14689,7 +14696,7 @@ "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.2" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -14702,7 +14709,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -14710,7 +14717,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -14723,7 +14730,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -14736,8 +14743,8 @@ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" } }, "supports-color": { @@ -14745,7 +14752,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "svgo": { @@ -14753,13 +14760,13 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" } }, "sw-precache": { @@ -14767,16 +14774,16 @@ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", "requires": { - "dom-urls": "1.1.0", - "es6-promise": "4.2.4", - "glob": "7.1.2", - "lodash.defaults": "4.2.0", - "lodash.template": "4.4.0", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "pretty-bytes": "4.0.2", - "sw-toolbox": "3.6.0", - "update-notifier": "2.5.0" + "dom-urls": "^1.1.0", + "es6-promise": "^4.0.5", + "glob": "^7.1.1", + "lodash.defaults": "^4.2.0", + "lodash.template": "^4.4.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "pretty-bytes": "^4.0.2", + "sw-toolbox": "^3.4.0", + "update-notifier": "^2.3.0" } }, "sw-precache-webpack-plugin": { @@ -14784,9 +14791,9 @@ "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz", "integrity": "sha1-ppUBflTu1XVVFJOlGdwdqNotxeA=", "requires": { - "del": "2.2.2", - "sw-precache": "5.2.1", - "uglify-js": "3.3.24" + "del": "^2.2.2", + "sw-precache": "^5.1.1", + "uglify-js": "^3.0.13" } }, "sw-toolbox": { @@ -14794,8 +14801,8 @@ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", "requires": { - "path-to-regexp": "1.7.0", - "serviceworker-cache-polyfill": "4.0.0" + "path-to-regexp": "^1.0.1", + "serviceworker-cache-polyfill": "^4.0.0" } }, "symbol-observable": { @@ -14818,12 +14825,12 @@ "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "requires": { - "ajv": "6.5.2", - "ajv-keywords": "3.2.0", - "chalk": "2.4.1", - "lodash": "4.17.10", + "ajv": "^6.0.1", + "ajv-keywords": "^3.0.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" }, "dependencies": { "ajv": { @@ -14831,10 +14838,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.1" } }, "chalk": { @@ -14842,9 +14849,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "fast-deep-equal": { @@ -14869,7 +14876,7 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "test-exclude": { @@ -14877,11 +14884,11 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.10", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" } }, "text-table": { @@ -14919,7 +14926,7 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmp": { @@ -14927,7 +14934,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "tmpl": { @@ -14950,7 +14957,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -14958,7 +14965,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -14968,10 +14975,10 @@ "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" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -14979,8 +14986,8 @@ "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" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "toposort": { @@ -14993,7 +15000,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" }, "dependencies": { "punycode": { @@ -15033,7 +15040,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -15047,7 +15054,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-is": { @@ -15056,7 +15063,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.18" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -15074,8 +15081,8 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz", "integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==", "requires": { - "commander": "2.15.1", - "source-map": "0.6.1" + "commander": "~2.15.0", + "source-map": "~0.6.1" } }, "uglify-to-browserify": { @@ -15089,9 +15096,9 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" }, "dependencies": { "source-map": { @@ -15104,9 +15111,9 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" } }, "yargs": { @@ -15114,9 +15121,9 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -15133,7 +15140,7 @@ "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", "requires": { - "invariant": "2.2.4" + "invariant": "^2.1.0" } }, "underscore": { @@ -15147,10 +15154,10 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -15158,7 +15165,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -15166,10 +15173,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -15184,7 +15191,7 @@ "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "requires": { - "macaddress": "0.2.8" + "macaddress": "^0.2.8" } }, "uniqs": { @@ -15197,7 +15204,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universalify": { @@ -15215,8 +15222,8 @@ "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.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -15224,9 +15231,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -15261,16 +15268,16 @@ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "requires": { - "boxen": "1.3.0", - "chalk": "2.4.1", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "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" }, "dependencies": { "chalk": { @@ -15278,9 +15285,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } } } @@ -15295,7 +15302,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urijs": { @@ -15329,9 +15336,9 @@ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "requires": { - "loader-utils": "1.1.0", - "mime": "1.6.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.0.2", + "mime": "^1.4.1", + "schema-utils": "^0.3.0" } }, "url-parse": { @@ -15339,8 +15346,8 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", "requires": { - "querystringify": "2.0.0", - "requires-port": "1.0.0" + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" }, "dependencies": { "querystringify": { @@ -15355,7 +15362,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "use": { @@ -15363,7 +15370,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" } }, "util": { @@ -15406,8 +15413,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "value-equal": { @@ -15430,10 +15437,10 @@ "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.4.1.tgz", "integrity": "sha512-ZyXBm+9C/6kNUNyc+aeNKEhtTu/Mn+OfpsNBGuTxU8S2DUcis/KQL0rTN6jWL+7ygdOrun18qhheNZTA7YERmg==", "requires": { - "lodash": "4.17.10", - "prop-types": "15.6.1", - "react-transition-group": "2.3.1", - "velocity-animate": "1.5.1" + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "react-transition-group": "^2.0.0", + "velocity-animate": "^1.4.0" } }, "vendors": { @@ -15446,9 +15453,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vm-browserify": { @@ -15464,7 +15471,7 @@ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "requires": { - "makeerror": "1.0.11" + "makeerror": "1.0.x" } }, "warning": { @@ -15472,7 +15479,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "watch": { @@ -15485,9 +15492,9 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "requires": { - "chokidar": "2.0.3", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "wbuf": { @@ -15495,7 +15502,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { - "minimalistic-assert": "1.0.1" + "minimalistic-assert": "^1.0.0" } }, "webidl-conversions": { @@ -15508,28 +15515,28 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^5.1.5", + "ajv-keywords": "^2.0.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" }, "dependencies": { "ajv-keywords": { @@ -15547,9 +15554,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -15557,9 +15564,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -15574,7 +15581,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "load-json-file": { @@ -15582,10 +15589,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "os-locale": { @@ -15593,9 +15600,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "path-type": { @@ -15603,7 +15610,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "read-pkg": { @@ -15611,9 +15618,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -15621,8 +15628,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "source-map": { @@ -15640,7 +15647,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "which-module": { @@ -15653,19 +15660,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } }, "yargs-parser": { @@ -15673,7 +15680,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -15683,11 +15690,11 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" } }, "webpack-dev-server": { @@ -15696,32 +15703,32 @@ "integrity": "sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow==", "requires": { "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.2", - "connect-history-api-fallback": "1.5.0", - "debug": "3.1.0", - "del": "3.0.0", - "express": "4.16.3", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "import-local": "0.1.1", + "array-includes": "^3.0.3", + "bonjour": "^3.5.0", + "chokidar": "^1.6.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.13.3", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.17.4", + "import-local": "^0.1.1", "internal-ip": "1.2.0", - "ip": "1.1.5", - "killable": "1.0.0", - "loglevel": "1.6.1", - "opn": "5.2.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.3", - "serve-index": "1.9.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "selfsigned": "^1.9.1", + "serve-index": "^1.7.2", "sockjs": "0.3.18", "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "4.5.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" + "spdy": "^3.4.1", + "strip-ansi": "^3.0.1", + "supports-color": "^4.2.1", + "webpack-dev-middleware": "^1.11.0", + "yargs": "^6.6.0" }, "dependencies": { "camelcase": { @@ -15734,15 +15741,15 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "cliui": { @@ -15750,9 +15757,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "debug": { @@ -15768,12 +15775,12 @@ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" } }, "globby": { @@ -15781,11 +15788,11 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "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": { @@ -15805,7 +15812,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "pify": { @@ -15818,9 +15825,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "supports-color": { @@ -15828,7 +15835,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "yargs": { @@ -15836,19 +15843,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" } }, "yargs-parser": { @@ -15856,7 +15863,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" } } } @@ -15866,8 +15873,8 @@ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", "requires": { - "fs-extra": "0.30.0", - "lodash": "4.17.10" + "fs-extra": "^0.30.0", + "lodash": ">=3.5 <5" }, "dependencies": { "fs-extra": { @@ -15875,11 +15882,11 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, "jsonfile": { @@ -15887,7 +15894,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } } } @@ -15897,8 +15904,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } }, "websocket-driver": { @@ -15906,8 +15913,8 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "requires": { - "http-parser-js": "0.4.12", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { @@ -15940,8 +15947,8 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" }, "dependencies": { "webidl-conversions": { @@ -15961,7 +15968,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -15974,7 +15981,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "window-size": { @@ -15992,7 +15999,7 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -16000,8 +16007,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -16009,7 +16016,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -16017,9 +16024,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -16034,7 +16041,7 @@ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { @@ -16042,9 +16049,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -16077,19 +16084,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" }, "dependencies": { "camelcase": { @@ -16102,9 +16109,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, "is-fullwidth-code-point": { @@ -16112,7 +16119,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -16120,9 +16127,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -16132,7 +16139,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { - "camelcase": "3.0.0" + "camelcase": "^3.0.0" }, "dependencies": { "camelcase": { @@ -16148,11 +16155,11 @@ "integrity": "sha512-Jg8fLV+ax2E5kHtAFAvh/JzMnpgyQykZS1DG8NAqojzsLjfSWKi1fX6VxHkYuQyyqPcH4bvStTBX/aF5CFhv4Q==", "requires": { "@babel/runtime": "7.0.0", - "fn-name": "2.0.1", - "lodash": "4.17.10", - "property-expr": "1.5.1", - "synchronous-promise": "2.0.5", - "toposort": "2.0.2" + "fn-name": "~2.0.1", + "lodash": "^4.17.10", + "property-expr": "^1.5.0", + "synchronous-promise": "^2.0.5", + "toposort": "^2.0.2" }, "dependencies": { "toposort": { diff --git a/mlflow/server/js/package.json b/mlflow/server/js/package.json index 886d8aac4b8cf..7150a7afe223e 100644 --- a/mlflow/server/js/package.json +++ b/mlflow/server/js/package.json @@ -55,6 +55,7 @@ "eslint-plugin-promise": "3.6.0", "eslint-plugin-react": "7.4.0", "eslint-plugin-standard": "3.0.1", + "jest-localstorage-mock": "^2.3.0", "react-app-rewired": "^1.5.2" }, "scripts": { diff --git a/mlflow/server/js/src/components/ExperimentPage.js b/mlflow/server/js/src/components/ExperimentPage.js index b924d0a5b56cf..6a03715600647 100644 --- a/mlflow/server/js/src/components/ExperimentPage.js +++ b/mlflow/server/js/src/components/ExperimentPage.js @@ -7,7 +7,9 @@ import ExperimentView from './ExperimentView'; import RequestStateWrapper from './RequestStateWrapper'; import KeyFilter from '../utils/KeyFilter'; import { ViewType } from '../sdk/MlflowEnums'; - +import { SearchUtils } from "../utils/SearchUtils"; +import LocalStorageUtils from "../utils/LocalStorageUtils"; +import { ExperimentPagePersistedState } from "../sdk/MlflowLocalStorageMessages"; export const LIFECYCLE_FILTER = { ACTIVE: 'Active', DELETED: 'Deleted' }; @@ -16,6 +18,15 @@ class ExperimentPage extends Component { super(props); this.onSearch = this.onSearch.bind(this); this.getRequestIds = this.getRequestIds.bind(this); + const store = ExperimentPage.getLocalStore(this.props.experimentId); + // Load state data persisted in localStorage. If data isn't present in localStorage (e.g. the + // first time we construct this component in a browser), the default values in + // ExperimentPagePersistedState will take precedence. + const persistedState = new ExperimentPagePersistedState(store.loadComponentState()); + this.state = { + ...ExperimentPage.getDefaultUnpersistedState(), + persistedState: persistedState.toJSON(), + }; } static propTypes = { @@ -23,31 +34,58 @@ class ExperimentPage extends Component { dispatchSearchRuns: PropTypes.func.isRequired, }; - state = { - paramKeyFilter: new KeyFilter(), - metricKeyFilter: new KeyFilter(), - getExperimentRequestId: getUUID(), - searchRunsRequestId: getUUID(), - searchInput: '', - lastExperimentId: undefined, - lifecycleFilter: LIFECYCLE_FILTER.ACTIVE, - }; + /** Returns default values for state attributes that aren't persisted in local storage. */ + static getDefaultUnpersistedState() { + return { + // String UUID associated with a GetExperiment API request + getExperimentRequestId: getUUID(), + // String UUID associated with a SearchRuns API request + searchRunsRequestId: getUUID(), + // Last experiment, if any, displayed by this instance of ExperimentPage + lastExperimentId: undefined, + // Lifecycle filter of runs to display + lifecycleFilter: LIFECYCLE_FILTER.ACTIVE, + }; + } + + /** + * Returns a LocalStorageStore instance that can be used to persist data associated with the + * ExperimentPage component (e.g. component state like metric/param filter info), for the + * specified experiment. + */ + static getLocalStore(experimentId) { + return LocalStorageUtils.getStoreForComponent("ExperimentPage", experimentId); + } + + snapshotComponentState() { + const store = ExperimentPage.getLocalStore(this.props.experimentId); + store.saveComponentState(new ExperimentPagePersistedState(this.state.persistedState)); + } + + componentDidUpdate() { + this.snapshotComponentState(); + } + + componentWillUnmount() { + // Snapshot component state on unmounts to ensure we've captured component state in cases where + // componentDidUpdate doesn't fire. + this.snapshotComponentState(); + } static getDerivedStateFromProps(props, state) { if (props.experimentId !== state.lastExperimentId) { + const store = ExperimentPage.getLocalStore(props.experimentId); + const loadedState = new ExperimentPagePersistedState(store.loadComponentState()).toJSON(); const newState = { - paramKeyFilter: new KeyFilter(), - metricKeyFilter: new KeyFilter(), - getExperimentRequestId: getUUID(), - searchRunsRequestId: getUUID(), - searchInput: '', + ...ExperimentPage.getDefaultUnpersistedState(), + persistedState: loadedState, lastExperimentId: props.experimentId, lifecycleFilter: LIFECYCLE_FILTER.ACTIVE, }; props.dispatch(getExperimentApi(props.experimentId, newState.getExperimentRequestId)); props.dispatch(searchRunsApi( [props.experimentId], - [], + SearchUtils.parseSearchInput(newState.persistedState.searchInput), lifecycleFilterToRunViewType(newState.lifecycleFilter), newState.searchRunsRequestId)); return newState; @@ -55,12 +93,15 @@ class ExperimentPage extends Component { return null; } - onSearch(paramKeyFilter, metricKeyFilter, andedExpressions, searchInput, lifecycleFilterInput) { + onSearch(paramKeyFilterString, metricKeyFilterString, searchInput, lifecycleFilterInput) { + const andedExpressions = SearchUtils.parseSearchInput(searchInput); this.setState({ - paramKeyFilter, - metricKeyFilter, - searchInput, - lifecycleFilter: lifecycleFilterInput + persistedState: new ExperimentPagePersistedState({ + paramKeyFilterString, + metricKeyFilterString, + searchInput, + }).toJSON(), + lifecycleFilter: lifecycleFilterInput, }); const searchRunsRequestId = this.props.dispatchSearchRuns( this.props.experimentId, andedExpressions, lifecycleFilterInput); @@ -72,13 +113,13 @@ class ExperimentPage extends Component {
diff --git a/mlflow/server/js/src/components/ExperimentView.js b/mlflow/server/js/src/components/ExperimentView.js index 0ec4c2ecd7e4e..277473bd4c364 100644 --- a/mlflow/server/js/src/components/ExperimentView.js +++ b/mlflow/server/js/src/components/ExperimentView.js @@ -8,7 +8,6 @@ import { withRouter } from 'react-router-dom'; import Routes from '../Routes'; import { Button, ButtonGroup, DropdownButton, MenuItem } from 'react-bootstrap'; import { Experiment, RunInfo } from '../sdk/MlflowMessages'; -import { SearchUtils } from '../utils/SearchUtils'; import { saveAs } from 'file-saver'; import { getLatestMetrics } from '../reducers/MetricReducer'; import KeyFilter from '../utils/KeyFilter'; @@ -20,6 +19,8 @@ import ExperimentViewUtil from './ExperimentViewUtil'; import DeleteRunModal from './modals/DeleteRunModal'; import RestoreRunModal from './modals/RestoreRunModal'; +import LocalStorageUtils from "../utils/LocalStorageUtils"; +import { ExperimentViewPersistedState } from "../sdk/MlflowLocalStorageMessages"; export const DEFAULT_EXPANDED_VALUE = true; @@ -48,6 +49,12 @@ class ExperimentView extends Component { this.onExpand = this.onExpand.bind(this); this.addBagged = this.addBagged.bind(this); this.removeBagged = this.removeBagged.bind(this); + const store = ExperimentView.getLocalStore(this.props.experiment.experiment_id); + const persistedState = new ExperimentViewPersistedState(store.loadComponentState()); + this.state = { + ...ExperimentView.getDefaultUnpersistedState(), + persistedState: persistedState.toJSON(), + }; } static propTypes = { @@ -80,31 +87,37 @@ class ExperimentView extends Component { searchInput: PropTypes.string.isRequired, }; - state = { - runsHiddenByExpander: {}, - // By default all runs are expanded. In this state, runs are explicitly expanded or unexpanded. - runsExpanded: {}, - runsSelected: {}, - paramKeyFilterInput: '', - metricKeyFilterInput: '', - lifecycleFilterInput: LIFECYCLE_FILTER.ACTIVE, - searchInput: '', - searchErrorMessage: undefined, - sort: { - ascending: false, - isMetric: false, - isParam: false, - key: "start_time" - }, - showMultiColumns: true, - showDeleteRunModal: false, - showRestoreRunModal: false, - // Arrays of "unbagged", or split-out metrics and parameters. We maintain these as lists to help - // keep them ordered (i.e. splitting out a column shouldn't change the ordering of columns - // that have already been split out) - unbaggedMetrics: [], - unbaggedParams: [], - }; + /** Returns default values for state attributes that aren't persisted in local storage. */ + static getDefaultUnpersistedState() { + return { + // Object mapping from run UUID -> boolean (whether the run is selected) + runsSelected: {}, + // Text entered into the param filter field + paramKeyFilterInput: '', + // Text entered into the metric filter field + metricKeyFilterInput: '', + // Lifecycle stage of runs to display + lifecycleFilterInput: '', + // Text entered into the runs-search field + searchInput: '', + // String error message, if any, from an attempted search + searchErrorMessage: undefined, + // True if a model for deleting one or more runs should be displayed + showDeleteRunModal: false, + // True if a model for restoring one or more runs should be displayed + showRestoreRunModal: false, + }; + } + + /** + * Returns a LocalStorageStore instance that can be used to persist data associated with the + * ExperimentView component (e.g. component state such as table sort settings), for the + * specified experiment. + */ + static getLocalStore(experimentId) { + return LocalStorageUtils.getStoreForComponent("ExperimentView", experimentId); + } + shouldComponentUpdate(nextProps, nextState) { // Don't update the component if a modal is showing before and after the update try. @@ -113,6 +126,35 @@ class ExperimentView extends Component { return true; } + /** + * Returns true if search filter text was updated, e.g. if a user entered new text into the + * param filter, metric filter, or search text boxes. + */ + filtersDidUpdate(prevState) { + return prevState.paramKeyFilterInput !== this.state.paramKeyFilterInput || + prevState.metricKeyFilterInput !== this.state.metricKeyFilterInput || + prevState.searchInput !== this.state.searchInput; + } + + /** Snapshots desired attributes of the component's current state in local storage. */ + snapshotComponentState() { + const store = ExperimentView.getLocalStore(this.props.experiment.experiment_id); + store.saveComponentState(new ExperimentViewPersistedState(this.state.persistedState)); + } + + componentDidUpdate(prevProps, prevState) { + // Don't snapshot state on changes to search filter text; we only want to save these on search + // in ExperimentPage + if (!this.filtersDidUpdate(prevState)) { + this.snapshotComponentState(); + } + } + + componentWillUnmount() { + // Snapshot component state on unmounts to ensure we've captured component state in cases where + // componentDidUpdate doesn't fire. + this.snapshotComponentState(); + } static getDerivedStateFromProps(nextProps, prevState) { // Compute the actual runs selected. (A run cannot be selected if it is not passed in as a @@ -138,7 +180,12 @@ class ExperimentView extends Component { } setShowMultiColumns(value) { - this.setState({ showMultiColumns: value }); + this.setState({ + persistedState: new ExperimentViewPersistedState({ + ...this.state.persistedState, + showMultiColumns: value, + }).toJSON(), + }); } onDeleteRun() { @@ -164,12 +211,19 @@ class ExperimentView extends Component { * @param colName Name of the column (metric or param key). */ addBagged(isParam, colName) { - const unbagged = isParam ? this.state.unbaggedParams : this.state.unbaggedMetrics; + const unbagged = isParam ? this.state.persistedState.unbaggedParams : + this.state.persistedState.unbaggedMetrics; const idx = unbagged.indexOf(colName); const newUnbagged = idx >= 0 ? unbagged.slice(0, idx).concat(unbagged.slice(idx + 1, unbagged.length)) : unbagged; const stateKey = isParam ? "unbaggedParams" : "unbaggedMetrics"; - this.setState({[stateKey]: newUnbagged}); + this.setState( + { + persistedState: new ExperimentViewPersistedState({ + ...this.state.persistedState, + [stateKey]: newUnbagged, + }).toJSON(), + }); } /** @@ -179,9 +233,16 @@ class ExperimentView extends Component { * @param colName Name of the column (metric or param key). */ removeBagged(isParam, colName) { - const unbagged = isParam ? this.state.unbaggedParams : this.state.unbaggedMetrics; + const unbagged = isParam ? this.state.persistedState.unbaggedParams : + this.state.persistedState.unbaggedMetrics; const stateKey = isParam ? "unbaggedParams" : "unbaggedMetrics"; - this.setState({[stateKey]: unbagged.concat([colName])}); + this.setState( + { + persistedState: new ExperimentViewPersistedState({ + ...this.state.persistedState, + [stateKey]: unbagged.concat([colName]) + }).toJSON() + }); } render() { @@ -196,6 +257,9 @@ class ExperimentView extends Component { // of parameter and metric names around later const paramKeyList = paramKeyFilter.apply(this.props.paramKeyList); const metricKeyList = metricKeyFilter.apply(this.props.metricKeyList); + const unbaggedParamKeyList = paramKeyFilter.apply(this.state.persistedState.unbaggedParams); + const unbaggedMetricKeyList = paramKeyFilter.apply(this.state.persistedState.unbaggedMetrics); + const compareDisabled = Object.keys(this.state.runsSelected).length < 2; const deleteDisabled = Object.keys(this.state.runsSelected).length < 1; const restoreDisabled = Object.keys(this.state.runsSelected).length < 1; @@ -329,21 +393,21 @@ class ExperimentView extends Component {
- {this.state.showMultiColumns ? + {this.state.persistedState.showMultiColumns ? : @@ -389,17 +453,24 @@ class ExperimentView extends Component { } onSortBy(isMetric, isParam, key) { - const sort = this.state.sort; + const sort = this.state.persistedState.sort; this.setSortBy(isMetric, isParam, key, !sort.ascending); } setSortBy(isMetric, isParam, key, ascending) { - this.setState({sort: { + const newSortState = { ascending: ascending, key: key, isMetric: isMetric, isParam: isParam - }}); + }; + this.setState( + { + persistedState: new ExperimentViewPersistedState({ + ...this.state.persistedState, + sort: newSortState, + }).toJSON(), + }); } onCheckbox(runUuid) { @@ -434,17 +505,24 @@ class ExperimentView extends Component { } onExpand(runId, childrenIds) { - const newExpanderState = !ExperimentViewUtil.isExpanderOpen(this.state.runsExpanded, runId); - const newRunsHiddenByExpander = {...this.state.runsHiddenByExpander}; + const newExpanderState = !ExperimentViewUtil.isExpanderOpen( + this.state.persistedState.runsExpanded, runId); + const newRunsHiddenByExpander = {...this.state.persistedState.runsHiddenByExpander}; childrenIds.forEach((childId) => { newRunsHiddenByExpander[childId] = !newExpanderState; }); - this.setState({ + const newPersistedStateFields = { runsExpanded: { - ...this.state.runsExpanded, + ...this.state.persistedState.runsExpanded, [runId]: newExpanderState, }, runsHiddenByExpander: newRunsHiddenByExpander, + }; + this.setState({ + persistedState: new ExperimentViewPersistedState({ + ...this.state.persistedState, + ...newPersistedStateFields, + }).toJSON(), }); // Deselect the children const newRunsSelected = {...this.state.runsSelected}; @@ -471,7 +549,7 @@ class ExperimentView extends Component { } onLifecycleFilterInput(newLifecycleInput) { - this.setState({ lifecycleFilterInput: newLifecycleInput }, this.onSearch); + this.setState({ lifecycleFilterInput: newLifecycleInput }, this.onSearch()); } onSearch(e) { @@ -484,11 +562,8 @@ class ExperimentView extends Component { searchInput, lifecycleFilterInput } = this.state; - const paramKeyFilter = new KeyFilter(paramKeyFilterInput); - const metricKeyFilter = new KeyFilter(metricKeyFilterInput); try { - const andedExpressions = SearchUtils.parseSearchInput(searchInput); - this.props.onSearch(paramKeyFilter, metricKeyFilter, andedExpressions, searchInput, + this.props.onSearch(paramKeyFilterInput, metricKeyFilterInput, searchInput, lifecycleFilterInput); } catch (ex) { this.setState({ searchErrorMessage: ex.errorMessage }); @@ -496,11 +571,15 @@ class ExperimentView extends Component { } onClear() { - const paramKeyFilter = new KeyFilter(); - const metricKeyFilter = new KeyFilter(); - const andedExpressions = []; - this.props.onSearch(paramKeyFilter, metricKeyFilter, andedExpressions, "", - LIFECYCLE_FILTER.ACTIVE); + // When user clicks "Clear", preserve multicolumn toggle state but reset other persisted state + // attributes to their default values. + const newPersistedState = new ExperimentViewPersistedState({ + showMultiColumns: this.state.persistedState.showMultiColumns, + }); + this.setState({persistedState: newPersistedState.toJSON()}, () => { + this.snapshotComponentState(); + this.props.onSearch("", "", "", LIFECYCLE_FILTER.ACTIVE); + }); } onCompare() { diff --git a/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js b/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js new file mode 100644 index 0000000000000..ffcc1b02bdefe --- /dev/null +++ b/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js @@ -0,0 +1,62 @@ +/** + * This class contains definitions of message entities corresponding to data stored in LocalStorage. + * The backwards-compatibility behavior of these messages is as follows: + * + * Backwards-compatible changes: + * 1) Adding a new field: Backwards-compatible. New fields that are absent from old data in + * local storage will take on the specified default value. + * 2) Removing a field: Backwards-compatible. Unknown fields from old data in local storage will be + * ignored at construction-time. + * + * Backwards-incompatible changes (AVOID MAKING SUCH CHANGES): + * 1) Changing the type of a field. Old data loaded from local storage will be of the wrong type. + * 2) Changing the role/usage of a field. It's better to add a new field than to repurpose an + * existing field, since a repurposed field may be populated with unexpected data cached in + * local storage. + */ +import Immutable from "immutable"; + +/** + * This class wraps attributes of the ExperimentPage component's state that should be + * persisted in / restored from local storage. + */ +export const ExperimentPagePersistedState = Immutable.Record({ + // Comma-separated string containing containing the keys of parameters to display + paramKeyFilterString: "", + // Comma-separated string containing containing the keys of metrics to display + metricKeyFilterString: "", + // SQL-like query string used to filter runs, e.g. "params.alpha = '0.5'" + searchInput: "", +}, 'ExperimentPagePersistedState'); + + +/** + * This class wraps attributes of the ExperimentPage component's state that should be + * persisted in / restored from local storage. + */ +export const ExperimentViewPersistedState = Immutable.Record({ + // Object mapping run UUIDs (strings) to booleans, where a boolean value of true indicates that + // a run has been minimized (its child runs are hidden). + runsHiddenByExpander: {}, + // Object mapping run UUIDs (strings) to booleans, where a boolean value of true indicates that + // a run has been expanded (its child runs are visible). + runsExpanded: {}, + // Object describing the sort state of the runs table. + sort: { + // Boolean indicating whether the rows are sorted in ascending order. + ascending: false, + // If true, the rows are being sorted on a metric, and isParam must be false. + isMetric: false, + // If true, the rows are being sorted on a param, and isMetric must be false. + isParam: false, + // Column to sort on (can be a metric or param key, or the name of a run metadata column) + key: "start_time" + }, + // If true, shows the multi-column table view instead of the compact table view. + showMultiColumns: true, + // Arrays of "unbagged", or split-out metric and param keys (strings). We maintain these as lists + // to help keep them ordered (i.e. splitting out a column shouldn't change the ordering of columns + // that have already been split out) + unbaggedMetrics: [], + unbaggedParams: [], +}, 'ExperimentViewPersistedState'); diff --git a/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.test.js b/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.test.js new file mode 100644 index 0000000000000..9ccec2a1aba02 --- /dev/null +++ b/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.test.js @@ -0,0 +1,19 @@ +import React from 'react'; +import { ExperimentPagePersistedState, ExperimentViewPersistedState } from '../sdk/MlflowLocalStorageMessages'; + +test('Local storage messages ignore unknown fields', () => { + const persistedState = ExperimentPagePersistedState({heyYallImAnUnknownField: "value"}); + expect(persistedState.paramKeyFilterString).toEqual(""); + expect(persistedState.metricKeyFilterString).toEqual(""); + expect(persistedState.searchInput).toEqual(""); +}); + +test('Local storage messages set default values for unspecified fields', () => { + const persistedState = ExperimentViewPersistedState({}); + expect(persistedState.sort === { + ascending: false, + isMetric: false, + isParam: false, + key: "start_time", + }); +}); diff --git a/mlflow/server/js/src/setupTests.js b/mlflow/server/js/src/setupTests.js index 82edfc9e5adea..ce3b9fb45f773 100644 --- a/mlflow/server/js/src/setupTests.js +++ b/mlflow/server/js/src/setupTests.js @@ -2,3 +2,6 @@ import { configure } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; configure({ adapter: new Adapter() }); +// Included to mock local storage in JS tests, see docs at +// https://www.npmjs.com/package/jest-localstorage-mock#in-create-react-app +require('jest-localstorage-mock'); diff --git a/mlflow/server/js/src/utils/LocalStorageUtils.js b/mlflow/server/js/src/utils/LocalStorageUtils.js new file mode 100644 index 0000000000000..562a0ba33fdde --- /dev/null +++ b/mlflow/server/js/src/utils/LocalStorageUtils.js @@ -0,0 +1,69 @@ +/** + * Utils for working with local storage. + */ +export default class LocalStorageUtils { + /** + * Protocol version of MLflow's local storage. Should be incremented on any breaking change in how + * data persisted in local storage is used, to prevent old (invalid) cached data from being loaded + * and breaking the application. + */ + static version = "1.0"; + + /** + * Return a LocalStorageStore corresponding to the specified component and ID, where the ID + * can be used to disambiguate between multiple instances of cached data for the same component + * (e.g. cached data for multiple experiments). + */ + static getStoreForComponent(componentName, id) { + return new LocalStorageStore([componentName, id].join("-")); + } +} + +/** + * Interface to browser local storage that allows for setting key-value pairs under the specified + * "scope". + */ +class LocalStorageStore { + constructor(scope) { + this.scope = scope; + } + static reactComponentStateKey = "ReactComponentState"; + + /** + * Loads React component state cached in local storage into a vanilla JS object. + */ + loadComponentState() { + const storedVal = this.getItem(LocalStorageStore.reactComponentStateKey); + if (storedVal) { + return JSON.parse(storedVal); + } + return {}; + } + + /** + * Save React component state in local storage. + * @param stateRecord: Immutable.Record instance containing component state. + */ + saveComponentState(stateRecord) { + this.setItem( + LocalStorageStore.reactComponentStateKey, JSON.stringify(stateRecord.toJSON())); + } + + /** + * Helper method for constructing a scoped key to use for setting/getting values in + * local storage. + */ + withScopePrefix(key) { + return ["MLflowLocalStorage", LocalStorageUtils.version, this.scope, key].join("-"); + } + + /** Save the specified key-value pair in local storage. */ + setItem(key, value) { + window.localStorage.setItem(this.withScopePrefix(key), value); + } + + /** Fetch the value corresponding to the passed-in key from local storage. */ + getItem(key) { + return window.localStorage.getItem(this.withScopePrefix(key)); + } +} diff --git a/mlflow/server/js/src/utils/LocalStorageUtils.test.js b/mlflow/server/js/src/utils/LocalStorageUtils.test.js new file mode 100644 index 0000000000000..f9eb7679053c4 --- /dev/null +++ b/mlflow/server/js/src/utils/LocalStorageUtils.test.js @@ -0,0 +1,34 @@ +import LocalStorageUtils from './LocalStorageUtils'; +import { ExperimentPagePersistedState } from "../sdk/MlflowLocalStorageMessages"; + +test('Setting key-value pairs in one scope does not affect the other', () => { + const store0 = LocalStorageUtils.getStoreForComponent("SomeTestComponent", 1); + const store1 = LocalStorageUtils.getStoreForComponent("AnotherTestComponent", 1); + const store2 = LocalStorageUtils.getStoreForComponent("SomeTestComponent", 2); + const persistedState0 = new ExperimentPagePersistedState({searchInput: "params.ollKorrect"}); + const persistedState1 = new ExperimentPagePersistedState({searchInput: "metrics.ok"}); + [store1, store2].forEach((otherStore) => { + store0.setItem("myKey", "myCoolVal"); + otherStore.setItem("myKey", "thisValIsBetterYo"); + expect(store0.getItem("myKey")).toEqual("myCoolVal"); + expect(otherStore.getItem("myKey")).toEqual("thisValIsBetterYo"); + + store0.saveComponentState(persistedState0); + otherStore.saveComponentState(persistedState1); + expect(store0.loadComponentState().searchInput).toEqual("params.ollKorrect"); + expect(otherStore.loadComponentState().searchInput).toEqual("metrics.ok"); + }); +}); + +test('Overwriting key-value pairs is possible', () => { + const store = LocalStorageUtils.getStoreForComponent("SomeTestComponent", 1); + store.setItem("a", "b"); + expect(store.getItem("a")).toEqual("b"); + store.setItem("a", "c"); + expect(store.getItem("a")).toEqual("c"); + store.saveComponentState(new ExperimentPagePersistedState({searchInput: "params.ollKorrect"})); + expect(store.loadComponentState().searchInput).toEqual("params.ollKorrect"); + store.saveComponentState(new ExperimentPagePersistedState({searchInput: "params.okay"})); + expect(store.loadComponentState().searchInput).toEqual("params.okay"); +}); + From 1b09159b0daa19641878c2d0e9cf00444a1a7759 Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Thu, 8 Nov 2018 16:04:07 -0800 Subject: [PATCH 044/483] Make compact view default (#700) Originally, we made the compact view non-default because it didn't support column-splitting or persistence -- now that we have both of these, we should go ahead and make this view default. Users can still switch back to the old view, and that choice will be persisted. Also switched ordering of the icons so the default is on the left. --- mlflow/server/js/src/components/ExperimentView.js | 14 +++++++------- .../js/src/sdk/MlflowLocalStorageMessages.js | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mlflow/server/js/src/components/ExperimentView.js b/mlflow/server/js/src/components/ExperimentView.js index 277473bd4c364..f28515feacaca 100644 --- a/mlflow/server/js/src/components/ExperimentView.js +++ b/mlflow/server/js/src/components/ExperimentView.js @@ -390,13 +390,6 @@ class ExperimentView extends Component { - +
diff --git a/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js b/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js index ffcc1b02bdefe..887f82978e67c 100644 --- a/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js +++ b/mlflow/server/js/src/sdk/MlflowLocalStorageMessages.js @@ -53,7 +53,7 @@ export const ExperimentViewPersistedState = Immutable.Record({ key: "start_time" }, // If true, shows the multi-column table view instead of the compact table view. - showMultiColumns: true, + showMultiColumns: false, // Arrays of "unbagged", or split-out metric and param keys (strings). We maintain these as lists // to help keep them ordered (i.e. splitting out a column shouldn't change the ordering of columns // that have already been split out) From 1e0c2bdda70d195c0eb5aa4e3c76e2d51ae98361 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Thu, 8 Nov 2018 18:12:29 -0800 Subject: [PATCH 045/483] Change pyfunc scoring server pandas format to `split` (#690) * Use 'split' record format * Fix azure test * Format * Test helper funcs fix * Scoring server handle * Print traceback when handling pyfunc server exception * pyfunc scoring tests * scoring server test file * More tests * Add scoring server tests * Lint fix * Azure var name * Shorten java test name * Docs and remove legacy sklearn serve_model * Docs update * Docs and new header * Fix sagemaker scoring tests * Azure docs update * Return pandas record oriented frame * Lint * Docs, lint * Docs improvement * Adjust content type naming and semantics * Content type adjustments * Lint * Address comments * Address comments * Address more comments * Lint * Include stacktrace as json key in exception text rather than formatted string for easier parsing * Message fix * Doc fixes * Doc tweak * remove redundant comments * Another docs fix * Fix content types * Address docs comments * Only log content type warning once * Doc formatting * Remove another instance of * Spacing fix * Address docs comments * Address more docs comments * Docs and java comments * python docs tweaks * Fix test and lint issue * Lint and test fixes * Tweak content type supported error response * Spark test fix * Remove unused sklearn imports * Fix lint errors, sagemaker test * Fix tests --- docs/source/models.rst | 106 +++++++++--- docs/source/quickstart.rst | 18 +- docs/source/tutorial.rst | 20 ++- mlflow/azureml/__init__.py | 9 +- mlflow/azureml/cli.py | 4 + mlflow/cli.py | 2 - mlflow/exceptions.py | 16 +- .../org/mlflow/sagemaker/MLeapPredictor.java | 32 +++- .../PandasRecordOrientedDataFrame.java | 68 -------- .../PandasSplitOrientedDataFrame.java | 106 ++++++++++++ .../org/mlflow/sagemaker/ScoringServer.java | 5 +- .../java/org/mlflow/MLeapPredictorTest.java | 21 ++- .../java/org/mlflow/PandasDataFrameTest.java | 99 ++++++++--- .../org/mlflow/mleap_model/sample_input.json | 18 +- mlflow/pyfunc/cli.py | 5 +- mlflow/pyfunc/scoring_server.py | 138 +++++++++++++-- mlflow/sagemaker/__init__.py | 4 + mlflow/sagemaker/cli.py | 4 + mlflow/sklearn.py | 48 +----- mlflow/utils/__init__.py | 8 +- tests/azureml/test_image_creation.py | 2 +- tests/helper_functions.py | 55 +++--- tests/keras/test_keras_model_export.py | 11 +- tests/pyfunc/test_scoring_server.py | 158 ++++++++++++++++++ tests/sagemaker/test_model_export.py | 16 +- tests/spark/test_spark_model_export.py | 31 ++-- 26 files changed, 732 insertions(+), 272 deletions(-) delete mode 100644 mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasRecordOrientedDataFrame.java create mode 100644 mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasSplitOrientedDataFrame.java create mode 100644 tests/pyfunc/test_scoring_server.py diff --git a/docs/source/models.rst b/docs/source/models.rst index 0654b37335837..86664cf759064 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -247,12 +247,34 @@ MLflow provides tools for deploying models on a local machine and to several pro Not all deployment methods are available for all model flavors. Deployment is supported for the Python Function format and all compatible formats. +.. _pyfunc_deployment: + Deploy a ``python_function`` model as a local REST API endpoint ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MLflow can deploy models locally as local REST API endpoints or to directly score CSV files. This functionality is a convenient way of testing models before deploying to a remote model server. You deploy the Python Function flavor locally using the CLI interface to the :py:mod:`mlflow.pyfunc` module. +The local REST API server accepts the following data formats as inputs: + + * JSON-serialized Pandas DataFrames in the ``split`` orientation. For example, + ``data = pandas_df.to_json(orient='split')``. This format is specified using a ``Content-Type`` + request header value of ``application/json; format=pandas-split``. Starting in MLflow 0.9.0, + this will be the default format if ``Content-Type`` is ``application/json`` (i.e, with no format + specification). + + * JSON-serialized Pandas DataFrames in the ``records`` orientation. *We do not recommend using + this format because it is not guaranteed to preserve column ordering.* Currently, this format is + specified using a ``Content-Type`` request header value of ``application/json; format=pandas-records`` + or ``application/json``. Starting in MLflow 0.9.0, ``application/json`` will refer to the + ``split`` format instead. For forwards compatibility, we recommend using the ``split`` format + or specifying the ``application/json; format=pandas-records`` content type. + + * CSV-serialized Pandas DataFrames. For example, ``data = pandas_df.to_csv()``. This format is + specified using a ``Content-Type`` request header value of ``text/csv``. + +For more information about serializing Pandas DataFrames, see +https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html * :py:func:`serve ` deploys the model as a local REST API server. * :py:func:`predict ` uses the model to generate a prediction for a local @@ -266,16 +288,23 @@ For more info, see: mlflow pyfunc serve --help mlflow pyfunc predict --help +.. _azureml_deployment: + Microsoft Azure ML ^^^^^^^^^^^^^^^^^^ The :py:mod:`mlflow.azureml` module can package ``python_function`` models into Azure ML container images. These images can be deployed to Azure Kubernetes Service (AKS) and the Azure Container Instances (ACI) -platform for real-time serving. +platform for real-time serving. The resulting Azure ML ContainerImage will contain a webserver that +accepts the following data formats as input: + + * JSON-serialized Pandas DataFrames in the ``split`` orientation. For example, + ``data = pandas_df.to_json(orient='split')``. This format is specified using a ``Content-Type`` + request header value of ``application/json``. * :py:func:`build_image ` registers an MLflow model with an existing Azure ML workspace and builds an Azure ML container image for deployment to AKS and ACI. The `Azure ML SDK`_ is - required in order to use this function. **The Azure ML SDK requires Python 3. It cannot be installed with - earlier versions of Python.** + required in order to use this function. *The Azure ML SDK requires Python 3. It cannot be installed with + earlier versions of Python.* .. _Azure ML SDK: https://docs.microsoft.com/en-us/python/api/overview/azure/ml/intro?view=azure-ml-py @@ -324,18 +353,25 @@ platform for real-time serving. import requests import json + + # `sample_input` is a JSON-serialized Pandas DatFrame with the `split` orientation sample_input = { - "residual sugar": {"0": 20.7}, - "alcohol": {"0": 8.8}, - "chlorides": {"0": 0.045}, - "density": {"0": 1.001}, - "sulphates": {"0": 0.45}, - "total sulfur dioxide": {"0": 170.0}, - "fixed acidity": {"0": 7.0}, - "citric acid": {"0": 0.36}, - "pH": {"0": 3.0}, - "volatile acidity": {"0": 0.27}, - "free sulfur dioxide": {"0": 45.0} + "columns": [ + "alcohol", + "chlorides", + "citric acid", + "density", + "fixed acidity", + "free sulfur dioxide", + "pH", + "residual sugar", + "sulphates", + "total sulfur dioxide", + "volatile acidity" + ], + "data": [ + [8.8, 0.045, 0.36, 1.001, 7, 45, 3, 20.7, 0.45, 170, 0.27] + ] } response = requests.post( url=webservice.scoring_uri, data=json.dumps(sample_input), @@ -358,19 +394,25 @@ platform for real-time serving. scoring_uri=$(az ml service show --name -v | jq -r ".scoringUri") + # `sample_input` is a JSON-serialized Pandas DatFrame with the `split` orientation sample_input=' { - "residual sugar": {"0": 20.7}, - "alcohol": {"0": 8.8}, - "chlorides": {"0": 0.045}, - "density": {"0": 1.001}, - "sulphates": {"0": 0.45}, - "total sulfur dioxide": {"0": 170.0}, - "fixed acidity": {"0": 7.0}, - "citric acid": {"0": 0.36}, - "pH": {"0": 3.0}, - "volatile acidity": {"0": 0.27}, - "free sulfur dioxide": {"0": 45.0} + "columns": [ + "alcohol", + "chlorides", + "citric acid", + "density", + "fixed acidity", + "free sulfur dioxide", + "pH", + "residual sugar", + "sulphates", + "total sulfur dioxide", + "volatile acidity" + ], + "data": [ + [8.8, 0.045, 0.36, 1.001, 7, 45, 3, 20.7, 0.45, 170, 0.27] + ] }' echo $sample_input | curl -s -X POST $scoring_uri\ @@ -385,6 +427,8 @@ For more info, see: mlflow azureml --help mlflow azureml build-image --help +.. _sagemaker_deployment: + Deploy a ``python_function`` model on Amazon SageMaker ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -394,7 +438,17 @@ To deploy remotely to SageMaker you need to set up your environment and user acc To export a custom model to SageMaker, you need a MLflow-compatible Docker image to be available on Amazon ECR. MLflow provides a default Docker image definition; however, it is up to you to build the image and upload it to ECR. MLflow includes the utility function ``build_and_push_container`` to perform this step. Once built and uploaded, you can use the MLflow -container for all MLflow models. +container for all MLflow models. Model webservers deployed using the :py:mod:`mlflow.sagemaker` +module accept the following data formats as input, depending on the deployment flavor: + + * ``python_function``: For this deployment flavor, The endpoint accepts the same formats + as the pyfunc server. These formats are described in the + :ref:`pyfunc deployment documentation `. + + * ``mleap``: For this deployment flavor, the endpoint accepts `only` + JSON-serialized Pandas DataFrames in the ``split`` orientation. For example, + ``data = pandas_df.to_json(orient='split')``. This format is specified using a ``Content-Type`` + request header value of ``application/json``. * :py:func:`run-local ` deploys the model locally in a Docker container. The image and the environment should be identical to how the model would be run diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 7ccbfc5bdc13b..58c210be09cc7 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -153,23 +153,27 @@ When you run the example, it outputs an MLflow run ID for that experiment. If yo ``mlflow ui``, you will also see that the run saved a ``model`` folder containing an ``MLmodel`` description file and a pickled scikit-learn model. You can pass the run ID and the path of the model within the artifacts directory (here "model") to various tools. For example, MLflow includes a -simple REST server for scikit-learn models: +simple REST server for python-based models: .. code:: bash - mlflow sklearn serve -r -m model + mlflow pyfunc serve -r -m model .. note:: By default the server runs on port 5000. If that port is already in use, use the `--port` option to - specify a different port. For example: ``mlflow sklearn serve --port 1234 -r -m model`` + specify a different port. For example: ``mlflow pyfunc serve --port 1234 -r -m model`` -Once you have started the server, you can pass it some sample data with ``curl`` and see the -predictions: +Once you have started the server, you can pass it some sample data and see the +predictions. + +The following example uses ``curl`` to send a JSON-serialized Pandas DataFrame with the ``split`` +orientation to the pyfunc server. For more information about the input data formats accepted by +the pyfunc model server, see the :ref:`MLflow deployment tools documentation `. .. code:: bash - curl -d '[{"x": 1}, {"x": -1}]' -H 'Content-Type: application/json' -X POST localhost:5000/invocations + curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST localhost:5000/invocations which returns:: @@ -178,7 +182,7 @@ which returns:: .. note:: The ``sklearn_logistic_regression/train.py`` script must be run with the same Python version as - the version of Python that runs ``mlflow sklearn serve``. If they are not the same version, + the version of Python that runs ``mlflow pyfunc serve``. If they are not the same version, the stacktrace below may appear:: File "/usr/local/lib/python3.6/site-packages/mlflow/sklearn.py", line 54, in _load_model_from_local_file diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index 56183bcfeaaf5..bdf45f3fc9280 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -50,8 +50,8 @@ Training the Model ------------------ -First, train a linear regression model that takes two hyperparameters: ``alpha`` and ``l1_ratio``. - +First, train a linear regression model that takes two hyperparameters: ``alpha`` and ``l1_ratio``. + .. plain-section:: .. container:: python @@ -220,7 +220,7 @@ On this page, you can see a list of experiment runs with metrics you can use to .. image:: _static/images/tutorial-compare.png .. container:: R - + .. image:: _static/images/tutorial-compare-R.png You can use the search feature to quickly filter out many models. For example, the query ``metrics.rmse < 0.8`` @@ -367,7 +367,7 @@ in MLflow saved the model as an artifact within the run. .. code:: - mlflow sklearn serve /Users/mlflow/mlflow-prototype/mlruns/0/7c1a0d5c42844dcdb8f5191146925174/artifacts/model -p 1234 + mlflow pyfunc serve /Users/mlflow/mlflow-prototype/mlruns/0/7c1a0d5c42844dcdb8f5191146925174/artifacts/model -p 1234 .. note:: @@ -376,13 +376,17 @@ in MLflow saved the model as an artifact within the run. ``UnicodeDecodeError: 'ascii' codec can't decode byte 0x9f in position 1: ordinal not in range(128)`` or ``raise ValueError, "unsupported pickle protocol: %d"``. - To serve a prediction, run: + Once you have deployed the server, you can pass it some sample data and see the + predictions. The following example uses ``curl`` to send a JSON-serialized Pandas DataFrame + with the ``split`` orientation to the pyfunc server. For more information about the input data + formats accepted by the pyfunc model server, see the + :ref:`MLflow deployment tools documentation `. .. code:: - curl -X POST -H "Content-Type:application/json" --data '[{"fixed acidity": 6.2, "volatile acidity": 0.66, "citric acid": 0.48, "residual sugar": 1.2, "chlorides": 0.029, "free sulfur dioxide": 29, "total sulfur dioxide": 75, "density": 0.98, "pH": 3.33, "sulphates": 0.39, "alcohol": 12.8}]' http://127.0.0.1:1234/invocations + curl -X POST -H "Content-Type:application/json; format=pandas-split" --data '{"columns":["alcohol", "chlorides", "citric acid", "density", "fixed acidity", "free sulfur dioxide", "pH", "residual sugar", "sulphates", "total sulfur dioxide", "volatile acidity"],"data":[[12.8, 0.029, 0.48, 0.98, 6.2, 29, 3.33, 1.2, 0.39, 75, 0.66]]}' http://127.0.0.1:1234/invocations - which should return something like:: + the server should respond with output similar to:: {"predictions": [6.379428821398614]} @@ -416,7 +420,7 @@ in MLflow saved the model as an artifact within the run. .. image:: _static/images/tutorial-serving-r.png .. note:: - + By default, a model is served using the R packages available. To ensure the environment serving the prediction function matches the model, set ``restore = TRUE`` when calling ``mlflow_rfunc_serve()``. diff --git a/mlflow/azureml/__init__.py b/mlflow/azureml/__init__.py index ece9b4c187571..60017883e9d3c 100644 --- a/mlflow/azureml/__init__.py +++ b/mlflow/azureml/__init__.py @@ -31,6 +31,10 @@ def build_image(model_path, workspace, run_id=None, image_name=None, model_name= The resulting image can be deployed as a web service to Azure Container Instances (ACI) or Azure Kubernetes Service (AKS). + The resulting Azure ML ContainerImage will contain a webserver that processes model queries. + For information about the input data formats accepted by this webserver, see the + :ref:`MLflow deployment tools documentation `. + :param model_path: The path to MLflow model for which the image will be built. If a run id is specified, this is should be a run-relative path. Otherwise, it should be a local path. @@ -307,6 +311,7 @@ def _get_mlflow_azure_resource_name(): from azureml.core.model import Model from mlflow.pyfunc import load_pyfunc +from mlflow.pyfunc.scoring_server import parse_json_input from mlflow.utils import get_jsonable_obj @@ -316,8 +321,8 @@ def init(): model = load_pyfunc(model_path) -def run(s): - input_df = pd.read_json(s, orient="records") +def run(json_input): + input_df = parse_json_input(json_input=json_input, orientation="split") return get_jsonable_obj(model.predict(input_df)) """ diff --git a/mlflow/azureml/cli.py b/mlflow/azureml/cli.py index 7f4dc37735b1b..ec423bc2aff46 100644 --- a/mlflow/azureml/cli.py +++ b/mlflow/azureml/cli.py @@ -51,6 +51,10 @@ def build_image(model_path, workspace_name, subscription_id, run_id, image_name, Register an MLflow model with Azure ML and build an Azure ML ContainerImage for deployment. The resulting image can be deployed as a web service to Azure Container Instances (ACI) or Azure Kubernetes Service (AKS). + + The resulting Azure ML ContainerImage will contain a webserver that processes model queries. + For information about the input data formats accepted by this webserver, see the following + documentation: https://www.mlflow.org/docs/latest/models.html#azureml-deployment. """ # The Azure ML SDK is only compatible with Python 3. However, this CLI should still be # accessible for inspection rom Python 2. Therefore, we will only import from the SDK diff --git a/mlflow/cli.py b/mlflow/cli.py index 74062328bbb29..2f34d89dc2170 100644 --- a/mlflow/cli.py +++ b/mlflow/cli.py @@ -9,7 +9,6 @@ import mlflow.azureml.cli import mlflow.projects as projects -import mlflow.sklearn import mlflow.data import mlflow.experiments import mlflow.pyfunc.cli @@ -204,7 +203,6 @@ def server(file_store, default_artifact_root, host, port, workers, static_prefix sys.exit(1) -cli.add_command(mlflow.sklearn.commands) cli.add_command(mlflow.data.download) cli.add_command(mlflow.pyfunc.cli.commands) cli.add_command(mlflow.rfunc.cli.commands) diff --git a/mlflow/exceptions.py b/mlflow/exceptions.py index 9b0906f133ac6..6efb1f4f41477 100644 --- a/mlflow/exceptions.py +++ b/mlflow/exceptions.py @@ -10,16 +10,28 @@ class MlflowException(Exception): for debugging purposes. If the error text is sensitive, raise a generic `Exception` object instead. """ - def __init__(self, message, error_code=INTERNAL_ERROR): + def __init__(self, message, error_code=INTERNAL_ERROR, **kwargs): + """ + :param message: The message describing the error that occured. This will be included in the + exception's serialized JSON representation. + :param error_code: An appropriate error code for the error that occured; it will be included + in the exception's serialized JSON representation. This should be one of + the codes listed in the `mlflow.protos.databricks_pb2` proto. + :param kwargs: Additional key-value pairs to include in the serialized JSON representation + of the MlflowException. + """ try: self.error_code = ErrorCode.Name(error_code) except (ValueError, TypeError): self.error_code = ErrorCode.Name(INTERNAL_ERROR) self.message = message + self.json_kwargs = kwargs super(MlflowException, self).__init__(message) def serialize_as_json(self): - return json.dumps({'error_code': self.error_code, 'message': self.message}) + exception_dict = {'error_code': self.error_code, 'message': self.message} + exception_dict.update(self.json_kwargs) + return json.dumps(exception_dict) class RestException(MlflowException): diff --git a/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/MLeapPredictor.java b/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/MLeapPredictor.java index 7795bc93a0999..58d5a6c8fc245 100644 --- a/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/MLeapPredictor.java +++ b/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/MLeapPredictor.java @@ -55,17 +55,37 @@ public MLeapPredictor(String modelDataPath, String inputSchemaPath) { @Override protected PredictorDataWrapper predict(PredictorDataWrapper input) throws PredictorEvaluationException { - PandasRecordOrientedDataFrame pandasFrame = null; + PandasSplitOrientedDataFrame pandasFrame = null; try { - pandasFrame = PandasRecordOrientedDataFrame.fromJson(input.toJson()); + pandasFrame = PandasSplitOrientedDataFrame.fromJson(input.toJson()); } catch (IOException e) { logger.error( - "Encountered a JSON conversion error during conversion of Pandas dataframe to LeapFrame.", + "Encountered a JSON parsing error during conversion of input to a Pandas DataFrame" + + " representation.", e); throw new PredictorEvaluationException( - "Failed to transform input into a JSON representation of an MLeap dataframe." - + " Please ensure that the input is a JSON-serialized Pandas Dataframe" - + " with the `record` orientation.", + "Encountered a JSON parsing error while transforming input into a Pandas DataFrame" + + " representation. Ensure that the input is a JSON-serialized Pandas DataFrame" + + " with the `split` orientation.", + e); + } catch (InvalidSchemaException e) { + logger.error( + "Encountered a schema mismatch while transforming input into a Pandas DataFrame" + + " representation.", + e); + throw new PredictorEvaluationException( + "Encountered a schema mismatch while transforming input into a Pandas DataFrame" + + " representation. Ensure that the input is a JSON-serialized Pandas DataFrame" + + " with the `split` orientation.", + e); + } catch (IllegalArgumentException e) { + logger.error( + "Failed to transform input into a Pandas DataFrame because the parsed frame is invalid.", + e); + throw new PredictorEvaluationException( + "Failed to transform input into a Pandas DataFrame because the parsed frame is invalid." + + " Ensure that the input is a JSON-serialized Pandas DataFrame with the `split`" + + " orientation.", e); } diff --git a/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasRecordOrientedDataFrame.java b/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasRecordOrientedDataFrame.java deleted file mode 100644 index 60fcc360342e9..0000000000000 --- a/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasRecordOrientedDataFrame.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.mlflow.sagemaker; - -import com.fasterxml.jackson.core.JsonProcessingException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import ml.combust.mleap.runtime.frame.DefaultLeapFrame; -import org.mlflow.utils.SerializationUtils; - -/** - * A representation of a serialized Pandas dataframe in record-oriented format. For more - * information, see `pandas.DataFrame.toJson(orient="records")` - * (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html) - */ -class PandasRecordOrientedDataFrame { - private final List> records; - - private static final String LEAP_FRAME_KEY_ROWS = "rows"; - private static final String LEAP_FRAME_KEY_SCHEMA = "schema"; - - private PandasRecordOrientedDataFrame(List> records) { - this.records = records; - } - - /** - * Constructs a {@link PandasRecordOrientedDataFrame} - * - * @param frameJson A representation of the dataframe - */ - static PandasRecordOrientedDataFrame fromJson(String frameJson) throws IOException { - return new PandasRecordOrientedDataFrame(SerializationUtils.fromJson(frameJson, List.class)); - } - - /** @return The number of records contained in the dataframe */ - int size() { - return this.records.size(); - } - - /** - * Applies the specified MLeap frame schema ({@link LeapFrameSchema}) to this dataframe, producing - * a {@link DefaultLeapFrame} - * - * @throws InvalidSchemaException If the supplied pandas dataframe is invalid (missing a required - * field, etc) - */ - DefaultLeapFrame toLeapFrame(LeapFrameSchema leapFrameSchema) throws JsonProcessingException { - List> mleapRows = new ArrayList<>(); - for (Map record : this.records) { - List mleapRow = new ArrayList<>(); - for (String fieldName : leapFrameSchema.getFieldNames()) { - if (!record.containsKey(fieldName)) { - throw new InvalidSchemaException( - String.format("Pandas dataframe is missing a required field: `%s`", fieldName)); - } - mleapRow.add(record.get(fieldName)); - } - mleapRows.add(mleapRow); - } - Map rawFrame = new HashMap<>(); - rawFrame.put(LEAP_FRAME_KEY_ROWS, mleapRows); - rawFrame.put(LEAP_FRAME_KEY_SCHEMA, leapFrameSchema.getRawSchema()); - String leapFrameJson = SerializationUtils.toJson(rawFrame); - DefaultLeapFrame leapFrame = LeapFrameUtils.getLeapFrameFromJson(leapFrameJson); - return leapFrame; - } -} diff --git a/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasSplitOrientedDataFrame.java b/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasSplitOrientedDataFrame.java new file mode 100644 index 0000000000000..2a112586906ce --- /dev/null +++ b/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/PandasSplitOrientedDataFrame.java @@ -0,0 +1,106 @@ +package org.mlflow.sagemaker; + +import com.fasterxml.jackson.core.JsonProcessingException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import ml.combust.mleap.runtime.frame.DefaultLeapFrame; +import org.mlflow.utils.SerializationUtils; + +/** + * A representation of a serialized Pandas DataFrame in split-oriented format. For more information, + * see `pandas.DataFrame.toJson(orient="split")` + * (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html) + */ +class PandasSplitOrientedDataFrame { + private List> entries; + + private static final String PANDAS_FRAME_KEY_COLUMN_NAMES = "columns"; + private static final String PANDAS_FRAME_KEY_ROWS = "data"; + + private static final String LEAP_FRAME_KEY_ROWS = "rows"; + private static final String LEAP_FRAME_KEY_SCHEMA = "schema"; + + private PandasSplitOrientedDataFrame(List columnNames, List> rows) { + this.entries = new ArrayList<>(); + for (int rowIndex = 0; rowIndex < rows.size(); ++rowIndex) { + List row = rows.get(rowIndex); + if (row.size() != columnNames.size()) { + throw new IllegalArgumentException( + String.format( + "Row %d of the DataFrame does not contain the expected number of columns! Found %d" + + " columns, expected %d columns", + rowIndex, row.size(), columnNames.size())); + } + LinkedHashMap newEntry = new LinkedHashMap<>(row.size()); + for (int i = 0; i < row.size(); ++i) { + newEntry.put(columnNames.get(i), row.get(i)); + } + this.entries.add(newEntry); + } + } + + /** + * Constructs a {@link PandasSplitOrientedDataFrame} + * + * @param frameJson A representation of the DataFrame + */ + static PandasSplitOrientedDataFrame fromJson(String frameJson) throws IOException { + Map> parsedFrame = SerializationUtils.fromJson(frameJson, Map.class); + validatePandasDataFrameJsonRepresentation(parsedFrame); + return new PandasSplitOrientedDataFrame( + (List) parsedFrame.get(PANDAS_FRAME_KEY_COLUMN_NAMES), + (List>) parsedFrame.get(PANDAS_FRAME_KEY_ROWS)); + } + + private static void validatePandasDataFrameJsonRepresentation(Map> parsedFrame) + throws InvalidSchemaException { + String[] expectedColumnNames = + new String[] {PANDAS_FRAME_KEY_COLUMN_NAMES, PANDAS_FRAME_KEY_ROWS}; + for (String columnName : expectedColumnNames) { + if (!parsedFrame.containsKey(columnName)) { + throw new InvalidSchemaException( + String.format( + "The JSON representation of the serialized Pandas DataFrame is missing an expected " + + " column with name: `%s` that is required by the Pandas `split` orientation.", + columnName)); + } + } + } + + /** @return The number of rows contained in the DataFrame */ + int size() { + return this.entries.size(); + } + + /** + * Applies the specified MLeap frame schema ({@link LeapFrameSchema}) to this DataFrame, producing + * a {@link DefaultLeapFrame} + * + * @throws InvalidSchemaException If the supplied pandas DataFrame is invalid (missing a required + * field, etc) + */ + DefaultLeapFrame toLeapFrame(LeapFrameSchema leapFrameSchema) throws JsonProcessingException { + List> mleapRows = new ArrayList<>(); + for (Map entry : this.entries) { + List mleapRow = new ArrayList<>(); + for (String fieldName : leapFrameSchema.getFieldNames()) { + if (!entry.containsKey(fieldName)) { + throw new InvalidSchemaException( + String.format("Pandas DataFrame is missing a required field: `%s`", fieldName)); + } + mleapRow.add(entry.get(fieldName)); + } + mleapRows.add(mleapRow); + } + Map rawFrame = new HashMap<>(); + rawFrame.put(LEAP_FRAME_KEY_ROWS, mleapRows); + rawFrame.put(LEAP_FRAME_KEY_SCHEMA, leapFrameSchema.getRawSchema()); + String leapFrameJson = SerializationUtils.toJson(rawFrame); + DefaultLeapFrame leapFrame = LeapFrameUtils.getLeapFrameFromJson(leapFrameJson); + return leapFrame; + } +} diff --git a/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/ScoringServer.java b/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/ScoringServer.java index e421a2354dff7..61c5ce03b9982 100644 --- a/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/ScoringServer.java +++ b/mlflow/java/scoring/src/main/java/org/mlflow/sagemaker/ScoringServer.java @@ -191,8 +191,9 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) String.format( "Received a request with an unsupported content type: %s", requestContentType)); response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - responseContent = getErrorResponseJson( - "Requests must have a content header of type `application/json` or `text/csv`"); + responseContent = + getErrorResponseJson( + "Requests must have a content header of type `application/json` or `text/csv`"); } catch (Exception e) { logger.error("An unknown error occurred while evaluating the prediction request.", e); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); diff --git a/mlflow/java/scoring/src/test/java/org/mlflow/MLeapPredictorTest.java b/mlflow/java/scoring/src/test/java/org/mlflow/MLeapPredictorTest.java index 10e7d929dfd5f..4594a94cbd737 100644 --- a/mlflow/java/scoring/src/test/java/org/mlflow/MLeapPredictorTest.java +++ b/mlflow/java/scoring/src/test/java/org/mlflow/MLeapPredictorTest.java @@ -38,8 +38,7 @@ public void testMLeapPredictorEvaluatesCompatibleInputCorrectly() } @Test - public void - testMLeapPredictorThrowsPredictorEvaluationExceptionWhenEvaluatingInputWithMissingField() + public void testMLeapPredictorThrowsPredictorEvaluationExceptionWhenInputIsMissingField() throws IOException, JsonProcessingException { String modelPath = MLflowRootResourceProvider.getResourcePath("mleap_model"); MLeapPredictor predictor = (MLeapPredictor) (new MLeapLoader()).load(modelPath); @@ -47,11 +46,16 @@ public void testMLeapPredictorEvaluatesCompatibleInputCorrectly() String sampleInputPath = MLflowRootResourceProvider.getResourcePath("mleap_model/sample_input.json"); String sampleInputJson = new String(Files.readAllBytes(Paths.get(sampleInputPath))); - List> sampleInput = - SerializationUtils.fromJson(sampleInputJson, List.class); - - sampleInput.get(0).remove("topic"); + Map> sampleInput = SerializationUtils.fromJson(sampleInputJson, Map.class); + List> rows = (List>) sampleInput.get("data"); + List columnNames = (List) sampleInput.get("columns"); + int topicIndex = columnNames.indexOf("topic"); + columnNames.remove("topic"); + for (List row : rows) { + row.remove(topicIndex); + } String badInputJson = SerializationUtils.toJson(sampleInput); + PredictorDataWrapper inputData = new PredictorDataWrapper(badInputJson, PredictorDataWrapper.ContentType.Json); try { @@ -77,8 +81,9 @@ public void testMLeapPredictorThrowsPredictorEvaluationExceptionWhenEvaluatingBa try { predictor.predict(badInputData); - Assert.fail("Expected predictor evaluation on a bad JSON input" - + "to throw a PredictorEvaluationException."); + Assert.fail( + "Expected predictor evaluation on a bad JSON input" + + "to throw a PredictorEvaluationException."); } catch (PredictorEvaluationException e) { // Success } diff --git a/mlflow/java/scoring/src/test/java/org/mlflow/PandasDataFrameTest.java b/mlflow/java/scoring/src/test/java/org/mlflow/PandasDataFrameTest.java index 5917a2d50843b..1f0279d7b04d5 100644 --- a/mlflow/java/scoring/src/test/java/org/mlflow/PandasDataFrameTest.java +++ b/mlflow/java/scoring/src/test/java/org/mlflow/PandasDataFrameTest.java @@ -1,19 +1,17 @@ package org.mlflow.sagemaker; +import com.fasterxml.jackson.core.JsonProcessingException; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import org.junit.Assert; -import org.junit.Test; -import java.io.File; -import org.mlflow.utils.SerializationUtils; -import java.io.IOException; +import java.util.HashMap; import java.util.List; import java.util.Map; - -import org.mlflow.MLflowRootResourceProvider; - import ml.combust.mleap.runtime.frame.DefaultLeapFrame; -import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.Assert; +import org.junit.Test; +import org.mlflow.MLflowRootResourceProvider; +import org.mlflow.utils.SerializationUtils; public class PandasDataFrameTest { @Test @@ -21,8 +19,8 @@ public void testPandasDataFrameIsProducedFromValidJsonSuccessfully() throws IOEx String sampleInputPath = MLflowRootResourceProvider.getResourcePath("mleap_model/sample_input.json"); String sampleInputJson = new String(Files.readAllBytes(Paths.get(sampleInputPath))); - PandasRecordOrientedDataFrame pandasFrame = - PandasRecordOrientedDataFrame.fromJson(sampleInputJson); + PandasSplitOrientedDataFrame pandasFrame = + PandasSplitOrientedDataFrame.fromJson(sampleInputJson); Assert.assertEquals((pandasFrame.size() == 1), true); } @@ -30,14 +28,58 @@ public void testPandasDataFrameIsProducedFromValidJsonSuccessfully() throws IOEx public void testLoadingPandasDataFrameFromInvalidJsonThrowsIOException() { String badFrameJson = "this is not valid frame json"; try { - PandasRecordOrientedDataFrame pandasFrame = - PandasRecordOrientedDataFrame.fromJson(badFrameJson); - Assert.fail("Expected parsing a pandas dataframe from invalid json to throw an IOException."); + PandasSplitOrientedDataFrame pandasFrame = + PandasSplitOrientedDataFrame.fromJson(badFrameJson); + Assert.fail("Expected parsing a pandas DataFrame from invalid json to throw an IOException."); } catch (IOException e) { // Succeed } } + @Test + public void testLoadingPandasDataFrameFromJsonWithInvalidSplitOrientationSchemaThrowsException() + throws IOException, JsonProcessingException { + String sampleInputPath = + MLflowRootResourceProvider.getResourcePath("mleap_model/sample_input.json"); + String sampleInputJson = new String(Files.readAllBytes(Paths.get(sampleInputPath))); + Map> sampleInput = SerializationUtils.fromJson(sampleInputJson, Map.class); + sampleInput.remove("columns"); + String missingSchemaFieldJson = SerializationUtils.toJson(sampleInput); + + try { + PandasSplitOrientedDataFrame pandasFrame = + PandasSplitOrientedDataFrame.fromJson(missingSchemaFieldJson); + Assert.fail( + "Expected parsing a pandas DataFrame with an invalid `split` orientation schema" + + " to throw an exception."); + } catch (InvalidSchemaException e) { + // Succeed + } + } + + @Test + public void testLoadingPandasDataFrameFromJsonWithInvalidFrameDataThrowsException() + throws IOException, JsonProcessingException { + String sampleInputPath = + MLflowRootResourceProvider.getResourcePath("mleap_model/sample_input.json"); + String sampleInputJson = new String(Files.readAllBytes(Paths.get(sampleInputPath))); + Map> sampleInput = SerializationUtils.fromJson(sampleInputJson, Map.class); + + // Remove a column from the first row of the sample input and check for an exception + // during parsing + Map> missingColumnInFirstRowInput = new HashMap<>(sampleInput); + List> rows = (List>) missingColumnInFirstRowInput.get("data"); + rows.get(0).remove(0); + String missingColumnInFirstRowJson = SerializationUtils.toJson(missingColumnInFirstRowInput); + try { + PandasSplitOrientedDataFrame pandasFrame = + PandasSplitOrientedDataFrame.fromJson(missingColumnInFirstRowJson); + Assert.fail("Expected parsing a pandas DataFrame with invalid data to throw an exception."); + } catch (IllegalArgumentException e) { + // Succeed + } + } + @Test public void testPandasDataFrameWithMLeapCompatibleSchemaIsConvertedToLeapFrameSuccessfully() throws JsonProcessingException, IOException { @@ -47,16 +89,16 @@ public void testPandasDataFrameWithMLeapCompatibleSchemaIsConvertedToLeapFrameSu String sampleInputPath = MLflowRootResourceProvider.getResourcePath("mleap_model/sample_input.json"); String sampleInputJson = new String(Files.readAllBytes(Paths.get(sampleInputPath))); - PandasRecordOrientedDataFrame pandasFrame = - PandasRecordOrientedDataFrame.fromJson(sampleInputJson); + PandasSplitOrientedDataFrame pandasFrame = + PandasSplitOrientedDataFrame.fromJson(sampleInputJson); DefaultLeapFrame leapFrame = pandasFrame.toLeapFrame(leapFrameSchema); } /** - * In order to produce a leap frame from a pandas dataframe, the pandas dataframe - * must contain all of the fields specified by the intended leap frame's schema. - * This test ensures that an exception is thrown if such a field is missing + * In order to produce a leap frame from a Pandas DataFrame, the Pandas DataFrame must contain all + * of the fields specified by the intended leap frame's schema. This test ensures that an + * exception is thrown if such a field is missing */ @Test public void testConvertingPandasDataFrameWithMissingMLeapSchemaFieldThrowsException() @@ -67,17 +109,22 @@ public void testConvertingPandasDataFrameWithMissingMLeapSchemaFieldThrowsExcept String sampleInputPath = MLflowRootResourceProvider.getResourcePath("mleap_model/sample_input.json"); String sampleInputJson = new String(Files.readAllBytes(Paths.get(sampleInputPath))); - List> sampleInput = - SerializationUtils.fromJson(sampleInputJson, List.class); - sampleInput.get(0).remove("topic"); - String missingFieldJson = SerializationUtils.toJson(sampleInput); + Map> sampleInput = SerializationUtils.fromJson(sampleInputJson, Map.class); + List> rows = (List>) sampleInput.get("data"); + List columnNames = (List) sampleInput.get("columns"); + int topicIndex = columnNames.indexOf("topic"); + columnNames.remove("topic"); + for (List row : rows) { + row.remove(topicIndex); + } + String missingDataColumnJson = SerializationUtils.toJson(sampleInput); - PandasRecordOrientedDataFrame pandasFrame = - PandasRecordOrientedDataFrame.fromJson(missingFieldJson); + PandasSplitOrientedDataFrame pandasFrame = + PandasSplitOrientedDataFrame.fromJson(missingDataColumnJson); try { pandasFrame.toLeapFrame(leapFrameSchema); Assert.fail( - "Expected leap frame conversion of a pandas dataframe with a missing field to fail."); + "Expected leap frame conversion of a pandas DataFrame with a missing field to fail."); } catch (InvalidSchemaException e) { // Succeed } diff --git a/mlflow/java/scoring/src/test/resources/org/mlflow/mleap_model/sample_input.json b/mlflow/java/scoring/src/test/resources/org/mlflow/mleap_model/sample_input.json index 91f7f3508a2e8..2f439d0fca121 100644 --- a/mlflow/java/scoring/src/test/resources/org/mlflow/mleap_model/sample_input.json +++ b/mlflow/java/scoring/src/test/resources/org/mlflow/mleap_model/sample_input.json @@ -1,6 +1,12 @@ -[ - { - "topic": "alt.atheism", - "text": "From: marshall@csugrad.cs.vt.edu (Kevin Marshall) Subject: Re: Faith and Dogma Organization: Virginia Tech Computer Science Dept, Blacksburg, VA Lines: 96 NNTP-Posting-Host: csugrad.cs.vt.edsadsadasdasdaddu tgk@cs.toronto.edu (Todd Kelley) writes: >In light of what happened in Waco, I need to get something of my >chest. > >Faith and dogma are dangerous. " - } -] \ No newline at end of file +{ + "data": [ + [ + "From: marshall@csugrad.cs.vt.edu (Kevin Marshall) Subject: Re: Faith and Dogma Organization: Virginia Tech Computer Science Dept, Blacksburg, VA Lines: 96 NNTP-Posting-Host: csugrad.cs.vt.edsadsadasdasdaddu tgk@cs.toronto.edu (Todd Kelley) writes: >In light of what happened in Waco, I need to get something of my >chest. > >Faith and dogma are dangerous. ", + "alt.atheism" + ] + ], + "columns": [ + "text", + "topic" + ] +} diff --git a/mlflow/pyfunc/cli.py b/mlflow/pyfunc/cli.py index c29d68fa56c0d..480911494e34b 100644 --- a/mlflow/pyfunc/cli.py +++ b/mlflow/pyfunc/cli.py @@ -50,7 +50,10 @@ def commands(): @cli_args.NO_CONDA def serve(model_path, run_id, port, host, no_conda): """ - Serve a PythonFunction model saved with MLflow. + Serve a pyfunc model saved with MLflow by launching a webserver on the specified + host and port. For information about the input data formats accepted by the webserver, + see the following documentation: + https://www.mlflow.org/docs/latest/models.html#pyfunc-deployment. If a ``run_id`` is specified, ``model-path`` is treated as an artifact path within that run; otherwise it is treated as a local path. diff --git a/mlflow/pyfunc/scoring_server.py b/mlflow/pyfunc/scoring_server.py index 3e9a3352d989c..40bb5c8ae2043 100644 --- a/mlflow/pyfunc/scoring_server.py +++ b/mlflow/pyfunc/scoring_server.py @@ -13,10 +13,17 @@ from __future__ import print_function import json +import traceback import pandas as pd import flask +from six import reraise + +from mlflow.exceptions import MlflowException +from mlflow.protos.databricks_pb2 import MALFORMED_REQUEST, BAD_REQUEST from mlflow.utils.rest_utils import NumpyEncoder +from mlflow.utils.logging_utils import eprint +from mlflow.server.handlers import catch_mlflow_exception try: from StringIO import StringIO @@ -25,6 +32,77 @@ from mlflow.utils import get_jsonable_obj +CONTENT_TYPE_CSV = "text/csv" +CONTENT_TYPE_JSON = "application/json" +CONTENT_TYPE_JSON_RECORDS_ORIENTED = "application/json; format=pandas-records" +CONTENT_TYPE_JSON_SPLIT_ORIENTED = "application/json; format=pandas-split" + +CONTENT_TYPES = [ + CONTENT_TYPE_CSV, + CONTENT_TYPE_JSON, + CONTENT_TYPE_JSON_RECORDS_ORIENTED, + CONTENT_TYPE_JSON_SPLIT_ORIENTED +] + + +def parse_json_input(json_input, orientation="split"): + """ + :param json_input: A JSON-formatted string representation of a Pandas DataFrame, or a stream + containing such a string representation. + :param orientation: The Pandas DataFrame orientation of the JSON input. This is either 'split' + or 'records'. + """ + # pylint: disable=broad-except + try: + return pd.read_json(json_input, orient=orientation) + except Exception: + _handle_serving_error( + error_message=( + "Failed to parse input as a Pandas DataFrame. Ensure that the input is" + " a valid JSON-formatted Pandas DataFrame with the `{orientation}` orientation" + " produced using the `pandas.DataFrame.to_json(..., orient='{orientation}')`" + " method.".format(orientation=orientation)), + error_code=MALFORMED_REQUEST) + + +def parse_csv_input(csv_input): + """ + :param csv_input: A CSV-formatted string representation of a Pandas DataFrame, or a stream + containing such a string representation. + """ + # pylint: disable=broad-except + try: + return pd.read_csv(csv_input) + except Exception: + _handle_serving_error( + error_message=( + "Failed to parse input as a Pandas DataFrame. Ensure that the input is" + " a valid CSV-formatted Pandas DataFrame produced using the" + " `pandas.DataFrame.to_csv()` method."), + error_code=MALFORMED_REQUEST) + + +def _handle_serving_error(error_message, error_code): + """ + Logs information about an exception thrown by model inference code that is currently being + handled and reraises it with the specified error message. The exception stack trace + is also included in the reraised error message. + + :param error_message: A message for the reraised exception. + :param error_code: An appropriate error code for the reraised exception. This should be one of + the codes listed in the `mlflow.protos.databricks_pb2` proto. + """ + traceback_buf = StringIO() + traceback.print_exc(file=traceback_buf) + reraise(MlflowException, + MlflowException( + message=error_message, + error_code=error_code, + stack_trace=traceback_buf.getvalue())) + + +logged_pandas_records_format_warning = False + def init(model): """ @@ -43,28 +121,66 @@ def ping(): # pylint: disable=unused-variable return flask.Response(response='\n', status=status, mimetype='application/json') @app.route('/invocations', methods=['POST']) + @catch_mlflow_exception def transformation(): # pylint: disable=unused-variable """ Do an inference on a single batch of data. In this sample server, - we take data as CSV or json, convert it to a pandas data frame, + we take data as CSV or json, convert it to a Pandas DataFrame, generate predictions and convert them back to CSV. """ # Convert from CSV to pandas - if flask.request.content_type == 'text/csv': + if flask.request.content_type == CONTENT_TYPE_CSV: data = flask.request.data.decode('utf-8') - s = StringIO(data) - data = pd.read_csv(s) - elif flask.request.content_type == 'application/json': - data = flask.request.data.decode('utf-8') - s = StringIO(data) - data = pd.read_json(s, orient="records") + csv_input = StringIO(data) + data = parse_csv_input(csv_input=csv_input) + elif flask.request.content_type == CONTENT_TYPE_JSON: + global logged_pandas_records_format_warning + if not logged_pandas_records_format_warning: + eprint( + "**IMPORTANT UPDATE**: Starting in MLflow 0.9.0, requests received with a" + " `Content-Type` header value of `{json_content_type}` will be interpreted" + " as JSON-serialized Pandas DataFrames with the `split` orientation, instead" + " of the `records` orientation. The `records` orientation is unsafe because" + " it may not preserve column ordering. Client code should be updated to" + " either send serialized DataFrames with the `split` orientation and the" + " `{split_json_content_type}` content type (recommended) or use the" + " `{records_json_content_type}` content type with the `records` orientation." + " For more information, see" + " https://www.mlflow.org/docs/latest/models.html#pyfunc-deployment.\n".format( + json_content_type=CONTENT_TYPE_JSON, + split_json_content_type=CONTENT_TYPE_JSON_SPLIT_ORIENTED, + records_json_content_type=CONTENT_TYPE_JSON_RECORDS_ORIENTED)) + logged_pandas_records_format_warning = True + data = parse_json_input(json_input=flask.request.data.decode('utf-8'), + orientation="records") + elif flask.request.content_type == CONTENT_TYPE_JSON_RECORDS_ORIENTED: + data = parse_json_input(json_input=flask.request.data.decode('utf-8'), + orientation="records") + elif flask.request.content_type == CONTENT_TYPE_JSON_SPLIT_ORIENTED: + data = parse_json_input(json_input=flask.request.data.decode('utf-8'), + orientation="split") else: return flask.Response( - response='This predictor only supports CSV or JSON data, got %s' % str( - flask.request.content_type), status=415, mimetype='text/plain') + response=("This predictor only supports the following content types," + " {supported_content_types}. Got '{received_content_type}'.".format( + supported_content_types=CONTENT_TYPES, + received_content_type=flask.request.content_type)), + status=415, + mimetype='text/plain') # Do the prediction - predictions = get_jsonable_obj(model.predict(data)) + # pylint: disable=broad-except + try: + raw_predictions = model.predict(data) + except Exception: + _handle_serving_error( + error_message=( + "Encountered an unexpected error while evaluating the model. Verify" + " that the serialized input Dataframe is compatible with the model for" + " inference."), + error_code=BAD_REQUEST) + + predictions = get_jsonable_obj(raw_predictions, pandas_orientation="records") result = json.dumps(predictions, cls=NumpyEncoder) return flask.Response(response=result, status=200, mimetype='application/json') diff --git a/mlflow/sagemaker/__init__.py b/mlflow/sagemaker/__init__.py index f9ad856ffda9e..9a3566a2fcf77 100644 --- a/mlflow/sagemaker/__init__.py +++ b/mlflow/sagemaker/__init__.py @@ -205,6 +205,10 @@ def deploy(app_name, model_path, execution_role_arn=None, bucket=None, run_id=No Deploy an MLflow model on AWS SageMaker. The currently active AWS account must have correct permissions set up. + This function creates a SageMaker endpoint. For more information about the input data + formats accepted by this endpoint, see the + :ref:`MLflow deployment tools documentation `. + :param app_name: Name of the deployed application. :param path: Path to the model. Either local if no ``run_id`` or MLflow-relative if ``run_id`` is specified. diff --git a/mlflow/sagemaker/cli.py b/mlflow/sagemaker/cli.py index 13a7e5434cc83..81aafb0a556e9 100644 --- a/mlflow/sagemaker/cli.py +++ b/mlflow/sagemaker/cli.py @@ -58,6 +58,10 @@ def deploy(app_name, model_path, execution_role_arn, bucket, run_id, image_url, """ Deploy model on Sagemaker as a REST API endpoint. Current active AWS account needs to have correct permissions setup. + + For more information about the input data formats accepted by the deployed REST API endpoint, + see the following documentation: + https://www.mlflow.org/docs/latest/models.html#sagemaker-deployment. """ if vpc_config is not None: with open(vpc_config, "r") as f: diff --git a/mlflow/sklearn.py b/mlflow/sklearn.py index f220f67619d50..b7e932ba6c2fb 100644 --- a/mlflow/sklearn.py +++ b/mlflow/sklearn.py @@ -11,17 +11,12 @@ from __future__ import absolute_import -import json import os import pickle import shutil -import click -import flask -import pandas import sklearn -from mlflow.utils import cli_args from mlflow import pyfunc from mlflow.exceptions import MlflowException from mlflow.models import Model @@ -54,6 +49,7 @@ def save_model(sk_model, path, conda_env=None, mlflow_model=Model(), format, `mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE`, provides better cross-system compatibility by identifying and packaging code dependencies with the serialized model. + >>> import mlflow.sklearn >>> from sklearn.datasets import load_iris >>> from sklearn import tree @@ -195,45 +191,3 @@ def load_model(path, run_id=None): if run_id is not None: path = mlflow.tracking.utils._get_model_log_dir(model_name=path, run_id=run_id) return _load_model_from_local_file(path) - - -@click.group("sklearn") -def commands(): - """ - Serve scikit-learn models locally. - - To serve a model associated with a run on a tracking server, set the MLFLOW_TRACKING_URI - environment variable to the URL of the desired server. - """ - pass - - -@commands.command("serve") -@cli_args.MODEL_PATH -@click.option("--run_id", "-r", metavar="RUN_ID", help="Run ID to look for the model in.") -@click.option("--port", "-p", default=5000, help="Server port. [default: 5000]") -@click.option("--host", default="127.0.0.1", - help="The networking interface on which the prediction server listens. Defaults to " - "127.0.0.1. Use 0.0.0.0 to bind to all addresses, which is useful for running " - "inside of docker.") -def serve_model(model_path, run_id=None, port=None, host="127.0.0.1"): - """ - Serve a scikit-learn model saved with MLflow. - - If ``run_id`` is specified, ``model_path`` is treated as an artifact path within that run; - otherwise it is treated as a local path. - """ - model = load_model(run_id=run_id, path=model_path) - app = flask.Flask(__name__) - - @app.route('/invocations', methods=['POST']) - def predict(): # pylint: disable=unused-variable - if flask.request.content_type != 'application/json': - return flask.Response(status=415, response='JSON data expected', mimetype='text/plain') - data = flask.request.data.decode('utf-8') - records = pandas.read_json(data, orient="records") - predictions = model.predict(records) - result = json.dumps({"predictions": predictions.tolist()}) - return flask.Response(status=200, response=result + "\n", mimetype='application/json') - - app.run(host, port=port) diff --git a/mlflow/utils/__init__.py b/mlflow/utils/__init__.py index ce1f55f20a1fd..e058d33947656 100644 --- a/mlflow/utils/__init__.py +++ b/mlflow/utils/__init__.py @@ -21,19 +21,21 @@ def ndarray2list(ndarray): return [ndarray2list(ndarray[i, :]) for i in range(0, ndarray.shape[0])] -def get_jsonable_obj(data): +def get_jsonable_obj(data, pandas_orientation=None): """Attempt to make the data json-able via standard library. Look for some commonly used types that are not jsonable and convert them into json-able ones. Unknown data types are returned as is. :param data: data to be converted, works with pandas and numpy, rest will be returned as is. + :param pandas_orientation: If `data` is a Pandas DataFrame, it will be converted to a JSON + dictionary using this Pandas serialization orientation. """ if isinstance(data, np.ndarray): return ndarray2list(data) if isinstance(data, pd.DataFrame): - return data.to_dict(orient='records') + return data.to_dict(orient=pandas_orientation) if isinstance(data, pd.Series): - return pd.DataFrame(data).to_dict(orient='records') + return pd.DataFrame(data).to_dict(orient=pandas_orientation) else: # by default just return whatever this is and hope for the best return data diff --git a/tests/azureml/test_image_creation.py b/tests/azureml/test_image_creation.py index d51f2586715bc..2b9b967768f04 100644 --- a/tests/azureml/test_image_creation.py +++ b/tests/azureml/test_image_creation.py @@ -419,7 +419,7 @@ def test_execution_script_run_method_scores_pandas_dataframes_successfully( # reasonable output data is produced input_data = datasets.load_iris().data[:, :2] # pylint: disable=undefined-variable - output_data = run(pd.DataFrame(data=input_data).to_json(orient="records")) + output_data = run(pd.DataFrame(data=input_data).to_json(orient="split")) assert len(output_data) == len(input_data) diff --git a/tests/helper_functions.py b/tests/helper_functions.py index f69dca2d415f4..83364b0b2d4a2 100644 --- a/tests/helper_functions.py +++ b/tests/helper_functions.py @@ -9,6 +9,7 @@ import pandas as pd +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server import mlflow.pyfunc @@ -24,11 +25,14 @@ def random_file(ext): return "temp_test_%d.%s" % (random_int(), ext) -def score_model_in_sagemaker_docker_container(model_path, data, flavor=mlflow.pyfunc.FLAVOR_NAME): +def score_model_in_sagemaker_docker_container( + model_path, data, content_type, flavor=mlflow.pyfunc.FLAVOR_NAME): """ :param model_path: Path to the model to be served. :param data: The data to send to the docker container for testing. This is either a - Pandas dataframe or a JSON-formatted string. + Pandas dataframe or string of the format specified by `content_type`. + :param content_type: The type of the data to send to the docker container for testing. This is + one of `mlflow.pyfunc.scoring_server.CONTENT_TYPES`. :param flavor: Model flavor to be deployed. """ env = dict(os.environ) @@ -37,15 +41,16 @@ def score_model_in_sagemaker_docker_container(model_path, data, flavor=mlflow.py stdout=PIPE, stderr=STDOUT, universal_newlines=True, env=env) - r = _score_proc(proc, 5000, data, "json").content - import json - return json.loads(r) # TODO: we should return pd.Dataframe the same as pyfunc serve + return _score_proc(proc, 5000, data, content_type) -def pyfunc_serve_and_score_model(model_path, data): +def pyfunc_serve_and_score_model(model_path, data, content_type): """ :param model_path: Path to the model to be served. - :param data: Data in pandas.DataFrame format to send to the docker container for testing. + :param data: The data to send to the pyfunc server for testing. This is either a + Pandas dataframe or string of the format specified by `content_type`. + :param content_type: The type of the data to send to the pyfunc server for testing. This is + one of `mlflow.pyfunc.scoring_server.CONTENT_TYPES`. """ env = dict(os.environ) env.update(LC_ALL="en_US.UTF-8", LANG="en_US.UTF-8") @@ -59,13 +64,12 @@ def pyfunc_serve_and_score_model(model_path, data): print(x) m = re.match(pattern=".*Running on http://127.0.0.1:(\\d+).*", string=x) if m: - return pd.read_json(_score_proc(proc, int(m.group(1)), data, data_type="csv").content, - orient="records") + return _score_proc(proc, int(m.group(1)), data, content_type=content_type) raise Exception("Failed to start server") -def _score_proc(proc, port, data, data_type): +def _score_proc(proc, port, data, content_type): try: for i in range(0, 50): assert proc.poll() is None, "scoring process died" @@ -84,23 +88,20 @@ def _score_proc(proc, port, data, data_type): print("server up, ping status", ping_status) if ping_status.status_code != 200: raise Exception("ping failed, server is not happy") - if data_type == "json": - if type(data) == pd.DataFrame: - data = data.to_dict(orient="records") - r = requests.post(url='http://localhost:%d/invocations' % port, - json=data) - elif data_type == "csv": - data = data.to_csv(index=False, header=True) - r = requests.post(url='http://localhost:%d/invocations' % port, - data=data, - headers={"Content-Type": "text/csv"}) - else: - raise Exception("Unexpected data_type %s" % data_type) - if r.status_code != 200: - raise Exception("scoring failed, status code = {}. Response = '{}' ".format( - r.status_code, - r)) - return r + if type(data) == pd.DataFrame: + if content_type == pyfunc_scoring_server.CONTENT_TYPE_JSON: + data = data.to_json(orient="records") + elif content_type == pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED: + data = data.to_json(orient="split") + elif content_type == pyfunc_scoring_server.CONTENT_TYPE_CSV: + data = data.to_csv() + else: + raise Exception( + "Unexpected content type for Pandas dataframe input %s" % content_type) + response = requests.post(url='http://localhost:%d/invocations' % port, + data=data, + headers={"Content-Type": content_type}) + return response finally: if proc.poll() is None: proc.terminate() diff --git a/tests/keras/test_keras_model_export.py b/tests/keras/test_keras_model_export.py index 034c7dee486fe..cb21cb03e6366 100644 --- a/tests/keras/test_keras_model_export.py +++ b/tests/keras/test_keras_model_export.py @@ -10,8 +10,9 @@ import pandas as pd import numpy as np -import mlflow.keras import mlflow +import mlflow.keras +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server from mlflow import pyfunc from tests.helper_functions import pyfunc_serve_and_score_model from tests.projects.utils import tracking_uri_mock # pylint: disable=unused-import @@ -57,8 +58,12 @@ def test_model_save_load(tmpdir, model, data, predicted): assert all(pyfunc_loaded.predict(x).values == predicted) # pyfunc serve - preds = pyfunc_serve_and_score_model(model_path=os.path.abspath(path), data=pd.DataFrame(x)) - assert all(preds.values.astype(np.float32) == predicted) + scoring_response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(path), + data=pd.DataFrame(x), + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED) + assert all(pd.read_json(scoring_response.content, orient="records").values.astype(np.float32) + == predicted) def test_model_log(tracking_uri_mock, model, data, predicted): # pylint: disable=unused-argument diff --git a/tests/pyfunc/test_scoring_server.py b/tests/pyfunc/test_scoring_server.py new file mode 100644 index 0000000000000..bbdcfd1c4cdcb --- /dev/null +++ b/tests/pyfunc/test_scoring_server.py @@ -0,0 +1,158 @@ +import os +import json +import pandas as pd +import numpy as np +from collections import namedtuple + +import pytest +import sklearn.datasets as datasets +import sklearn.neighbors as knn + +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server +import mlflow.sklearn +from mlflow.protos.databricks_pb2 import ErrorCode, MALFORMED_REQUEST, BAD_REQUEST + +from tests.helper_functions import pyfunc_serve_and_score_model + + +ModelWithData = namedtuple("ModelWithData", ["model", "inference_data"]) + + +@pytest.fixture(scope="session") +def sklearn_model(): + iris = datasets.load_iris() + X = iris.data[:, :2] # we only take the first two features. + y = iris.target + knn_model = knn.KNeighborsClassifier() + knn_model.fit(X, y) + return ModelWithData(model=knn_model, inference_data=X) + + +@pytest.fixture +def model_path(tmpdir): + return str(os.path.join(tmpdir.strpath, "model")) + + +def test_scoring_server_responds_to_invalid_json_input_with_stacktrace_and_error_code( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + + incorrect_json_content = json.dumps({"not": "a serialized dataframe"}) + response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=incorrect_json_content, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED) + response_json = json.loads(response.content) + assert "error_code" in response_json + assert response_json["error_code"] == ErrorCode.Name(MALFORMED_REQUEST) + assert "message" in response_json + assert "stack_trace" in response_json + + +def test_scoring_server_responds_to_malformed_json_input_with_stacktrace_and_error_code( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + + malformed_json_content = "this is,,,, not valid json" + response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=malformed_json_content, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED) + response_json = json.loads(response.content) + assert "error_code" in response_json + assert response_json["error_code"] == ErrorCode.Name(MALFORMED_REQUEST) + assert "message" in response_json + assert "stack_trace" in response_json + + +def test_scoring_server_responds_to_invalid_pandas_input_format_with_stacktrace_and_error_code( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + + # The pyfunc scoring server expects a serialized Pandas Dataframe in `split` or `records` + # format; passing a serialized Dataframe in `table` format should yield a readable error + pandas_table_content = pd.DataFrame(sklearn_model.inference_data).to_json(orient="table") + response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=pandas_table_content, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED) + response_json = json.loads(response.content) + assert "error_code" in response_json + assert response_json["error_code"] == ErrorCode.Name(MALFORMED_REQUEST) + assert "message" in response_json + assert "stack_trace" in response_json + + +def test_scoring_server_responds_to_incompatible_inference_dataframe_with_stacktrace_and_error_code( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + incompatible_df = pd.DataFrame(np.array(range(10))) + + response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=incompatible_df, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED) + response_json = json.loads(response.content) + assert "error_code" in response_json + assert response_json["error_code"] == ErrorCode.Name(BAD_REQUEST) + assert "message" in response_json + assert "stack_trace" in response_json + + +def test_scoring_server_responds_to_invalid_csv_input_with_stacktrace_and_error_code( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + + # Any empty string is not valid pandas CSV + incorrect_csv_content = "" + response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=incorrect_csv_content, + content_type=pyfunc_scoring_server.CONTENT_TYPE_CSV) + response_json = json.loads(response.content) + assert "error_code" in response_json + assert response_json["error_code"] == ErrorCode.Name(MALFORMED_REQUEST) + assert "message" in response_json + assert "stack_trace" in response_json + + +def test_scoring_server_successfully_evaluates_correct_dataframes_with_pandas_records_orientation( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + + pandas_record_content = pd.DataFrame(sklearn_model.inference_data).to_json(orient="records") + response_default_content_type = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=pandas_record_content, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON) + assert response_default_content_type.status_code == 200 + + response_records_content_type = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=pandas_record_content, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_RECORDS_ORIENTED) + assert response_records_content_type.status_code == 200 + + +def test_scoring_server_successfully_evaluates_correct_dataframes_with_pandas_split_orientation( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + + pandas_split_content = pd.DataFrame(sklearn_model.inference_data).to_json(orient="split") + response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=pandas_split_content, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED) + assert response.status_code == 200 + + +def test_scoring_server_responds_to_invalid_content_type_request_with_unsupported_content_type_code( + sklearn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_model.model, path=model_path) + + pandas_split_content = pd.DataFrame(sklearn_model.inference_data).to_json(orient="split") + response = pyfunc_serve_and_score_model( + model_path=os.path.abspath(model_path), + data=pandas_split_content, + content_type="not_a_supported_content_type") + assert response.status_code == 415 diff --git a/tests/sagemaker/test_model_export.py b/tests/sagemaker/test_model_export.py index 43fc8fc956e14..09ee66934f97a 100644 --- a/tests/sagemaker/test_model_export.py +++ b/tests/sagemaker/test_model_export.py @@ -4,6 +4,7 @@ import pickle import tempfile import unittest +import json import sklearn.datasets as datasets import sklearn.linear_model as glm @@ -12,10 +13,10 @@ import pandas as pd import pytest -from mlflow.utils.file_utils import TempDir +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server from mlflow import pyfunc - from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.file_utils import TempDir from tests.helper_functions import score_model_in_sagemaker_docker_container @@ -49,10 +50,13 @@ def test_model_export(self): pyfunc.save_model(input_path, loader_module="mlflow.sklearn", data_path=model_pkl, conda_env=_mlflow_conda_env(tmp.path(conda_env))) - xpred = score_model_in_sagemaker_docker_container(input_path, self._iris_df) - print('expected', self._linear_lr_predict) - print('actual ', xpred) - np.testing.assert_array_equal(self._linear_lr_predict, xpred) + scoring_response = score_model_in_sagemaker_docker_container( + model_path=input_path, + data=self._iris_df, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED, + flavor=pyfunc.FLAVOR_NAME) + np.testing.assert_array_equal( + self._linear_lr_predict, np.array(json.loads(scoring_response.content))) finally: if path_to_remove: try: diff --git a/tests/spark/test_spark_model_export.py b/tests/spark/test_spark_model_export.py index 036882c617cb7..e4cf4d7752f74 100644 --- a/tests/spark/test_spark_model_export.py +++ b/tests/spark/test_spark_model_export.py @@ -1,6 +1,7 @@ import os import json +import numpy as np import pandas as pd import pyspark from pyspark.ml.classification import LogisticRegression @@ -17,15 +18,15 @@ from collections import namedtuple import mlflow +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server import mlflow.tracking from mlflow import active_run, pyfunc, mleap from mlflow import spark as sparkm from mlflow.models import Model from mlflow.utils.file_utils import TempDir - from mlflow.utils.environment import _mlflow_conda_env -from tests.helper_functions import score_model_in_sagemaker_docker_container +from tests.helper_functions import score_model_in_sagemaker_docker_container from tests.pyfunc.test_spark import score_model_as_udf @@ -148,15 +149,25 @@ def test_model_deployment(spark_model_iris, model_path, spark_conda_env): sample_input=spark_model_iris.spark_df) # 1. score and compare pyfunc deployed in Sagemaker docker container - preds1 = score_model_in_sagemaker_docker_container(model_path=model_path, - data=spark_model_iris.pandas_df, - flavor=mlflow.pyfunc.FLAVOR_NAME) - assert spark_model_iris.predictions == preds1 + scoring_response_1 = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=spark_model_iris.pandas_df, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED, + flavor=mlflow.pyfunc.FLAVOR_NAME) + np.testing.assert_array_almost_equal( + spark_model_iris.predictions, + np.array(json.loads(scoring_response_1.content)), + decimal=4) # 2. score and compare mleap deployed in Sagemaker docker container - preds2 = score_model_in_sagemaker_docker_container(model_path=model_path, - data=spark_model_iris.pandas_df, - flavor=mlflow.mleap.FLAVOR_NAME) - assert spark_model_iris.predictions == preds2 + scoring_response_2 = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=spark_model_iris.pandas_df.to_json(orient="split"), + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON, + flavor=mlflow.mleap.FLAVOR_NAME) + np.testing.assert_array_almost_equal( + spark_model_iris.predictions, + np.array(json.loads(scoring_response_2.content)), + decimal=4) def test_sparkml_model_log(tmpdir, spark_model_iris): From 9ba3959a1f86867d6ea74544751607b63344c5aa Mon Sep 17 00:00:00 2001 From: verdantforce <43613279+verdantforce@users.noreply.github.com> Date: Fri, 9 Nov 2018 01:33:13 -0600 Subject: [PATCH 046/483] Fix pyfunc serve ENV bug (#701) * Fixing the bug where docker fails to serve. The reason that serving fails is that when an `env` is specified, mlflow's sagemaker serve will try to install mlflow from /opt/mlflow. Note, /opt/mlflow always exists due to the way how Dockerfile is structured. Since the directory is empty by default, pip installing the package will fail which leads to the container exiting. To reproduce the issue, 1. run ```mlflow sagemaker build-and-push-container``` 2. create a pyfunc model with env 3. run ```mlflow sagemaker run-local --model-path {path/to/model} --run-id {runid}``` * Remove redundant check * Fix lint error --- mlflow/sagemaker/container/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlflow/sagemaker/container/__init__.py b/mlflow/sagemaker/container/__init__.py index 8293dd7eee5c2..21dbcf2c7fae8 100644 --- a/mlflow/sagemaker/container/__init__.py +++ b/mlflow/sagemaker/container/__init__.py @@ -134,7 +134,7 @@ def _serve_mleap(): def _container_includes_mlflow_source(): - return os.path.isdir("/opt/mlflow") + return os.path.exists("/opt/mlflow/setup.py") def _train(): From 2d1c36be0c78e57f41fa87be32516290651a45ea Mon Sep 17 00:00:00 2001 From: Mani Parkhe Date: Fri, 9 Nov 2018 08:05:03 -0800 Subject: [PATCH 047/483] fixing typo in readme (#703) --- examples/hyperparam/README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/hyperparam/README.rst b/examples/hyperparam/README.rst index 013572ef94a0b..1e3ec04f85b0f 100644 --- a/examples/hyperparam/README.rst +++ b/examples/hyperparam/README.rst @@ -49,24 +49,24 @@ Creates an experiment for hyperparam runs and return its experiment ID. .. code:: bash - mlflow run -e train --experiment-id example/hyperparam + mlflow run -e train --experiment-id examples/hyperparam Runs the Keras deep learning training with default parameters and log it in experiment 1. .. code:: bash mlflow run -e random --experiment-id -P \ - training_experiment_id= example/hyperparam + training_experiment_id= examples/hyperparam .. code:: bash mlflow run -e gpyopt --experiment-id -P \ - training_experiment_id= example/hyperparam + training_experiment_id= examples/hyperparam .. code:: bash mlflow run -e hyperopt --experiment-id -P \ - training_experiment_id= example/hyperparam + training_experiment_id= examples/hyperparam Runs the hyperparameter tuning with either random search or GpyOpt or Hyperopt and log the results under ``hyperparam_experiment_id``. From 9b6f6210b17f5125ccf1361ce7582f42aeac7f19 Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Fri, 9 Nov 2018 12:34:35 -0800 Subject: [PATCH 048/483] [R] Increase timeout of REST calls from 1 second to 60 seconds (#704) --- mlflow/R/mlflow/R/tracking-rest.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlflow/R/mlflow/R/tracking-rest.R b/mlflow/R/mlflow/R/tracking-rest.R index f55b40f76e4ae..9f3a61d193eea 100644 --- a/mlflow/R/mlflow/R/tracking-rest.R +++ b/mlflow/R/mlflow/R/tracking-rest.R @@ -27,7 +27,7 @@ mlflow_rest_headers <- function() { #' @importFrom httr timeout mlflow_rest_timeout <- function() { - timeout(getOption("mlflow.rest.timeout", 1)) + timeout(getOption("mlflow.rest.timeout", 60)) } #' @importFrom httr content From 505e81cb52101ce7b3ad78df79461eedfb9563fa Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Fri, 9 Nov 2018 18:09:22 -0800 Subject: [PATCH 049/483] Update release version to 0.8.0 (#699) --- CHANGELOG.rst | 55 +++++++++++++++++++++++++++++++++++++ mlflow/R/mlflow/DESCRIPTION | 2 +- mlflow/java/client/pom.xml | 4 +-- mlflow/java/pom.xml | 2 +- mlflow/java/scoring/pom.xml | 4 +-- mlflow/version.py | 2 +- 6 files changed, 62 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index c07a71f71e009..4e2923fd27bd6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,61 @@ Changelog ========= +0.8.0 (2018-11-08) +----------------- + +MLflow 0.8.0 introduces several major features: + +- Dramatically improved UI for comparing experiment run results: + + - Metrics and parameters are by default grouped into a single column, to avoid an explosion of mostly-empty columns. Individual metrics and parameters can be moved into their own column to help compare across rows. + - Runs that are "nested" inside other runs (e.g., as part of a hyperparameter search or multistep workflow) now show up grouped by their parent run, and can be expanded or collapsed altogether. Runs can be nested by calling ``mlflow.start_run`` or ``mlflow.run`` while already within a run. + - Run names (as opposed to automatically generated run UUIDs) now show up instead of the run ID, making comparing runs in graphs easier. + - The state of the run results table, including filters, sorting, and expanded rows, is persisted in browser local storage, making it easier to go back and forth between an individual run view and the table. + +- Support for deploying models as Docker containers directly to Azure Machine Learning Service Workspace (as opposed to the previously-recommended solution of Azure ML Workbench). + + +Breaking changes: + +- [CLI] ``mlflow sklearn serve`` has been removed in favor of ``mlflow pyfunc serve``, which takes the same arguments but works against any pyfunc model (#690, @dbczumar) + + +Features: + +- [Scoring] pyfunc server and SageMaker now support the pandas "split" JSON format in addition to the "records" format. The split format allows the client to specify the order of columns, which is necessary for some model formats. We recommend switching client code over to use this new format (by sending the Content-Type header ``application/json; format=pandas-split``), as it will become the default JSON format in MLflow 0.9.0. (#690, @dbczumar) +- [UI] Add compact experiment view (#546, #620, #662, #665, @smurching) +- [UI] Add support for viewing & tracking nested runs in experiment view (#588, @andrewmchen; #618, #619, @aarondav) +- [UI] Persist experiments view filters and sorting in browser local storage (#687, @smurching) +- [UI] Show run name instead of run ID when present (#476, @smurching) +- [Scoring] Support for deploying Models directly to Azure Machine Learning Service Workspace (#631, @dbczumar) +- [Server/Python/Java] Add ``rename_experiment`` to Tracking API (#570, @aarondav) +- [Server] Add ``get_experiment_by_name`` to RestStore (#592, @dmarkhas) +- [Server] Allow passing gunicorn options when starting mlflow server (#626, @mparkhe) +- [Python] Cloudpickle support for sklearn serialization (#653, @dbczumar) +- [Artifacts] FTP artifactory store added (#287, @Shenggan) + + +Bug fixes and documentation updates: + +- [Python] Update TensorFlow integration to match API provided by other flavors (#612, @dbczumar; #670, @mlaradji) +- [Python] Support for TensorFlow 1.12 (#692, @smurching) +- [R] Explicitly loading Keras module at predict time no longer required (#586, @kevinykuo) +- [R] pyfunc serve can correctly load models saved with the R Keras support (#634, @tomasatdatabricks) +- [R] Increase network timeout of calls to the RestStore from 1 second to 60 seconds (#704, @aarondav) +- [Server] Improve errors returned by RestStore (#582, @andrewmchen; #560, @smurching) +- [Server] Deleting the default experiment no longer causes it to be immediately recreated (#604, @andrewmchen; #641, @schipiga) +- [Server] Azure Blob Storage artifact repo supports Windows paths (#642, @marcusrehm) +- [Server] Improve behavior when environment and run files are corrupted (#632, #654, #661, @mparkhe) +- [UI] Improve error page when viewing nonexistent runs or views (#600, @andrewmchen; #560, @andrewmchen) +- [UI] UI no longer throws an error if all experiments are deleted (#605, @andrewmchen) +- [Docs] Include diagram of workflow for multistep example (#581, @dennyglee) +- [Docs] Add reference tags and R and Java APIs to tracking documentation (#514, @stbof) +- [Docs/R] Use CRAN installation (#686, @javierluraschi) + +Small bug fixes and doc updates (#576, #594, @javierluraschi; #585, @kevinykuo; #593, #601, #611, #650, #669, #671, #679, @dbczumar; #607, @suzil; #583, #615, @andrewmchen; #622, #681, @aarondav; #625, @pogil; #589, @tomasatdatabricks; #529, #635, #684, @stbof; #657, @mvsusp; #682, @mateiz; #678, vfdev-5; #596, @yutannihilation; #663, @smurching) + + 0.7.0 (2018-10-01) ----------------- diff --git a/mlflow/R/mlflow/DESCRIPTION b/mlflow/R/mlflow/DESCRIPTION index 10aaedbda4c23..3296824574733 100644 --- a/mlflow/R/mlflow/DESCRIPTION +++ b/mlflow/R/mlflow/DESCRIPTION @@ -1,7 +1,7 @@ Package: mlflow Type: Package Title: Interface to 'MLflow' -Version: 0.7.1 +Version: 0.8.0 Authors@R: c( person("Matei", "Zaharia", email = "matei@databricks.com", role = c("aut", "cre")), person("Javier", "Luraschi", email = "javier@rstudio.com", role = c("aut")), diff --git a/mlflow/java/client/pom.xml b/mlflow/java/client/pom.xml index 3cd6d4fefc0fd..28da4a7d2ba7d 100644 --- a/mlflow/java/client/pom.xml +++ b/mlflow/java/client/pom.xml @@ -5,13 +5,13 @@ org.mlflow mlflow-parent - 0.7.1 + 0.8.0 ../pom.xml mlflow-client jar - 0.7.1 + 0.8.0 MLflow Tracking API http://mlflow.org diff --git a/mlflow/java/pom.xml b/mlflow/java/pom.xml index 6e6a61f9660fa..c92960c9ed67d 100644 --- a/mlflow/java/pom.xml +++ b/mlflow/java/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mlflow mlflow-parent - 0.7.1 + 0.8.0 pom MLflow Parent POM http://mlflow.org diff --git a/mlflow/java/scoring/pom.xml b/mlflow/java/scoring/pom.xml index e351f126ef025..a040022f73fe5 100644 --- a/mlflow/java/scoring/pom.xml +++ b/mlflow/java/scoring/pom.xml @@ -5,7 +5,7 @@ org.mlflow mlflow-parent - 0.7.1 + 0.8.0 ../pom.xml @@ -18,7 +18,7 @@ mlflow-scoring - 0.7.1 + 0.8.0 jar MLflow scoring server http://mlflow.org diff --git a/mlflow/version.py b/mlflow/version.py index 1febf6fc0c6b3..d755dda829302 100644 --- a/mlflow/version.py +++ b/mlflow/version.py @@ -1,4 +1,4 @@ # Copyright 2018 Databricks, Inc. -VERSION = '0.7.1.dev' +VERSION = '0.8.0' From 092fc6b0792c9d1e89c607bfb9590a232ccbd8dd Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Sat, 10 Nov 2018 09:05:08 -0800 Subject: [PATCH 050/483] Update development version to 0.8.1.dev (#706) --- mlflow/R/mlflow/DESCRIPTION | 2 +- mlflow/java/client/pom.xml | 4 ++-- mlflow/java/pom.xml | 2 +- mlflow/java/scoring/pom.xml | 4 ++-- mlflow/version.py | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mlflow/R/mlflow/DESCRIPTION b/mlflow/R/mlflow/DESCRIPTION index 3296824574733..e680f3bb69db6 100644 --- a/mlflow/R/mlflow/DESCRIPTION +++ b/mlflow/R/mlflow/DESCRIPTION @@ -1,7 +1,7 @@ Package: mlflow Type: Package Title: Interface to 'MLflow' -Version: 0.8.0 +Version: 0.8.1 Authors@R: c( person("Matei", "Zaharia", email = "matei@databricks.com", role = c("aut", "cre")), person("Javier", "Luraschi", email = "javier@rstudio.com", role = c("aut")), diff --git a/mlflow/java/client/pom.xml b/mlflow/java/client/pom.xml index 28da4a7d2ba7d..698b87d630b04 100644 --- a/mlflow/java/client/pom.xml +++ b/mlflow/java/client/pom.xml @@ -5,13 +5,13 @@ org.mlflow mlflow-parent - 0.8.0 + 0.8.1 ../pom.xml mlflow-client jar - 0.8.0 + 0.8.1 MLflow Tracking API http://mlflow.org diff --git a/mlflow/java/pom.xml b/mlflow/java/pom.xml index c92960c9ed67d..0bbc8ee9e0897 100644 --- a/mlflow/java/pom.xml +++ b/mlflow/java/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.mlflow mlflow-parent - 0.8.0 + 0.8.1 pom MLflow Parent POM http://mlflow.org diff --git a/mlflow/java/scoring/pom.xml b/mlflow/java/scoring/pom.xml index a040022f73fe5..1075a08416050 100644 --- a/mlflow/java/scoring/pom.xml +++ b/mlflow/java/scoring/pom.xml @@ -5,7 +5,7 @@ org.mlflow mlflow-parent - 0.8.0 + 0.8.1 ../pom.xml @@ -18,7 +18,7 @@ mlflow-scoring - 0.8.0 + 0.8.1 jar MLflow scoring server http://mlflow.org diff --git a/mlflow/version.py b/mlflow/version.py index d755dda829302..fd87530442886 100644 --- a/mlflow/version.py +++ b/mlflow/version.py @@ -1,4 +1,4 @@ # Copyright 2018 Databricks, Inc. -VERSION = '0.8.0' +VERSION = '0.8.1.dev' From c67c1826c2776b97d3f2b4a38cd864329d15f480 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Sat, 10 Nov 2018 23:23:10 -0800 Subject: [PATCH 051/483] [Default Envs] Add default conda environment to Sklearn (#705) * Env changes * Test updates * Test tweaks * Model utils tests * Remove unused azml import * Lint fixes * Remove unused function * Address comments * Address comments * Test fix * Test fix * Lint fixes * Fix child process handling in scoring process tests * Sagemaker test fix * Fix sklearn model read --- mlflow/azureml/__init__.py | 1 - mlflow/sklearn.py | 65 ++++++++++----- mlflow/utils/environment.py | 21 +++-- mlflow/utils/model_utils.py | 32 ++++++++ tests/helper_functions.py | 44 ++++++---- tests/sagemaker/test_model_export.py | 3 +- tests/sklearn/test_sklearn_model_export.py | 93 +++++++++++++++++++++- tests/utils/test_environment.py | 32 +++++--- tests/utils/test_model_utils.py | 61 ++++++++++++++ 9 files changed, 293 insertions(+), 59 deletions(-) create mode 100644 mlflow/utils/model_utils.py create mode 100644 tests/utils/test_model_utils.py diff --git a/mlflow/azureml/__init__.py b/mlflow/azureml/__init__.py index 60017883e9d3c..9f7f995832662 100644 --- a/mlflow/azureml/__init__.py +++ b/mlflow/azureml/__init__.py @@ -20,7 +20,6 @@ from mlflow.utils import PYTHON_VERSION, get_unique_resource_id from mlflow.utils.logging_utils import eprint from mlflow.utils.file_utils import TempDir, _copy_file_or_tree, _copy_project -from mlflow.utils.environment import _mlflow_conda_env from mlflow.version import VERSION as mlflow_version diff --git a/mlflow/sklearn.py b/mlflow/sklearn.py index b7e932ba6c2fb..85eee07bd7648 100644 --- a/mlflow/sklearn.py +++ b/mlflow/sklearn.py @@ -14,6 +14,7 @@ import os import pickle import shutil +import yaml import sklearn @@ -22,6 +23,18 @@ from mlflow.models import Model from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE, INTERNAL_ERROR import mlflow.tracking +from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.model_utils import _get_flavor_configuration + +FLAVOR_NAME = "sklearn" + +DEFAULT_CONDA_ENV = _mlflow_conda_env( + additional_conda_deps=[ + "scikit-learn={}".format(sklearn.__version__), + ], + additional_pip_deps=None, + additional_conda_channels=None +) SERIALIZATION_FORMAT_PICKLE = "pickle" SERIALIZATION_FORMAT_CLOUDPICKLE = "cloudpickle" @@ -40,16 +53,16 @@ def save_model(sk_model, path, conda_env=None, mlflow_model=Model(), :param sk_model: scikit-learn model to be saved. :param path: Local path where the model is to be saved. :param conda_env: Path to a Conda environment file. If provided, this decribes the environment - this model should be run in. At minimum, it should specify python, scikit-learn, - and mlflow with appropriate versions. + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.sklearn.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.sklearn.DEFAULT_CONDA_ENV`` environment will be added to the model. :param mlflow_model: :py:mod:`mlflow.models.Model` this flavor is being added to. :param serialization_format: The format in which to serialize the model. This should be one of the formats listed in - `mlflow.sklearn.SUPPORTED_SERIALIZATION_FORMATS`. The Cloudpickle - format, `mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE`, provides - better cross-system compatibility by identifying and packaging - code dependencies with the serialized model. - + ``mlflow.sklearn.SUPPORTED_SERIALIZATION_FORMATS``. The Cloudpickle + format, ``mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE``, + provides better cross-system compatibility by identifying and + packaging code dependencies with the serialized model. >>> import mlflow.sklearn >>> from sklearn.datasets import load_iris >>> from sklearn import tree @@ -84,13 +97,17 @@ def save_model(sk_model, path, conda_env=None, mlflow_model=Model(), model_data_subpath = "model.pkl" _save_model(sk_model=sk_model, output_path=os.path.join(path, model_data_subpath), serialization_format=serialization_format) - model_conda_env = None - if conda_env: - model_conda_env = os.path.basename(os.path.abspath(conda_env)) - shutil.copyfile(conda_env, os.path.join(path, model_conda_env)) + + conda_env_subpath = "conda.yaml" + if conda_env is not None: + shutil.copyfile(conda_env, os.path.join(path, conda_env_subpath)) + else: + with open(os.path.join(path, conda_env_subpath), "w") as f: + yaml.safe_dump(DEFAULT_CONDA_ENV, stream=f, default_flow_style=False) + pyfunc.add_to_model(mlflow_model, loader_module="mlflow.sklearn", data=model_data_subpath, - env=model_conda_env) - mlflow_model.add_flavor("sklearn", + env=conda_env_subpath) + mlflow_model.add_flavor(FLAVOR_NAME, pickled_model=model_data_subpath, sklearn_version=sklearn.__version__, serialization_format=serialization_format) @@ -105,11 +122,15 @@ def log_model(sk_model, artifact_path, conda_env=None, :param sk_model: scikit-learn model to be saved. :param artifact_path: Run-relative artifact path. :param conda_env: Path to a Conda environment file. If provided, this decribes the environment - this model should be run in. At minimum, it should specify python, scikit-learn, - and mlflow with appropriate versions. + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.sklearn.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.sklearn.DEFAULT_CONDA_ENV`` environment will be added to the model. :param serialization_format: The format in which to serialize the model. This should be one of - the following: `mlflow.sklearn.SERIALIZATION_FORMAT_PICKLE`, - `mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE`. + the formats listed in + ``mlflow.sklearn.SUPPORTED_SERIALIZATION_FORMATS``. The Cloudpickle + format, ``mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE``, + provides better cross-system compatibility by identifying and + packaging code dependencies with the serialized model. >>> import mlflow >>> import mlflow.sklearn @@ -135,10 +156,7 @@ def log_model(sk_model, artifact_path, conda_env=None, def _load_model_from_local_file(path): """Load a scikit-learn model saved as an MLflow artifact on the local file system.""" # TODO: we could validate the SciKit-Learn version here - model = Model.load(os.path.join(path, "MLmodel")) - assert "sklearn" in model.flavors - params = model.flavors["sklearn"] - with open(os.path.join(path, params["pickled_model"]), "rb") as f: + with open(path, "rb") as f: # Models serialized with Cloudpickle can be deserialized using Pickle; in fact, # Cloudpickle.load() is just a redefinition of pickle.load(). Therefore, we do # not need to check the serialization format of the model before deserializing. @@ -190,4 +208,7 @@ def load_model(path, run_id=None): """ if run_id is not None: path = mlflow.tracking.utils._get_model_log_dir(model_name=path, run_id=run_id) - return _load_model_from_local_file(path) + path = os.path.abspath(path) + flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME) + sklearn_model_artifacts_path = os.path.join(path, flavor_conf['pickled_model']) + return _load_model_from_local_file(path=sklearn_model_artifacts_path) diff --git a/mlflow/utils/environment.py b/mlflow/utils/environment.py index 5f9c8a86f1d13..b85dd2b6c6b7d 100644 --- a/mlflow/utils/environment.py +++ b/mlflow/utils/environment.py @@ -9,15 +9,19 @@ """ -def _mlflow_conda_env(path, additional_conda_deps=None, additional_pip_deps=None, +def _mlflow_conda_env(path=None, additional_conda_deps=None, additional_pip_deps=None, additional_conda_channels=None): """ - Create conda environment file. Contains default dependency on current python version. - :param path: local filesystem path where the conda env file is to be created. + Creates a Conda environment with the specified package channels and dependencies. + + :param path: Local filesystem path where the conda env file is to be written. If unspecified, + the conda env will not be written to the filesystem; it will still be returned + in dictionary format. :param additional_conda_deps: List of additional conda dependencies passed as strings. :param additional_pip_deps: List of additional pip dependencies passed as strings. :param additional_channels: List of additional conda channels to search when resolving packages. - :return: path where the conda environment file has been created. + :return: `None` if `path` is specified. Otherwise, the a dictionary representation of the + Conda environment. """ env = yaml.load(_conda_header) env["dependencies"] = ["python={}".format(PYTHON_VERSION)] @@ -28,6 +32,9 @@ def _mlflow_conda_env(path, additional_conda_deps=None, additional_pip_deps=None if additional_conda_channels is not None: env["channels"] += additional_conda_channels - with open(path, "w") as f: - yaml.safe_dump(env, f, default_flow_style=False) - return path + if path is not None: + with open(path, "w") as out: + yaml.safe_dump(env, stream=out, default_flow_style=False) + return None + else: + return env diff --git a/mlflow/utils/model_utils.py b/mlflow/utils/model_utils.py new file mode 100644 index 0000000000000..527972c539054 --- /dev/null +++ b/mlflow/utils/model_utils.py @@ -0,0 +1,32 @@ +import os + +from mlflow.exceptions import MlflowException +from mlflow.models import Model +from mlflow.protos.databricks_pb2 import RESOURCE_DOES_NOT_EXIST + + +def _get_flavor_configuration(model_path, flavor_name): + """ + Obtains the configuration for the specified flavor from the specified + MLflow model path. If the model does not contain the specified flavor, + an exception will be thrown. + + :param model_path: The path to the root directory of the MLflow model for which to load + the specified flavor configuration. + :param flavor_name: The name of the flavor configuration to load. + :return: The flavor configuration as a dictionary. + """ + model_configuration_path = os.path.join(model_path, "MLmodel") + if not os.path.exists(model_configuration_path): + raise MlflowException( + "Could not find an \"MLmodel\" configuration file at \"{model_path}\"".format( + model_path=model_path), + RESOURCE_DOES_NOT_EXIST) + + model_conf = Model.load(model_configuration_path) + if flavor_name not in model_conf.flavors: + raise MlflowException( + "Model does not have the \"{flavor_name}\" flavor".format(flavor_name=flavor_name), + RESOURCE_DOES_NOT_EXIST) + conf = model_conf.flavors[flavor_name] + return conf diff --git a/tests/helper_functions.py b/tests/helper_functions.py index 83364b0b2d4a2..418cc62d97eba 100644 --- a/tests/helper_functions.py +++ b/tests/helper_functions.py @@ -1,11 +1,11 @@ import os import random - import re import requests import string -from subprocess import Popen, PIPE, STDOUT import time +import signal +from subprocess import Popen, PIPE, STDOUT import pandas as pd @@ -37,11 +37,10 @@ def score_model_in_sagemaker_docker_container( """ env = dict(os.environ) env.update(LC_ALL="en_US.UTF-8", LANG="en_US.UTF-8") - proc = Popen(['mlflow', 'sagemaker', 'run-local', '-m', model_path, '-p', "5000", "-f", flavor], - stdout=PIPE, - stderr=STDOUT, - universal_newlines=True, env=env) - return _score_proc(proc, 5000, data, content_type) + proc = _start_scoring_proc( + cmd=['mlflow', 'sagemaker', 'run-local', '-m', model_path, '-p', "5000", "-f", flavor], + env=env) + return _evaluate_scoring_proc(proc, 5000, data, content_type) def pyfunc_serve_and_score_model(model_path, data, content_type): @@ -54,22 +53,32 @@ def pyfunc_serve_and_score_model(model_path, data, content_type): """ env = dict(os.environ) env.update(LC_ALL="en_US.UTF-8", LANG="en_US.UTF-8") - cmd = ['mlflow', 'pyfunc', 'serve', '-m', model_path, "-p", "0"] - proc = Popen(cmd, - stdout=PIPE, - stderr=STDOUT, - universal_newlines=True, - env=env) + proc = _start_scoring_proc( + cmd=['mlflow', 'pyfunc', 'serve', '-m', model_path, "-p", "0"], + env=env) for x in iter(proc.stdout.readline, ""): print(x) m = re.match(pattern=".*Running on http://127.0.0.1:(\\d+).*", string=x) if m: - return _score_proc(proc, int(m.group(1)), data, content_type=content_type) + return _evaluate_scoring_proc(proc, int(m.group(1)), data, content_type=content_type) raise Exception("Failed to start server") -def _score_proc(proc, port, data, content_type): +def _start_scoring_proc(cmd, env): + proc = Popen(cmd, + stdout=PIPE, + stderr=STDOUT, + universal_newlines=True, + env=env, + # Assign the scoring process to a process group. All child processes of the + # scoring process will be assigned to this group as well. This allows child + # processes of the scoring process to be terminated successfully + preexec_fn=os.setsid) + return proc + + +def _evaluate_scoring_proc(proc, port, data, content_type): try: for i in range(0, 50): assert proc.poll() is None, "scoring process died" @@ -104,7 +113,10 @@ def _score_proc(proc, port, data, content_type): return response finally: if proc.poll() is None: - proc.terminate() + # Terminate the process group containing the scoring process. + # This will terminate all child processes of the scoring process + pgrp = os.getpgid(proc.pid) + os.killpg(pgrp, signal.SIGTERM) print("captured output of the scoring process") print("-------------------------STDOUT------------------------------") print(proc.stdout.read()) diff --git a/tests/sagemaker/test_model_export.py b/tests/sagemaker/test_model_export.py index 09ee66934f97a..34adb45778251 100644 --- a/tests/sagemaker/test_model_export.py +++ b/tests/sagemaker/test_model_export.py @@ -47,9 +47,10 @@ def test_model_export(self): pickle.dump(self._linear_lr, f) input_path = tmp.path("input_model") conda_env = "conda.env" + _mlflow_conda_env(path=tmp.path(conda_env)) pyfunc.save_model(input_path, loader_module="mlflow.sklearn", data_path=model_pkl, - conda_env=_mlflow_conda_env(tmp.path(conda_env))) + conda_env=conda_env) scoring_response = score_model_in_sagemaker_docker_container( model_path=input_path, data=self._iris_df, diff --git a/tests/sklearn/test_sklearn_model_export.py b/tests/sklearn/test_sklearn_model_export.py index ba8dc158ac914..5d1b1fb8e84a0 100644 --- a/tests/sklearn/test_sklearn_model_export.py +++ b/tests/sklearn/test_sklearn_model_export.py @@ -4,9 +4,14 @@ import os import pickle import pytest +import json +import yaml from collections import namedtuple import numpy as np +import pandas as pd +import pandas.testing +import sklearn import sklearn.datasets as datasets import sklearn.linear_model as glm import sklearn.neighbors as knn @@ -14,14 +19,17 @@ from sklearn.preprocessing import FunctionTransformer as SKFunctionTransformer import mlflow.sklearn +import mlflow.utils from mlflow import pyfunc from mlflow.exceptions import MlflowException from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE from mlflow.models import Model from mlflow.tracking.utils import _get_model_log_dir -from mlflow.utils.file_utils import TempDir from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.file_utils import TempDir +from mlflow.utils.model_utils import _get_flavor_configuration +from tests.helper_functions import score_model_in_sagemaker_docker_container ModelWithData = namedtuple("ModelWithData", ["model", "inference_data"]) @@ -62,6 +70,15 @@ def model_path(tmpdir): return os.path.join(str(tmpdir), "model") +@pytest.fixture +def sklearn_custom_env(tmpdir): + conda_env = os.path.join(str(tmpdir), "conda_env.yml") + _mlflow_conda_env( + conda_env, + additional_conda_deps=["scikit-learn", "pytest"]) + return conda_env + + def test_model_save_load(sklearn_knn_model, model_path): knn_model = sklearn_knn_model.model @@ -89,7 +106,7 @@ def test_model_log(sklearn_logreg_model, model_path): artifact_path = "linear" conda_env = os.path.join(tmp.path(), "conda_env.yaml") - _mlflow_conda_env(conda_env, additional_pip_deps=["sklearn"]) + _mlflow_conda_env(conda_env, additional_pip_deps=["scikit-learn"]) mlflow.sklearn.log_model( sk_model=sklearn_logreg_model.model, @@ -148,14 +165,84 @@ def test_custom_transformer_can_be_saved_and_loaded_with_cloudpickle_format( sklearn_custom_transformer_model.inference_data)) -def test_save_model_throws_exception_if_serialization_format_is_unrecognized( +def test_model_save_persists_specified_conda_env_in_mlflow_model_directory( + sklearn_knn_model, model_path, sklearn_custom_env): + mlflow.sklearn.save_model( + sk_model=sklearn_knn_model.model, path=model_path, conda_env=sklearn_custom_env) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != sklearn_custom_env + + with open(sklearn_custom_env, "r") as f: + sklearn_custom_env_parsed = yaml.safe_load(f) + with open(saved_conda_env_path, "r") as f: + saved_conda_env_parsed = yaml.safe_load(f) + assert saved_conda_env_parsed == sklearn_custom_env_parsed + + +def test_model_log_persists_specified_conda_env_in_mlflow_model_directory( + sklearn_knn_model, sklearn_custom_env): + artifact_path = "model" + with mlflow.start_run(): + mlflow.sklearn.log_model(sk_model=sklearn_knn_model.model, + artifact_path=artifact_path, + conda_env=sklearn_custom_env) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != sklearn_custom_env + + with open(sklearn_custom_env, "r") as f: + sklearn_custom_env_parsed = yaml.safe_load(f) + with open(saved_conda_env_path, "r") as f: + saved_conda_env_parsed = yaml.safe_load(f) + assert saved_conda_env_parsed == sklearn_custom_env_parsed + + +def test_model_save_throws_exception_if_serialization_format_is_unrecognized( sklearn_knn_model, model_path): with pytest.raises(MlflowException) as exc: mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path, serialization_format="not a valid format") + assert exc.error_code == INVALID_PARAMETER_VALUE # The unsupported serialization format should have been detected prior to the execution of # any directory creation or state-mutating persistence logic that would prevent a second # serialization call with the same model path from succeeding assert not os.path.exists(model_path) mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path) + + +def test_model_save_without_specified_conda_env_uses_default_env_with_expected_dependencies( + sklearn_knn_model, model_path): + knn_model = sklearn_knn_model.model + mlflow.sklearn.save_model(sk_model=knn_model, path=model_path, conda_env=None) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.sklearn.DEFAULT_CONDA_ENV + + +def test_model_log_without_specified_conda_env_uses_default_env_with_expected_dependencies( + sklearn_knn_model): + artifact_path = "model" + knn_model = sklearn_knn_model.model + with mlflow.start_run(): + mlflow.sklearn.log_model(sk_model=knn_model, artifact_path=artifact_path, conda_env=None) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.sklearn.DEFAULT_CONDA_ENV diff --git a/tests/utils/test_environment.py b/tests/utils/test_environment.py index 5d68fdc347559..e988a30bea7fa 100644 --- a/tests/utils/test_environment.py +++ b/tests/utils/test_environment.py @@ -1,14 +1,28 @@ import os +import pytest from mlflow.utils.environment import _mlflow_conda_env -def test_save(tmpdir): - filename = os.path.join(str(tmpdir), "conda_env.yml") - _mlflow_conda_env(filename, additional_conda_deps=["conda-dep-1=0.0.1", "conda-dep-2"], - additional_pip_deps=["pip-dep-1", "pip-dep2==0.1.0"]) - print("") - print("env start") - with open(filename) as f: - print(f.read()) - print("env end") +@pytest.fixture +def conda_env_path(tmpdir): + return os.path.join(tmpdir.strpath, "conda_env.yaml") + + +def test_mlflow_conda_env_returns_none_when_output_path_is_specified(conda_env_path): + env_creation_output = _mlflow_conda_env( + path=conda_env_path, + additional_conda_deps=["conda-dep-1=0.0.1", "conda-dep-2"], + additional_pip_deps=["pip-dep-1", "pip-dep2==0.1.0"]) + + assert env_creation_output is None + + +def test_mlflow_conda_env_returns_expected_env_dict_when_output_path_is_not_specified(): + conda_deps = ["conda-dep-1=0.0.1", "conda-dep-2"] + env = _mlflow_conda_env( + path=None, + additional_conda_deps=conda_deps) + + for conda_dep in conda_deps: + assert conda_dep in env["dependencies"] diff --git a/tests/utils/test_model_utils.py b/tests/utils/test_model_utils.py new file mode 100644 index 0000000000000..6d6da078fdc30 --- /dev/null +++ b/tests/utils/test_model_utils.py @@ -0,0 +1,61 @@ +import os + +import pytest +import sklearn.datasets as datasets +import sklearn.neighbors as knn + +import mlflow.sklearn +import mlflow.utils.model_utils as mlflow_model_utils +from mlflow.exceptions import MlflowException +from mlflow.models import Model +from mlflow.protos.databricks_pb2 import RESOURCE_DOES_NOT_EXIST +from mlflow.mleap import FLAVOR_NAME as MLEAP_FLAVOR_NAME + + +@pytest.fixture(scope="session") +def sklearn_knn_model(): + iris = datasets.load_iris() + X = iris.data[:, :2] # we only take the first two features. + y = iris.target + knn_model = knn.KNeighborsClassifier() + knn_model.fit(X, y) + return knn_model + + +@pytest.fixture +def model_path(tmpdir): + return os.path.join(str(tmpdir), "model") + + +def test_get_flavor_configuration_throws_exception_when_model_configuration_does_not_exist( + model_path): + with pytest.raises(MlflowException) as exc: + mlflow_model_utils._get_flavor_configuration( + model_path=model_path, flavor_name=mlflow.mleap.FLAVOR_NAME) + assert exc.error_code == RESOURCE_DOES_NOT_EXIST + + +def test_get_flavor_configuration_throws_exception_when_requested_flavor_is_missing( + model_path, sklearn_knn_model): + mlflow.sklearn.save_model(sk_model=sklearn_knn_model, path=model_path) + + # The saved model contains the "sklearn" flavor, so this call should succeed + sklearn_flavor_config = mlflow_model_utils._get_flavor_configuration( + model_path=model_path, flavor_name=mlflow.sklearn.FLAVOR_NAME) + assert sklearn_flavor_config is not None + + # The saved model does not contain the "mleap" flavor, so this call should fail + with pytest.raises(MlflowException) as exc: + mlflow_model_utils._get_flavor_configuration( + model_path=model_path, flavor_name=MLEAP_FLAVOR_NAME) + assert exc.error_code == RESOURCE_DOES_NOT_EXIST + + +def test_get_flavor_configuration_with_present_flavor_returns_expected_configuration( + sklearn_knn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_knn_model, path=model_path) + + sklearn_flavor_config = mlflow_model_utils._get_flavor_configuration( + model_path=model_path, flavor_name=mlflow.sklearn.FLAVOR_NAME) + model_config = Model.load(os.path.join(model_path, "MLmodel")) + assert sklearn_flavor_config == model_config.flavors[mlflow.sklearn.FLAVOR_NAME] From 1b3b9965c20e4d0fd6541182705b7fb2b4b669bc Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Mon, 12 Nov 2018 14:26:38 -0800 Subject: [PATCH 052/483] [Default envs] Add default conda environments for Tensorflow, PyTorch, Spark (#707) * Env changes * Test updates * Test tweaks * Test fix spark * testfix * Spark support * Model utils tests * Remove unused azml import * Lint fixes * Keras support * Lint * Remove unused function * Address comments * Address comments * Make yaml changes * Torch * Test fix * Test fixes * Tensorflow * Test fixes * Test fix * Lint fixes * Fix whitespace * Fix child process handling in scoring process tests * Sagemaker test fix * Fix sklearn model read * Tensorflow remove integration test * Revert whitespace changes to unrelated files * Comment update * pytorch param docs * Revert keras/h2o, will submit as separate PR * Lint * Fix tests --- mlflow/pytorch.py | 74 ++++++---- mlflow/sklearn.py | 2 +- mlflow/spark.py | 47 +++++-- mlflow/tensorflow.py | 56 +++++--- tests/pytorch/test_pytorch_model_export.py | 128 +++++++++++++++--- tests/sklearn/test_sklearn_model_export.py | 1 - tests/spark/test_spark_model_export.py | 92 +++++++++++-- .../test_tensorflow_model_export.py | 125 ++++++++++++----- 8 files changed, 397 insertions(+), 128 deletions(-) diff --git a/mlflow/pytorch.py b/mlflow/pytorch.py index 675195fb41d16..b1fbcd394376f 100644 --- a/mlflow/pytorch.py +++ b/mlflow/pytorch.py @@ -11,18 +11,33 @@ from __future__ import absolute_import import os +import shutil +import yaml import numpy as np import pandas as pd import torch +import torchvision from mlflow import pyfunc from mlflow.models import Model import mlflow.tracking - +from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.model_utils import _get_flavor_configuration FLAVOR_NAME = "pytorch" +DEFAULT_CONDA_ENV = _mlflow_conda_env( + additional_conda_deps=[ + "pytorch={}".format(torch.__version__), + "torchvision={}".format(torchvision.__version__), + ], + additional_pip_deps=None, + additional_conda_channels=[ + "pytorch", + ], +) + def log_model(pytorch_model, artifact_path, conda_env=None, **kwargs): """ @@ -31,9 +46,10 @@ def log_model(pytorch_model, artifact_path, conda_env=None, **kwargs): :param pytorch_model: PyTorch model to be saved. Must accept a single ``torch.FloatTensor`` as input and produce a single output tensor. :param artifact_path: Run-relative artifact path. - :param conda_env: Path to a Conda environment file. If provided, this defines the environment - for the model. At minimum, it should specify python, pytorch, and mlflow with appropriate - versions. + :param conda_env: Path to a Conda environment file. If provided, this decribes the environment + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.pytorch.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.pytorch.DEFAULT_CONDA_ENV`` environment will be added to the model. :param kwargs: kwargs to pass to ``torch.save`` method. >>> import torch @@ -89,8 +105,9 @@ def save_model(pytorch_model, path, conda_env=None, mlflow_model=Model(), **kwar input and produce a single output tensor. :param path: Local path where the model is to be saved. :param conda_env: Path to a Conda environment file. If provided, this decribes the environment - this model should be run in. At minimum, it should specify python, pytorch, - and mlflow with appropriate versions. + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.pytorch.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.pytorch.DEFAULT_CONDA_ENV`` environment will be added to the model. :param mlflow_model: :py:mod:`mlflow.models.Model` this flavor is being added to. :param kwargs: kwargs to pass to ``torch.save`` method. @@ -122,33 +139,24 @@ def save_model(pytorch_model, path, conda_env=None, mlflow_model=Model(), **kwar torch.save(pytorch_model, model_path, **kwargs) model_file = os.path.basename(model_path) + conda_env_subpath = "conda.yaml" + if conda_env is not None: + shutil.copyfile(conda_env, os.path.join(path, conda_env_subpath)) + else: + with open(os.path.join(path, conda_env_subpath), "w") as f: + yaml.safe_dump(DEFAULT_CONDA_ENV, stream=f, default_flow_style=False) + mlflow_model.add_flavor(FLAVOR_NAME, model_data=model_file, pytorch_version=torch.__version__) pyfunc.add_to_model(mlflow_model, loader_module="mlflow.pytorch", - data=model_file, env=conda_env) + data=model_file, env=conda_env_subpath) mlflow_model.save(os.path.join(path, "MLmodel")) def _load_model(path, **kwargs): - mlflow_model_path = os.path.join(path, "MLmodel") - if not os.path.exists(mlflow_model_path): - raise RuntimeError("MLmodel is not found at '{}'".format(path)) - - mlflow_model = Model.load(mlflow_model_path) - - if FLAVOR_NAME not in mlflow_model.flavors: - raise ValueError("Could not find flavor '{}' amongst available flavors {}, " - "unable to load stored model" - .format(FLAVOR_NAME, list(mlflow_model.flavors.keys()))) - - # This maybe replaced by a warning and then try/except torch.load - flavor = mlflow_model.flavors[FLAVOR_NAME] - if torch.__version__ != flavor["pytorch_version"]: - raise ValueError("Stored model version '{}' does not match " - "installed PyTorch version '{}'" - .format(flavor["pytorch_version"], torch.__version__)) - - path = os.path.abspath(path) - path = os.path.join(path, mlflow_model.flavors[FLAVOR_NAME]['model_data']) + """ + :param path: The path to a serialized PyTorch model. + :param kwargs: Additional kwargs to pass to the PyTorch ``torch.load`` function. + """ return torch.load(path, **kwargs) @@ -172,15 +180,23 @@ def load_model(path, run_id=None, **kwargs): """ if run_id is not None: path = mlflow.tracking.utils._get_model_log_dir(model_name=path, run_id=run_id) + path = os.path.abspath(path) + flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME) + + if torch.__version__ != flavor_conf["pytorch_version"]: + raise ValueError("Stored model version '{}' does not match " + "installed PyTorch version '{}'" + .format(flavor_conf["pytorch_version"], torch.__version__)) - return _load_model(path, **kwargs) + torch_model_artifacts_path = os.path.join(path, flavor_conf['model_data']) + return _load_model(path=torch_model_artifacts_path, **kwargs) def _load_pyfunc(path, **kwargs): """ Load PyFunc implementation. Called by ``pyfunc.load_pyfunc``. """ - return _PyTorchWrapper(_load_model(os.path.dirname(path), **kwargs)) + return _PyTorchWrapper(_load_model(path, **kwargs)) class _PyTorchWrapper(object): diff --git a/mlflow/sklearn.py b/mlflow/sklearn.py index 85eee07bd7648..8dd5ba718fd63 100644 --- a/mlflow/sklearn.py +++ b/mlflow/sklearn.py @@ -33,7 +33,7 @@ "scikit-learn={}".format(sklearn.__version__), ], additional_pip_deps=None, - additional_conda_channels=None + additional_conda_channels=None, ) SERIALIZATION_FORMAT_PICKLE = "pickle" diff --git a/mlflow/spark.py b/mlflow/spark.py index 9ab226c60767a..d9a852ddc1be5 100644 --- a/mlflow/spark.py +++ b/mlflow/spark.py @@ -23,6 +23,7 @@ import os import shutil +import yaml import pyspark from pyspark import SparkContext @@ -31,13 +32,23 @@ import mlflow from mlflow import pyfunc, mleap from mlflow.models import Model +from mlflow.utils.model_utils import _get_flavor_configuration from mlflow.utils.logging_utils import eprint +from mlflow.utils.environment import _mlflow_conda_env FLAVOR_NAME = "spark" # Default temporary directory on DFS. Used to write / read from Spark ML models. DFS_TMP = "/tmp/mlflow" +DEFAULT_CONDA_ENV = _mlflow_conda_env( + additional_conda_deps=[ + "pyspark={}".format(pyspark.__version__), + ], + additional_pip_deps=None, + additional_conda_channels=None, +) + def log_model(spark_model, artifact_path, conda_env=None, jars=None, dfs_tmpdir=None, sample_input=None): @@ -47,9 +58,10 @@ def log_model(spark_model, artifact_path, conda_env=None, jars=None, dfs_tmpdir= :param spark_model: PipelineModel to be saved. :param artifact_path: Run relative artifact path. - :param conda_env: Path to a Conda environment file. If provided, defines environment for the - model. At minimum, it should specify python, pyspark, and mlflow with - appropriate versions. + :param conda_env: Path to a conda environment file. if provided, this decribes the environment + this model should be run in. at minimum, it should specify the dependencies + contained in ``mlflow.pyspark.DEFAULT_CONDA_ENV``. if `none`, the default + ``mlflow.pyspark.DEFAULT_CONDA_ENV`` environment will be added to the model. :param jars: List of JARs needed by the model. :param dfs_tmpdir: Temporary directory path on Distributed (Hadoop) File System (DFS) or local filesystem if running in local mode. The model will be writen in this @@ -166,7 +178,10 @@ def save_model(spark_model, path, mlflow_model=Model(), conda_env=None, jars=Non :param spark_model: Spark PipelineModel to be saved. Can save only PipelineModels. :param path: Local path where the model is to be saved. :param mlflow_model: MLflow model config this flavor is being added to. - :param conda_env: Conda environment this model depends on. + :param conda_env: Path to a conda environment file. if provided, this decribes the environment + this model should be run in. at minimum, it should specify the dependencies + contained in ``mlflow.pyspark.DEFAULT_CONDA_ENV``. if `none`, the default + ``mlflow.pyspark.DEFAULT_CONDA_ENV`` environment will be added to the model. :param jars: List of JARs needed by the model. :param dfs_tmpdir: Temporary directory path on Distributed (Hadoop) File System (DFS) or local filesystem if running in local mode. The model will be written in this @@ -204,14 +219,18 @@ def save_model(spark_model, path, mlflow_model=Model(), conda_env=None, jars=Non sparkml_data_path = os.path.abspath(os.path.join(path, sparkml_data_path_sub)) _HadoopFileSystem.copy_to_local_file(tmp_path, sparkml_data_path, remove_src=True) pyspark_version = pyspark.version.__version__ - model_conda_env = None - if conda_env: - model_conda_env = os.path.basename(os.path.abspath(conda_env)) - shutil.copyfile(conda_env, os.path.join(path, model_conda_env)) + + conda_env_subpath = "conda.yaml" + if conda_env is not None: + shutil.copyfile(conda_env, os.path.join(path, conda_env_subpath)) + else: + with open(os.path.join(path, conda_env_subpath), "w") as f: + yaml.safe_dump(DEFAULT_CONDA_ENV, stream=f, default_flow_style=False) + mlflow_model.add_flavor(FLAVOR_NAME, pyspark_version=pyspark_version, model_data=sparkml_data_path_sub) pyfunc.add_to_model(mlflow_model, loader_module="mlflow.spark", data=sparkml_data_path_sub, - env=model_conda_env) + env=conda_env_subpath) mlflow_model.save(os.path.join(path, "MLmodel")) @@ -250,12 +269,10 @@ def load_model(path, run_id=None, dfs_tmpdir=None): """ if run_id is not None: path = mlflow.tracking.utils._get_model_log_dir(model_name=path, run_id=run_id) - m = Model.load(os.path.join(path, 'MLmodel')) - if FLAVOR_NAME not in m.flavors: - raise Exception("Model does not have {} flavor".format(FLAVOR_NAME)) - conf = m.flavors[FLAVOR_NAME] - model_path = os.path.join(path, conf['model_data']) - return _load_model(model_path=model_path, dfs_tmpdir=dfs_tmpdir) + path = os.path.abspath(path) + flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME) + spark_model_artifacts_path = os.path.join(path, flavor_conf['model_data']) + return _load_model(model_path=spark_model_artifacts_path, dfs_tmpdir=dfs_tmpdir) def _load_pyfunc(path): diff --git a/mlflow/tensorflow.py b/mlflow/tensorflow.py index 1bd535b79551a..42e8400d3028d 100644 --- a/mlflow/tensorflow.py +++ b/mlflow/tensorflow.py @@ -14,6 +14,7 @@ import os import shutil +import yaml import pandas import tensorflow as tf @@ -24,11 +25,21 @@ from mlflow.models import Model from mlflow.protos.databricks_pb2 import DIRECTORY_NOT_EMPTY from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils.environment import _mlflow_conda_env from mlflow.utils.file_utils import _copy_file_or_tree from mlflow.utils.logging_utils import eprint +from mlflow.utils.model_utils import _get_flavor_configuration FLAVOR_NAME = "tensorflow" +DEFAULT_CONDA_ENV = _mlflow_conda_env( + additional_conda_deps=[ + "tensorflow={}".format(tf.__version__), + ], + additional_pip_deps=None, + additional_conda_channels=None, +) + def log_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, artifact_path, conda_env=None): @@ -52,9 +63,11 @@ def log_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, arti `signature_def_map` parameter of the `tf.saved_model.builder.SavedModelBuilder` method. :param artifact_path: The run-relative path to which to log model artifacts. - :param conda_env: Path to a Conda environment file. If provided, defines an environment for the - model. At minimum, it should specify python, tensorflow, and mlflow with - appropriate versions. + :param conda_env: Path to a Conda environment file. If provided, this decribes the environment + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.tensorflow.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.tensorflow.DEFAULT_CONDA_ENV`` environment will be added to the + model. """ return Model.log(artifact_path=artifact_path, flavor=mlflow.tensorflow, tf_saved_model_dir=tf_saved_model_dir, tf_meta_graph_tags=tf_meta_graph_tags, @@ -84,9 +97,11 @@ def save_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, pat `tf.saved_model.builder.savedmodelbuilder` method. :param path: Local path where the MLflow model is to be saved. :param mlflow_model: MLflow model configuration to which this flavor will be added. - :param conda_env: Path to a Conda environment file. If provided, defines an environment for the - model. At minimum, it should specify python, tensorflow, and mlflow with - appropriate versions. + :param conda_env: Path to a Conda environment file. If provided, this decribes the environment + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.tensorflow.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.tensorflow.DEFAULT_CONDA_ENV`` environment will be added to the + model. """ eprint("Validating the specified Tensorflow model by attempting to load it in a new Tensorflow" " graph...") @@ -102,16 +117,17 @@ def save_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, pat model_dir_subpath = "tfmodel" shutil.move(os.path.join(path, root_relative_path), os.path.join(path, model_dir_subpath)) + conda_env_subpath = "conda.yaml" + if conda_env is not None: + shutil.copyfile(conda_env, os.path.join(path, conda_env_subpath)) + else: + with open(os.path.join(path, conda_env_subpath), "w") as f: + yaml.safe_dump(DEFAULT_CONDA_ENV, stream=f, default_flow_style=False) + mlflow_model.add_flavor(FLAVOR_NAME, saved_model_dir=model_dir_subpath, meta_graph_tags=tf_meta_graph_tags, signature_def_key=tf_signature_def_key) - - model_conda_env = None - if conda_env: - model_conda_env = os.path.basename(os.path.abspath(conda_env)) - _copy_file_or_tree(src=conda_env, dst=path) - - pyfunc.add_to_model(mlflow_model, loader_module="mlflow.tensorflow", env=model_conda_env) + pyfunc.add_to_model(mlflow_model, loader_module="mlflow.tensorflow", env=conda_env_subpath) mlflow_model.save(os.path.join(path, "MLmodel")) @@ -154,14 +170,12 @@ def load_model(path, tf_sess, run_id=None): """ if run_id is not None: path = _get_model_log_dir(model_name=path, run_id=run_id) - m = Model.load(os.path.join(path, 'MLmodel')) - if FLAVOR_NAME not in m.flavors: - raise Exception("Model does not have {} flavor".format(FLAVOR_NAME)) - conf = m.flavors[FLAVOR_NAME] - saved_model_dir = os.path.join(path, conf['saved_model_dir']) - return _load_model(tf_saved_model_dir=saved_model_dir, tf_sess=tf_sess, - tf_meta_graph_tags=conf['meta_graph_tags'], - tf_signature_def_key=conf['signature_def_key']) + path = os.path.abspath(path) + flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME) + tf_saved_model_dir = os.path.join(path, flavor_conf['saved_model_dir']) + return _load_model(tf_saved_model_dir=tf_saved_model_dir, tf_sess=tf_sess, + tf_meta_graph_tags=flavor_conf['meta_graph_tags'], + tf_signature_def_key=flavor_conf['signature_def_key']) def _load_model(tf_saved_model_dir, tf_sess, tf_meta_graph_tags, tf_signature_def_key): diff --git a/tests/pytorch/test_pytorch_model_export.py b/tests/pytorch/test_pytorch_model_export.py index e33afc42df5ac..2fa5a976eb027 100644 --- a/tests/pytorch/test_pytorch_model_export.py +++ b/tests/pytorch/test_pytorch_model_export.py @@ -1,19 +1,26 @@ from __future__ import print_function -import pytest +import os +import pytest import numpy as np import pandas as pd - +import pandas.testing import sklearn.datasets as datasets - import torch import torch.nn as nn +import yaml from torch.utils.data import DataLoader +import mlflow.pyfunc as pyfunc import mlflow.pytorch from mlflow import tracking +from mlflow.exceptions import MlflowException +from mlflow.utils.environment import _mlflow_conda_env from mlflow.utils.file_utils import TempDir +from mlflow.utils.model_utils import _get_flavor_configuration + +from tests.helper_functions import score_model_in_sagemaker_docker_container @pytest.fixture(scope='module') @@ -63,6 +70,21 @@ def model(data): return model +@pytest.fixture +def model_path(tmpdir): + return os.path.join(str(tmpdir), "model") + + +@pytest.fixture +def pytorch_custom_env(tmpdir): + conda_env = os.path.join(str(tmpdir), "conda_env.yml") + _mlflow_conda_env( + conda_env, + additional_conda_deps=["pytorch", "torchvision", "pytest"], + additional_conda_channels=["pytorch"]) + return conda_env + + def _predict(model, data): dataset = get_dataset(data) batch_size = 16 @@ -84,7 +106,6 @@ def predicted(model, data): def test_log_model(model, data, predicted): - old_uri = tracking.get_tracking_uri() # should_start_run tests whether or not calling log_model() automatically starts a run. for should_start_run in [False, True]: @@ -101,7 +122,7 @@ def test_log_model(model, data, predicted): model_loaded = mlflow.pytorch.load_model("pytorch", run_id=run_id) test_predictions = _predict(model_loaded, data) - assert np.all(test_predictions == predicted) + np.testing.assert_array_equal(test_predictions, predicted) finally: mlflow.end_run() tracking.set_tracking_uri(old_uri) @@ -110,7 +131,7 @@ def test_log_model(model, data, predicted): def test_raise_exception(model): with TempDir(chdr=True, remove_on_exit=True) as tmp: path = tmp.path("model") - with pytest.raises(RuntimeError): + with pytest.raises(MlflowException): mlflow.pytorch.load_model(path) with pytest.raises(TypeError): @@ -129,21 +150,88 @@ def test_raise_exception(model): pickle.dump(knn, f) path = tmp.path("knn") sklearn.save_model(knn, path=path) - with pytest.raises(ValueError): + with pytest.raises(MlflowException): mlflow.pytorch.load_model(path) -def test_save_and_load_model(model, data, predicted): - +def test_save_and_load_model(model, model_path, data, predicted): x, y = data - with TempDir(chdr=True, remove_on_exit=True) as tmp: - path = tmp.path("model") - mlflow.pytorch.save_model(model, path) - - # Loading pytorch model - model_loaded = mlflow.pytorch.load_model(path) - assert np.all(_predict(model_loaded, data) == predicted) - - # Loading pyfunc model - pyfunc_loaded = mlflow.pyfunc.load_pyfunc(path) - assert np.all(pyfunc_loaded.predict(x).values[:, 0] == predicted) + mlflow.pytorch.save_model(model, model_path) + + # Loading pytorch model + model_loaded = mlflow.pytorch.load_model(model_path) + np.testing.assert_array_equal(_predict(model_loaded, data), predicted) + + # Loading pyfunc model + pyfunc_loaded = mlflow.pyfunc.load_pyfunc(model_path) + np.testing.assert_array_almost_equal( + pyfunc_loaded.predict(x).values[:, 0], predicted, decimal=4) + + +def test_model_save_persists_specified_conda_env_in_mlflow_model_directory( + model, model_path, pytorch_custom_env): + mlflow.pytorch.save_model( + pytorch_model=model, path=model_path, conda_env=pytorch_custom_env) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != pytorch_custom_env + + with open(pytorch_custom_env, "r") as f: + pytorch_custom_env_text = f.read() + with open(saved_conda_env_path, "r") as f: + saved_conda_env_text = f.read() + assert saved_conda_env_text == pytorch_custom_env_text + + +def test_model_log_persists_specified_conda_env_in_mlflow_model_directory( + model, pytorch_custom_env): + artifact_path = "model" + with mlflow.start_run(): + mlflow.pytorch.log_model(pytorch_model=model, + artifact_path=artifact_path, + conda_env=pytorch_custom_env) + run_id = mlflow.active_run().info.run_uuid + model_path = tracking.utils._get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != pytorch_custom_env + + with open(pytorch_custom_env, "r") as f: + pytorch_custom_env_text = f.read() + with open(saved_conda_env_path, "r") as f: + saved_conda_env_text = f.read() + assert saved_conda_env_text == pytorch_custom_env_text + + +def test_model_save_without_specified_conda_env_uses_default_env_with_expected_dependencies( + model, model_path): + mlflow.pytorch.save_model(pytorch_model=model, path=model_path, conda_env=None) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.pytorch.DEFAULT_CONDA_ENV + + +def test_model_log_without_specified_conda_env_uses_default_env_with_expected_dependencies( + model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.pytorch.log_model(pytorch_model=model, + artifact_path=artifact_path, + conda_env=None) + run_id = mlflow.active_run().info.run_uuid + model_path = tracking.utils._get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.pytorch.DEFAULT_CONDA_ENV diff --git a/tests/sklearn/test_sklearn_model_export.py b/tests/sklearn/test_sklearn_model_export.py index 5d1b1fb8e84a0..6bb70739473e5 100644 --- a/tests/sklearn/test_sklearn_model_export.py +++ b/tests/sklearn/test_sklearn_model_export.py @@ -4,7 +4,6 @@ import os import pickle import pytest -import json import yaml from collections import namedtuple diff --git a/tests/spark/test_spark_model_export.py b/tests/spark/test_spark_model_export.py index e4cf4d7752f74..dd6321bed7837 100644 --- a/tests/spark/test_spark_model_export.py +++ b/tests/spark/test_spark_model_export.py @@ -8,7 +8,6 @@ from pyspark.ml.feature import VectorAssembler from pyspark.ml.pipeline import Pipeline from pyspark.ml.wrapper import JavaModel -from pyspark.ml.util import _jvm from pyspark.version import __version__ as pyspark_version from pyspark.sql import SQLContext from pyspark.sql.types import DateType @@ -16,6 +15,7 @@ from sklearn import datasets import shutil from collections import namedtuple +import yaml import mlflow import mlflow.pyfunc.scoring_server as pyfunc_scoring_server @@ -23,17 +23,21 @@ from mlflow import active_run, pyfunc, mleap from mlflow import spark as sparkm from mlflow.models import Model -from mlflow.utils.file_utils import TempDir +from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.file_utils import TempDir +from mlflow.utils.model_utils import _get_flavor_configuration from tests.helper_functions import score_model_in_sagemaker_docker_container from tests.pyfunc.test_spark import score_model_as_udf @pytest.fixture -def spark_conda_env(tmpdir): +def spark_custom_env(tmpdir): conda_env = os.path.join(str(tmpdir), "conda_env.yml") - _mlflow_conda_env(conda_env, additional_pip_deps=["pyspark=={}".format(pyspark_version)]) + _mlflow_conda_env( + conda_env, + additional_conda_deps=["pyspark", "pytest"]) return conda_env @@ -123,9 +127,9 @@ def test_hadoop_filesystem(tmpdir): assert not os.path.exists(FS._remote_path(remote).toString()) # skip file: prefix -def test_model_export(spark_model_iris, model_path, spark_conda_env): +def test_model_export(spark_model_iris, model_path, spark_custom_env): sparkm.save_model(spark_model_iris.model, path=model_path, - conda_env=spark_conda_env) + conda_env=spark_custom_env) # 1. score and compare reloaded sparkml model reloaded_model = sparkm.load_model(path=model_path) preds_df = reloaded_model.transform(spark_model_iris.spark_df) @@ -142,9 +146,9 @@ def test_model_export(spark_model_iris, model_path, spark_conda_env): @pytest.mark.large -def test_model_deployment(spark_model_iris, model_path, spark_conda_env): +def test_model_deployment(spark_model_iris, model_path, spark_custom_env): sparkm.save_model(spark_model_iris.model, path=model_path, - conda_env=spark_conda_env, + conda_env=spark_custom_env, # Test both spark ml and mleap sample_input=spark_model_iris.spark_df) @@ -202,13 +206,83 @@ def test_sparkml_model_log(tmpdir, spark_model_iris): shutil.rmtree(tracking_dir) +def test_sparkml_model_save_persists_specified_conda_env_in_mlflow_model_directory( + spark_model_iris, model_path, spark_custom_env): + sparkm.save_model(spark_model=spark_model_iris.model, + path=model_path, + conda_env=spark_custom_env) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != spark_custom_env + + with open(spark_custom_env, "r") as f: + spark_custom_env_parsed = yaml.safe_load(f) + with open(saved_conda_env_path, "r") as f: + saved_conda_env_parsed = yaml.safe_load(f) + assert saved_conda_env_parsed == spark_custom_env_parsed + + +def test_sparkml_model_log_persists_specified_conda_env_in_mlflow_model_directory( + spark_model_iris, model_path, spark_custom_env): + artifact_path = "model" + with mlflow.start_run(): + sparkm.log_model( + spark_model=spark_model_iris.model, + artifact_path=artifact_path, + conda_env=spark_custom_env) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != spark_custom_env + + with open(spark_custom_env, "r") as f: + spark_custom_env_parsed = yaml.safe_load(f) + with open(saved_conda_env_path, "r") as f: + saved_conda_env_parsed = yaml.safe_load(f) + assert saved_conda_env_parsed == spark_custom_env_parsed + + +def test_sparkml_model_save_without_specified_conda_env_uses_default_env_with_expected_dependencies( + spark_model_iris, model_path): + sparkm.save_model(spark_model=spark_model_iris.model, path=model_path, conda_env=None) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == sparkm.DEFAULT_CONDA_ENV + + +def test_sparkml_model_log_without_specified_conda_env_uses_default_env_with_expected_dependencies( + spark_model_iris): + artifact_path = "model" + with mlflow.start_run(): + sparkm.log_model( + spark_model=spark_model_iris.model, artifact_path=artifact_path, conda_env=None) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == sparkm.DEFAULT_CONDA_ENV + + def test_mleap_model_log(spark_model_iris): artifact_path = "model" sparkm.log_model(spark_model=spark_model_iris.model, sample_input=spark_model_iris.spark_df, artifact_path=artifact_path) rid = active_run().info.run_uuid - model_path = mlflow.tracking.utils._get_model_log_dir(model_name=artifact_path, run_id=rid) + model_path = _get_model_log_dir(model_name=artifact_path, run_id=rid) config_path = os.path.join(model_path, "MLmodel") mlflow_model = Model.load(config_path) assert sparkm.FLAVOR_NAME in mlflow_model.flavors diff --git a/tests/tensorflow/test_tensorflow_model_export.py b/tests/tensorflow/test_tensorflow_model_export.py index 14ecd8f7bfff8..f846397301588 100644 --- a/tests/tensorflow/test_tensorflow_model_export.py +++ b/tests/tensorflow/test_tensorflow_model_export.py @@ -6,6 +6,7 @@ import os import shutil import pytest +import yaml import numpy as np import pandas as pd @@ -17,9 +18,11 @@ import mlflow.tensorflow from mlflow.exceptions import MlflowException from mlflow import pyfunc -from mlflow.models import Model -from mlflow.utils.environment import _mlflow_conda_env from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.model_utils import _get_flavor_configuration +from tests.helper_functions import score_model_in_sagemaker_docker_container + SavedModelInfo = collections.namedtuple( "SavedModelInfo", ["path", "meta_graph_tags", "signature_def_key", "inference_df", "expected_results_df"]) @@ -139,9 +142,22 @@ def saved_tf_categorical_model(tmpdir): expected_results_df=estimator_preds_df) +@pytest.fixture +def tf_custom_env(tmpdir): + conda_env = os.path.join(str(tmpdir), "conda_env.yml") + _mlflow_conda_env( + conda_env, + additional_conda_deps=["tensorflow", "pytest"]) + return conda_env + + +@pytest.fixture +def model_path(tmpdir): + return os.path.join(str(tmpdir), "model") + + def test_save_and_load_model_persists_and_restores_model_in_default_graph_context_successfully( - tmpdir, saved_tf_iris_model): - model_path = os.path.join(str(tmpdir), "model") + saved_tf_iris_model, model_path): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, @@ -163,8 +179,7 @@ def test_save_and_load_model_persists_and_restores_model_in_default_graph_contex def test_save_and_load_model_persists_and_restores_model_in_custom_graph_context_successfully( - tmpdir, saved_tf_iris_model): - model_path = os.path.join(str(tmpdir), "model") + saved_tf_iris_model, model_path): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, @@ -185,8 +200,7 @@ def test_save_and_load_model_persists_and_restores_model_in_custom_graph_context assert t_output is not None -def test_iris_model_can_be_loaded_and_evaluated_successfully(tmpdir, saved_tf_iris_model): - model_path = os.path.join(str(tmpdir), "model") +def test_iris_model_can_be_loaded_and_evaluated_successfully(saved_tf_iris_model, model_path): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, @@ -233,9 +247,7 @@ def load_and_evaluate(tf_sess, tf_graph, tf_context): def test_save_model_with_invalid_path_signature_def_or_metagraph_tags_throws_exception( - tmpdir, saved_tf_iris_model): - model_path = os.path.join(str(tmpdir), "model") - + saved_tf_iris_model, model_path): with pytest.raises(IOError): mlflow.tensorflow.save_model(tf_saved_model_dir="not_a_valid_tf_model_dir", tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, @@ -261,8 +273,7 @@ def test_save_model_with_invalid_path_signature_def_or_metagraph_tags_throws_exc path=model_path) -def test_load_model_loads_artifacts_from_specified_model_directory(tmpdir, saved_tf_iris_model): - model_path = os.path.join(str(tmpdir), "model") +def test_load_model_loads_artifacts_from_specified_model_directory(saved_tf_iris_model, model_path): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, @@ -301,36 +312,87 @@ def test_log_and_load_model_persists_and_restores_model_successfully(saved_tf_ir assert t_output is not None -def test_log_model_persists_conda_environment(tmpdir, saved_tf_iris_model): - conda_env_path = os.path.join(str(tmpdir), "conda_env.yaml") - _mlflow_conda_env(path=conda_env_path, additional_conda_deps=["tensorflow"]) - with open(conda_env_path, "r") as f: - conda_env_text = f.read() +def test_save_model_persists_specified_conda_env_in_mlflow_model_directory( + saved_tf_iris_model, model_path, tf_custom_env): + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path, + conda_env=tf_custom_env) + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != tf_custom_env + + with open(tf_custom_env, "r") as f: + tf_custom_env_text = f.read() + with open(saved_conda_env_path, "r") as f: + saved_conda_env_text = f.read() + assert saved_conda_env_text == tf_custom_env_text + + +def test_log_model_persists_specified_conda_env_in_mlflow_model_directory( + saved_tf_iris_model, tf_custom_env): artifact_path = "model" with mlflow.start_run(): mlflow.tensorflow.log_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, artifact_path=artifact_path, - conda_env=conda_env_path) + conda_env=tf_custom_env) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != tf_custom_env + + with open(tf_custom_env, "r") as f: + tf_custom_env_text = f.read() + with open(saved_conda_env_path, "r") as f: + saved_conda_env_text = f.read() + assert saved_conda_env_text == tf_custom_env_text + + +def test_save_model_without_specified_conda_env_uses_default_env_with_expected_dependencies( + saved_tf_iris_model, model_path): + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path, + conda_env=None) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.tensorflow.DEFAULT_CONDA_ENV + + +def test_log_model_without_specified_conda_env_uses_default_env_with_expected_dependencies( + saved_tf_iris_model, model_path): + artifact_path = "model" + with mlflow.start_run(): + mlflow.tensorflow.log_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + artifact_path=artifact_path, + conda_env=None) run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) - model_dir = _get_model_log_dir(artifact_path, run_id) - model_config = Model.load(os.path.join(model_dir, "MLmodel")) - flavor_config = model_config.flavors.get(pyfunc.FLAVOR_NAME, None) - assert flavor_config is not None - pyfunc_env_subpath = flavor_config.get(pyfunc.ENV, None) - assert pyfunc_env_subpath is not None - with open(os.path.join(model_dir, pyfunc_env_subpath), "r") as f: - persisted_env_text = f.read() + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) - assert persisted_env_text == conda_env_text + assert conda_env == mlflow.tensorflow.DEFAULT_CONDA_ENV -def test_iris_data_model_can_be_loaded_and_evaluated_as_pyfunc(tmpdir, saved_tf_iris_model): - model_path = os.path.join(str(tmpdir), "model") +def test_iris_data_model_can_be_loaded_and_evaluated_as_pyfunc(saved_tf_iris_model, model_path): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, tf_signature_def_key=saved_tf_iris_model.signature_def_key, @@ -342,8 +404,7 @@ def test_iris_data_model_can_be_loaded_and_evaluated_as_pyfunc(tmpdir, saved_tf_ def test_categorical_model_can_be_loaded_and_evaluated_as_pyfunc( - tmpdir, saved_tf_categorical_model): - model_path = os.path.join(str(tmpdir), "model") + saved_tf_categorical_model, model_path): mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_categorical_model.path, tf_meta_graph_tags=saved_tf_categorical_model.meta_graph_tags, tf_signature_def_key=saved_tf_categorical_model.signature_def_key, From 3e81dc065520b01c5e3445eef771f4b259c01227 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Mon, 12 Nov 2018 16:37:44 -0800 Subject: [PATCH 053/483] [Default envs] Add default conda environments for H2O, Keras (#708) * Env changes * Test updates * Test tweaks * Test fix spark * testfix * Spark support * Model utils tests * Remove unused azml import * Lint fixes * Keras support * Lint * Remove unused function * Address comments * Address comments * Make yaml changes * Torch * Test fix * Test fixes * Tensorflow * Test fixes * Test fix * Lint fixes * Fix whitespace * Fix child process handling in scoring process tests * Sagemaker test fix * Fix sklearn model read * Tensorflow remove integration test * Revert whitespace changes to unrelated files * Comment update * pytorch param docs * Remove tensorflow, torch, spark, sklearn changes - these are part of a different PR * Keras file fix * Keras docs fix * Test fixes * Docs fix for version number --- mlflow/h2o.py | 60 +++++-- mlflow/keras.py | 59 +++++-- tests/h2o/test_h2o_model_export.py | 224 +++++++++++++++++++------ tests/keras/test_keras_model_export.py | 113 ++++++++++++- 4 files changed, 374 insertions(+), 82 deletions(-) diff --git a/mlflow/h2o.py b/mlflow/h2o.py index 59a7dc54efaa7..9028613d16634 100644 --- a/mlflow/h2o.py +++ b/mlflow/h2o.py @@ -11,11 +11,26 @@ from __future__ import absolute_import import os +import shutil import yaml +import h2o + from mlflow import pyfunc from mlflow.models import Model import mlflow.tracking +from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.model_utils import _get_flavor_configuration + +FLAVOR_NAME = "h2o" + +DEFAULT_CONDA_ENV = _mlflow_conda_env( + additional_conda_deps=None, + additional_pip_deps=[ + "h2o=={}".format(h2o.__version__), + ], + additional_conda_channels=None, +) def save_model(h2o_model, path, conda_env=None, mlflow_model=Model(), settings=None): @@ -24,18 +39,21 @@ def save_model(h2o_model, path, conda_env=None, mlflow_model=Model(), settings=N :param h2o_model: H2O model to be saved. :param path: Local path where the model is to be saved. + :param conda_env: Path to a Conda environment file. If provided, this decribes the environment + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.h2o.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.h2o.DEFAULT_CONDA_ENV`` environment will be added to the model. :param mlflow_model: :py:mod:`mlflow.models.Model` this flavor is being added to. """ - import h2o - path = os.path.abspath(path) if os.path.exists(path): raise Exception("Path '{}' already exists".format(path)) - model_dir = os.path.join(path, "model.h2o") - os.makedirs(model_dir) + model_data_subpath = "model.h2o" + model_data_path = os.path.join(path, model_data_subpath) + os.makedirs(model_data_path) # Save h2o-model - h2o_save_location = h2o.save_model(model=h2o_model, path=model_dir, force=True) + h2o_save_location = h2o.save_model(model=h2o_model, path=model_data_path, force=True) model_file = os.path.basename(h2o_save_location) # Save h2o-settings @@ -43,30 +61,40 @@ def save_model(h2o_model, path, conda_env=None, mlflow_model=Model(), settings=N settings = {} settings['full_file'] = h2o_save_location settings['model_file'] = model_file - settings['model_dir'] = model_dir - with open(os.path.join(model_dir, "h2o.yaml"), 'w') as settings_file: + settings['model_dir'] = model_data_path + with open(os.path.join(model_data_path, "h2o.yaml"), 'w') as settings_file: yaml.safe_dump(settings, stream=settings_file) + conda_env_subpath = "conda.yaml" + if conda_env: + shutil.copyfile(conda_env, os.path.join(path, conda_env_subpath)) + else: + with open(os.path.join(path, conda_env_subpath), "w") as f: + yaml.safe_dump(DEFAULT_CONDA_ENV, stream=f, default_flow_style=False) + pyfunc.add_to_model(mlflow_model, loader_module="mlflow.h2o", - data="model.h2o", env=conda_env) - mlflow_model.add_flavor("h2o", saved_model=model_file, h2o_version=h2o.__version__) + data=model_data_subpath, env=conda_env_subpath) + mlflow_model.add_flavor(FLAVOR_NAME, h2o_version=h2o.__version__, data=model_data_subpath) mlflow_model.save(os.path.join(path, "MLmodel")) -def log_model(h2o_model, artifact_path, **kwargs): +def log_model(h2o_model, artifact_path, conda_env=None, **kwargs): """ Log an H2O model as an MLflow artifact for the current run. :param h2o_model: H2O model to be saved. :param artifact_path: Run-relative artifact path. + :param conda_env: Path to a Conda environment file. If provided, this decribes the environment + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.h2o.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.h2o.DEFAULT_CONDA_ENV`` environment will be added to the model. :param kwargs: kwargs to pass to ``h2o.save_model`` method. """ Model.log(artifact_path=artifact_path, flavor=mlflow.h2o, - h2o_model=h2o_model, **kwargs) + h2o_model=h2o_model, conda_env=conda_env, **kwargs) def _load_model(path, init=False): - import h2o path = os.path.abspath(path) with open(os.path.join(path, "h2o.yaml")) as f: params = yaml.safe_load(f.read()) @@ -81,7 +109,6 @@ def __init__(self, h2o_model): self.h2o_model = h2o_model def predict(self, dataframe): - import h2o predicted = self.h2o_model.predict(h2o.H2OFrame(dataframe)).as_data_frame() predicted.index = dataframe.index return predicted @@ -105,4 +132,9 @@ def load_model(path, run_id=None): """ if run_id is not None: path = mlflow.tracking.utils._get_model_log_dir(model_name=path, run_id=run_id) - return _load_model(os.path.join(path, "model.h2o")) + path = os.path.abspath(path) + flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME) + # Flavor configurations for models saved in MLflow version <= 0.8.0 may not contain a + # `data` key; in this case, we assume the model artifact path to be `model.h2o` + h2o_model_file_path = os.path.join(path, flavor_conf.get("data", "model.h2o")) + return _load_model(path=h2o_model_file_path) diff --git a/mlflow/keras.py b/mlflow/keras.py index 43f355e9cf07a..ec52155a41a21 100644 --- a/mlflow/keras.py +++ b/mlflow/keras.py @@ -11,13 +11,32 @@ from __future__ import absolute_import import os +import shutil +import yaml +import keras import keras.backend as K import pandas as pd from mlflow import pyfunc from mlflow.models import Model import mlflow.tracking +from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.model_utils import _get_flavor_configuration + +FLAVOR_NAME = "keras" + +DEFAULT_CONDA_ENV = _mlflow_conda_env( + additional_conda_deps=[ + "keras={}".format(keras.__version__), + # The Keras pyfunc representation requires the Tensorflow + # backend for Keras. Therefore, the conda environment must + # include Tensorflow + "tensorflow", + ], + additional_pip_deps=None, + additional_conda_channels=None, +) def save_model(keras_model, path, conda_env=None, mlflow_model=Model()): @@ -26,6 +45,10 @@ def save_model(keras_model, path, conda_env=None, mlflow_model=Model()): :param keras_model: Keras model to be saved. :param path: Local path where the model is to be saved. + :param conda_env: Path to a Conda environment file. If provided, this decribes the environment + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.keras.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.keras.DEFAULT_CONDA_ENV`` environment will be added to the model. :param mlflow_model: MLflow model config this flavor is being added to. >>> import mlflow @@ -38,27 +61,36 @@ def save_model(keras_model, path, conda_env=None, mlflow_model=Model()): ... # Save the model as an MLflow Model >>> mlflow.keras.save_model(keras_model, keras_model_path) """ - import keras - path = os.path.abspath(path) if os.path.exists(path): raise Exception("Path '{}' already exists".format(path)) os.makedirs(path) - model_file = os.path.join(path, "model.h5") - keras_model.save(model_file) + model_data_subpath = "model.h5" + keras_model.save(os.path.join(path, model_data_subpath)) + + conda_env_subpath = "conda.yaml" + if conda_env is not None: + shutil.copyfile(conda_env, os.path.join(path, conda_env_subpath)) + else: + with open(os.path.join(path, conda_env_subpath), "w") as f: + yaml.safe_dump(DEFAULT_CONDA_ENV, stream=f, default_flow_style=False) pyfunc.add_to_model(mlflow_model, loader_module="mlflow.keras", - data="model.h5", env=conda_env) - mlflow_model.add_flavor("keras", keras_version=keras.__version__) + data=model_data_subpath, env=conda_env_subpath) + mlflow_model.add_flavor(FLAVOR_NAME, keras_version=keras.__version__, data=model_data_subpath) mlflow_model.save(os.path.join(path, "MLmodel")) -def log_model(keras_model, artifact_path, **kwargs): +def log_model(keras_model, artifact_path, conda_env=None, **kwargs): """ Log a Keras model as an MLflow artifact for the current run. :param keras_model: Keras model to be saved. :param artifact_path: Run-relative artifact path. + :param conda_env: Path to a Conda environment file. If provided, this decribes the environment + this model should be run in. At minimum, it should specify the dependencies + contained in ``mlflow.keras.DEFAULT_CONDA_ENV``. If `None`, the default + ``mlflow.keras.DEFAULT_CONDA_ENV`` environment will be added to the model. :param kwargs: kwargs to pass to ``keras_model.save`` method. >>> from keras import Dense, layers @@ -73,7 +105,7 @@ def log_model(keras_model, artifact_path, **kwargs): >>> mlflow.keras.log_model(keras_model, "models") """ Model.log(artifact_path=artifact_path, flavor=mlflow.keras, - keras_model=keras_model, **kwargs) + keras_model=keras_model, conda_env=conda_env, **kwargs) def _load_model(model_file): @@ -81,8 +113,8 @@ def _load_model(model_file): import h5py # NOTE: Keras 2.2.3 does not work with unicode paths in python2. Pass in h5py.File instead of # string to avoid issues. - model_file = h5py.File(os.path.abspath(model_file),) - return keras.models.load_model(model_file) + with h5py.File(os.path.abspath(model_file), "r") as model_file: + return keras.models.load_model(model_file) class _KerasModelWrapper: @@ -133,4 +165,9 @@ def load_model(path, run_id=None): """ if run_id is not None: path = mlflow.tracking.utils._get_model_log_dir(model_name=path, run_id=run_id) - return _load_model(os.path.join(path, "model.h5")) + path = os.path.abspath(path) + flavor_conf = _get_flavor_configuration(model_path=path, flavor_name=FLAVOR_NAME) + # Flavor configurations for models saved in MLflow version <= 0.8.0 may not contain a + # `data` key; in this case, we assume the model artifact path to be `model.h5` + keras_model_artifacts_path = os.path.join(path, flavor_conf.get("data", "model.h5")) + return _load_model(model_file=keras_model_artifacts_path) diff --git a/tests/h2o/test_h2o_model_export.py b/tests/h2o/test_h2o_model_export.py index 05b121740c32c..4341c9606d6a9 100644 --- a/tests/h2o/test_h2o_model_export.py +++ b/tests/h2o/test_h2o_model_export.py @@ -2,66 +2,188 @@ from __future__ import print_function -import collections import os -import pandas -import shutil -import unittest +import pytest +import yaml +import pandas as pd +import pandas.testing +from collections import namedtuple import sklearn.datasets as datasets import h2o from h2o.estimators.gbm import H2OGradientBoostingEstimator -import tempfile import mlflow.h2o import mlflow from mlflow import pyfunc +from mlflow.models import Model +from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils.environment import _mlflow_conda_env from mlflow.utils.file_utils import TempDir +from mlflow.utils.model_utils import _get_flavor_configuration +from tests.helper_functions import pyfunc_serve_and_score_model +from tests.helper_functions import score_model_in_sagemaker_docker_container -class TestModelExport(unittest.TestCase): - def setUp(self): - h2o.init() - iris = datasets.load_iris() - data = h2o.H2OFrame({ - 'feature1': list(iris.data[:, 0]), - 'feature2': list(iris.data[:, 1]), - 'target': list(map(lambda i: "Flower %d" % i, iris.target)) - }) - train, self.test = data.split_frame(ratios=[.7]) - - self.gbm = H2OGradientBoostingEstimator(ntrees=10, max_depth=6) - self.gbm.train(['feature1', 'feature2'], 'target', training_frame=train) - self.predicted = self.gbm.predict(self.test).as_data_frame() - - def test_model_save_load(self): - with TempDir(chdr=True, remove_on_exit=True) as tmp: - path = tmp.path("model") - mlflow.h2o.save_model(self.gbm, path) - - # Loading h2o model - gbm_loaded = mlflow.h2o.load_model(path) - assert all(gbm_loaded.predict(self.test).as_data_frame() == self.predicted) - - # Loading pyfunc model - pyfunc_loaded = mlflow.pyfunc.load_pyfunc(path) - assert all(pyfunc_loaded.predict(self.test.as_data_frame()) == self.predicted) - - def test_model_log(self): - old_uri = mlflow.get_tracking_uri() - # should_start_run tests whether or not calling log_model() automatically starts a run. - for should_start_run in [False, True]: - with TempDir(chdr=True, remove_on_exit=True) as tmp: - try: - mlflow.set_tracking_uri("test") - if should_start_run: - mlflow.start_run() - mlflow.h2o.log_model(self.gbm, artifact_path="gbm") - - # Load model - gbm_loaded = mlflow.h2o.load_model("gbm", - run_id=mlflow.active_run().info.run_uuid) - assert all(gbm_loaded.predict(self.test).as_data_frame() == self.predicted) - finally: - mlflow.end_run() - mlflow.set_tracking_uri(old_uri) + +ModelWithData = namedtuple("ModelWithData", ["model", "inference_data"]) + + +@pytest.fixture +def h2o_iris_model(): + h2o.init() + iris = datasets.load_iris() + data = h2o.H2OFrame({ + 'feature1': list(iris.data[:, 0]), + 'feature2': list(iris.data[:, 1]), + 'target': list(map(lambda i: "Flower %d" % i, iris.target)) + }) + train, test = data.split_frame(ratios=[.7]) + + h2o_gbm = H2OGradientBoostingEstimator(ntrees=10, max_depth=6) + h2o_gbm.train(['feature1', 'feature2'], 'target', training_frame=train) + return ModelWithData(model=h2o_gbm, inference_data=test) + + +@pytest.fixture +def model_path(tmpdir): + return os.path.join(str(tmpdir), "model") + + +@pytest.fixture +def h2o_custom_env(tmpdir): + conda_env = os.path.join(str(tmpdir), "conda_env.yml") + _mlflow_conda_env( + conda_env, + additional_conda_deps=["pytest"], + additional_pip_deps=["h2o"]) + return conda_env + + +def test_model_save_load(h2o_iris_model, model_path): + h2o_model = h2o_iris_model.model + mlflow.h2o.save_model(h2o_model=h2o_model, path=model_path) + + # Loading h2o model + h2o_model_loaded = mlflow.h2o.load_model(model_path) + assert all( + h2o_model_loaded.predict(h2o_iris_model.inference_data).as_data_frame() == + h2o_model.predict(h2o_iris_model.inference_data).as_data_frame()) + + # Loading pyfunc model + pyfunc_loaded = mlflow.pyfunc.load_pyfunc(model_path) + assert all( + pyfunc_loaded.predict(h2o_iris_model.inference_data.as_data_frame()) == + h2o_model.predict(h2o_iris_model.inference_data).as_data_frame()) + + +def test_model_log(h2o_iris_model): + h2o_model = h2o_iris_model.model + old_uri = mlflow.get_tracking_uri() + # should_start_run tests whether or not calling log_model() automatically starts a run. + for should_start_run in [False, True]: + with TempDir(chdr=True, remove_on_exit=True): + try: + artifact_path = "gbm_model" + mlflow.set_tracking_uri("test") + if should_start_run: + mlflow.start_run() + mlflow.h2o.log_model(h2o_model=h2o_model, artifact_path=artifact_path) + + # Load model + h2o_model_loaded = mlflow.h2o.load_model( + path=artifact_path, run_id=mlflow.active_run().info.run_uuid) + assert all( + h2o_model_loaded.predict(h2o_iris_model.inference_data).as_data_frame() == + h2o_model.predict(h2o_iris_model.inference_data).as_data_frame()) + finally: + mlflow.end_run() + mlflow.set_tracking_uri(old_uri) + + +def test_model_load_succeeds_with_missing_data_key_when_data_exists_at_default_path( + h2o_iris_model, model_path): + """ + This is a backwards compatibility test to ensure that models saved in MLflow version <= 0.7.0 + can be loaded successfully. These models are missing the `data` flavor configuration key. + """ + h2o_model = h2o_iris_model.model + mlflow.h2o.save_model(h2o_model=h2o_model, path=model_path) + + model_conf_path = os.path.join(model_path, "MLmodel") + model_conf = Model.load(model_conf_path) + flavor_conf = model_conf.flavors.get(mlflow.h2o.FLAVOR_NAME, None) + assert flavor_conf is not None + del flavor_conf['data'] + model_conf.save(model_conf_path) + + h2o_model_loaded = mlflow.h2o.load_model(model_path) + assert all( + h2o_model_loaded.predict(h2o_iris_model.inference_data).as_data_frame() == + h2o_model.predict(h2o_iris_model.inference_data).as_data_frame()) + + +def test_model_save_persists_specified_conda_env_in_mlflow_model_directory( + h2o_iris_model, model_path, h2o_custom_env): + mlflow.h2o.save_model(h2o_model=h2o_iris_model.model, path=model_path, conda_env=h2o_custom_env) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != h2o_custom_env + + with open(h2o_custom_env, "r") as f: + h2o_custom_env_text = f.read() + with open(saved_conda_env_path, "r") as f: + saved_conda_env_text = f.read() + assert saved_conda_env_text == h2o_custom_env_text + + +def test_model_log_persists_specified_conda_env_in_mlflow_model_directory( + h2o_iris_model, h2o_custom_env): + artifact_path = "model" + with mlflow.start_run(): + mlflow.h2o.log_model(h2o_model=h2o_iris_model.model, + artifact_path=artifact_path, + conda_env=h2o_custom_env) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != h2o_custom_env + + with open(h2o_custom_env, "r") as f: + h2o_custom_env_text = f.read() + with open(saved_conda_env_path, "r") as f: + saved_conda_env_text = f.read() + assert saved_conda_env_text == h2o_custom_env_text + + +def test_model_save_without_specified_conda_env_uses_default_env_with_expected_dependencies( + h2o_iris_model, model_path): + mlflow.h2o.save_model(h2o_model=h2o_iris_model.model, path=model_path, conda_env=None) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.h2o.DEFAULT_CONDA_ENV + + +def test_model_log_without_specified_conda_env_uses_default_env_with_expected_dependencies( + h2o_iris_model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.h2o.log_model(h2o_model=h2o_iris_model.model, artifact_path=artifact_path) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.h2o.DEFAULT_CONDA_ENV diff --git a/tests/keras/test_keras_model_export.py b/tests/keras/test_keras_model_export.py index cb21cb03e6366..47549b8eeff01 100644 --- a/tests/keras/test_keras_model_export.py +++ b/tests/keras/test_keras_model_export.py @@ -9,12 +9,18 @@ import sklearn.datasets as datasets import pandas as pd import numpy as np +import yaml import mlflow import mlflow.keras import mlflow.pyfunc.scoring_server as pyfunc_scoring_server from mlflow import pyfunc +from mlflow.models import Model +from mlflow.tracking.utils import _get_model_log_dir +from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.model_utils import _get_flavor_configuration from tests.helper_functions import pyfunc_serve_and_score_model +from tests.helper_functions import score_model_in_sagemaker_docker_container from tests.projects.utils import tracking_uri_mock # pylint: disable=unused-import @@ -44,22 +50,35 @@ def predicted(model, data): return model.predict(data[0]) -def test_model_save_load(tmpdir, model, data, predicted): +@pytest.fixture +def model_path(tmpdir): + return os.path.join(tmpdir.strpath, "model") + + +@pytest.fixture +def keras_custom_env(tmpdir): + conda_env = os.path.join(str(tmpdir), "conda_env.yml") + _mlflow_conda_env( + conda_env, + additional_conda_deps=["keras", "tensorflow", "pytest"]) + return conda_env + + +def test_model_save_load(model, model_path, data, predicted): x, y = data - path = os.path.join(tmpdir.strpath, "model") - mlflow.keras.save_model(model, path) + mlflow.keras.save_model(model, model_path) # Loading Keras model - model_loaded = mlflow.keras.load_model(path) + model_loaded = mlflow.keras.load_model(model_path) assert all(model_loaded.predict(x) == predicted) # Loading pyfunc model - pyfunc_loaded = mlflow.pyfunc.load_pyfunc(path) + pyfunc_loaded = mlflow.pyfunc.load_pyfunc(model_path) assert all(pyfunc_loaded.predict(x).values == predicted) # pyfunc serve scoring_response = pyfunc_serve_and_score_model( - model_path=os.path.abspath(path), + model_path=os.path.abspath(model_path), data=pd.DataFrame(x), content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED) assert all(pd.read_json(scoring_response.content, orient="records").values.astype(np.float32) @@ -88,3 +107,85 @@ def test_model_log(tracking_uri_mock, model, data, predicted): # pylint: disabl assert all(pyfunc_loaded.predict(x).values == predicted) finally: mlflow.end_run() + + +def test_model_save_persists_specified_conda_env_in_mlflow_model_directory( + model, model_path, keras_custom_env): + mlflow.keras.save_model(keras_model=model, path=model_path, conda_env=keras_custom_env) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != keras_custom_env + + with open(keras_custom_env, "r") as f: + keras_custom_env_parsed = yaml.safe_load(f) + with open(saved_conda_env_path, "r") as f: + saved_conda_env_parsed = yaml.safe_load(f) + assert saved_conda_env_parsed == keras_custom_env_parsed + + +def test_model_log_persists_specified_conda_env_in_mlflow_model_directory(model, keras_custom_env): + artifact_path = "model" + with mlflow.start_run(): + mlflow.keras.log_model( + keras_model=model, artifact_path=artifact_path, conda_env=keras_custom_env) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + assert os.path.exists(saved_conda_env_path) + assert saved_conda_env_path != keras_custom_env + + with open(keras_custom_env, "r") as f: + keras_custom_env_parsed = yaml.safe_load(f) + with open(saved_conda_env_path, "r") as f: + saved_conda_env_parsed = yaml.safe_load(f) + assert saved_conda_env_parsed == keras_custom_env_parsed + + +def test_model_save_without_specified_conda_env_uses_default_env_with_expected_dependencies( + model, model_path): + mlflow.keras.save_model(keras_model=model, path=model_path, conda_env=None) + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.keras.DEFAULT_CONDA_ENV + + +def test_model_log_without_specified_conda_env_uses_default_env_with_expected_dependencies( + model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.keras.log_model(keras_model=model, artifact_path=artifact_path, conda_env=None) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) + conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) + with open(conda_env_path, "r") as f: + conda_env = yaml.safe_load(f) + + assert conda_env == mlflow.keras.DEFAULT_CONDA_ENV + + +def test_model_load_succeeds_with_missing_data_key_when_data_exists_at_default_path( + model, model_path, data, predicted): + """ + This is a backwards compatibility test to ensure that models saved in MLflow version <= 0.8.0 + can be loaded successfully. These models are missing the `data` flavor configuration key. + """ + mlflow.keras.save_model(keras_model=model, path=model_path) + + model_conf_path = os.path.join(model_path, "MLmodel") + model_conf = Model.load(model_conf_path) + flavor_conf = model_conf.flavors.get(mlflow.keras.FLAVOR_NAME, None) + assert flavor_conf is not None + del flavor_conf['data'] + model_conf.save(model_conf_path) + + model_loaded = mlflow.keras.load_model(model_path) + assert all(model_loaded.predict(data[0]) == predicted) From 99a5e574cd73b8c8676c0f71780de194a212dbae Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Mon, 12 Nov 2018 17:43:03 -0800 Subject: [PATCH 054/483] Mark MLflow as beta (#711) --- README.rst | 8 ++++---- docs/source/index.rst | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index dcda54f0cfa20..94724d0c8e0e6 100644 --- a/README.rst +++ b/README.rst @@ -1,8 +1,8 @@ -==================== -MLflow Alpha Release -==================== +=================== +MLflow Beta Release +=================== -**Note:** The current version of MLflow is an alpha release. This means that APIs and data formats +**Note:** The current version of MLflow is a beta release. This means that APIs and data formats are subject to change! **Note 2:** We do not currently support running MLflow on Windows. Despite this, we would appreciate any contributions diff --git a/docs/source/index.rst b/docs/source/index.rst index 007fe138c7d15..080158131f861 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -34,5 +34,5 @@ Get started using the :ref:`quickstart` or by reading about the :ref:`key concep .. warning:: - The current version of MLflow is an alpha release. This means that APIs and storage formats + The current version of MLflow is a beta release. This means that APIs and storage formats are subject to breaking change. From fcd58ef6fe65cbc3e2afa07adc82acb768d3c580 Mon Sep 17 00:00:00 2001 From: Stephanie Bodoff Date: Tue, 13 Nov 2018 15:19:20 -0800 Subject: [PATCH 055/483] Consistent model headings, fix formatting, fix rubric style, add local toc (#714) --- docs/source/models.rst | 50 ++++++++++++++----------- docs/source/quickstart.rst | 2 +- docs/source/tutorial.rst | 2 +- docs/theme/mlflow/static/css/custom.css | 3 +- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/docs/source/models.rst b/docs/source/models.rst index 86664cf759064..db322e59e4415 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -247,34 +247,41 @@ MLflow provides tools for deploying models on a local machine and to several pro Not all deployment methods are available for all model flavors. Deployment is supported for the Python Function format and all compatible formats. +.. contents:: + :local: + :depth: 1 + .. _pyfunc_deployment: Deploy a ``python_function`` model as a local REST API endpoint -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MLflow can deploy models locally as local REST API endpoints or to directly score CSV files. This functionality is a convenient way of testing models before deploying to a remote model server. You deploy the Python Function flavor locally using the CLI interface to the :py:mod:`mlflow.pyfunc` module. The local REST API server accepts the following data formats as inputs: - * JSON-serialized Pandas DataFrames in the ``split`` orientation. For example, + * JSON-serialized pandas DataFrames in the ``split`` orientation. For example, ``data = pandas_df.to_json(orient='split')``. This format is specified using a ``Content-Type`` request header value of ``application/json; format=pandas-split``. Starting in MLflow 0.9.0, this will be the default format if ``Content-Type`` is ``application/json`` (i.e, with no format specification). - * JSON-serialized Pandas DataFrames in the ``records`` orientation. *We do not recommend using + * JSON-serialized pandas DataFrames in the ``records`` orientation. *We do not recommend using this format because it is not guaranteed to preserve column ordering.* Currently, this format is specified using a ``Content-Type`` request header value of ``application/json; format=pandas-records`` or ``application/json``. Starting in MLflow 0.9.0, ``application/json`` will refer to the ``split`` format instead. For forwards compatibility, we recommend using the ``split`` format or specifying the ``application/json; format=pandas-records`` content type. - * CSV-serialized Pandas DataFrames. For example, ``data = pandas_df.to_csv()``. This format is + * CSV-serialized pandas DataFrames. For example, ``data = pandas_df.to_csv()``. This format is specified using a ``Content-Type`` request header value of ``text/csv``. -For more information about serializing Pandas DataFrames, see -https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html +For more information about serializing pandas DataFrames, see +`pandas.DataFrame.to_json `_. + +Commands +~~~~~~~~ * :py:func:`serve ` deploys the model as a local REST API server. * :py:func:`predict ` uses the model to generate a prediction for a local @@ -290,25 +297,21 @@ For more info, see: .. _azureml_deployment: -Microsoft Azure ML -^^^^^^^^^^^^^^^^^^ +Deploy a ``python_function`` model on Microsoft Azure ML +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + The :py:mod:`mlflow.azureml` module can package ``python_function`` models into Azure ML container images. These images can be deployed to Azure Kubernetes Service (AKS) and the Azure Container Instances (ACI) -platform for real-time serving. The resulting Azure ML ContainerImage will contain a webserver that +platform for real-time serving. The resulting Azure ML ContainerImage contains a web server that accepts the following data formats as input: - * JSON-serialized Pandas DataFrames in the ``split`` orientation. For example, - ``data = pandas_df.to_json(orient='split')``. This format is specified using a ``Content-Type`` - request header value of ``application/json``. + * JSON-serialized pandas DataFrames in the ``split`` orientation. For example, ``data = pandas_df.to_json(orient='split')``. This format is specified using a ``Content-Type`` request header value of ``application/json``. -* :py:func:`build_image ` registers an MLflow model with an existing Azure ML - workspace and builds an Azure ML container image for deployment to AKS and ACI. The `Azure ML SDK`_ is - required in order to use this function. *The Azure ML SDK requires Python 3. It cannot be installed with - earlier versions of Python.* + * :py:func:`build_image ` registers an MLflow model with an existing Azure ML workspace and builds an Azure ML container image for deployment to AKS and ACI. The `Azure ML SDK`_ is required in order to use this function. *The Azure ML SDK requires Python 3. It cannot be installed with earlier versions of Python.* .. _Azure ML SDK: https://docs.microsoft.com/en-us/python/api/overview/azure/ml/intro?view=azure-ml-py -.. rubric:: Deployment example (Python API): +.. rubric:: Example workflow using the Python API .. code:: python @@ -354,7 +357,7 @@ accepts the following data formats as input: import requests import json - # `sample_input` is a JSON-serialized Pandas DatFrame with the `split` orientation + # `sample_input` is a JSON-serialized pandas DataFrame with the `split` orientation sample_input = { "columns": [ "alcohol", @@ -379,7 +382,7 @@ accepts the following data formats as input: response_json = json.loads(response.text) print(response_json) -.. rubric:: Deployment example (CLI): +.. rubric:: Example workflow using the MLflow CLI .. code:: bash @@ -394,7 +397,7 @@ accepts the following data formats as input: scoring_uri=$(az ml service show --name -v | jq -r ".scoringUri") - # `sample_input` is a JSON-serialized Pandas DatFrame with the `split` orientation + # `sample_input` is a JSON-serialized pandas DataFrame with the `split` orientation sample_input=' { "columns": [ @@ -441,15 +444,18 @@ MLflow includes the utility function ``build_and_push_container`` to perform thi container for all MLflow models. Model webservers deployed using the :py:mod:`mlflow.sagemaker` module accept the following data formats as input, depending on the deployment flavor: - * ``python_function``: For this deployment flavor, The endpoint accepts the same formats + * ``python_function``: For this deployment flavor, the endpoint accepts the same formats as the pyfunc server. These formats are described in the :ref:`pyfunc deployment documentation `. * ``mleap``: For this deployment flavor, the endpoint accepts `only` - JSON-serialized Pandas DataFrames in the ``split`` orientation. For example, + JSON-serialized pandas DataFrames in the ``split`` orientation. For example, ``data = pandas_df.to_json(orient='split')``. This format is specified using a ``Content-Type`` request header value of ``application/json``. +Commands +~~~~~~~~ + * :py:func:`run-local ` deploys the model locally in a Docker container. The image and the environment should be identical to how the model would be run remotely and it is therefore useful for testing the model prior to deployment. diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 58c210be09cc7..e04308f43f541 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -167,7 +167,7 @@ simple REST server for python-based models: Once you have started the server, you can pass it some sample data and see the predictions. -The following example uses ``curl`` to send a JSON-serialized Pandas DataFrame with the ``split`` +The following example uses ``curl`` to send a JSON-serialized pandas DataFrame with the ``split`` orientation to the pyfunc server. For more information about the input data formats accepted by the pyfunc model server, see the :ref:`MLflow deployment tools documentation `. diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index bdf45f3fc9280..357abe7fcc744 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -377,7 +377,7 @@ in MLflow saved the model as an artifact within the run. or ``raise ValueError, "unsupported pickle protocol: %d"``. Once you have deployed the server, you can pass it some sample data and see the - predictions. The following example uses ``curl`` to send a JSON-serialized Pandas DataFrame + predictions. The following example uses ``curl`` to send a JSON-serialized pandas DataFrame with the ``split`` orientation to the pyfunc server. For more information about the input data formats accepted by the pyfunc model server, see the :ref:`MLflow deployment tools documentation `. diff --git a/docs/theme/mlflow/static/css/custom.css b/docs/theme/mlflow/static/css/custom.css index 2ba66acbfd413..e6ada0a59d966 100644 --- a/docs/theme/mlflow/static/css/custom.css +++ b/docs/theme/mlflow/static/css/custom.css @@ -174,7 +174,7 @@ b, strong, mark, .rst-content dl:not(.docutils) code.descname, .rst-content dl:not(.docutils) .optional, .rst-content p.rubric { - font-weight: 500; + font-weight: 600; } @@ -1099,4 +1099,3 @@ text-transform: capitalize; .plain-section ul.section-selector li.selected:hover { background-color: #333; } - From 4a17a430a3bf7ce62475465e138d2e3b9d1ba97e Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Tue, 13 Nov 2018 16:05:16 -0800 Subject: [PATCH 056/483] [Default envs] Add docker/sagemaker integration tests with default conda env for each flavor (#710) * Env changes * Test updates * Test tweaks * Test fix spark * testfix * Spark support * Model utils tests * Remove unused azml import * Lint fixes * Keras support * Lint * Remove unused function * Address comments * Address comments * Make yaml changes * Torch * Test fix * Test fixes * Tensorflow * Test fixes * Test fix * Lint fixes * Fix whitespace * Fix child process handling in scoring process tests * Sagemaker test fix * Fix sklearn model read * Sklearn integration test * Tensorflow test * pytorch * Pytorch fixes * Add h2o test * Keras * Keras file fix * Release tag * Default timeout * Test fix * reduce pytorch test time * Fix pyspark test --- conftest.py | 4 +++ tests/h2o/test_h2o_model_export.py | 22 ++++++++++++++++ tests/helper_functions.py | 23 ++++++++++++----- tests/keras/test_keras_model_export.py | 19 ++++++++++++++ tests/pytorch/test_pytorch_model_export.py | 20 +++++++++++++++ tests/sklearn/test_sklearn_model_export.py | 21 ++++++++++++++++ tests/spark/test_spark_model_export.py | 18 +++++++++++++ .../test_tensorflow_model_export.py | 25 ++++++++++++++++++- 8 files changed, 145 insertions(+), 7 deletions(-) diff --git a/conftest.py b/conftest.py index 5bc6553730f9d..63c9bb04141bb 100644 --- a/conftest.py +++ b/conftest.py @@ -1,6 +1,8 @@ def pytest_addoption(parser): parser.addoption('--large', action='store_true', dest="large", default=False, help="Run tests decorated with 'large' annotation") + parser.addoption('--release', action='store_true', dest="release", + default=False, help="Run tests decorated with 'release' annotation") parser.addoption("--requires-ssh", action='store_true', dest="requires_ssh", default=False, help="Run tests decorated with 'requires_ssh' annotation. " "These tests require keys to be configured locally " @@ -13,6 +15,8 @@ def pytest_configure(config): markexpr = [] if not config.option.large: markexpr.append('not large') + if not config.option.release: + markexpr.append('not release') if not config.option.requires_ssh: markexpr.append('not requires_ssh') if len(markexpr) > 0: diff --git a/tests/h2o/test_h2o_model_export.py b/tests/h2o/test_h2o_model_export.py index 4341c9606d6a9..78bed683f3593 100644 --- a/tests/h2o/test_h2o_model_export.py +++ b/tests/h2o/test_h2o_model_export.py @@ -5,6 +5,7 @@ import os import pytest import yaml +import json import pandas as pd import pandas.testing from collections import namedtuple @@ -15,6 +16,7 @@ import mlflow.h2o import mlflow +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server from mlflow import pyfunc from mlflow.models import Model from mlflow.tracking.utils import _get_model_log_dir @@ -187,3 +189,23 @@ def test_model_log_without_specified_conda_env_uses_default_env_with_expected_de conda_env = yaml.safe_load(f) assert conda_env == mlflow.h2o.DEFAULT_CONDA_ENV + + +@pytest.mark.release +def test_sagemaker_docker_model_scoring_with_default_conda_env(h2o_iris_model, model_path): + mlflow.h2o.save_model(h2o_model=h2o_iris_model.model, path=model_path, conda_env=None) + reloaded_h2o_pyfunc = mlflow.pyfunc.load_pyfunc(model_path) + + scoring_response = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=h2o_iris_model.inference_data.as_data_frame(), + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON, + flavor=mlflow.pyfunc.FLAVOR_NAME) + deployed_model_preds = pd.DataFrame(json.loads(scoring_response.content)) + + pandas.testing.assert_frame_equal( + deployed_model_preds["predict"].to_frame(), + reloaded_h2o_pyfunc.predict( + h2o_iris_model.inference_data.as_data_frame())["predict"].to_frame(), + check_dtype=False, + check_less_precise=6) diff --git a/tests/helper_functions.py b/tests/helper_functions.py index 418cc62d97eba..c90e228f1784b 100644 --- a/tests/helper_functions.py +++ b/tests/helper_functions.py @@ -26,7 +26,8 @@ def random_file(ext): def score_model_in_sagemaker_docker_container( - model_path, data, content_type, flavor=mlflow.pyfunc.FLAVOR_NAME): + model_path, data, content_type, flavor=mlflow.pyfunc.FLAVOR_NAME, + activity_polling_timeout_seconds=500): """ :param model_path: Path to the model to be served. :param data: The data to send to the docker container for testing. This is either a @@ -34,22 +35,27 @@ def score_model_in_sagemaker_docker_container( :param content_type: The type of the data to send to the docker container for testing. This is one of `mlflow.pyfunc.scoring_server.CONTENT_TYPES`. :param flavor: Model flavor to be deployed. + :param activity_polling_timeout_seconds: The amount of time, in seconds, to wait before + declaring the scoring process to have failed. """ env = dict(os.environ) env.update(LC_ALL="en_US.UTF-8", LANG="en_US.UTF-8") proc = _start_scoring_proc( cmd=['mlflow', 'sagemaker', 'run-local', '-m', model_path, '-p', "5000", "-f", flavor], env=env) - return _evaluate_scoring_proc(proc, 5000, data, content_type) + return _evaluate_scoring_proc(proc, 5000, data, content_type, activity_polling_timeout_seconds) -def pyfunc_serve_and_score_model(model_path, data, content_type): +def pyfunc_serve_and_score_model( + model_path, data, content_type, activity_polling_timeout_seconds=500): """ :param model_path: Path to the model to be served. :param data: The data to send to the pyfunc server for testing. This is either a Pandas dataframe or string of the format specified by `content_type`. :param content_type: The type of the data to send to the pyfunc server for testing. This is one of `mlflow.pyfunc.scoring_server.CONTENT_TYPES`. + :param activity_polling_timeout_seconds: The amount of time, in seconds, to wait before + declaring the scoring process to have failed. """ env = dict(os.environ) env.update(LC_ALL="en_US.UTF-8", LANG="en_US.UTF-8") @@ -60,7 +66,8 @@ def pyfunc_serve_and_score_model(model_path, data, content_type): print(x) m = re.match(pattern=".*Running on http://127.0.0.1:(\\d+).*", string=x) if m: - return _evaluate_scoring_proc(proc, int(m.group(1)), data, content_type=content_type) + return _evaluate_scoring_proc( + proc, int(m.group(1)), data, content_type, activity_polling_timeout_seconds) raise Exception("Failed to start server") @@ -78,9 +85,13 @@ def _start_scoring_proc(cmd, env): return proc -def _evaluate_scoring_proc(proc, port, data, content_type): +def _evaluate_scoring_proc(proc, port, data, content_type, activity_polling_timeout_seconds=250): + """ + :param activity_polling_timeout_seconds: The amount of time, in seconds, to wait before + declaring the scoring process to have failed. + """ try: - for i in range(0, 50): + for i in range(0, int(activity_polling_timeout_seconds / 5)): assert proc.poll() is None, "scoring process died" time.sleep(5) # noinspection PyBroadException diff --git a/tests/keras/test_keras_model_export.py b/tests/keras/test_keras_model_export.py index 47549b8eeff01..bd03de7f6c7f8 100644 --- a/tests/keras/test_keras_model_export.py +++ b/tests/keras/test_keras_model_export.py @@ -3,6 +3,7 @@ from __future__ import print_function import os +import json import pytest from keras.models import Sequential from keras.layers import Dense @@ -189,3 +190,21 @@ def test_model_load_succeeds_with_missing_data_key_when_data_exists_at_default_p model_loaded = mlflow.keras.load_model(model_path) assert all(model_loaded.predict(data[0]) == predicted) + + +@pytest.mark.release +def test_sagemaker_docker_model_scoring_with_default_conda_env(model, model_path, data, predicted): + mlflow.keras.save_model(keras_model=model, path=model_path, conda_env=None) + + scoring_response = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=data[0], + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED, + flavor=mlflow.pyfunc.FLAVOR_NAME, + activity_polling_timeout_seconds=500) + deployed_model_preds = pd.DataFrame(json.loads(scoring_response.content)) + + np.testing.assert_array_almost_equal( + deployed_model_preds.values, + predicted, + decimal=4) diff --git a/tests/pytorch/test_pytorch_model_export.py b/tests/pytorch/test_pytorch_model_export.py index 2fa5a976eb027..b96eaa2d3c42f 100644 --- a/tests/pytorch/test_pytorch_model_export.py +++ b/tests/pytorch/test_pytorch_model_export.py @@ -1,6 +1,7 @@ from __future__ import print_function import os +import json import pytest import numpy as np @@ -14,6 +15,7 @@ import mlflow.pyfunc as pyfunc import mlflow.pytorch +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server from mlflow import tracking from mlflow.exceptions import MlflowException from mlflow.utils.environment import _mlflow_conda_env @@ -235,3 +237,21 @@ def test_model_log_without_specified_conda_env_uses_default_env_with_expected_de conda_env = yaml.safe_load(f) assert conda_env == mlflow.pytorch.DEFAULT_CONDA_ENV + + +@pytest.mark.release +def test_sagemaker_docker_model_scoring_with_default_conda_env(model, model_path, data, predicted): + mlflow.pytorch.save_model(pytorch_model=model, path=model_path, conda_env=None) + + scoring_response = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=data[0], + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED, + flavor=mlflow.pyfunc.FLAVOR_NAME, + activity_polling_timeout_seconds=360) + deployed_model_preds = pd.DataFrame(json.loads(scoring_response.content)) + + np.testing.assert_array_almost_equal( + deployed_model_preds.values[:, 0], + predicted, + decimal=4) diff --git a/tests/sklearn/test_sklearn_model_export.py b/tests/sklearn/test_sklearn_model_export.py index 6bb70739473e5..b04762a82a16e 100644 --- a/tests/sklearn/test_sklearn_model_export.py +++ b/tests/sklearn/test_sklearn_model_export.py @@ -19,6 +19,7 @@ import mlflow.sklearn import mlflow.utils +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server from mlflow import pyfunc from mlflow.exceptions import MlflowException from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE @@ -245,3 +246,23 @@ def test_model_log_without_specified_conda_env_uses_default_env_with_expected_de conda_env = yaml.safe_load(f) assert conda_env == mlflow.sklearn.DEFAULT_CONDA_ENV + + +@pytest.mark.release +def test_sagemaker_docker_model_scoring_with_default_conda_env(sklearn_knn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path, conda_env=None) + reloaded_knn_pyfunc = pyfunc.load_pyfunc(path=model_path) + + inference_df = pd.DataFrame(sklearn_knn_model.inference_data) + scoring_response = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=inference_df, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED, + flavor=mlflow.pyfunc.FLAVOR_NAME) + deployed_model_preds = pd.DataFrame(json.loads(scoring_response.content)) + + pandas.testing.assert_frame_equal( + deployed_model_preds, + pd.DataFrame(reloaded_knn_pyfunc.predict(inference_df)), + check_dtype=False, + check_less_precise=6) diff --git a/tests/spark/test_spark_model_export.py b/tests/spark/test_spark_model_export.py index dd6321bed7837..2d204f21e8c99 100644 --- a/tests/spark/test_spark_model_export.py +++ b/tests/spark/test_spark_model_export.py @@ -3,6 +3,7 @@ import json import numpy as np import pandas as pd +import pandas.testing import pyspark from pyspark.ml.classification import LogisticRegression from pyspark.ml.feature import VectorAssembler @@ -174,6 +175,23 @@ def test_model_deployment(spark_model_iris, model_path, spark_custom_env): decimal=4) +@pytest.mark.release +def test_sagemaker_docker_model_scoring_with_default_conda_env(spark_model_iris, model_path): + sparkm.save_model(spark_model_iris.model, path=model_path, conda_env=None) + + scoring_response = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=spark_model_iris.pandas_df, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON, + flavor=mlflow.pyfunc.FLAVOR_NAME) + deployed_model_preds = json.loads(scoring_response.content) + + np.testing.assert_array_almost_equal( + deployed_model_preds, + spark_model_iris.predictions, + decimal=4) + + def test_sparkml_model_log(tmpdir, spark_model_iris): # Print the coefficients and intercept for multinomial logistic regression old_tracking_uri = mlflow.get_tracking_uri() diff --git a/tests/tensorflow/test_tensorflow_model_export.py b/tests/tensorflow/test_tensorflow_model_export.py index f846397301588..869d851c6b34b 100644 --- a/tests/tensorflow/test_tensorflow_model_export.py +++ b/tests/tensorflow/test_tensorflow_model_export.py @@ -7,6 +7,7 @@ import shutil import pytest import yaml +import json import numpy as np import pandas as pd @@ -16,6 +17,7 @@ import mlflow import mlflow.tensorflow +import mlflow.pyfunc.scoring_server as pyfunc_scoring_server from mlflow.exceptions import MlflowException from mlflow import pyfunc from mlflow.tracking.utils import _get_model_log_dir @@ -319,7 +321,6 @@ def test_save_model_persists_specified_conda_env_in_mlflow_model_directory( tf_signature_def_key=saved_tf_iris_model.signature_def_key, path=model_path, conda_env=tf_custom_env) - pyfunc_conf = _get_flavor_configuration(model_path=model_path, flavor_name=pyfunc.FLAVOR_NAME) saved_conda_env_path = os.path.join(model_path, pyfunc_conf[pyfunc.ENV]) assert os.path.exists(saved_conda_env_path) @@ -414,3 +415,25 @@ def test_categorical_model_can_be_loaded_and_evaluated_as_pyfunc( results_df = pyfunc_wrapper.predict(saved_tf_categorical_model.inference_df) pandas.testing.assert_frame_equal( results_df, saved_tf_categorical_model.expected_results_df, check_less_precise=6) + + +@pytest.mark.release +def test_model_deployment_with_default_conda_env(saved_tf_iris_model, model_path): + mlflow.tensorflow.save_model(tf_saved_model_dir=saved_tf_iris_model.path, + tf_meta_graph_tags=saved_tf_iris_model.meta_graph_tags, + tf_signature_def_key=saved_tf_iris_model.signature_def_key, + path=model_path, + conda_env=None) + + scoring_response = score_model_in_sagemaker_docker_container( + model_path=model_path, + data=saved_tf_iris_model.inference_df, + content_type=pyfunc_scoring_server.CONTENT_TYPE_JSON_SPLIT_ORIENTED, + flavor=mlflow.pyfunc.FLAVOR_NAME) + deployed_model_preds = pd.DataFrame(json.loads(scoring_response.content)) + + pandas.testing.assert_frame_equal( + deployed_model_preds, + saved_tf_iris_model.expected_results_df, + check_dtype=False, + check_less_precise=6) From f8ae3d699c75a20735725dd61fc60be39cd9f110 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Fri, 16 Nov 2018 15:33:45 -0800 Subject: [PATCH 057/483] Fix sklearn log default format w/ tests (#721) --- mlflow/sklearn.py | 2 +- tests/sklearn/test_sklearn_model_export.py | 24 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/mlflow/sklearn.py b/mlflow/sklearn.py index 8dd5ba718fd63..3c32efcd341e8 100644 --- a/mlflow/sklearn.py +++ b/mlflow/sklearn.py @@ -115,7 +115,7 @@ def save_model(sk_model, path, conda_env=None, mlflow_model=Model(), def log_model(sk_model, artifact_path, conda_env=None, - serialization_format=SERIALIZATION_FORMAT_PICKLE): + serialization_format=SERIALIZATION_FORMAT_CLOUDPICKLE): """ Log a scikit-learn model as an MLflow artifact for the current run. diff --git a/tests/sklearn/test_sklearn_model_export.py b/tests/sklearn/test_sklearn_model_export.py index b04762a82a16e..bf19c837bdb10 100644 --- a/tests/sklearn/test_sklearn_model_export.py +++ b/tests/sklearn/test_sklearn_model_export.py @@ -5,6 +5,7 @@ import pickle import pytest import yaml +import json from collections import namedtuple import numpy as np @@ -248,6 +249,29 @@ def test_model_log_without_specified_conda_env_uses_default_env_with_expected_de assert conda_env == mlflow.sklearn.DEFAULT_CONDA_ENV +def test_model_save_uses_cloudpickle_serialization_format_by_default(sklearn_knn_model, model_path): + mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path, conda_env=None) + + sklearn_conf = _get_flavor_configuration( + model_path=model_path, flavor_name=mlflow.sklearn.FLAVOR_NAME) + assert "serialization_format" in sklearn_conf + assert sklearn_conf["serialization_format"] == mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE + + +def test_model_log_uses_cloudpickle_serialization_format_by_default(sklearn_knn_model): + artifact_path = "model" + with mlflow.start_run(): + mlflow.sklearn.log_model( + sk_model=sklearn_knn_model.model, artifact_path=artifact_path, conda_env=None) + run_id = mlflow.active_run().info.run_uuid + model_path = _get_model_log_dir(artifact_path, run_id) + + sklearn_conf = _get_flavor_configuration( + model_path=model_path, flavor_name=mlflow.sklearn.FLAVOR_NAME) + assert "serialization_format" in sklearn_conf + assert sklearn_conf["serialization_format"] == mlflow.sklearn.SERIALIZATION_FORMAT_CLOUDPICKLE + + @pytest.mark.release def test_sagemaker_docker_model_scoring_with_default_conda_env(sklearn_knn_model, model_path): mlflow.sklearn.save_model(sk_model=sklearn_knn_model.model, path=model_path, conda_env=None) From 28627903b22c8d365295d6057be392ab7b03a6a2 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Tue, 20 Nov 2018 14:22:54 -0800 Subject: [PATCH 058/483] Replace instances of eprint with python logger calls (#723) --- mlflow/__init__.py | 3 ++ mlflow/azureml/__init__.py | 22 +++++---- mlflow/cli.py | 7 ++- mlflow/projects/__init__.py | 33 +++++++------ mlflow/projects/databricks.py | 21 +++++--- mlflow/projects/submitted_run.py | 12 +++-- mlflow/pyfunc/__init__.py | 22 +++++---- mlflow/pyfunc/cli.py | 10 ++-- mlflow/pyfunc/scoring_server.py | 22 +++++---- mlflow/rfunc/cli.py | 7 ++- mlflow/sagemaker/__init__.py | 67 ++++++++++++-------------- mlflow/sagemaker/container/__init__.py | 1 - mlflow/spark.py | 9 ++-- mlflow/store/cli.py | 10 ++-- mlflow/tensorflow.py | 12 +++-- mlflow/tracking/fluent.py | 14 ++++-- mlflow/utils/databricks_utils.py | 11 +++-- mlflow/utils/logging_utils.py | 37 ++++++++++++++ mlflow/utils/rest_utils.py | 12 +++-- tests/__init__.py | 3 ++ tests/projects/test_projects_cli.py | 10 ++-- 21 files changed, 220 insertions(+), 125 deletions(-) diff --git a/mlflow/__init__.py b/mlflow/__init__.py index 1238d29cbffcb..fbff2164ceccb 100644 --- a/mlflow/__init__.py +++ b/mlflow/__init__.py @@ -40,6 +40,9 @@ import mlflow.projects as projects # noqa import mlflow.tracking as tracking # noqa import mlflow.tracking.fluent +from mlflow.utils.logging_utils import _configure_mlflow_loggers + +_configure_mlflow_loggers(root_module_name=__name__) ActiveRun = mlflow.tracking.fluent.ActiveRun log_param = mlflow.tracking.fluent.log_param diff --git a/mlflow/azureml/__init__.py b/mlflow/azureml/__init__.py index 9f7f995832662..a5de022d0803d 100644 --- a/mlflow/azureml/__init__.py +++ b/mlflow/azureml/__init__.py @@ -8,6 +8,7 @@ import os import shutil import tempfile +import logging from distutils.version import StrictVersion @@ -18,11 +19,13 @@ from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils import PYTHON_VERSION, get_unique_resource_id -from mlflow.utils.logging_utils import eprint from mlflow.utils.file_utils import TempDir, _copy_file_or_tree, _copy_project from mlflow.version import VERSION as mlflow_version +_logger = logging.getLogger(__name__) + + def build_image(model_path, workspace, run_id=None, image_name=None, model_name=None, mlflow_home=None, description=None, tags=None, synchronous=True): """ @@ -140,9 +143,8 @@ def build_image(model_path, workspace, run_id=None, image_name=None, model_name= registered_model = AzureModel.register(workspace=workspace, model_path=tmp_model_path, model_name=model_name, tags=tags, description=description) - eprint("Registered an Azure Model with name: `{model_name}` and version:" - " `{model_version}`".format(model_name=registered_model.name, - model_version=registered_model.version)) + _logger.info("Registered an Azure Model with name: `%s` and version: `%s`", + registered_model.name, registered_model.version) # Create an execution script (entry point) for the image's model server. Azure ML requires # the container's execution script to be located in the current working directory during @@ -160,8 +162,10 @@ def build_image(model_path, workspace, run_id=None, image_name=None, model_name= execution_script_path = os.path.basename(execution_script_path) if mlflow_home is not None: - eprint("Copying the specified mlflow_home directory: `{mlflow_home}` to a temporary" - " location for container creation".format(mlflow_home=mlflow_home)) + _logger.info( + "Copying the specified mlflow_home directory: `%s` to a temporary location for" + " container creation", + mlflow_home) mlflow_home = os.path.join(tmp.path(), _copy_project(src_path=mlflow_home, dst_path=tmp.path())) image_file_dependencies = [mlflow_home] @@ -187,10 +191,8 @@ def build_image(model_path, workspace, run_id=None, image_name=None, model_name= name=image_name, image_config=image_configuration, models=[registered_model]) - eprint("Building an Azure Container Image with name: `{image_name}` and version:" - " `{image_version}`".format( - image_name=image.name, - image_version=image.version)) + _logger.info("Building an Azure Container Image with name: `%s` and version: `%s`", + image.name, image.version) if synchronous: image.wait_for_creation(show_output=True) return image, registered_model diff --git a/mlflow/cli.py b/mlflow/cli.py index 2f34d89dc2170..cd8aad65609ae 100644 --- a/mlflow/cli.py +++ b/mlflow/cli.py @@ -3,6 +3,7 @@ import json import os import sys +import logging import click from click import UsageError @@ -17,13 +18,15 @@ from mlflow.entities.experiment import Experiment from mlflow.utils.process import ShellCommandException -from mlflow.utils.logging_utils import eprint from mlflow.utils import cli_args from mlflow.server import _run_server from mlflow import tracking import mlflow.store.cli +_logger = logging.getLogger(__name__) + + @click.group() @click.version_option() def cli(): @@ -121,7 +124,7 @@ def run(uri, entry_point, version, param_list, experiment_id, mode, cluster_spec run_id=run_id, ) except projects.ExecutionException as e: - eprint("=== %s ===" % e) + _logger.error("=== %s ===", e) sys.exit(1) diff --git a/mlflow/projects/__init__.py b/mlflow/projects/__init__.py index f8703a3a22b86..b5bd17d7c2cd8 100644 --- a/mlflow/projects/__init__.py +++ b/mlflow/projects/__init__.py @@ -11,19 +11,18 @@ import re import subprocess import tempfile +import logging +import mlflow.tracking as tracking +import mlflow.tracking.fluent as fluent from mlflow.projects.submitted_run import LocalSubmittedRun, SubmittedRun from mlflow.projects import _project_spec from mlflow.exceptions import ExecutionException from mlflow.entities import RunStatus, SourceType, Param -import mlflow.tracking as tracking from mlflow.tracking.fluent import _get_experiment_id, _get_git_commit -import mlflow.tracking.fluent as fluent - import mlflow.projects.databricks from mlflow.utils import process -from mlflow.utils.logging_utils import eprint from mlflow.utils.mlflow_tags import MLFLOW_GIT_BRANCH_NAME # TODO: this should be restricted to just Git repos and not S3 and stuff like that @@ -33,6 +32,9 @@ MLFLOW_CONDA_HOME = "MLFLOW_CONDA_HOME" +_logger = logging.getLogger(__name__) + + def _run(uri, entry_point="main", version=None, parameters=None, experiment_id=None, mode=None, cluster_spec=None, git_username=None, git_password=None, use_conda=True, storage_dir=None, block=True, run_id=None): @@ -145,8 +147,9 @@ def run(uri, entry_point="main", version=None, parameters=None, experiment_id=No try: cluster_spec_dict = json.load(handle) except ValueError: - eprint("Error when attempting to load and parse JSON cluster spec from file " - "%s. " % cluster_spec) + _logger.error( + "Error when attempting to load and parse JSON cluster spec from file %s", + cluster_spec) raise submitted_run_obj = _run( uri=uri, entry_point=entry_point, version=version, parameters=parameters, @@ -167,13 +170,13 @@ def _wait_for(submitted_run_obj): try: active_run = tracking.MlflowClient().get_run(run_id) if run_id is not None else None if submitted_run_obj.wait(): - eprint("=== Run (ID '%s') succeeded ===" % run_id) + _logger.info("=== Run (ID '%s') succeeded ===", run_id) _maybe_set_run_terminated(active_run, "FINISHED") else: _maybe_set_run_terminated(active_run, "FAILED") raise ExecutionException("Run (ID '%s') failed" % run_id) except KeyboardInterrupt: - eprint("=== Run (ID '%s') interrupted, cancelling run ===" % run_id) + _logger.error("=== Run (ID '%s') interrupted, cancelling run ===", run_id) submitted_run_obj.cancel() _maybe_set_run_terminated(active_run, "FAILED") raise @@ -236,7 +239,7 @@ def _fetch_project(uri, force_tempdir, version=None, git_username=None, git_pass use_temp_dst_dir = force_tempdir or not _is_local_uri(parsed_uri) dst_dir = tempfile.mkdtemp() if use_temp_dst_dir else parsed_uri if use_temp_dst_dir: - eprint("=== Fetching project from %s into %s ===" % (uri, dst_dir)) + _logger.info("=== Fetching project from %s into %s ===", uri, dst_dir) if _is_local_uri(uri): if version is not None: raise ExecutionException("Setting a version is only supported for Git project URIs") @@ -326,7 +329,7 @@ def _get_or_create_conda_env(conda_env_path): env_names = [os.path.basename(env) for env in json.loads(stdout)['envs']] project_env_name = _get_conda_env_name(conda_env_path) if project_env_name not in env_names: - eprint('=== Creating conda environment %s ===' % project_env_name) + _logger.info('=== Creating conda environment %s ===', project_env_name) if conda_env_path: process.exec_cmd([conda_path, "env", "create", "-n", project_env_name, "--file", conda_env_path], stream_output=True) @@ -362,8 +365,10 @@ def _get_entry_point_command(project, entry_point, parameters, conda_env_name, s arguments of type 'path'. If None, a temporary base directory is used. """ storage_dir_for_run = _get_storage_dir(storage_dir) - eprint("=== Created directory %s for downloading remote URIs passed to arguments of " - "type 'path' ===" % storage_dir_for_run) + _logger.info( + "=== Created directory %s for downloading remote URIs passed to arguments of" + " type 'path' ===", + storage_dir_for_run) commands = [] if conda_env_name: activate_path = _get_conda_bin_executable("activate") @@ -383,7 +388,7 @@ def _run_entry_point(command, work_dir, experiment_id, run_id): """ env = os.environ.copy() env.update(_get_run_env_vars(run_id, experiment_id)) - eprint("=== Running command '%s' in run with ID '%s' === " % (command, run_id)) + _logger.info("=== Running command '%s' in run with ID '%s' === ", command, run_id) process = subprocess.Popen(["bash", "-c", command], close_fds=True, cwd=work_dir, env=env) return LocalSubmittedRun(run_id, process) @@ -460,7 +465,7 @@ def _invoke_mlflow_run_subprocess( Run an MLflow project asynchronously by invoking ``mlflow run`` in a subprocess, returning a SubmittedRun that can be used to query run status. """ - eprint("=== Asynchronously launching MLflow run with ID %s ===" % run_id) + _logger.info("=== Asynchronously launching MLflow run with ID %s ===", run_id) mlflow_run_arr = _build_mlflow_run_cmd( uri=work_dir, entry_point=entry_point, storage_dir=storage_dir, use_conda=use_conda, run_id=run_id, parameters=parameters) diff --git a/mlflow/projects/databricks.py b/mlflow/projects/databricks.py index cb997fa9bdcb5..38528a0ab2efe 100644 --- a/mlflow/projects/databricks.py +++ b/mlflow/projects/databricks.py @@ -5,6 +5,7 @@ import tempfile import textwrap import time +import logging from six.moves import shlex_quote @@ -13,7 +14,6 @@ from mlflow.projects.submitted_run import SubmittedRun from mlflow.utils import rest_utils, file_utils, databricks_utils from mlflow.exceptions import ExecutionException -from mlflow.utils.logging_utils import eprint from mlflow import tracking from mlflow.utils.mlflow_tags import MLFLOW_DATABRICKS_RUN_URL, MLFLOW_DATABRICKS_SHELL_JOB_ID, \ MLFLOW_DATABRICKS_SHELL_JOB_RUN_ID, MLFLOW_DATABRICKS_WEBAPP_URL @@ -32,6 +32,9 @@ DBFS_EXPERIMENT_DIR_BASE = "mlflow-experiments" +_logger = logging.getLogger(__name__) + + def before_run_validations(tracking_uri, cluster_spec): """Validations to perform before running a project on Databricks.""" if cluster_spec is None: @@ -70,7 +73,7 @@ def _upload_to_dbfs(self, src_path, dbfs_fuse_uri): Upload the file at `src_path` to the specified DBFS URI within the Databricks workspace corresponding to the default Databricks CLI profile. """ - eprint("=== Uploading project to DBFS path %s ===" % dbfs_fuse_uri) + _logger.info("=== Uploading project to DBFS path %s ===", dbfs_fuse_uri) http_endpoint = dbfs_fuse_uri with open(src_path, 'rb') as f: self._databricks_api_request(endpoint=http_endpoint, method='POST', data=f) @@ -125,9 +128,9 @@ def custom_filter(x): dbfs_fuse_uri = os.path.join("/dbfs", dbfs_path) if not self._dbfs_path_exists(dbfs_path): self._upload_to_dbfs(temp_tar_filename, dbfs_fuse_uri) - eprint("=== Finished uploading project to %s ===" % dbfs_fuse_uri) + _logger.info("=== Finished uploading project to %s ===", dbfs_fuse_uri) else: - eprint("=== Project already exists in DBFS ===") + _logger.info("=== Project already exists in DBFS ===") finally: shutil.rmtree(temp_tarfile_dir) return dbfs_fuse_uri @@ -171,7 +174,7 @@ def run_databricks(self, uri, entry_point, work_dir, parameters, experiment_id, tracking._TRACKING_URI_ENV_VAR: tracking_uri, tracking._EXPERIMENT_ID_ENV_VAR: experiment_id, } - eprint("=== Running entry point %s of project %s on Databricks ===" % (entry_point, uri)) + _logger.info("=== Running entry point %s of project %s on Databricks ===", entry_point, uri) # Launch run on Databricks command = _get_databricks_run_cmd(dbfs_fuse_uri, run_id, entry_point, parameters) return self._run_shell_command_job(uri, command, env_vars, cluster_spec) @@ -290,11 +293,13 @@ def __init__(self, databricks_run_id, mlflow_run_id, databricks_job_runner): self._job_runner = databricks_job_runner def _print_description_and_log_tags(self): - eprint("=== Launched MLflow run as Databricks job run with ID %s. Getting run status " - "page URL... ===" % self._databricks_run_id) + _logger.info( + "=== Launched MLflow run as Databricks job run with ID %s." + " Getting run status page URL... ===", + self._databricks_run_id) run_info = self._job_runner.jobs_runs_get(self._databricks_run_id) jobs_page_url = run_info["run_page_url"] - eprint("=== Check the run's status at %s ===" % jobs_page_url) + _logger.info("=== Check the run's status at %s ===", jobs_page_url) host_creds = databricks_utils.get_databricks_host_creds(self._job_runner.databricks_profile) tracking.MlflowClient().set_tag(self._mlflow_run_id, MLFLOW_DATABRICKS_RUN_URL, jobs_page_url) diff --git a/mlflow/projects/submitted_run.py b/mlflow/projects/submitted_run.py index 8d3f4d76a7d8f..87351d971d4f8 100644 --- a/mlflow/projects/submitted_run.py +++ b/mlflow/projects/submitted_run.py @@ -2,9 +2,12 @@ import os import signal +import logging from mlflow.entities import RunStatus -from mlflow.utils.logging_utils import eprint + + +_logger = logging.getLogger(__name__) class SubmittedRun(object): @@ -84,9 +87,10 @@ def cancel(self): except OSError: # The child process may have exited before we attempted to terminate it, so we # ignore OSErrors raised during child process termination - eprint("Failed to terminate child process (PID %s) corresponding to MLflow " - "run with ID %s. The process may have already " - "exited." % (self.command_proc.pid, self._run_id)) + _logger.info( + "Failed to terminate child process (PID %s) corresponding to MLflow " + "run with ID %s. The process may have already exited.", + self.command_proc.pid, self._run_id) self.command_proc.wait() def _get_status(self): diff --git a/mlflow/pyfunc/__init__.py b/mlflow/pyfunc/__init__.py index 7c462bb3b3c36..a7ccf2dce0a66 100644 --- a/mlflow/pyfunc/__init__.py +++ b/mlflow/pyfunc/__init__.py @@ -79,13 +79,13 @@ import shutil import sys import pandas +import logging from mlflow.tracking.fluent import active_run, log_artifacts from mlflow import tracking from mlflow.models import Model from mlflow.utils import PYTHON_VERSION, get_major_minor_py_version from mlflow.utils.file_utils import TempDir, _copy_file_or_tree -from mlflow.utils.logging_utils import eprint FLAVOR_NAME = "python_function" MAIN = "loader_module" @@ -95,6 +95,9 @@ PY_VERSION = "python_version" +_logger = logging.getLogger(__name__) + + def add_to_model(model, loader_module, data=None, code=None, env=None): """ Add a pyfunc spec to the model configuration. @@ -171,15 +174,16 @@ def load_pyfunc(path, run_id=None, suppress_warnings=False): def _warn_potentially_incompatible_py_version_if_necessary(model_py_version): if model_py_version is None: - eprint("The specified model does not have a specified Python version. It may be" - " incompatible with the version of Python that is currently running:" - " Python {version}".format( - version=PYTHON_VERSION)) + _logger.warning( + "The specified model does not have a specified Python version. It may be" + " incompatible with the version of Python that is currently running: Python %s", + PYTHON_VERSION) elif get_major_minor_py_version(model_py_version) != get_major_minor_py_version(PYTHON_VERSION): - eprint("The version of Python that the model was saved in, Python {model_version}, differs" - " from the version of Python that is currently running, Python {system_version}," - " and may be incompatible".format( - model_version=model_py_version, system_version=PYTHON_VERSION)) + _logger.warning( + "The version of Python that the model was saved in, `Python %s`, differs" + " from the version of Python that is currently running, `Python %s`," + " and may be incompatible", + model_py_version, PYTHON_VERSION) def _get_code_dirs(src_code_path, dst_code_path=None): diff --git a/mlflow/pyfunc/cli.py b/mlflow/pyfunc/cli.py index 480911494e34b..c9a410b431386 100644 --- a/mlflow/pyfunc/cli.py +++ b/mlflow/pyfunc/cli.py @@ -4,16 +4,18 @@ from six.moves import shlex_quote import subprocess import sys - +import logging import click import pandas +from mlflow.projects import _get_conda_bin_executable, _get_or_create_conda_env from mlflow.pyfunc import load_pyfunc, scoring_server, _load_model_env from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils import cli_args -from mlflow.utils.logging_utils import eprint -from mlflow.projects import _get_conda_bin_executable, _get_or_create_conda_env + + +_logger = logging.getLogger(__name__) def _rerun_in_conda(conda_env_path): @@ -25,7 +27,7 @@ def _rerun_in_conda(conda_env_path): safe_argv = [shlex_quote(arg) for arg in sys.argv] commands.append(" ".join(safe_argv) + " --no-conda") commandline = " && ".join(commands) - eprint("=== Running command '{}'".format(commandline)) + _logger.info("=== Running command '%s'", commandline) child = subprocess.Popen(["bash", "-c", commandline], close_fds=True) exit_code = child.wait() return exit_code diff --git a/mlflow/pyfunc/scoring_server.py b/mlflow/pyfunc/scoring_server.py index 40bb5c8ae2043..b8c99948a1bbe 100644 --- a/mlflow/pyfunc/scoring_server.py +++ b/mlflow/pyfunc/scoring_server.py @@ -14,6 +14,7 @@ import json import traceback +import logging import pandas as pd import flask @@ -22,7 +23,6 @@ from mlflow.exceptions import MlflowException from mlflow.protos.databricks_pb2 import MALFORMED_REQUEST, BAD_REQUEST from mlflow.utils.rest_utils import NumpyEncoder -from mlflow.utils.logging_utils import eprint from mlflow.server.handlers import catch_mlflow_exception try: @@ -45,6 +45,9 @@ ] +_logger = logging.getLogger(__name__) + + def parse_json_input(json_input, orientation="split"): """ :param json_input: A JSON-formatted string representation of a Pandas DataFrame, or a stream @@ -136,20 +139,19 @@ def transformation(): # pylint: disable=unused-variable elif flask.request.content_type == CONTENT_TYPE_JSON: global logged_pandas_records_format_warning if not logged_pandas_records_format_warning: - eprint( + _logger.warning( "**IMPORTANT UPDATE**: Starting in MLflow 0.9.0, requests received with a" - " `Content-Type` header value of `{json_content_type}` will be interpreted" + " `Content-Type` header value of `%s` will be interpreted" " as JSON-serialized Pandas DataFrames with the `split` orientation, instead" " of the `records` orientation. The `records` orientation is unsafe because" " it may not preserve column ordering. Client code should be updated to" " either send serialized DataFrames with the `split` orientation and the" - " `{split_json_content_type}` content type (recommended) or use the" - " `{records_json_content_type}` content type with the `records` orientation." - " For more information, see" - " https://www.mlflow.org/docs/latest/models.html#pyfunc-deployment.\n".format( - json_content_type=CONTENT_TYPE_JSON, - split_json_content_type=CONTENT_TYPE_JSON_SPLIT_ORIENTED, - records_json_content_type=CONTENT_TYPE_JSON_RECORDS_ORIENTED)) + " `%s` content type (recommended) or use the `%s` content type with the" + " `records` orientation. For more information, see" + " https://www.mlflow.org/docs/latest/models.html#pyfunc-deployment.\n", + CONTENT_TYPE_JSON, + CONTENT_TYPE_JSON_SPLIT_ORIENTED, + CONTENT_TYPE_JSON_RECORDS_ORIENTED) logged_pandas_records_format_warning = True data = parse_json_input(json_input=flask.request.data.decode('utf-8'), orientation="records") diff --git a/mlflow/rfunc/cli.py b/mlflow/rfunc/cli.py index 37a9d65791d85..e54c8cf36a12c 100644 --- a/mlflow/rfunc/cli.py +++ b/mlflow/rfunc/cli.py @@ -3,10 +3,13 @@ import click import os import subprocess +import logging from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils import cli_args -from mlflow.utils.logging_utils import eprint + + +_logger = logging.getLogger(__name__) @click.group("rfunc") @@ -21,7 +24,7 @@ def commands(): def execute(command): - eprint("=== Rscript -e %s) ===" % command) + _logger.info("=== Rscript -e %s) ===", command) env = os.environ.copy() process = subprocess.Popen(["Rscript", "-e", command], close_fds=True, env=env) process.wait() diff --git a/mlflow/sagemaker/__init__.py b/mlflow/sagemaker/__init__.py index 9a3566a2fcf77..3172cf994ca8b 100644 --- a/mlflow/sagemaker/__init__.py +++ b/mlflow/sagemaker/__init__.py @@ -10,6 +10,7 @@ import tarfile import uuid import shutil +import logging import base64 import boto3 @@ -20,8 +21,8 @@ from mlflow.models import Model from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils import get_unique_resource_id -from mlflow.utils.logging_utils import eprint from mlflow.utils.file_utils import TempDir, _copy_project +from mlflow.utils.logging_utils import eprint from mlflow.sagemaker.container import SUPPORTED_FLAVORS as SUPPORTED_DEPLOYMENT_FLAVORS from mlflow.sagemaker.container import DEPLOYMENT_CONFIG_KEY_FLAVOR_NAME @@ -80,6 +81,8 @@ C._init(sys.argv[1])"] """ +_logger = logging.getLogger(__name__) + def _docker_ignore(mlflow_root): docker_ignore = os.path.join(mlflow_root, '.dockerignore') @@ -147,7 +150,7 @@ def build_image(name=DEFAULT_IMAGE_NAME, mlflow_home=None): with open(os.path.join(cwd, "Dockerfile"), "w") as f: f.write(_DOCKERFILE_TEMPLATE % install_mlflow) - eprint("building docker image") + _logger.info("building docker image") os.system('find {cwd}/'.format(cwd=cwd)) proc = Popen(["docker", "build", "-t", name, "-f", "Dockerfile", "."], cwd=cwd, @@ -169,7 +172,7 @@ def push_image_to_ecr(image=DEFAULT_IMAGE_NAME): :param image: Docker image name. """ - eprint("Pushing image to ECR") + _logger.info("Pushing image to ECR") client = boto3.client("sts") caller_id = client.get_caller_identity() account = caller_id['Account'] @@ -177,8 +180,7 @@ def push_image_to_ecr(image=DEFAULT_IMAGE_NAME): region = my_session.region_name or "us-west-2" fullname = _full_template.format(account=account, region=region, image=image, version=mlflow.version.VERSION) - eprint("Pushing docker image {image} to {repo}".format( - image=image, repo=fullname)) + _logger.info("Pushing docker image %s to %s", image=image, repo=fullname) ecr_client = boto3.client('ecr') try: ecr_client.describe_repositories(repositoryNames=[image])['repositories'] @@ -302,7 +304,7 @@ def deploy(app_name, model_path, execution_role_arn=None, bucket=None, run_id=No execution_role_arn = _get_assumed_role_arn() if not bucket: - eprint("No model data bucket specified, using the default bucket") + _logger.info("No model data bucket specified, using the default bucket") bucket = _get_default_s3_bucket(region_name) model_s3_path = _upload_s3( @@ -381,7 +383,7 @@ def delete(app_name, region_name="us-west-2", archive=False): endpoint_arn = endpoint_info["EndpointArn"] sage_client.delete_endpoint(EndpointName=app_name) - eprint("Deleted endpoint with arn: {earn}".format(earn=endpoint_arn)) + _logger.info("Deleted endpoint with arn: %s", endpoint_arn) if not archive: config_name = endpoint_info["EndpointConfigName"] @@ -389,14 +391,12 @@ def delete(app_name, region_name="us-west-2", archive=False): EndpointConfigName=config_name) config_arn = config_info["EndpointConfigArn"] sage_client.delete_endpoint_config(EndpointConfigName=config_name) - eprint("Deleted associated endpoint configuration with arn: {carn}".format( - carn=config_arn)) + _logger.info("Deleted associated endpoint configuration with arn: %s", config_arn) for pv in config_info["ProductionVariants"]: model_name = pv["ModelName"] model_arn = _delete_sagemaker_model( model_name, sage_client, s3_client) - eprint("Deleted associated model with arn: {marn}".format( - marn=model_arn)) + _logger.info("Deleted associated model with arn: %s", model_arn) def run_local(model_path, run_id=None, port=5000, image=DEFAULT_IMAGE_NAME, flavor=None): @@ -427,16 +427,16 @@ def run_local(model_path, run_id=None, port=5000, image=DEFAULT_IMAGE_NAME, flav deployment_config = _get_deployment_config(flavor_name=flavor) - eprint("launching docker image with path {}".format(model_path)) + _logger.info("launching docker image with path %s", model_path) cmd = ["docker", "run", "-v", "{}:/opt/ml/model/".format(model_path), "-p", "%d:8080" % port] for key, value in deployment_config.items(): cmd += ["-e", "{key}={value}".format(key=key, value=value)] cmd += ["--rm", image, "serve"] - eprint('executing', ' '.join(cmd)) + _logger.info('executing: %s', ' '.join(cmd)) proc = Popen(cmd, stdout=PIPE, stderr=STDOUT, universal_newlines=True) def _sigterm_handler(*_): - eprint("received termination signal => killing docker process") + _logger.info("received termination signal => killing docker process") proc.send_signal(signal.SIGINT) import signal @@ -488,7 +488,7 @@ def _get_default_s3_bucket(region_name): response = s3.list_buckets() buckets = [b['Name'] for b in response["Buckets"]] if bucket_name not in buckets: - eprint("Default bucket `%s` not found. Creating..." % bucket_name) + _logger.info("Default bucket `%s` not found. Creating...", bucket_name) bucket_creation_kwargs = { 'ACL': 'bucket-owner-full-control', 'Bucket': bucket_name, @@ -503,10 +503,9 @@ def _get_default_s3_bucket(region_name): 'LocationConstraint': region_name } response = s3.create_bucket(**bucket_creation_kwargs) - eprint(response) + _logger.info("Bucket creation response: %s", response) else: - eprint("Default bucket `%s` already exists. Skipping creation." % - bucket_name) + _logger.info("Default bucket `%s` already exists. Skipping creation.", bucket_name) return bucket_name @@ -541,7 +540,7 @@ def _upload_s3(local_model_path, bucket, prefix): Key=key, Tagging={'TagSet': [{'Key': 'SageMaker', 'Value': 'true'}, ]} ) - eprint('tag response', response) + _logger.info('tag response: %s', response) return '{}/{}/{}'.format(s3.meta.endpoint_url, bucket, key) @@ -645,8 +644,7 @@ def _create_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, :param role: SageMaker execution ARN role :param sage_client: A boto3 client for SageMaker """ - eprint("Creating new endpoint with name: {en} ...".format( - en=endpoint_name)) + _logger.info("Creating new endpoint with name: %s ...", endpoint_name) model_name = _get_sagemaker_model_name(endpoint_name) model_response = _create_sagemaker_model(model_name=model_name, @@ -657,7 +655,7 @@ def _create_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, image_url=image_url, execution_role=role, sage_client=sage_client) - eprint("Created model with arn: %s" % model_response["ModelArn"]) + _logger.info("Created model with arn: %s", model_response["ModelArn"]) production_variant = { 'VariantName': model_name, @@ -677,15 +675,15 @@ def _create_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, }, ], ) - eprint("Created endpoint configuration with arn: %s" - % endpoint_config_response["EndpointConfigArn"]) + _logger.info("Created endpoint configuration with arn: %s", + endpoint_config_response["EndpointConfigArn"]) endpoint_response = sage_client.create_endpoint( EndpointName=endpoint_name, EndpointConfigName=config_name, Tags=[], ) - eprint("Created endpoint with arn: %s" % endpoint_response["EndpointArn"]) + _logger.info("Created endpoint with arn: %s", endpoint_response["EndpointArn"]) def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, flavor, @@ -722,8 +720,7 @@ def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, deployed_config_arn = deployed_config_info["EndpointConfigArn"] deployed_production_variants = deployed_config_info["ProductionVariants"] - eprint("Found active endpoint with arn: {earn}. Updating...".format( - earn=endpoint_arn)) + _logger.info("Found active endpoint with arn: %s. Updating...", endpoint_arn) new_model_name = _get_sagemaker_model_name(endpoint_name) new_model_response = _create_sagemaker_model(model_name=new_model_name, @@ -734,7 +731,7 @@ def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, image_url=image_url, execution_role=role, sage_client=sage_client) - eprint("Created new model with arn: %s" % new_model_response["ModelArn"]) + _logger.info("Created new model with arn: %s", new_model_response["ModelArn"]) if mode == DEPLOYMENT_MODE_ADD: new_model_weight = 0 @@ -765,29 +762,27 @@ def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, }, ], ) - eprint("Created new endpoint configuration with arn: %s" - % endpoint_config_response["EndpointConfigArn"]) + _logger.info("Created new endpoint configuration with arn: %s", + endpoint_config_response["EndpointConfigArn"]) sage_client.update_endpoint(EndpointName=endpoint_name, EndpointConfigName=new_config_name) - eprint("Updated endpoint with new configuration!") + _logger.info("Updated endpoint with new configuration!") # If applicable, clean up unused models and old configurations if not archive: - eprint("Cleaning up unused resources...") + _logger.info("Cleaning up unused resources...") if mode == DEPLOYMENT_MODE_REPLACE: s3_client = boto3.client('s3') for pv in deployed_production_variants: deployed_model_arn = _delete_sagemaker_model(model_name=pv["ModelName"], sage_client=sage_client, s3_client=s3_client) - eprint("Deleted model with arn: {marn}".format( - marn=deployed_model_arn)) + _logger.info("Deleted model with arn: %s", deployed_model_arn) sage_client.delete_endpoint_config( EndpointConfigName=deployed_config_name) - eprint("Deleted endpoint configuration with arn: {carn}".format( - carn=deployed_config_arn)) + _logger.info("Deleted endpoint configuration with arn: %s", deployed_config_arn) def _create_sagemaker_model(model_name, model_s3_path, flavor, vpc_config, run_id, image_url, diff --git a/mlflow/sagemaker/container/__init__.py b/mlflow/sagemaker/container/__init__.py index 21dbcf2c7fae8..b777f27a3c8cc 100644 --- a/mlflow/sagemaker/container/__init__.py +++ b/mlflow/sagemaker/container/__init__.py @@ -21,7 +21,6 @@ from mlflow import pyfunc, mleap from mlflow.models import Model -from mlflow.utils.logging_utils import eprint from mlflow.version import VERSION as MLFLOW_VERSION MODEL_PATH = "/opt/ml/model" diff --git a/mlflow/spark.py b/mlflow/spark.py index d9a852ddc1be5..16bdc2adacb5d 100644 --- a/mlflow/spark.py +++ b/mlflow/spark.py @@ -24,6 +24,7 @@ import os import shutil import yaml +import logging import pyspark from pyspark import SparkContext @@ -32,9 +33,8 @@ import mlflow from mlflow import pyfunc, mleap from mlflow.models import Model -from mlflow.utils.model_utils import _get_flavor_configuration -from mlflow.utils.logging_utils import eprint from mlflow.utils.environment import _mlflow_conda_env +from mlflow.utils.model_utils import _get_flavor_configuration FLAVOR_NAME = "spark" @@ -50,6 +50,9 @@ ) +_logger = logging.getLogger(__name__) + + def log_model(spark_model, artifact_path, conda_env=None, jars=None, dfs_tmpdir=None, sample_input=None): """ @@ -158,7 +161,7 @@ def maybe_copy_from_local_file(cls, src, dst): if qualified_local_path == "file:" + local_path.toString(): return local_path.toString() cls.copy_from_local_file(src, dst, remove_src=False) - eprint("Copied SparkML model to %s" % dst) + _logger.info("Copied SparkML model to %s", dst) return dst @classmethod diff --git a/mlflow/store/cli.py b/mlflow/store/cli.py index 8b28acd85ec5b..fe1abfb41dfd5 100644 --- a/mlflow/store/cli.py +++ b/mlflow/store/cli.py @@ -1,4 +1,4 @@ -from mlflow.utils.logging_utils import eprint +import logging import click @@ -7,6 +7,9 @@ from mlflow.utils.proto_json_utils import message_to_json +_logger = logging.getLogger(__name__) + + @click.group("artifacts") def commands(): """ @@ -36,7 +39,8 @@ def log_artifact(local_file, run_id, artifact_path): artifact_uri = store.get_run(run_id).info.artifact_uri artifact_repo = ArtifactRepository.from_artifact_uri(artifact_uri, store) artifact_repo.log_artifact(local_file, artifact_path) - eprint("Logged artifact from local file %s to artifact_path=%s" % (local_file, artifact_path)) + _logger.info("Logged artifact from local file %s to artifact_path=%s", + local_file, artifact_path) @commands.command("log-artifacts") @@ -57,7 +61,7 @@ def log_artifacts(local_dir, run_id, artifact_path): artifact_uri = store.get_run(run_id).info.artifact_uri artifact_repo = ArtifactRepository.from_artifact_uri(artifact_uri, store) artifact_repo.log_artifacts(local_dir, artifact_path) - eprint("Logged artifact from local dir %s to artifact_path=%s" % (local_dir, artifact_path)) + _logger.info("Logged artifact from local dir %s to artifact_path=%s", local_dir, artifact_path) @commands.command("list") diff --git a/mlflow/tensorflow.py b/mlflow/tensorflow.py index 42e8400d3028d..fc125c239a2ae 100644 --- a/mlflow/tensorflow.py +++ b/mlflow/tensorflow.py @@ -15,6 +15,7 @@ import os import shutil import yaml +import logging import pandas import tensorflow as tf @@ -27,7 +28,6 @@ from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils.environment import _mlflow_conda_env from mlflow.utils.file_utils import _copy_file_or_tree -from mlflow.utils.logging_utils import eprint from mlflow.utils.model_utils import _get_flavor_configuration FLAVOR_NAME = "tensorflow" @@ -41,6 +41,9 @@ ) +_logger = logging.getLogger(__name__) + + def log_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, artifact_path, conda_env=None): """ @@ -103,12 +106,13 @@ def save_model(tf_saved_model_dir, tf_meta_graph_tags, tf_signature_def_key, pat ``mlflow.tensorflow.DEFAULT_CONDA_ENV`` environment will be added to the model. """ - eprint("Validating the specified Tensorflow model by attempting to load it in a new Tensorflow" - " graph...") + _logger.info( + "Validating the specified Tensorflow model by attempting to load it in a new Tensorflow" + " graph...") _validate_saved_model(tf_saved_model_dir=tf_saved_model_dir, tf_meta_graph_tags=tf_meta_graph_tags, tf_signature_def_key=tf_signature_def_key) - eprint("Validation succeeded!") + _logger.info("Validation succeeded!") if os.path.exists(path): raise MlflowException("Path '{}' already exists".format(path), DIRECTORY_NOT_EMPTY) diff --git a/mlflow/tracking/fluent.py b/mlflow/tracking/fluent.py index 951b1e0aa0c68..0253dd4341e7f 100644 --- a/mlflow/tracking/fluent.py +++ b/mlflow/tracking/fluent.py @@ -11,6 +11,7 @@ import atexit import sys import time +import logging from mlflow.entities import Experiment, Run, SourceType, RunInfo from mlflow.exceptions import MlflowException @@ -18,7 +19,6 @@ from mlflow.utils import env from mlflow.utils.databricks_utils import is_in_databricks_notebook, get_notebook_id, \ get_notebook_path, get_webapp_url -from mlflow.utils.logging_utils import eprint from mlflow.utils.mlflow_tags import MLFLOW_DATABRICKS_WEBAPP_URL, \ MLFLOW_DATABRICKS_NOTEBOOK_PATH, \ MLFLOW_DATABRICKS_NOTEBOOK_ID @@ -30,6 +30,9 @@ _active_experiment_id = None +_logger = logging.getLogger(__name__) + + def set_experiment(experiment_name): """ Set given experiment as active experiment. If experiment does not exist, create an experiment @@ -194,8 +197,8 @@ def log_metric(key, value): :param value: Metric value (float). """ if not isinstance(value, numbers.Number): - eprint("WARNING: The metric {}={} was not logged because the value is not a number.".format( - key, value)) + _logger.warning( + "The metric %s=%s was not logged because the value is not a number.", key, value) return run_id = _get_or_start_run().info.run_uuid MlflowClient().log_metric(run_id, key, value, int(time.time())) @@ -283,8 +286,9 @@ def _get_git_commit(path): try: from git import Repo, InvalidGitRepositoryError, GitCommandNotFound, NoSuchPathError except ImportError as e: - eprint("Notice: failed to import Git (the Git executable is probably not on your PATH)," - " so Git SHA is not available. Error: %s" % e) + _logger.warning( + "Failed to import Git (the Git executable is probably not on your PATH)," + " so Git SHA is not available. Error: %s", e) return None try: if os.path.isfile(path): diff --git a/mlflow/utils/databricks_utils.py b/mlflow/utils/databricks_utils.py index 71302bff69d49..5bdde3cf64181 100644 --- a/mlflow/utils/databricks_utils.py +++ b/mlflow/utils/databricks_utils.py @@ -1,9 +1,13 @@ +import logging + from mlflow.exceptions import MlflowException from mlflow.utils.rest_utils import MlflowHostCreds -from mlflow.utils.logging_utils import eprint from databricks_cli.configure import provider +_logger = logging.getLogger(__name__) + + def _get_dbutils(): try: import IPython @@ -69,8 +73,9 @@ def get_databricks_host_creds(profile=None): authentication information necessary to talk to the Databricks server. """ if not hasattr(provider, 'get_config'): - eprint("Warning: support for databricks-cli<0.8.0 is deprecated and will be removed" - " in a future version.") + _logger.warning( + "Support for databricks-cli<0.8.0 is deprecated and will be removed" + " in a future version.") config = provider.get_config_for_profile(profile) elif profile: config = provider.ProfileConfigProvider(profile).get_config() diff --git a/mlflow/utils/logging_utils.py b/mlflow/utils/logging_utils.py index 64ba60d08c3b4..81859d73d2c2f 100644 --- a/mlflow/utils/logging_utils.py +++ b/mlflow/utils/logging_utils.py @@ -1,5 +1,42 @@ from __future__ import print_function + import sys +import logging +import logging.config + + +# Logging format example: +# 2018/11/20 12:36:37 INFO mlflow.sagemaker: Creating new SageMaker endpoint +LOGGING_LINE_FORMAT = "%(asctime)s %(levelname)s %(name)s: %(message)s" +LOGGING_DATETIME_FORMAT = "%Y/%m/%d %H:%M:%S" + + +def _configure_mlflow_loggers(root_module_name): + logging.config.dictConfig({ + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'mlflow_formatter': { + 'format': LOGGING_LINE_FORMAT, + 'datefmt': LOGGING_DATETIME_FORMAT, + }, + }, + 'handlers': { + 'mlflow_handler': { + 'level': 'INFO', + 'formatter': 'mlflow_formatter', + 'class': 'logging.StreamHandler', + 'stream': sys.stderr, + }, + }, + 'loggers': { + root_module_name: { + 'handlers': ['mlflow_handler'], + 'level': 'INFO', + 'propagate': False, + }, + }, + }) def eprint(*args, **kwargs): diff --git a/mlflow/utils/rest_utils.py b/mlflow/utils/rest_utils.py index 19cec8e8b83cc..d3a25438528ee 100644 --- a/mlflow/utils/rest_utils.py +++ b/mlflow/utils/rest_utils.py @@ -1,12 +1,12 @@ import base64 import time +import logging import json from json import JSONEncoder import numpy import requests -from mlflow.utils.logging_utils import eprint from mlflow.utils.string_utils import strip_suffix from mlflow.exceptions import MlflowException, RestException @@ -14,6 +14,9 @@ RESOURCE_DOES_NOT_EXIST = 'RESOURCE_DOES_NOT_EXIST' +_logger = logging.getLogger(__name__) + + def http_request(host_creds, endpoint, retries=3, retry_interval=3, **kwargs): """ Makes an HTTP request with the specified method to the specified hostname/endpoint. Retries @@ -46,9 +49,10 @@ def http_request(host_creds, endpoint, retries=3, retry_interval=3, **kwargs): if response.status_code >= 200 and response.status_code < 500: return response else: - eprint("API request to %s failed with code %s != 200, retrying up to %s more times. " - "API response body: %s" % (url, response.status_code, retries - i - 1, - response.text)) + _logger.error( + "API request to %s failed with code %s != 200, retrying up to %s more times. " + "API response body: %s", + url, response.status_code, retries - i - 1, response.text) time.sleep(retry_interval) raise MlflowException("API request to %s failed to return code 200 after %s tries" % (url, retries)) diff --git a/tests/__init__.py b/tests/__init__.py index e69de29bb2d1d..0474b96f1f9e1 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +1,3 @@ +from mlflow.utils.logging_utils import _configure_mlflow_loggers + +_configure_mlflow_loggers(root_module_name=__name__) diff --git a/tests/projects/test_projects_cli.py b/tests/projects/test_projects_cli.py index a965f8cf8488c..6e5dbcc6991c3 100644 --- a/tests/projects/test_projects_cli.py +++ b/tests/projects/test_projects_cli.py @@ -2,18 +2,22 @@ import hashlib import mock import os +import logging from click.testing import CliRunner import pytest from mlflow import cli -from mlflow.utils import process, logging_utils +from mlflow.utils import process from tests.integration.utils import invoke_cli_runner from tests.projects.utils import TEST_PROJECT_DIR, GIT_PROJECT_URI, SSH_PROJECT_URI,\ TEST_NO_SPEC_PROJECT_DIR from tests.projects.utils import tracking_uri_mock # pylint: disable=unused-import +_logger = logging.getLogger(__name__) + + @pytest.mark.large def test_run_local_params(tracking_uri_mock): # pylint: disable=unused-argument excitement_arg = 2 @@ -31,9 +35,9 @@ def test_run_local_conda_env(tracking_uri_mock): # pylint: disable=unused-argum try: process.exec_cmd(cmd=["conda", "env", "remove", "--name", expected_env_name]) except process.ShellCommandException: - logging_utils.eprint( + _logger.error( "Unable to remove conda environment %s. The environment may not have been present, " - "continuing with running the test." % expected_env_name) + "continuing with running the test.", expected_env_name) invoke_cli_runner(cli.run, [TEST_PROJECT_DIR, "-e", "check_conda_env", "-P", "conda_env_name=%s" % expected_env_name]) From 80dd2a612f74f20ebccab0775f9e7d8344ac0f57 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Tue, 20 Nov 2018 16:47:35 -0800 Subject: [PATCH 059/483] SageMaker fixes for archive mode and synchronous deployment/deletion execution (#717) * Progress toward archive fix * DeploymentOp * Pass region name through * Add 'blocking' and 'timeout' parameters to 'deploy' and 'delete' methods * docs fixes * Timeout ops * Rename error message op * Lint * Validate deployment mode before S3 data upload, fix exception typing * Update archive param doc * CLI archive doc update * Use time.time and shorten --asynchronous flag to --async * Progress messages * Use loggers * Lint * Rename configure method * Convert remaining eprints * Configure a single default logger * Lint * Fix sagemaker log call * Use module naming * Address comments * Lint * Revert release tag comment * Fix logging for tests * Lint * Revert test changes * Remove test statement * Revert docs * Docs tweaks * Lint * Add update delay * Address comments * Lint * Move log * Logging fixes * Test fixes * Make linter happy --- mlflow/sagemaker/__init__.py | 476 +++++++++++++++++++++-------- mlflow/sagemaker/cli.py | 63 +++- tests/sagemaker/test_deployment.py | 20 +- 3 files changed, 411 insertions(+), 148 deletions(-) diff --git a/mlflow/sagemaker/__init__.py b/mlflow/sagemaker/__init__.py index 3172cf994ca8b..8acbe178aeb7c 100644 --- a/mlflow/sagemaker/__init__.py +++ b/mlflow/sagemaker/__init__.py @@ -11,6 +11,7 @@ import uuid import shutil import logging +import time import base64 import boto3 @@ -18,7 +19,9 @@ import mlflow import mlflow.version from mlflow import pyfunc, mleap +from mlflow.exceptions import MlflowException from mlflow.models import Model +from mlflow.protos.databricks_pb2 import RESOURCE_DOES_NOT_EXIST, INVALID_PARAMETER_VALUE from mlflow.tracking.utils import _get_model_log_dir from mlflow.utils import get_unique_resource_id from mlflow.utils.file_utils import TempDir, _copy_project @@ -202,7 +205,8 @@ def push_image_to_ecr(image=DEFAULT_IMAGE_NAME): def deploy(app_name, model_path, execution_role_arn=None, bucket=None, run_id=None, image_url=None, region_name="us-west-2", mode=DEPLOYMENT_MODE_CREATE, archive=False, instance_type=DEFAULT_SAGEMAKER_INSTANCE_TYPE, - instance_count=DEFAULT_SAGEMAKER_INSTANCE_COUNT, vpc_config=None, flavor=None): + instance_count=DEFAULT_SAGEMAKER_INSTANCE_COUNT, vpc_config=None, flavor=None, + synchronous=True, timeout_seconds=1200): """ Deploy an MLflow model on AWS SageMaker. The currently active AWS account must have correct permissions set up. @@ -243,9 +247,13 @@ def deploy(app_name, model_path, execution_role_arn=None, bucket=None, run_id=No AWS console or the ``UpdateEndpointWeightsAndCapacities`` function defined in https://docs.aws.amazon.com/sagemaker/latest/dg/API_UpdateEndpointWeightsAndCapacities.html. - :param archive: If True, any pre-existing SageMaker application resources that become inactive - (i.e. as a result of deploying in ``mlflow.sagemaker.DEPLOYMENT_MODE_REPLACE`` - mode) are preserved. If False, these resources are deleted. + :param archive: If ``True``, any pre-existing SageMaker application resources that become + inactive (i.e. as a result of deploying in + ``mlflow.sagemaker.DEPLOYMENT_MODE_REPLACE`` mode) are preserved. + These resources may include unused SageMaker models and endpoint configurations + that were associated with a prior version of the application endpoint. If + ``False``, these resources are deleted. In order to use ``archive=False``, + ``deploy()`` must be executed synchronously with ``synchronous=True``. :param instance_type: The type of SageMaker ML instance on which to deploy the model. For a list of supported instance types, see https://aws.amazon.com/sagemaker/pricing/instance-types/. @@ -275,10 +283,31 @@ def deploy(app_name, model_path, execution_role_arn=None, bucket=None, run_id=No a flavor is automatically selected from the model's available flavors. If the specified flavor is not present or not supported for deployment, an exception will be thrown. + :param synchronous: If `True`, this function will block until the deployment process succeeds + or encounters an irrecoverable failure. If `False`, this function will + return immediately after starting the deployment process. It will not wait + for the deployment process to complete; in this case, the caller is + responsible for monitoring the health and status of the pending deployment + via native SageMaker APIs or the AWS console. + :param timeout_seconds: If `synchronous` is `True`, the deployment process will return after the + specified number of seconds if no definitive result (success or failure) + is achieved. Once the function returns, the caller is responsible + for monitoring the health and status of the pending deployment via + native SageMaker APIs or the AWS console. If `synchronous` is False, + this parameter is ignored. """ + if (not archive) and (not synchronous): + raise MlflowException( + message=( + "Resources must be archived when `deploy()` is executed in non-synchronous mode." + " Either set `synchronous=True` or `archive=True`."), + error_code=INVALID_PARAMETER_VALUE) + if mode not in DEPLOYMENT_MODES: - raise ValueError("`mode` must be one of: {mds}".format( - mds=",".join(DEPLOYMENT_MODES))) + raise MlflowException( + message="`mode` must be one of: {deployment_modes}".format( + deployment_modes=",".join(DEPLOYMENT_MODES)), + error_code=INVALID_PARAMETER_VALUE) s3_bucket_prefix = model_path if run_id: @@ -287,40 +316,74 @@ def deploy(app_name, model_path, execution_role_arn=None, bucket=None, run_id=No model_config_path = os.path.join(model_path, "MLmodel") if not os.path.exists(model_config_path): - raise Exception( - "Failed to find MLmodel configuration within the specified model's root directory.") + raise MlflowException( + message=( + "Failed to find MLmodel configuration within the specified model's" + " root directory."), + error_code=INVALID_PARAMETER_VALUE) model_config = Model.load(model_config_path) if flavor is None: flavor = _get_preferred_deployment_flavor(model_config) else: _validate_deployment_flavor(model_config, flavor) - print("Using the {selected_flavor} flavor for deployment!".format(selected_flavor=flavor)) + _logger.info("Using the %s flavor for deployment!", flavor) + + sage_client = boto3.client('sagemaker', region_name=region_name) + s3_client = boto3.client('s3', region_name=region_name) + + endpoint_exists = _find_endpoint(endpoint_name=app_name, sage_client=sage_client) is not None + if endpoint_exists and mode == DEPLOYMENT_MODE_CREATE: + raise MlflowException( + message=( + "You are attempting to deploy an application with name: {application_name} in" + " '{mode_create}' mode. However, an application with the same name already" + " exists. If you want to update this application, deploy in '{mode_add}' or" + " '{mode_replace}' mode.".format( + application_name=app_name, + mode_create=DEPLOYMENT_MODE_CREATE, + mode_add=DEPLOYMENT_MODE_ADD, + mode_replace=DEPLOYMENT_MODE_REPLACE)), + error_code=INVALID_PARAMETER_VALUE) if not image_url: image_url = _get_default_image_url(region_name=region_name) - if not execution_role_arn: execution_role_arn = _get_assumed_role_arn() - if not bucket: _logger.info("No model data bucket specified, using the default bucket") bucket = _get_default_s3_bucket(region_name) - model_s3_path = _upload_s3( - local_model_path=model_path, bucket=bucket, prefix=s3_bucket_prefix) - _deploy(role=execution_role_arn, - image_url=image_url, - app_name=app_name, - model_s3_path=model_s3_path, - run_id=run_id, - region_name=region_name, - mode=mode, - archive=archive, - instance_type=instance_type, - instance_count=instance_count, - vpc_config=vpc_config, - flavor=flavor) + model_s3_path = _upload_s3(local_model_path=model_path, + bucket=bucket, + prefix=s3_bucket_prefix, + region_name=region_name, + s3_client=s3_client) + if endpoint_exists: + deployment_operation = _update_sagemaker_endpoint( + endpoint_name=app_name, image_url=image_url, model_s3_path=model_s3_path, + run_id=run_id, flavor=flavor, instance_type=instance_type, + instance_count=instance_count, vpc_config=vpc_config, mode=mode, + role=execution_role_arn, sage_client=sage_client, s3_client=s3_client) + else: + deployment_operation = _create_sagemaker_endpoint( + endpoint_name=app_name, image_url=image_url, model_s3_path=model_s3_path, + run_id=run_id, flavor=flavor, instance_type=instance_type, + instance_count=instance_count, vpc_config=vpc_config, role=execution_role_arn, + sage_client=sage_client) + + if synchronous: + _logger.info("Waiting for the deployment operation to complete...") + operation_status = deployment_operation.await_completion(timeout_seconds=timeout_seconds) + if operation_status.state == _SageMakerOperationStatus.STATE_SUCCEEDED: + _logger.info("The deployment operation completed successfully with message: \"%s\"", + operation_status.message) + else: + raise MlflowException( + "The deployment operation failed with the following error message:" + " \"{error_message}\"".format(error_message=operation_status.message)) + if not archive: + deployment_operation.clean_up() def _get_preferred_deployment_flavor(model_config): @@ -337,11 +400,14 @@ def _get_preferred_deployment_flavor(model_config): elif pyfunc.FLAVOR_NAME in model_config.flavors: return pyfunc.FLAVOR_NAME else: - raise ValueError("The specified model does not contain any of the supported flavors for" - " deployment. The model contains the following flavors:" - " {model_flavors}. Supported flavors: {supported_flavors}".format( - model_flavors=model_config.flavors.keys(), - supported_flavors=SUPPORTED_DEPLOYMENT_FLAVORS)) + raise MlflowException( + message=( + "The specified model does not contain any of the supported flavors for" + " deployment. The model contains the following flavors: {model_flavors}." + " Supported flavors: {supported_flavors}".format( + model_flavors=model_config.flavors.keys(), + supported_flavors=SUPPORTED_DEPLOYMENT_FLAVORS)), + error_code=RESOURCE_DOES_NOT_EXIST) def _validate_deployment_flavor(model_config, flavor): @@ -354,28 +420,53 @@ def _validate_deployment_flavor(model_config, flavor): :param flavor: The deployment flavor to validate """ if flavor not in SUPPORTED_DEPLOYMENT_FLAVORS: - raise ValueError("The specified flavor: `{flavor_name}` is not supported for" - " deployment. Please use one of the supported flavors:" - " {supported_flavor_names}".format( - flavor_name=flavor, - supported_flavor_names=SUPPORTED_DEPLOYMENT_FLAVORS)) + raise MlflowException( + message=( + "The specified flavor: `{flavor_name}` is not supported for deployment." + " Please use one of the supported flavors: {supported_flavor_names}".format( + flavor_name=flavor, + supported_flavor_names=SUPPORTED_DEPLOYMENT_FLAVORS)), + error_code=INVALID_PARAMETER_VALUE) elif flavor not in model_config.flavors: - raise ValueError("The specified model does not contain the specified deployment flavor:" + raise MlflowException( + message=("The specified model does not contain the specified deployment flavor:" " `{flavor_name}`. Please use one of the following deployment flavors" " that the model contains: {model_flavors}".format( - flavor_name=flavor, model_flavors=model_config.flavors.keys())) + flavor_name=flavor, model_flavors=model_config.flavors.keys())), + error_code=RESOURCE_DOES_NOT_EXIST) -def delete(app_name, region_name="us-west-2", archive=False): +def delete(app_name, region_name="us-west-2", archive=False, synchronous=True, timeout_seconds=300): """ Delete a SageMaker application. :param app_name: Name of the deployed application. :param region_name: Name of the AWS region in which the application is deployed. - :param archive: If True, resources associated with the specified application, such - as its associated models and endpoint configuration, will be preserved. - If False, these resources will be deleted. + :param archive: If ``True``, resources associated with the specified application, such + as its associated models and endpoint configuration, are preserved. + If ``False``, these resources are deleted. In order to use + ``archive=False``, ``delete()`` must be executed synchronously with + ``synchronous=True``. + :param synchronous: If `True`, this function blocks until the deletion process succeeds + or encounters an irrecoverable failure. If `False`, this function + returns immediately after starting the deletion process. It will not wait + for the deletion process to complete; in this case, the caller is + responsible for monitoring the status of the deletion process via native + SageMaker APIs or the AWS console. + :param timeout_seconds: If `synchronous` is `True`, the deletion process returns after the + specified number of seconds if no definitive result (success or failure) + is achieved. Once the function returns, the caller is responsible + for monitoring the status of the deletion process via native SageMaker + APIs or the AWS console. If `synchronous` is False, this parameter + is ignored. """ + if (not archive) and (not synchronous): + raise MlflowException( + message=( + "Resources must be archived when `deploy()` is executed in non-synchronous mode." + " Either set `synchronous=True` or `archive=True`."), + error_code=INVALID_PARAMETER_VALUE) + s3_client = boto3.client('s3', region_name=region_name) sage_client = boto3.client('sagemaker', region_name=region_name) @@ -385,7 +476,18 @@ def delete(app_name, region_name="us-west-2", archive=False): sage_client.delete_endpoint(EndpointName=app_name) _logger.info("Deleted endpoint with arn: %s", endpoint_arn) - if not archive: + def status_check_fn(): + endpoint_info = _find_endpoint(endpoint_name=app_name, sage_client=sage_client) + if endpoint_info is not None: + return _SageMakerOperationStatus.in_progress( + "Deletion is still in progress. Current endpoint status: {endpoint_status}".format( + endpoint_status=endpoint_info["EndpointStatus"])) + else: + return _SageMakerOperationStatus.succeeded( + "The SageMaker endpoint was deleted successfully.") + + def cleanup_fn(): + _logger.info("Cleaning up unused resources...") config_name = endpoint_info["EndpointConfigName"] config_info = sage_client.describe_endpoint_config( EndpointConfigName=config_name) @@ -398,6 +500,21 @@ def delete(app_name, region_name="us-west-2", archive=False): model_name, sage_client, s3_client) _logger.info("Deleted associated model with arn: %s", model_arn) + delete_operation = _SageMakerOperation(status_check_fn=status_check_fn, cleanup_fn=cleanup_fn) + + if synchronous: + _logger.info("Waiting for the delete operation to complete...") + operation_status = delete_operation.await_completion(timeout_seconds=timeout_seconds) + if operation_status.state == _SageMakerOperationStatus.STATE_SUCCEEDED: + _logger.info("The deletion operation completed successfully with message: \"%s\"", + operation_status.message) + else: + raise MlflowException( + "The deletion operation failed with the following error message:" + " \"{error_message}\"".format(error_message=operation_status.message)) + if not archive: + delete_operation.clean_up() + def run_local(model_path, run_id=None, port=5000, image=DEFAULT_IMAGE_NAME, flavor=None): """ @@ -518,30 +635,31 @@ def _make_tarfile(output_filename, source_dir): tar.add(os.path.join(source_dir, f), arcname=f) -def _upload_s3(local_model_path, bucket, prefix): +def _upload_s3(local_model_path, bucket, prefix, region_name, s3_client): """ Upload dir to S3 as .tar.gz. :param local_model_path: Local path to a dir. :param bucket: S3 bucket where to store the data. :param prefix: Path within the bucket. + :param region_name: The AWS region in which to upload data to S3. + :param s3_client: A boto3 client for S3. :return: S3 path of the uploaded artifact. """ - sess = boto3.Session() + sess = boto3.Session(region_name=region_name) with TempDir() as tmp: model_data_file = tmp.path("model.tar.gz") _make_tarfile(model_data_file, local_model_path) - s3 = boto3.client('s3') with open(model_data_file, 'rb') as fobj: key = os.path.join(prefix, 'model.tar.gz') obj = sess.resource('s3').Bucket(bucket).Object(key) obj.upload_fileobj(fobj) - response = s3.put_object_tagging( + response = s3_client.put_object_tagging( Bucket=bucket, Key=key, Tagging={'TagSet': [{'Key': 'SageMaker', 'Value': 'true'}, ]} ) _logger.info('tag response: %s', response) - return '{}/{}/{}'.format(s3.meta.endpoint_url, bucket, key) + return '{}/{}/{}'.format(s3_client.meta.endpoint_url, bucket, key) def _get_deployment_config(flavor_name): @@ -552,76 +670,6 @@ def _get_deployment_config(flavor_name): return deployment_config -def _deploy(role, image_url, app_name, model_s3_path, run_id, region_name, mode, archive, - instance_type, instance_count, vpc_config, flavor): - """ - Deploy model on sagemaker. - :param role: SageMaker execution ARN role - :param image_url: URL of the ECR-hosted docker image the model is being deployed into - :param app_name: Name of the deployed app. - :param model_s3_path: S3 path where we stored the model artifacts. - :param run_id: Run ID that generated this model. - :param mode: The mode in which to deploy the application. - :param archive: If True, any pre-existing SageMaker application resources that become inactive - (i.e. as a result of deploying in mlflow.sagemaker.DEPLOYMENT_MODE_REPLACE mode) - will be preserved. If False, these resources will be deleted. - :param instance_type: The type of SageMaker ML instance on which to deploy the model. - :param instance_count: The number of SageMaker ML instances on which to deploy the model. - :param vpc_config: A dictionary specifying the VPC configuration to use when creating the - new SageMaker model associated with this application. - :param flavor: The name of the flavor of the model to use for deployment. - """ - sage_client = boto3.client('sagemaker', region_name=region_name) - s3_client = boto3.client('s3', region_name=region_name) - - endpoints_page = sage_client.list_endpoints( - MaxResults=100, NameContains=app_name) - endpoint_found = (app_name in [endp["EndpointName"] - for endp in endpoints_page["Endpoints"]]) - while (not endpoint_found) and ("NextToken" in endpoints_page): - next_token = endpoints_page["NextToken"] - endpoints_page = sage_client.list_endpoints(MaxResults=100, - NextToken=next_token, - NameContains=app_name) - endpoint_found = any( - [ep["EndpointName"] == app_name for ep in endpoints_page["Endpoints"]]) - - if endpoint_found and mode == DEPLOYMENT_MODE_CREATE: - msg = ("You are attempting to deploy an application with name: `{an}` in `{mcr} `mode." - " However, an application with the same name already exists. If you want to update" - " this application, deploy in `{madd}` or `{mrep}` mode.").format( - an=app_name, - mcr=DEPLOYMENT_MODE_CREATE, - madd=DEPLOYMENT_MODE_ADD, - mrep=DEPLOYMENT_MODE_REPLACE) - raise Exception(msg) - elif endpoint_found: - return _update_sagemaker_endpoint(endpoint_name=app_name, - image_url=image_url, - model_s3_path=model_s3_path, - run_id=run_id, - flavor=flavor, - instance_type=instance_type, - instance_count=instance_count, - vpc_config=vpc_config, - mode=mode, - archive=archive, - role=role, - sage_client=sage_client, - s3_client=s3_client) - else: - return _create_sagemaker_endpoint(endpoint_name=app_name, - image_url=image_url, - model_s3_path=model_s3_path, - run_id=run_id, - flavor=flavor, - instance_type=instance_type, - instance_count=instance_count, - vpc_config=vpc_config, - role=role, - sage_client=sage_client) - - def _get_sagemaker_model_name(endpoint_name): return "{en}-model-{uid}".format(en=endpoint_name, uid=get_unique_resource_id()) @@ -641,8 +689,8 @@ def _create_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, :param instance_count: The number of SageMaker ML instances on which to deploy the model. :param vpc_config: A dictionary specifying the VPC configuration to use when creating the new SageMaker model associated with this SageMaker endpoint. - :param role: SageMaker execution ARN role - :param sage_client: A boto3 client for SageMaker + :param role: SageMaker execution ARN role. + :param sage_client: A boto3 client for SageMaker. """ _logger.info("Creating new endpoint with name: %s ...", endpoint_name) @@ -685,9 +733,35 @@ def _create_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, ) _logger.info("Created endpoint with arn: %s", endpoint_response["EndpointArn"]) + def status_check_fn(): + endpoint_info = _find_endpoint(endpoint_name=endpoint_name, sage_client=sage_client) + + if endpoint_info is None: + return _SageMakerOperationStatus.in_progress("Waiting for endpoint to be created...") + + endpoint_status = endpoint_info["EndpointStatus"] + if endpoint_status == "Creating": + return _SageMakerOperationStatus.in_progress( + "Waiting for endpoint to reach the \"InService\" state. Current endpoint status:" + " \"{endpoint_status}\"".format(endpoint_status=endpoint_status)) + elif endpoint_status == "InService": + return _SageMakerOperationStatus.succeeded( + "The SageMaker endpoint was created successfully.") + else: + failure_reason = endpoint_info.get( + "FailureReason", + ("An unknown SageMaker failure occurred. Please see the SageMaker console logs for" + " more information.")) + return _SageMakerOperationStatus.failed(failure_reason) + + def cleanup_fn(): + pass + + return _SageMakerOperation(status_check_fn=status_check_fn, cleanup_fn=cleanup_fn) + def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, flavor, - instance_type, instance_count, vpc_config, mode, archive, role, + instance_type, instance_count, vpc_config, mode, role, sage_client, s3_client): """ :param image_url: URL of the ECR-hosted Docker image the model is being deployed into @@ -700,9 +774,6 @@ def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, new SageMaker model associated with this SageMaker endpoint. :param mode: either mlflow.sagemaker.DEPLOYMENT_MODE_ADD or mlflow.sagemaker.DEPLOYMENT_MODE_REPLACE. - :param archive: If True, any pre-existing SageMaker application resources that become inactive - (i.e. as a result of deploying in mlflow.sagemaker.DEPLOYMENT_MODE_REPLACE mode) - will be preserved. If False, these resources will be deleted. :param role: SageMaker execution ARN role. :param sage_client: A boto3 client for SageMaker. :param s3_client: A boto3 client for S3. @@ -769,11 +840,36 @@ def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, EndpointConfigName=new_config_name) _logger.info("Updated endpoint with new configuration!") - # If applicable, clean up unused models and old configurations - if not archive: + operation_start_time = time.time() + + def status_check_fn(): + if time.time() - operation_start_time < 20: + # Wait at least 20 seconds before checking the status of the update; this ensures + # that we don't consider the operation to have failed if small delays occur at + # initialization time + return _SageMakerOperationStatus.in_progress() + + endpoint_info = sage_client.describe_endpoint(EndpointName=endpoint_name) + endpoint_update_was_rolled_back = ( + endpoint_info["EndpointStatus"] == "InService" + and endpoint_info["EndpointConfigName"] != new_config_name) + if endpoint_update_was_rolled_back or endpoint_info["EndpointStatus"] == "Failed": + failure_reason = endpoint_info.get( + "FailureReason", + ("An unknown SageMaker failure occurred. Please see the SageMaker console logs for" + " more information.")) + return _SageMakerOperationStatus.failed(failure_reason) + elif endpoint_info["EndpointStatus"] == "InService": + return _SageMakerOperationStatus.succeeded( + "The SageMaker endpoint was updated successfully.") + else: + return _SageMakerOperationStatus.in_progress( + "The update operation is still in progress. Current endpoint status:" + " \"{endpoint_status}\"".format(endpoint_status=endpoint_info["EndpointStatus"])) + + def cleanup_fn(): _logger.info("Cleaning up unused resources...") if mode == DEPLOYMENT_MODE_REPLACE: - s3_client = boto3.client('s3') for pv in deployed_production_variants: deployed_model_arn = _delete_sagemaker_model(model_name=pv["ModelName"], sage_client=sage_client, @@ -784,20 +880,22 @@ def _update_sagemaker_endpoint(endpoint_name, image_url, model_s3_path, run_id, EndpointConfigName=deployed_config_name) _logger.info("Deleted endpoint configuration with arn: %s", deployed_config_arn) + return _SageMakerOperation(status_check_fn=status_check_fn, cleanup_fn=cleanup_fn) + def _create_sagemaker_model(model_name, model_s3_path, flavor, vpc_config, run_id, image_url, execution_role, sage_client): """ - :param model_s3_path: S3 path where the model artifacts are stored - :param flavor: The name of the flavor of the model + :param model_s3_path: S3 path where the model artifacts are stored. + :param flavor: The name of the flavor of the model. :param vpc_config: A dictionary specifying the VPC configuration to use when creating the new SageMaker model associated with this SageMaker endpoint. - :param run_id: Run ID that generated this model + :param run_id: Run ID that generated this model. :param image_url: URL of the ECR-hosted Docker image that will serve as the - model's container - :param execution_role: The ARN of the role that SageMaker will assume when creating the model - :param sage_client: A boto3 client for SageMaker - :return: AWS response containing metadata associated with the new model + model's container, + :param execution_role: The ARN of the role that SageMaker will assume when creating the model. + :param sage_client: A boto3 client for SageMaker. + :return: AWS response containing metadata associated with the new model. """ create_model_args = { "ModelName": model_name, @@ -840,3 +938,115 @@ def _delete_sagemaker_model(model_name, sage_client, s3_client): sage_client.delete_model(ModelName=model_name) return model_arn + + +def _delete_sagemaker_endpoint_configuration(endpoint_config_name, sage_client): + """ + :param sage_client: A boto3 client for SageMaker. + :return: ARN of the deleted endpoint configuration. + """ + endpoint_config_info = sage_client.describe_endpoint_config( + EndpointConfigName=endpoint_config_name) + sage_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name) + return endpoint_config_info["EndpointConfigArn"] + + +def _find_endpoint(endpoint_name, sage_client): + """ + Finds a SageMaker endpoint with the specified name in the caller's AWS account, returning a + NoneType if the endpoint is not found. + + :param sage_client: A boto3 client for SageMaker. + :return: If the endpoint exists, a dictionary of endpoint attributes. If the endpoint does not + exist, `None`. + """ + endpoints_page = sage_client.list_endpoints( + MaxResults=100, NameContains=endpoint_name) + + while True: + for endpoint in endpoints_page["Endpoints"]: + if endpoint["EndpointName"] == endpoint_name: + return endpoint + + if "NextToken" in endpoints_page: + endpoints_page = sage_client.list_endpoints(MaxResults=100, + NextToken=endpoints_page["NextToken"], + NameContains=endpoint_name) + else: + return None + + +class _SageMakerOperation: + + def __init__(self, status_check_fn, cleanup_fn): + self.status_check_fn = status_check_fn + self.cleanup_fn = cleanup_fn + self.start_time = time.time() + self.status = _SageMakerOperationStatus(_SageMakerOperationStatus.STATE_IN_PROGRESS, None) + self.cleaned_up = False + + def await_completion(self, timeout_seconds): + iteration = 0 + begin = time.time() + while (time.time() - begin) < timeout_seconds: + status = self.status_check_fn() + if status.state == _SageMakerOperationStatus.STATE_IN_PROGRESS: + if iteration % 4 == 0: + # Log the progress status roughly every 20 seconds + _logger.info(status.message) + + time.sleep(5) + iteration += 1 + continue + else: + self.status = status + return status + + duration_seconds = time.time() - begin + return _SageMakerOperationStatus.timed_out(duration_seconds) + + def clean_up(self): + if self.status.state != _SageMakerOperationStatus.STATE_SUCCEEDED: + raise ValueError( + "Cannot clean up an operation that has not succeeded! Current operation state:" + " {operation_state}".format(operation_state=self.status.state)) + + if not self.cleaned_up: + self.cleaned_up = True + else: + raise ValueError("`clean_up()` has already been executed for this operation!") + + self.cleanup_fn() + + +class _SageMakerOperationStatus: + + STATE_SUCCEEDED = "succeeded" + STATE_FAILED = "failed" + STATE_IN_PROGRESS = "in progress" + STATE_TIMED_OUT = "timed_out" + + def __init__(self, state, message): + self.state = state + self.message = message + + @classmethod + def in_progress(cls, message=None): + if message is None: + message = "The operation is still in progress." + return cls(_SageMakerOperationStatus.STATE_IN_PROGRESS, message) + + @classmethod + def timed_out(cls, duration_seconds): + return cls(_SageMakerOperationStatus.STATE_TIMED_OUT, + "Timed out after waiting {duration_seconds} seconds for the operation to" + " complete. This operation may still be in progress. Please check the AWS" + " console for more information.".format(duration_seconds=duration_seconds)) + + @classmethod + def failed(cls, message): + return cls(_SageMakerOperationStatus.STATE_FAILED, message) + + @classmethod + def succeeded(cls, message): + return cls(_SageMakerOperationStatus.STATE_SUCCEEDED, message) diff --git a/mlflow/sagemaker/cli.py b/mlflow/sagemaker/cli.py index 81aafb0a556e9..690570f13ecd3 100644 --- a/mlflow/sagemaker/cli.py +++ b/mlflow/sagemaker/cli.py @@ -35,8 +35,15 @@ def commands(): help="The mode in which to deploy the application." " Must be one of the following: {mds}".format( mds=", ".join(mlflow.sagemaker.DEPLOYMENT_MODES))) -@click.option("--archive", "-ar", is_flag=True, help="If specified, any SageMaker resources that" - " become inactive (i.e as the result of replacement) will be preserved") +@click.option("--archive", "-ar", is_flag=True, + help=("If specified, any SageMaker resources that become inactive (i.e as the" + " result of an update in {mode_replace} mode) are preserved." + " These resources may include unused SageMaker models and endpoint" + " configurations that were associated with a prior version of the application" + " endpoint. Otherwise, if `--archive` is unspecified, these resources are" + " deleted. `--archive` must be specified when deploying asynchronously with" + " `--async`.".format( + mode_replace=mlflow.sagemaker.DEPLOYMENT_MODE_REPLACE))) @click.option("--instance-type", "-t", default=mlflow.sagemaker.DEFAULT_SAGEMAKER_INSTANCE_TYPE, help="The type of SageMaker ML instance on which to deploy the model. For a list of" " supported instance types, see" @@ -53,12 +60,28 @@ def commands(): " {supported_flavors}. If unspecified, a flavor will be automatically selected" " from the model's available flavors.".format( supported_flavors=mlflow.sagemaker.SUPPORTED_DEPLOYMENT_FLAVORS))) +@click.option("--async", "asynchronous", is_flag=True, + help=("If specified, this command will return immediately after starting the" + " deployment process. It will not wait for the deployment process to complete." + " The caller is responsible for monitoring the deployment process via native" + " SageMaker APIs or the AWS console.")) +@click.option("--timeout", default=1200, + help=("If the command is executed synchronously, the deployment process will return" + " after the specified number of seconds if no definitive result (success or" + " failure) is achieved. Once the function returns, the caller is responsible" + " for monitoring the health and status of the pending deployment via" + " native SageMaker APIs or the AWS console. If the command is executed" + " asynchronously using the `--async` flag, this value is ignored.")) def deploy(app_name, model_path, execution_role_arn, bucket, run_id, image_url, region_name, mode, - archive, instance_type, instance_count, vpc_config, flavor): + archive, instance_type, instance_count, vpc_config, flavor, asynchronous, timeout): """ Deploy model on Sagemaker as a REST API endpoint. Current active AWS account needs to have correct permissions setup. + By default, unless the ``--async`` flag is specified, this command will block until + either the deployment process completes (definitively succeeds or fails) or the specified + timeout elapses. + For more information about the input data formats accepted by the deployed REST API endpoint, see the following documentation: https://www.mlflow.org/docs/latest/models.html#sagemaker-deployment. @@ -71,7 +94,8 @@ def deploy(app_name, model_path, execution_role_arn, bucket, run_id, image_url, execution_role_arn=execution_role_arn, bucket=bucket, run_id=run_id, image_url=image_url, region_name=region_name, mode=mode, archive=archive, instance_type=instance_type, - instance_count=instance_count, vpc_config=vpc_config, flavor=flavor) + instance_count=instance_count, vpc_config=vpc_config, flavor=flavor, + synchronous=(not asynchronous), timeout_seconds=timeout) @commands.command("list-flavors") @@ -84,15 +108,36 @@ def list_flavors(): @click.option("--app-name", "-a", help="Application name", required=True) @click.option("--region-name", "-r", default="us-west-2", help="Name of the AWS region in which to deploy the application.") -@click.option("--archive", "-ar", is_flag=True, help="If specified, resources associated with" - " the application are preserved. Otherwise, these resources are deleted.") -def delete(app_name, region_name, archive): +@click.option("--archive", "-ar", is_flag=True, + help=("If specified, resources associated with the application are preserved." + " These resources may include unused SageMaker models and endpoint" + " configurations that were previously associated with the application endpoint." + " Otherwise, if `--archive` is unspecified, these resources are deleted." + " `--archive` must be specified when deleting asynchronously with `--async`.")) +@click.option("--async", "asynchronous", is_flag=True, + help=("If specified, this command will return immediately after starting the" + " deletion process. It will not wait for the deletion process to complete." + " The caller is responsible for monitoring the deletion process via native" + " SageMaker APIs or the AWS console.")) +@click.option("--timeout", default=1200, + help=("If the command is executed synchronously, the deployment process will return" + " after the specified number of seconds if no definitive result (success or" + " failure) is achieved. Once the function returns, the caller is responsible" + " for monitoring the health and status of the pending deployment via" + " native SageMaker APIs or the AWS console. If the command is executed" + " asynchronously using the `--async` flag, this value is ignored.")) +def delete(app_name, region_name, archive, asynchronous, timeout): """ - Delete the specified application. Unless ``archive`` is set to ``True``, all SageMaker resources + Delete the specified application. Unless ``--archive`` is specified, all SageMaker resources associated with the application are deleted as well. + + By default, unless the ``--async`` flag is specified, this command will block until + either the deletion process completes (definitively succeeds or fails) or the specified timeout + elapses. """ mlflow.sagemaker.delete( - app_name=app_name, region_name=region_name, archive=archive) + app_name=app_name, region_name=region_name, archive=archive, synchronous=(not asynchronous), + timeout_seconds=timeout) @commands.command("run-local") diff --git a/tests/sagemaker/test_deployment.py b/tests/sagemaker/test_deployment.py index f9fd87f2b778d..dd6df19cc46fc 100644 --- a/tests/sagemaker/test_deployment.py +++ b/tests/sagemaker/test_deployment.py @@ -9,7 +9,9 @@ import mlflow.pyfunc import mlflow.sklearn import mlflow.sagemaker as mfs +from mlflow.exceptions import MlflowException from mlflow.models import Model +from mlflow.protos.databricks_pb2 import ErrorCode, RESOURCE_DOES_NOT_EXIST, INVALID_PARAMETER_VALUE from mlflow.tracking.utils import _get_model_log_dir TrainedModel = namedtuple("TrainedModel", ["model_path", "run_id"]) @@ -28,36 +30,42 @@ def pretrained_model(): return TrainedModel(model_path, run_id) -def test_deployment_with_unsupported_flavor_throws_value_error(pretrained_model): +def test_deployment_with_unsupported_flavor_raises_exception(pretrained_model): unsupported_flavor = "this is not a valid flavor" - with pytest.raises(ValueError): + with pytest.raises(MlflowException) as exc: mfs.deploy(app_name="bad_flavor", model_path=pretrained_model.model_path, run_id=pretrained_model.run_id, flavor=unsupported_flavor) + assert exc.value.error_code == ErrorCode.Name(INVALID_PARAMETER_VALUE) -def test_deployment_with_missing_flavor_throws_value_error(pretrained_model): + +def test_deployment_with_missing_flavor_raises_exception(pretrained_model): missing_flavor = "mleap" - with pytest.raises(ValueError): + with pytest.raises(MlflowException) as exc: mfs.deploy(app_name="missing-flavor", model_path=pretrained_model.model_path, run_id=pretrained_model.run_id, flavor=missing_flavor) + assert exc.value.error_code == ErrorCode.Name(RESOURCE_DOES_NOT_EXIST) + -def test_deployment_of_model_with_no_supported_flavors_throws_value_error(pretrained_model): +def test_deployment_of_model_with_no_supported_flavors_raises_exception(pretrained_model): logged_model_path = _get_model_log_dir(pretrained_model.model_path, pretrained_model.run_id) model_config_path = os.path.join(logged_model_path, "MLmodel") model_config = Model.load(model_config_path) del model_config.flavors[mlflow.pyfunc.FLAVOR_NAME] model_config.save(path=model_config_path) - with pytest.raises(ValueError): + with pytest.raises(MlflowException) as exc: mfs.deploy(app_name="missing-flavor", model_path=logged_model_path, flavor=None) + assert exc.value.error_code == ErrorCode.Name(RESOURCE_DOES_NOT_EXIST) + def test_validate_deployment_flavor_validates_python_function_flavor_successfully( pretrained_model): From 0a31c6513ec1d9181bde83be30e18abac5010c48 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Thu, 22 Nov 2018 01:21:19 -0800 Subject: [PATCH 060/483] Test infrastructure for SageMaker (#718) * Add SparkJava plugin * Add MLeap flavor and modify SparkML module to use it * Fixes * Add mleap * Import model in test * Import mleap * Add missing assert * Reorder spark session creation params in test * Docs fix * revert pom xml change * remove java * Add standalone to mleap * Import fix * Add docs and * Add warning about py incompatibility * Address comments * Code spacing fix * Revert log test changes * Whitespace fixes * Exception import fixes * Fix lint issues * Fix method call * callfix * Remove unused imports * Py4j log level fix * reorder tests * testfix * test fixes * Spacing fix * lint fixes * Add mleap schema test * Fix test * Whitespace fix * Test fix * Bump version to 0.5.3dev0 * Update container + build function to support MLeap * Fix lint errors * Install maven * Test support infra * Fixws * Add tests * Path fixes * line fix * Lint fixes * Revert scoring server * Update test asserts, remove unused file * Specify server port * Add mock for sagemaker functions that we use * Sigquit >> sigterm * accept any version of mlflow jar * Address some comments, fix bug in scoring server argument parsing (whoops :/), add support for specifying deployment flavor * Address comments * Update ScoringServer.java * Update ScoringServer.java * Update __init__.py * varfix * Revert tempdir changes * Mark test as large * Use sagemaker env var instead of file upload * Parameter fixes * CLI fixes * CLI Fixes * CLI support, tests * Make linter happy * Fix serving command * Name change for get_serving_flavor * Address comments * Make linter happy * Address comments * Add cli command and refactor flavor selection/validation * Test fixes * Add print statements * Varfix * Run local in shell to get docker env var successfully * Lint fix * Iteration fix * Deployment env var fixes for local serving * Sagemaker mock progress * Rename service mock * Mock test * Lint * Revert extraneous files * Revert * Tests * Mock tests and fixes * Better test coverage * Update test * Docs * Revert examples * Use mocks in real tests * Lint * lint * Add mocks test * Lint * Unpin moto and boto * Fix doc spacing * Add mock boto credentials * Fix tests * Lint * Test fix * Lint * Check more specific exception * Wraps fix * Lint fix * Remove needless encoding --- .travis.yml | 1 + test-requirements.txt | 5 +- tests/sagemaker/mock/__init__.py | 628 ++++++++++++++++++ tests/sagemaker/mock/mock_sagemaker_urls.py | 9 + .../mock/test_sagemaker_service_mock.py | 521 +++++++++++++++ tests/sagemaker/test_deployment.py | 100 +++ 6 files changed, 1261 insertions(+), 3 deletions(-) create mode 100644 tests/sagemaker/mock/__init__.py create mode 100644 tests/sagemaker/mock/mock_sagemaker_urls.py create mode 100644 tests/sagemaker/mock/test_sagemaker_service_mock.py diff --git a/.travis.yml b/.travis.yml index 1d7946b7a9179..66f6f48ec429e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -99,6 +99,7 @@ script: - pytest --verbose tests/pytorch --large - pytest --verbose tests/pyfunc --large - pytest --verbose tests/sagemaker --large + - pytest --verbose tests/sagemaker/mock --large - pytest --verbose tests/sklearn --large - pytest --verbose tests/spark --large - pytest --verbose tests/tensorflow --large diff --git a/test-requirements.txt b/test-requirements.txt index 96c6df93f1784..993a9c9aa9972 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -2,10 +2,9 @@ azure-storage google-cloud-storage h2o -# TODO: don't pin boto version once https://github.com/spulec/moto/issues/1793 is addressed -boto3==1.7.84 +boto3 mock==2.0.0 -moto==1.3.4 +moto prospector[with_pyroma]==0.12.7 pep8==1.7.1 pyarrow diff --git a/tests/sagemaker/mock/__init__.py b/tests/sagemaker/mock/__init__.py new file mode 100644 index 0000000000000..d2ea56a0d2ac2 --- /dev/null +++ b/tests/sagemaker/mock/__init__.py @@ -0,0 +1,628 @@ +from __future__ import absolute_import + +import json +from collections import namedtuple +from datetime import datetime + +from moto.core import BaseBackend, BaseModel +from moto.core.responses import BaseResponse +from moto.ec2 import ec2_backends + +from moto.iam.models import ACCOUNT_ID +from moto.core.models import base_decorator, deprecated_base_decorator + +SageMakerResourceWithArn = namedtuple("SageMakerResourceWithArn", ["resource", "arn"]) + + +class SageMakerResponse(BaseResponse): + """ + A collection of handlers for SageMaker API calls that produce API-conforming + JSON responses. + """ + + @property + def sagemaker_backend(self): + return sagemaker_backends[self.region] + + @property + def request_params(self): + return json.loads(self.body) + + def create_endpoint_config(self): + """ + Handler for the SageMaker "CreateEndpointConfig" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html. + """ + config_name = self.request_params["EndpointConfigName"] + production_variants = self.request_params.get("ProductionVariants") + tags = self.request_params.get("Tags", []) + new_config = self.sagemaker_backend.create_endpoint_config( + config_name=config_name, production_variants=production_variants, tags=tags, + region_name=self.region) + return json.dumps({ + 'EndpointConfigArn': new_config.arn + }) + + def describe_endpoint_config(self): + """ + Handler for the SageMaker "DescribeEndpoint" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeEndpoint.html. + """ + config_name = self.request_params["EndpointConfigName"] + config_description = self.sagemaker_backend.describe_endpoint_config(config_name) + return json.dumps(config_description.response_object) + + def delete_endpoint_config(self): + """ + Handler for the SageMaker "DeleteEndpointConfig" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DeleteEndpointConfig.html. + """ + config_name = self.request_params["EndpointConfigName"] + self.sagemaker_backend.delete_endpoint_config(config_name) + return "" + + def create_endpoint(self): + """ + Handler for the SageMaker "CreateEndpoint" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpoint.html. + """ + endpoint_name = self.request_params["EndpointName"] + endpoint_config_name = self.request_params["EndpointConfigName"] + tags = self.request_params.get("Tags", []) + new_endpoint = self.sagemaker_backend.create_endpoint( + endpoint_name=endpoint_name, + endpoint_config_name=endpoint_config_name, + tags=tags, region_name=self.region) + return json.dumps({ + 'EndpointArn': new_endpoint.arn + }) + + def describe_endpoint(self): + """ + Handler for the SageMaker "DescribeEndpoint" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeEndpoint.html. + """ + endpoint_name = self.request_params["EndpointName"] + endpoint_description = self.sagemaker_backend.describe_endpoint(endpoint_name) + return json.dumps(endpoint_description.response_object) + + def update_endpoint(self): + """ + Handler for the SageMaker "UpdateEndpoint" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_UpdateEndpoint.html. + """ + endpoint_name = self.request_params["EndpointName"] + new_config_name = self.request_params["EndpointConfigName"] + updated_endpoint = self.sagemaker_backend.update_endpoint( + endpoint_name=endpoint_name, new_config_name=new_config_name) + return json.dumps({ + 'EndpointArn': updated_endpoint.arn + }) + + def delete_endpoint(self): + """ + Handler for the SageMaker "DeleteEndpoint" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DeleteEndpoint.html. + """ + endpoint_name = self.request_params["EndpointName"] + self.sagemaker_backend.delete_endpoint(endpoint_name) + return "" + + def list_endpoints(self): + """ + Handler for the SageMaker "ListEndpoints" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListEndpoints.html. + + This function does not support pagination. All endpoint configs are returned in a + single response. + """ + endpoint_summaries = self.sagemaker_backend.list_endpoints() + return json.dumps({ + 'Endpoints': [summary.response_object for summary in endpoint_summaries] + }) + + def list_endpoint_configs(self): + """ + Handler for the SageMaker "ListEndpointConfigs" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListEndpointConfigs.html. + + This function does not support pagination. All endpoint configs are returned in a + single response. + """ + # Note: + endpoint_config_summaries = self.sagemaker_backend.list_endpoint_configs() + return json.dumps({ + 'EndpointConfigs': [summary.response_object for summary in endpoint_config_summaries] + }) + + def list_models(self): + """ + Handler for the SageMaker "ListModels" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListModels.html. + + This function does not support pagination. All endpoint configs are returned in a + single response. + """ + model_summaries = self.sagemaker_backend.list_models() + return json.dumps({ + 'Models': [summary.response_object for summary in model_summaries] + }) + + def create_model(self): + """ + Handler for the SageMaker "CreateModel" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateModel.html. + """ + model_name = self.request_params["ModelName"] + primary_container = self.request_params["PrimaryContainer"] + execution_role_arn = self.request_params["ExecutionRoleArn"] + tags = self.request_params.get("Tags", []) + vpc_config = self.request_params.get("VpcConfig", None) + new_model = self.sagemaker_backend.create_model( + model_name=model_name, primary_container=primary_container, + execution_role_arn=execution_role_arn, tags=tags, vpc_config=vpc_config, + region_name=self.region) + return json.dumps({ + 'ModelArn': new_model.arn + }) + + def describe_model(self): + """ + Handler for the SageMaker "DescribeModel" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeModel.html. + """ + model_name = self.request_params["ModelName"] + model_description = self.sagemaker_backend.describe_model(model_name) + return json.dumps(model_description.response_object) + + def delete_model(self): + """ + Handler for the SageMaker "DeleteModel" API call documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DeleteModel.html. + """ + model_name = self.request_params["ModelName"] + self.sagemaker_backend.delete_model(model_name) + return "" + + +class SageMakerBackend(BaseBackend): + """ + A mock backend for managing and exposing SageMaker resource state. + """ + + BASE_SAGEMAKER_ARN = "arn:aws:sagemaker:{region_name}:{account_id}:" + + def __init__(self): + self.models = {} + self.endpoints = {} + self.endpoint_configs = {} + + @property + def _url_module(self): + """ + Required override from the Moto "BaseBackend" object that reroutes requests from the + specified SageMaker URLs to the mocked SageMaker backend. + """ + urls_module_name = "tests.sagemaker.mock.mock_sagemaker_urls" + urls_module = __import__(urls_module_name, fromlist=['url_bases', 'url_paths']) + return urls_module + + def _get_base_arn(self, region_name): + """ + :return: A SageMaker ARN prefix that can be prepended to a resource name. + """ + return SageMakerBackend.BASE_SAGEMAKER_ARN.format( + region_name=region_name, account_id=ACCOUNT_ID) + + def create_endpoint_config(self, config_name, production_variants, tags, region_name): + """ + Modifies backend state during calls to the SageMaker "CreateEndpointConfig" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpointConfig.html. + """ + if config_name in self.endpoint_configs: + raise ValueError("Attempted to create an endpoint configuration with name:" + " {config_name}, but an endpoint configuration with this" + " name already exists.".format(config_name=config_name)) + for production_variant in production_variants: + if "ModelName" not in production_variant: + raise ValueError("Production variant must specify a model name.") + elif production_variant["ModelName"] not in self.models: + raise ValueError( + "Production variant specifies a model name that does not exist" + " Model name: '{model_name}'".format( + model_name=production_variant["ModelName"])) + + new_config = EndpointConfig(config_name=config_name, + production_variants=production_variants, + tags=tags) + new_config_arn = self._get_base_arn(region_name=region_name) + new_config.arn_descriptor + new_resource = SageMakerResourceWithArn(resource=new_config, arn=new_config_arn) + self.endpoint_configs[config_name] = new_resource + return new_resource + + def describe_endpoint_config(self, config_name): + """ + Modifies backend state during calls to the SageMaker "DescribeEndpointConfig" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeEndpointConfig.html. + """ + if config_name not in self.endpoint_configs: + raise ValueError("Attempted to describe an endpoint config with name: `{config_name}`" + " that does not exist.".format(config_name=config_name)) + + config = self.endpoint_configs[config_name] + return EndpointConfigDescription(config=config.resource, arn=config.arn) + + def delete_endpoint_config(self, config_name): + """ + Modifies backend state during calls to the SageMaker "DeleteEndpointConfig" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DeleteEndpointConfig.html. + """ + if config_name not in self.endpoint_configs: + raise ValueError("Attempted to delete an endpoint config with name: `{config_name}`" + " that does not exist.".format(config_name=config_name)) + + del self.endpoint_configs[config_name] + + def create_endpoint(self, endpoint_name, endpoint_config_name, tags, region_name): + """ + Modifies backend state during calls to the SageMaker "CreateEndpoint" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateEndpoint.html. + """ + if endpoint_name in self.endpoints: + raise ValueError("Attempted to create an endpoint with name: `{endpoint_name}`" + " but an endpoint with this name already exists.".format( + endpoint_name=endpoint_name)) + + if endpoint_config_name not in self.endpoint_configs: + raise ValueError("Attempted to create an endpoint with a configuration named:" + " `{config_name}` However, this configuration does not exist.".format( + config_name=endpoint_config_name)) + + new_endpoint = Endpoint(endpoint_name=endpoint_name, config_name=endpoint_config_name, + tags=tags) + new_endpoint_arn = self._get_base_arn(region_name=region_name) + new_endpoint.arn_descriptor + new_resource = SageMakerResourceWithArn(resource=new_endpoint, arn=new_endpoint_arn) + self.endpoints[endpoint_name] = new_resource + return new_resource + + def describe_endpoint(self, endpoint_name): + """ + Modifies backend state during calls to the SageMaker "DescribeEndpoint" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeEndpoint.html. + """ + if endpoint_name not in self.endpoints: + raise ValueError("Attempted to describe an endpoint with name: `{endpoint_name}`" + " that does not exist.".format(endpoint_name=endpoint_name)) + + endpoint = self.endpoints[endpoint_name] + config = self.endpoint_configs[endpoint.resource.config_name] + return EndpointDescription( + endpoint=endpoint.resource, config=config.resource, arn=endpoint.arn) + + def update_endpoint(self, endpoint_name, new_config_name): + """ + Modifies backend state during calls to the SageMaker "UpdateEndpoint" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_UpdateEndpoint.html. + """ + if endpoint_name not in self.endpoints: + raise ValueError("Attempted to update an endpoint with name: `{endpoint_name}`" + " that does not exist.".format(endpoint_name=endpoint_name)) + + if new_config_name not in self.endpoint_configs: + raise ValueError("Attempted to update an endpoint named `{endpoint_name}` with a new" + " configuration named: `{config_name}`. However, this configuration" + " does not exist.".format( + endpoint_name=endpoint_name, config_name=new_config_name)) + + endpoint = self.endpoints[endpoint_name] + endpoint.resource.config_name = new_config_name + return endpoint + + def delete_endpoint(self, endpoint_name): + """ + Modifies backend state during calls to the SageMaker "DeleteEndpoint" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DeleteEndpoint.html. + """ + if endpoint_name not in self.endpoints: + raise ValueError("Attempted to delete an endpoint with name: `{endpoint_name}`" + " that does not exist.".format(endpoint_name=endpoint_name)) + + del self.endpoints[endpoint_name] + + def list_endpoints(self): + """ + Modifies backend state during calls to the SageMaker "ListEndpoints" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListEndpoints.html. + """ + summaries = [] + for _, endpoint in self.endpoints.items(): + summary = EndpointSummary(endpoint=endpoint.resource, arn=endpoint.arn) + summaries.append(summary) + return summaries + + def list_endpoint_configs(self): + """ + Modifies backend state during calls to the SageMaker "ListEndpointConfigs" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListEndpointConfigs.html. + """ + summaries = [] + for _, endpoint_config in self.endpoint_configs.items(): + summary = EndpointConfigSummary( + config=endpoint_config.resource, arn=endpoint_config.arn) + summaries.append(summary) + return summaries + + def list_models(self): + """ + Modifies backend state during calls to the SageMaker "ListModels" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListModels.html. + """ + summaries = [] + for _, model in self.models.items(): + summary = ModelSummary(model=model.resource, arn=model.arn) + summaries.append(summary) + return summaries + + def create_model(self, model_name, primary_container, execution_role_arn, tags, region_name, + vpc_config=None): + """ + Modifies backend state during calls to the SageMaker "CreateModel" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateModel.html. + """ + if model_name in self.models: + raise ValueError("Attempted to create a model with name: `{model_name}`" + " but a model with this name already exists.".format( + model_name=model_name)) + + new_model = Model(model_name=model_name, primary_container=primary_container, + execution_role_arn=execution_role_arn, tags=tags, vpc_config=vpc_config) + new_model_arn = self._get_base_arn(region_name=region_name) + new_model.arn_descriptor + new_resource = SageMakerResourceWithArn(resource=new_model, arn=new_model_arn) + self.models[model_name] = new_resource + return new_resource + + def describe_model(self, model_name): + """ + Modifies backend state during calls to the SageMaker "DescribeModel" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeModel.html. + """ + if model_name not in self.models: + raise ValueError("Attempted to describe a model with name: `{model_name}`" + " that does not exist.".format(model_name=model_name)) + + model = self.models[model_name] + return ModelDescription(model=model.resource, arn=model.arn) + + def delete_model(self, model_name): + """ + Modifies backend state during calls to the SageMaker "DeleteModel" API + documented here: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DeleteModel.html. + """ + if model_name not in self.models: + raise ValueError("Attempted to delete an model with name: `{model_name}`" + " that does not exist.".format(model_name=model_name)) + + del self.models[model_name] + + +class TimestampedResource(BaseModel): + + TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" + + def __init__(self): + curr_time = datetime.now().strftime(TimestampedResource.TIMESTAMP_FORMAT) + self.creation_time = curr_time + self.last_modified_time = curr_time + + +class Endpoint(TimestampedResource): + """ + Object representing a SageMaker endpoint. The SageMakerBackend will create + and manage Endpoints. + """ + + STATUS_IN_SERVICE = "InService" + STATUS_FAILED = "Failed" + + def __init__(self, endpoint_name, config_name, tags): + super(Endpoint, self).__init__() + self.endpoint_name = endpoint_name + self.config_name = config_name + self.tags = tags + self.status = Endpoint.STATUS_IN_SERVICE + + @property + def arn_descriptor(self): + return ":endpoint/{endpoint_name}".format(endpoint_name=self.endpoint_name) + + +class EndpointSummary: + """ + Object representing an endpoint entry in the endpoints list returned by + SageMaker's "ListEndpoints" API: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListEndpoints.html. + """ + + def __init__(self, endpoint, arn): + self.endpoint = endpoint + self.arn = arn + + @property + def response_object(self): + response = { + 'EndpointName': self.endpoint.endpoint_name, + 'CreationTime': self.endpoint.creation_time, + 'LastModifiedTime': self.endpoint.last_modified_time, + 'EndpointStatus': self.endpoint.status, + 'EndpointArn': self.arn, + } + return response + + +class EndpointDescription: + """ + Object representing an endpoint description returned by SageMaker's + "DescribeEndpoint" API: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeEndpoint.html. + """ + + def __init__(self, endpoint, config, arn): + self.endpoint = endpoint + self.config = config + self.arn = arn + + @property + def response_object(self): + response = { + 'EndpointName': self.endpoint.endpoint_name, + 'EndpointArn': self.arn, + 'EndpointConfigName': self.endpoint.config_name, + 'ProductionVariants': self.config.production_variants, + 'EndpointStatus': self.endpoint.status, + 'CreationTime': self.endpoint.creation_time, + 'LastModifiedTime': self.endpoint.last_modified_time, + } + return response + + +class EndpointConfig(TimestampedResource): + """ + Object representing a SageMaker endpoint configuration. The SageMakerBackend will create + and manage EndpointConfigs. + """ + + def __init__(self, config_name, production_variants, tags): + super(EndpointConfig, self).__init__() + self.config_name = config_name + self.production_variants = production_variants + self.tags = tags + + @property + def arn_descriptor(self): + return ":endpoint-config/{config_name}".format(config_name=self.config_name) + + +class EndpointConfigSummary: + """ + Object representing an endpoint configuration entry in the configurations list returned by + SageMaker's "ListEndpointConfigs" API: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListEndpointConfigs.html. + """ + + def __init__(self, config, arn): + self.config = config + self.arn = arn + + @property + def response_object(self): + response = { + 'EndpointConfigName': self.config.config_name, + 'EndpointArn': self.arn, + 'CreationTime': self.config.creation_time, + } + return response + + +class EndpointConfigDescription: + """ + Object representing an endpoint configuration description returned by SageMaker's + "DescribeEndpointConfig" API: + https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeEndpointConfig.html. + """ + + def __init__(self, config, arn): + self.config = config + self.arn = arn + + @property + def response_object(self): + response = { + 'EndpointConfigName': self.config.config_name, + 'EndpointConfigArn': self.arn, + 'ProductionVariants': self.config.production_variants, + 'CreationTime': self.config.creation_time, + } + return response + + +class Model(TimestampedResource): + """ + Object representing a SageMaker model. The SageMakerBackend will create and manage Models. + """ + + def __init__(self, model_name, primary_container, execution_role_arn, tags, vpc_config): + super(Model, self).__init__() + self.model_name = model_name + self.primary_container = primary_container + self.execution_role_arn = execution_role_arn + self.tags = tags + self.vpc_config = vpc_config + + @property + def arn_descriptor(self): + return ":model/{model_name}".format(model_name=self.model_name) + + +class ModelSummary: + """ + Object representing a model entry in the models list returned by SageMaker's + "ListModels" API: https://docs.aws.amazon.com/sagemaker/latest/dg/API_ListModels.html. + """ + + def __init__(self, model, arn): + self.model = model + self.arn = arn + + @property + def response_object(self): + response = { + 'ModelArn': self.arn, + 'ModelName': self.model.model_name, + 'CreationTime': self.model.creation_time, + } + return response + + +class ModelDescription: + """ + Object representing a model description returned by SageMaker's + "DescribeModel" API: https://docs.aws.amazon.com/sagemaker/latest/dg/API_DescribeModel.html. + """ + + def __init__(self, model, arn): + self.model = model + self.arn = arn + + @property + def response_object(self): + response = { + 'ModelArn': self.arn, + 'ModelName': self.model.model_name, + 'PrimaryContainer': self.model.primary_container, + 'ExecutionRoleArn': self.model.execution_role_arn, + 'VpcConfig': self.model.vpc_config if self.model.vpc_config else {}, + 'CreationTime': self.model.creation_time, + } + return response + + +# Create a SageMaker backend for each EC2 region +sagemaker_backends = {} +for region, ec2_backend in ec2_backends.items(): + new_backend = SageMakerBackend() + sagemaker_backends[region] = new_backend + +mock_sagemaker = base_decorator(sagemaker_backends) diff --git a/tests/sagemaker/mock/mock_sagemaker_urls.py b/tests/sagemaker/mock/mock_sagemaker_urls.py new file mode 100644 index 0000000000000..f0ffb75c3a046 --- /dev/null +++ b/tests/sagemaker/mock/mock_sagemaker_urls.py @@ -0,0 +1,9 @@ +from tests.sagemaker.mock import SageMakerResponse + +url_bases = [ + "https?://api.sagemaker.(.+).amazonaws.com", +] + +url_paths = { + '{0}/$': SageMakerResponse.dispatch, +} diff --git a/tests/sagemaker/mock/test_sagemaker_service_mock.py b/tests/sagemaker/mock/test_sagemaker_service_mock.py new file mode 100644 index 0000000000000..7ff97acda4816 --- /dev/null +++ b/tests/sagemaker/mock/test_sagemaker_service_mock.py @@ -0,0 +1,521 @@ +import os + +import boto3 +import pytest + +from tests.sagemaker.mock import mock_sagemaker + + +@pytest.fixture(scope='session', autouse=True) +def set_boto_credentials(): + os.environ["AWS_ACCESS_KEY_ID"] = "NotARealAccessKey" + os.environ["AWS_SECRET_ACCESS_KEY"] = "NotARealSecretAccessKey" + os.environ["AWS_SESSION_TOKEN"] = "NotARealSessionToken" + + +@pytest.fixture +def sagemaker_client(): + return boto3.client("sagemaker", region_name="us-west-2") + + +def create_sagemaker_model(sagemaker_client, model_name): + return sagemaker_client.create_model( + ExecutionRoleArn='arn:aws:iam::012345678910:role/sample-role', + ModelName=model_name, + PrimaryContainer={ + 'Image': '012345678910.dkr.ecr.us-west-2.amazonaws.com/sample-container', + } + ) + + +def create_endpoint_config(sagemaker_client, endpoint_config_name, model_name): + return sagemaker_client.create_endpoint_config( + EndpointConfigName=endpoint_config_name, + ProductionVariants=[ + { + 'VariantName': 'sample-variant', + 'ModelName': model_name, + 'InitialInstanceCount': 1, + 'InstanceType': 'ml.m4.xlarge', + 'InitialVariantWeight': 1.0, + }, + ], + ) + + +@mock_sagemaker +def test_created_model_is_listed_by_list_models_function(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model( + sagemaker_client=sagemaker_client, model_name=model_name) + + models_response = sagemaker_client.list_models() + assert "Models" in models_response + models = models_response["Models"] + assert all(["ModelName" in model for model in models]) + assert model_name in [model["ModelName"] for model in models] + + +@mock_sagemaker +def test_create_model_returns_arn_containing_model_name(sagemaker_client): + model_name = "sample-model" + model_create_response = create_sagemaker_model( + sagemaker_client=sagemaker_client, model_name=model_name) + assert "ModelArn" in model_create_response + assert model_name in model_create_response["ModelArn"] + + +@mock_sagemaker +def test_creating_model_with_name_already_in_use_raises_exception(sagemaker_client): + model_name = "sample-model-name" + + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + with pytest.raises(ValueError): + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + +@mock_sagemaker +def test_all_models_are_listed_after_creating_many_models(sagemaker_client): + model_names = [] + + for i in range(100): + model_name = "sample-model-{idx}".format(idx=i) + model_names.append(model_name) + + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + listed_models = sagemaker_client.list_models()["Models"] + listed_model_names = [model["ModelName"] for model in listed_models] + for model_name in model_names: + assert model_name in listed_model_names + + +@mock_sagemaker +def test_describe_model_response_contains_expected_attributes(sagemaker_client): + model_name = "sample-model" + execution_role_arn = "arn:aws:iam::012345678910:role/sample-role" + primary_container = { + "Image": "012345678910.dkr.ecr.us-west-2.amazonaws.com/sample-container", + } + + sagemaker_client.create_model( + ModelName=model_name, + ExecutionRoleArn=execution_role_arn, + PrimaryContainer=primary_container, + ) + + describe_model_response = sagemaker_client.describe_model(ModelName=model_name) + assert "CreationTime" in describe_model_response + assert "ModelArn" in describe_model_response + assert "ExecutionRoleArn" in describe_model_response + assert describe_model_response["ExecutionRoleArn"] == execution_role_arn + assert "ModelName" in describe_model_response + assert describe_model_response["ModelName"] == model_name + assert "PrimaryContainer" in describe_model_response + assert describe_model_response["PrimaryContainer"] == primary_container + + +@mock_sagemaker +def test_describe_model_throws_exception_for_nonexistent_model(sagemaker_client): + with pytest.raises(ValueError): + sagemaker_client.describe_model(ModelName="nonexistent-model") + + +@mock_sagemaker +def test_model_is_no_longer_listed_after_deletion(sagemaker_client): + model_name = "sample-model-name" + + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + sagemaker_client.delete_model(ModelName=model_name) + + listed_models = sagemaker_client.list_models()["Models"] + listed_model_names = [model["ModelName"] for model in listed_models] + assert model_name not in listed_model_names + + +@mock_sagemaker +def test_created_endpoint_config_is_listed_by_list_endpoints_function(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + endpoint_configs_response = sagemaker_client.list_endpoint_configs() + assert "EndpointConfigs" in endpoint_configs_response + endpoint_configs = endpoint_configs_response["EndpointConfigs"] + assert all([ + "EndpointConfigName" in endpoint_config for endpoint_config in endpoint_configs]) + assert endpoint_config_name in [ + endpoint_config["EndpointConfigName"] for endpoint_config in endpoint_configs + ] + + +@mock_sagemaker +def test_create_endpoint_config_returns_arn_containing_config_name( + sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_config_response = create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + assert "EndpointConfigArn" in create_config_response + assert endpoint_config_name in create_config_response["EndpointConfigArn"] + + +@mock_sagemaker +def test_creating_endpoint_config_with_name_already_in_use_raises_exception(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + with pytest.raises(ValueError): + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + +@mock_sagemaker +def test_all_endpoint_configs_are_listed_after_creating_many_configs(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + endpoint_config_names = [] + + for i in range(100): + endpoint_config_name = "sample-config-{idx}".format(idx=i) + endpoint_config_names.append(endpoint_config_name) + + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + listed_endpoint_configs = sagemaker_client.list_endpoint_configs()["EndpointConfigs"] + listed_endpoint_config_names = [ + endpoint_config["EndpointConfigName"] + for endpoint_config in listed_endpoint_configs] + for endpoint_config_name in endpoint_config_names: + assert endpoint_config_name in listed_endpoint_config_names + + +@mock_sagemaker +def test_describe_endpoint_config_response_contains_expected_attributes(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + production_variants = [ + { + 'VariantName': 'sample-variant', + 'ModelName': model_name, + 'InitialInstanceCount': 1, + 'InstanceType': 'ml.m4.xlarge', + 'InitialVariantWeight': 1.0, + }, + ] + sagemaker_client.create_endpoint_config( + EndpointConfigName=endpoint_config_name, + ProductionVariants=production_variants, + ) + + describe_endpoint_config_response = sagemaker_client.describe_endpoint_config( + EndpointConfigName=endpoint_config_name) + assert "CreationTime" in describe_endpoint_config_response + assert "EndpointConfigArn" in describe_endpoint_config_response + assert "EndpointConfigName" in describe_endpoint_config_response + assert describe_endpoint_config_response["EndpointConfigName"] == endpoint_config_name + assert "ProductionVariants" in describe_endpoint_config_response + assert describe_endpoint_config_response["ProductionVariants"] == production_variants + + +@mock_sagemaker +def test_describe_endpoint_config_throws_exception_for_nonexistent_config(sagemaker_client): + with pytest.raises(ValueError): + sagemaker_client.describe_endpoint_config(EndpointConfigName="nonexistent-config") + + +@mock_sagemaker +def test_endpoint_config_is_no_longer_listed_after_deletion(sagemaker_client): + model_name = "sample-model-name" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + sagemaker_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name) + + listed_endpoint_configs = sagemaker_client.list_endpoint_configs()["EndpointConfigs"] + listed_endpoint_config_names = [ + endpoint_config["EndpointConfigName"] for endpoint_config in listed_endpoint_configs + ] + assert endpoint_config_name not in listed_endpoint_config_names + + +@mock_sagemaker +def test_created_endpoint_is_listed_by_list_endpoints_function(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + endpoint_name = "sample-endpoint" + + sagemaker_client.create_endpoint( + EndpointConfigName=endpoint_config_name, + EndpointName=endpoint_name, + Tags=[ + { + "Key": "Some Key", + "Value": "Some Value", + }, + ], + ) + + endpoints_response = sagemaker_client.list_endpoints() + assert "Endpoints" in endpoints_response + endpoints = endpoints_response["Endpoints"] + assert all(["EndpointName" in endpoint for endpoint in endpoints]) + assert endpoint_name in [endpoint["EndpointName"] for endpoint in endpoints] + + +@mock_sagemaker +def test_create_endpoint_returns_arn_containing_endpoint_name( + sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + endpoint_name = "sample-endpoint" + + create_endpoint_response = sagemaker_client.create_endpoint( + EndpointConfigName=endpoint_config_name, + EndpointName=endpoint_name, + Tags=[ + { + "Key": "Some Key", + "Value": "Some Value", + }, + ], + ) + + assert "EndpointArn" in create_endpoint_response + assert endpoint_name in create_endpoint_response["EndpointArn"] + + +@mock_sagemaker +def test_creating_endpoint_with_name_already_in_use_raises_exception(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + endpoint_name = "sample-endpoint" + + sagemaker_client.create_endpoint( + EndpointConfigName=endpoint_config_name, + EndpointName=endpoint_name, + Tags=[ + { + "Key": "Some Key", + "Value": "Some Value", + }, + ], + ) + + with pytest.raises(ValueError): + sagemaker_client.create_endpoint( + EndpointConfigName=endpoint_config_name, + EndpointName=endpoint_name, + Tags=[ + { + "Key": "Some Key", + "Value": "Some Value", + }, + ], + ) + + +@mock_sagemaker +def test_all_endpoint_are_listed_after_creating_many_endpoints(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + endpoint_names = [] + + for i in range(100): + endpoint_name = "sample-endpoint-{idx}".format(idx=i) + endpoint_names.append(endpoint_name) + + sagemaker_client.create_endpoint( + EndpointConfigName=endpoint_config_name, + EndpointName=endpoint_name, + Tags=[ + { + "Key": "Some Key", + "Value": "Some Value", + }, + ], + ) + + listed_endpoints = sagemaker_client.list_endpoints()["Endpoints"] + listed_endpoint_names = [endpoint["EndpointName"] for endpoint in listed_endpoints] + for endpoint_name in endpoint_names: + assert endpoint_name in listed_endpoint_names + + +@mock_sagemaker +def test_describe_endpoint_response_contains_expected_attributes(sagemaker_client): + model_name = "sample-model" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + production_variants = [ + { + 'VariantName': 'sample-variant', + 'ModelName': model_name, + 'InitialInstanceCount': 1, + 'InstanceType': 'ml.m4.xlarge', + 'InitialVariantWeight': 1.0, + }, + ] + sagemaker_client.create_endpoint_config( + EndpointConfigName=endpoint_config_name, + ProductionVariants=production_variants, + ) + + endpoint_name = "sample-endpoint" + sagemaker_client.create_endpoint( + EndpointName=endpoint_name, + EndpointConfigName=endpoint_config_name, + ) + + describe_endpoint_response = sagemaker_client.describe_endpoint(EndpointName=endpoint_name) + assert "CreationTime" in describe_endpoint_response + assert "LastModifiedTime" in describe_endpoint_response + assert "EndpointArn" in describe_endpoint_response + assert "EndpointStatus" in describe_endpoint_response + assert "ProductionVariants" in describe_endpoint_response + + +@mock_sagemaker +def test_describe_endpoint_throws_exception_for_nonexistent_endpoint(sagemaker_client): + with pytest.raises(ValueError): + sagemaker_client.describe_endpoint(EndpointName="nonexistent-endpoint") + + +@mock_sagemaker +def test_endpoint_is_no_longer_listed_after_deletion(sagemaker_client): + model_name = "sample-model-name" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + endpoint_name = "sample-endpoint" + sagemaker_client.create_endpoint( + EndpointConfigName=endpoint_config_name, + EndpointName=endpoint_name, + ) + + sagemaker_client.delete_endpoint(EndpointName=endpoint_name) + + listed_endpoints = sagemaker_client.list_endpoints()["Endpoints"] + listed_endpoint_names = [endpoint["EndpointName"] for endpoint in listed_endpoints] + assert endpoint_name not in listed_endpoint_names + + +@mock_sagemaker +def test_update_endpoint_modifies_config_correctly(sagemaker_client): + model_name = "sample-model-name" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + first_endpoint_config_name = "sample-config-1" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=first_endpoint_config_name, + model_name=model_name) + + second_endpoint_config_name = "sample-config-2" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=second_endpoint_config_name, + model_name=model_name) + + endpoint_name = "sample-endpoint" + sagemaker_client.create_endpoint( + EndpointConfigName=first_endpoint_config_name, + EndpointName=endpoint_name, + ) + + first_describe_endpoint_response = sagemaker_client.describe_endpoint( + EndpointName=endpoint_name) + assert first_describe_endpoint_response["EndpointConfigName"] == first_endpoint_config_name + + sagemaker_client.update_endpoint( + EndpointName=endpoint_name, EndpointConfigName=second_endpoint_config_name) + + second_describe_endpoint_response = sagemaker_client.describe_endpoint( + EndpointName=endpoint_name) + assert second_describe_endpoint_response["EndpointConfigName"] == second_endpoint_config_name + + +@mock_sagemaker +def test_update_endpoint_with_nonexistent_config_throws_exception(sagemaker_client): + model_name = "sample-model-name" + create_sagemaker_model(sagemaker_client=sagemaker_client, model_name=model_name) + + endpoint_config_name = "sample-config" + create_endpoint_config( + sagemaker_client=sagemaker_client, + endpoint_config_name=endpoint_config_name, + model_name=model_name) + + endpoint_name = "sample-endpoint" + sagemaker_client.create_endpoint( + EndpointConfigName=endpoint_config_name, + EndpointName=endpoint_name, + ) + + with pytest.raises(ValueError): + sagemaker_client.update_endpoint( + EndpointName=endpoint_name, EndpointConfigName="nonexistent-config") diff --git a/tests/sagemaker/test_deployment.py b/tests/sagemaker/test_deployment.py index dd6df19cc46fc..d0b60c3ff0220 100644 --- a/tests/sagemaker/test_deployment.py +++ b/tests/sagemaker/test_deployment.py @@ -2,6 +2,7 @@ import pytest from collections import namedtuple +import boto3 import numpy as np from sklearn.linear_model import LogisticRegression @@ -30,6 +31,58 @@ def pretrained_model(): return TrainedModel(model_path, run_id) +@pytest.fixture +def sagemaker_client(): + return boto3.client("sagemaker", region_name="us-west-2") + + +@pytest.fixture(scope='session', autouse=True) +def set_boto_credentials(): + os.environ["AWS_ACCESS_KEY_ID"] = "NotARealAccessKey" + os.environ["AWS_SECRET_ACCESS_KEY"] = "NotARealSecretAccessKey" + os.environ["AWS_SESSION_TOKEN"] = "NotARealSessionToken" + + +def mock_sagemaker_aws_services(fn): + # Import `wraps` from `six` instead of `functools` to properly set the + # wrapped function's `__wrapped__` attribute to the required value + # in Python 2 + from six import wraps + from moto import mock_s3, mock_ecr, mock_sts, mock_iam + from tests.sagemaker.mock import mock_sagemaker + + @mock_ecr + @mock_iam + @mock_s3 + @mock_sagemaker + @mock_sts + @wraps(fn) + def mock_wrapper(*args, **kwargs): + # Create an ECR repository for the `mlflow-pyfunc` SageMaker docker image + ecr_client = boto3.client("ecr", region_name="us-west-2") + ecr_client.create_repository(repositoryName=mfs.DEFAULT_IMAGE_NAME) + + # Create the moto IAM role + role_policy = """ + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": "*", + "Resource": "*" + } + ] + } + """ + iam_client = boto3.client("iam", region_name="us-west-2") + iam_client.create_role(RoleName="moto", AssumeRolePolicyDocument=role_policy) + + return fn(*args, **kwargs) + + return mock_wrapper + + def test_deployment_with_unsupported_flavor_raises_exception(pretrained_model): unsupported_flavor = "this is not a valid flavor" with pytest.raises(MlflowException) as exc: @@ -85,3 +138,50 @@ def test_get_preferred_deployment_flavor_obtains_valid_flavor_from_model(pretrai assert selected_flavor in mfs.SUPPORTED_DEPLOYMENT_FLAVORS assert selected_flavor in model_config.flavors + + +@mock_sagemaker_aws_services +def test_deploy_creates_sagemaker_resources_with_expected_names(pretrained_model, sagemaker_client): + app_name = "test-app" + mfs.deploy(app_name=app_name, + model_path=pretrained_model.model_path, + run_id=pretrained_model.run_id, + mode=mfs.DEPLOYMENT_MODE_CREATE) + + models_response = sagemaker_client.list_models() + found_matching_model = False + for model in models_response["Models"]: + if app_name in model["ModelName"]: + found_matching_model = True + break + assert found_matching_model + + endpoint_configs_response = sagemaker_client.list_endpoint_configs() + found_matching_config = False + for config in endpoint_configs_response["EndpointConfigs"]: + if app_name in config["EndpointConfigName"]: + found_matching_config = True + break + assert found_matching_config + + endpoints_response = sagemaker_client.list_endpoints() + assert app_name in [endpoint["EndpointName"] for endpoint in endpoints_response["Endpoints"]] + + +@mock_sagemaker_aws_services +def test_deploying_application_with_preexisting_name_in_create_mode_throws_exception( + pretrained_model): + app_name = "test-app" + mfs.deploy(app_name=app_name, + model_path=pretrained_model.model_path, + run_id=pretrained_model.run_id, + mode=mfs.DEPLOYMENT_MODE_CREATE) + + with pytest.raises(MlflowException) as exc: + mfs.deploy(app_name=app_name, + model_path=pretrained_model.model_path, + run_id=pretrained_model.run_id, + mode=mfs.DEPLOYMENT_MODE_CREATE) + + assert "an application with the same name already exists" in exc.value.message + assert exc.value.error_code == ErrorCode.Name(INVALID_PARAMETER_VALUE) From 44231515dd0b1f2c74a1f0c8efb1c19f35043c36 Mon Sep 17 00:00:00 2001 From: kryptec <30450751+kryptec@users.noreply.github.com> Date: Fri, 23 Nov 2018 14:44:15 -0700 Subject: [PATCH 061/483] Added Bash command for UI (#725) In section "Comparing the Models" the command to launch the MLflow UI was given for R mlflow_ui(), but not for Bash mlflow ui. This took me a bit to figure out since I needed the Bash command because I'm working in Python. I copied the relevant part from the Quickstart page to include commands for both, as well as the link to the page to view the results. --- docs/source/tutorial.rst | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorial.rst b/docs/source/tutorial.rst index 357abe7fcc744..005a4f298bc5c 100644 --- a/docs/source/tutorial.rst +++ b/docs/source/tutorial.rst @@ -208,8 +208,18 @@ Comparing the Models -------------------- -Next, use the MLflow UI to compare the models that you have produced. Run ``mlflow_ui()`` -in the same current working directory as the one that contains the ``mlruns``. +Next, use the MLflow UI to compare the models that you have produced. In the same current working directory +as the one that contains the ``mlruns`` run: + +.. code-section:: + .. code-block:: bash + + mlflow ui + .. code-block:: R + + mlflow_ui() + +and view it at ``_. On this page, you can see a list of experiment runs with metrics you can use to compare the models. From a1ba398a1fadd3e57add1f38ce81873ae0f59af2 Mon Sep 17 00:00:00 2001 From: Masahiro H Date: Sat, 24 Nov 2018 15:02:41 +0900 Subject: [PATCH 062/483] Fix typoe in R-api docs and source code (#730) Small typo in R-API documents and source code comments. --- docs/source/R-api.rst | 6 +++--- mlflow/R/mlflow/R/cli.R | 2 +- mlflow/R/mlflow/R/model-flavor.R | 2 +- mlflow/R/mlflow/R/model-keras.R | 2 +- mlflow/R/mlflow/man/mlflow_cli.Rd | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/R-api.rst b/docs/source/R-api.rst index 60876c32a0502..f8a68af2216ee 100644 --- a/docs/source/R-api.rst +++ b/docs/source/R-api.rst @@ -131,7 +131,7 @@ Retrieves the active run. MLflow Command ============== -Executes a generic MLflow command through the commmand line interface. +Executes a generic MLflow command through the command line interface. .. code:: r @@ -1445,7 +1445,7 @@ Arguments Value ----- -This funciton must return a list of flavors that conform to the MLmodel +This function must return a list of flavors that conform to the MLmodel specification. Save MLflow Model Flavor @@ -1486,7 +1486,7 @@ Arguments Value ----- -This funciton must return a list of flavors that conform to the MLmodel +This function must return a list of flavors that conform to the MLmodel specification. Save Model for MLflow diff --git a/mlflow/R/mlflow/R/cli.R b/mlflow/R/mlflow/R/cli.R index e85ff557ccb81..86537e78250c2 100644 --- a/mlflow/R/mlflow/R/cli.R +++ b/mlflow/R/mlflow/R/cli.R @@ -1,6 +1,6 @@ #' MLflow Command #' -#' Executes a generic MLflow command through the commmand line interface. +#' Executes a generic MLflow command through the command line interface. #' #' @param ... The parameters to pass to the command line. #' @param background Should this command be triggered as a background task? diff --git a/mlflow/R/mlflow/R/model-flavor.R b/mlflow/R/mlflow/R/model-flavor.R index 1f43764442596..25d61b433fc8f 100644 --- a/mlflow/R/mlflow/R/model-flavor.R +++ b/mlflow/R/mlflow/R/model-flavor.R @@ -11,7 +11,7 @@ #' or \code{conda.yaml}. #' @param conda_env Path to Conda dependencies file. #' -#' @return This funciton must return a list of flavors that conform to +#' @return This function must return a list of flavors that conform to #' the MLmodel specification. #' #' @export diff --git a/mlflow/R/mlflow/R/model-keras.R b/mlflow/R/mlflow/R/model-keras.R index 7dc53b8d62b6e..d1fd4804b1f33 100644 --- a/mlflow/R/mlflow/R/model-keras.R +++ b/mlflow/R/mlflow/R/model-keras.R @@ -10,7 +10,7 @@ #' or \code{conda.yaml}. #' @param conda_env Path to Conda dependencies file. #' -#' @return This funciton must return a list of flavors that conform to +#' @return This function must return a list of flavors that conform to #' the MLmodel specification. #' #' @export diff --git a/mlflow/R/mlflow/man/mlflow_cli.Rd b/mlflow/R/mlflow/man/mlflow_cli.Rd index 01a2900c2bae1..9d3b072ee400a 100644 --- a/mlflow/R/mlflow/man/mlflow_cli.Rd +++ b/mlflow/R/mlflow/man/mlflow_cli.Rd @@ -22,7 +22,7 @@ Defaults to \code{FALSE}.} A \code{processx} task. } \description{ -Executes a generic MLflow command through the commmand line interface. +Executes a generic MLflow command through the command line interface. } \examples{ \dontrun{ From 883f3b679a2a70fd7907337272b6e7f4052e19dc Mon Sep 17 00:00:00 2001 From: Dody Suria Wijaya Date: Sat, 24 Nov 2018 13:03:40 +0700 Subject: [PATCH 063/483] Fix small typo on training example directory name (#728) Not much, but might save a few minutes someone else figuring out why the instruction at tutorial didn't work --- .../train.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{sklearn_logisitic_regression => sklearn_logistic_regression}/train.py (100%) diff --git a/examples/sklearn_logisitic_regression/train.py b/examples/sklearn_logistic_regression/train.py similarity index 100% rename from examples/sklearn_logisitic_regression/train.py rename to examples/sklearn_logistic_regression/train.py From d90e017e8cb3fee25168a5f7c3668bcf568bc7c0 Mon Sep 17 00:00:00 2001 From: dbczumar <39497902+dbczumar@users.noreply.github.com> Date: Sat, 24 Nov 2018 00:20:35 -0800 Subject: [PATCH 064/483] Pin sklearn version in test dependencies (#731) The latest version of scikit-learn (0.21.0) is only available on pip. It has not yet been released on Anaconda. This causes test failures when attempting to resolve default conda environments: conda attempts to install a version of the scikit-learn dependency that is not available. To resolve this issue, we will temporarily pin the version of scikit-learn to the latest available version on Anaconda (0.20.0). --- test-requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test-requirements.txt b/test-requirements.txt index 993a9c9aa9972..4694e4f6ce34d 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -13,6 +13,9 @@ pyspark pytest==3.2.1 pytest-cov rstcheck==3.2 +# TODO: Stop pinning the version of scikit-learn when the latest version of the +# library on Anaconda catches up to pip +scikit-learn==0.20.0 scipy tensorflow torch From 853beb2087e2db6c3b55b1dc306bef529d07234e Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Sat, 24 Nov 2018 15:11:24 -0800 Subject: [PATCH 065/483] Update Javadoc build script to delete existing files before copying them into docs (#716) To ensure a reproducible build of the Javadocs / prevent undesired documentation left over from previous builds from sneaking into the docs. --- docs/build-javadoc.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/build-javadoc.sh b/docs/build-javadoc.sh index edd35befda989..083f6f2de799d 100755 --- a/docs/build-javadoc.sh +++ b/docs/build-javadoc.sh @@ -2,8 +2,9 @@ set -ex pushd ../mlflow/java/client/ -mvn javadoc:javadoc +mvn clean javadoc:javadoc popd +rm -rf build/html/java_api/ mkdir -p build/html/java_api/ cp -r ../mlflow/java/client/target/site/apidocs/* build/html/java_api/ echo "Copied JavaDoc into docs/build/html/java_api/" From e67d86ae6ca19b3de3b957413a77fcac84a0219e Mon Sep 17 00:00:00 2001 From: Siddharth Murching Date: Sat, 24 Nov 2018 23:03:45 -0800 Subject: [PATCH 066/483] Update Databricks project execution docs to clarify how to run against different workspaces (#715) Updates docstrings for the mlflow run CLI & mlflow.run Python API to describe how to run projects against different Databricks workspaces --- mlflow/cli.py | 12 ++++++++---- mlflow/projects/__init__.py | 7 ++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/mlflow/cli.py b/mlflow/cli.py index cd8aad65609ae..4935a1b0b6d99 100644 --- a/mlflow/cli.py +++ b/mlflow/cli.py @@ -53,10 +53,14 @@ def cli(): @click.option("--mode", "-m", metavar="MODE", help="Execution mode to use for run. Supported values: 'local' (runs project" "locally) and 'databricks' (runs project on a Databricks cluster)." - "Defaults to 'local'. If running against Databricks, will run against the " - "Databricks workspace specified in the default Databricks CLI profile. " - "See https://github.com/databricks/databricks-cli for more info on configuring " - "a Databricks CLI profile.") + "Defaults to 'local'. If running against Databricks, will run against a " + "Databricks workspace determined as follows: if a Databricks tracking URI " + "of the form 'databricks://profile' has been set (e.g. by setting " + "the MLFLOW_TRACKING_URI environment variable), will run against the " + "workspace specified by . Otherwise, runs against the workspace " + "specified by the default Databricks CLI profile. See " + "https://github.com/databricks/databricks-cli for more info on configuring a " + "Databricks CLI profile.") @click.option("--cluster-spec", "-c", metavar="FILE", help="Path to JSON file (must end in '.json') or JSON string describing the cluster" "to use when launching a run on Databricks. See " diff --git a/mlflow/projects/__init__.py b/mlflow/projects/__init__.py index b5bd17d7c2cd8..7943a2ecae030 100644 --- a/mlflow/projects/__init__.py +++ b/mlflow/projects/__init__.py @@ -115,7 +115,12 @@ def run(uri, entry_point="main", version=None, parameters=None, experiment_id=No environment variable ``$SHELL``) to run ``.sh`` files. :param version: For Git-based projects, either a commit hash or a branch name. :param experiment_id: ID of experiment under which to launch the run. - :param mode: Execution mode of the run: "local" or "databricks". + :param mode: Execution mode of the run: "local" or "databricks". If running against Databricks, + will run against a Databricks workspace determined as follows: if a Databricks + tracking URI of the form 'databricks://profile' has been set (e.g. by setting + the MLFLOW_TRACKING_URI environment variable), will run against the workspace + specified by . Otherwise, runs against the workspace specified by the + default Databricks CLI profile. :param cluster_spec: When ``mode`` is "databricks", dictionary or path to a JSON file containing a `Databricks cluster specification `_ From 609483587a62e0c7d54977c5dbd50afbc882696f Mon Sep 17 00:00:00 2001 From: Andy Konwinski Date: Thu, 29 Nov 2018 16:15:18 -0800 Subject: [PATCH 067/483] Updating remote runs docs. (#736) This updates the MLflow doc section about Remote Execution on Databricks. Here is a screenshot of what the docs look like after the changes in this PR. screen shot 2018-11-29 at 3 05 15 pm --- docs/source/projects.rst | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/source/projects.rst b/docs/source/projects.rst index 0cef5d7f993fd..ff4a13e4f5477 100644 --- a/docs/source/projects.rst +++ b/docs/source/projects.rst @@ -196,12 +196,15 @@ useful if you quickly want to test a project in your existing shell environment. Remote Execution on Databricks ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Support for running projects on Databricks will be released soon - -`sign up here `_ to receive updates. +Support for running projects remotely on Databricks is in beta preview and requires a Databricks account. +To receive future updates about the feature please `sign up here `_. -Launching a Run -~~~~~~~~~~~~~~~ +Launching a Remote Execution on Databricks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +To use this feature, you need to have a Databricks account (Community Edition is not yet supported) +and you must have set up the `Databricks Command Line utility `_. Find more detailed instructions in the Databricks docs (`here for Azure Databricks `_, `here for Databricks on AWS `_). A brief overview of how to use the feature is as follows: + First, create a JSON file containing the `cluster specification `_ for your run. Then, run your project via From a4b395b4d07407074db3d4684833b5e7f670490a Mon Sep 17 00:00:00 2001 From: Aaron Davidson Date: Mon, 3 Dec 2018 09:46:15 -0700 Subject: [PATCH 068/483] [UI] Generalize AJAX CSRF logic to support arbitrary HTTP headers via cookie (#733) --- .../ShowArtifactTextView.js | 4 +-- mlflow/server/js/src/index.js | 4 +-- mlflow/server/js/src/setupAjaxHeaders.js | 30 +++++++++++++++++++ mlflow/server/js/src/setupAjaxHeaders.test.js | 12 ++++++++ mlflow/server/js/src/setupCsrf.js | 23 -------------- 5 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 mlflow/server/js/src/setupAjaxHeaders.js create mode 100644 mlflow/server/js/src/setupAjaxHeaders.test.js delete mode 100644 mlflow/server/js/src/setupCsrf.js diff --git a/mlflow/server/js/src/components/artifact-view-components/ShowArtifactTextView.js b/mlflow/server/js/src/components/artifact-view-components/ShowArtifactTextView.js index 482be392a0d0a..cc2cbd4f55a0c 100644 --- a/mlflow/server/js/src/components/artifact-view-components/ShowArtifactTextView.js +++ b/mlflow/server/js/src/components/artifact-view-components/ShowArtifactTextView.js @@ -2,7 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { getSrc } from './ShowArtifactPage'; import './ShowArtifactTextView.css'; -import { CSRF_HEADER_NAME, getCsrfToken } from '../../setupCsrf'; +import { getRequestHeaders } from '../../setupAjaxHeaders'; class ShowArtifactTextView extends Component { constructor(props) { @@ -60,7 +60,7 @@ class ShowArtifactTextView extends Component { const getArtifactRequest = new Request(getSrc(this.props.path, this.props.runUuid), { method: 'GET', redirect: 'follow', - headers: new Headers({ [CSRF_HEADER_NAME]: getCsrfToken() }) + headers: new Headers(getRequestHeaders()) }); fetch(getArtifactRequest).then((response) => { return response.blob(); diff --git a/mlflow/server/js/src/index.js b/mlflow/server/js/src/index.js index 63450592f1665..700b703628b4e 100644 --- a/mlflow/server/js/src/index.js +++ b/mlflow/server/js/src/index.js @@ -3,11 +3,11 @@ import ReactDOM from 'react-dom'; import './index.css'; import App from './components/App'; import registerServiceWorker from './registerServiceWorker'; -import { setupCsrf } from './setupCsrf'; +import { setupAjaxHeaders } from './setupAjaxHeaders'; import { Provider } from 'react-redux'; import store from './Store'; -setupCsrf(); +setupAjaxHeaders(); const root = ( diff --git a/mlflow/server/js/src/setupAjaxHeaders.js b/mlflow/server/js/src/setupAjaxHeaders.js new file mode 100644 index 0000000000000..a873e3999e1d6 --- /dev/null +++ b/mlflow/server/js/src/setupAjaxHeaders.js @@ -0,0 +1,30 @@ +import $ from 'jquery'; +import cookie from 'cookie'; + +// To enable running behind applications that require specific headers +// to be set during HTTP requests (e.g., CSRF tokens), we support parsing +// a set of cookies with a key prefix of "mlflow-request-header-$HeaderName", +// which will be added as an HTTP header to all AJAX requests. +export const setupAjaxHeaders = () => { + const requestHeaders = getRequestHeaders(document.cookie); + $(document).ajaxSend((event, jqXHR) => { + if (requestHeaders) { + for (const [headerKey, headerValue] of Object.entries(requestHeaders)) { + jqXHR.setRequestHeader(headerKey, headerValue); + } + } + }); +}; + +export const getRequestHeaders = (documentCookie) => { + const headerCookiePrefix = "mlflow-request-header-"; + const parsedCookie = cookie.parse(documentCookie); + console.log(parsedCookie); + const headers = {}; + for (const cookieName in parsedCookie) { + if (cookieName.startsWith(headerCookiePrefix)) { + headers[cookieName.substring(headerCookiePrefix.length)] = parsedCookie[cookieName]; + } + } + return headers; +}; diff --git a/mlflow/server/js/src/setupAjaxHeaders.test.js b/mlflow/server/js/src/setupAjaxHeaders.test.js new file mode 100644 index 0000000000000..cd69bf6bf2753 --- /dev/null +++ b/mlflow/server/js/src/setupAjaxHeaders.test.js @@ -0,0 +1,12 @@ +import { getRequestHeaders } from './setupAjaxHeaders'; + +test('empty cookie should result in no headers', () => { + const headers = getRequestHeaders(""); + expect(headers).toEqual({}); +}); + +test('cookies prefixed with mlflow-request-header- should be returned', () => { + const headers = getRequestHeaders( + "a=b; mlflow-request-header-My-CSRF=1; mlflow-request-header-Hello=World; c=d"); + expect(headers).toEqual({"My-CSRF": "1", "Hello": "World"}); +}); diff --git a/mlflow/server/js/src/setupCsrf.js b/mlflow/server/js/src/setupCsrf.js deleted file mode 100644 index 8808a07084c9e..0000000000000 --- a/mlflow/server/js/src/setupCsrf.js +++ /dev/null @@ -1,23 +0,0 @@ -import $ from 'jquery'; -import cookie from 'cookie'; - -// To enable running behind applications that require CSRF tokens, we -// support parsing an optional "mlflow-csrf-token" cookie, which we will -// add as an 'X-CSRF-Token' header to all AJAX requests. -export const setupCsrf = () => { - const csrfToken = getCsrfToken(); - $.ajaxSetup({ - beforeSend(xhr) { - if (csrfToken) { - xhr.setRequestHeader(CSRF_HEADER_NAME, csrfToken); - } - } - }); -}; - -export const getCsrfToken = () => { - const parsedCookie = cookie.parse(document.cookie); - return parsedCookie['mlflow-csrf-token']; -}; - -export const CSRF_HEADER_NAME = 'X-CSRF-Token'; From 3c1addb8c89d5b43526ea816d82d0be749ac7f71 Mon Sep 17 00:00:00 2001 From: Matei Zaharia Date: Mon, 3 Dec 2018 18:14:21 -0800 Subject: [PATCH 069/483] Use Plotly for scatter plot to make it interactive (#737) * Use Plotly for scatter plot to make it interactive * review comments --- mlflow/server/js/package-lock.json | 10054 ++++++++++------ mlflow/server/js/package.json | 3 + mlflow/server/js/src/components/App.css | 5 + .../js/src/components/CompareRunScatter.css | 47 +- .../js/src/components/CompareRunScatter.js | 175 +- 5 files changed, 6783 insertions(+), 3501 deletions(-) diff --git a/mlflow/server/js/package-lock.json b/mlflow/server/js/package-lock.json index f9ad42e4da03f..afaaa7c25706d 100644 --- a/mlflow/server/js/package-lock.json +++ b/mlflow/server/js/package-lock.json @@ -4,6 +4,29 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "3d-view": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.0.tgz", + "integrity": "sha1-gxrpQtdQjFCAHj4G+v4ejFdOF74=", + "requires": { + "matrix-camera-controller": "2.1.3", + "orbit-camera-controller": "4.0.0", + "turntable-camera-controller": "3.0.1" + } + }, + "3d-view-controls": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", + "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", + "requires": { + "3d-view": "2.0.0", + "has-passive-events": "1.0.0", + "mouse-change": "1.4.0", + "mouse-event-offset": "3.0.2", + "mouse-wheel": "1.2.0", + "right-now": "1.0.0" + } + }, "@babel/code-frame": { "version": "7.0.0-rc.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz", @@ -20,10 +43,10 @@ "dev": true, "requires": { "@babel/types": "7.0.0-rc.1", - "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "jsesc": "2.5.1", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "jsesc": { @@ -75,9 +98,9 @@ "integrity": "sha512-5PgPDV6F5s69XNznTcP0za3qH7qgBkr9DVQTXfZtpF+3iEyuIZB1Mjxu52F5CFxgzQUQJoBYHVxtH4Itdb5MgA==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" + "chalk": "2.4.1", + "esutils": "2.0.2", + "js-tokens": "3.0.2" }, "dependencies": { "chalk": { @@ -86,9 +109,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -104,7 +127,7 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", "requires": { - "regenerator-runtime": "^0.12.0" + "regenerator-runtime": "0.12.1" }, "dependencies": { "regenerator-runtime": { @@ -123,7 +146,7 @@ "@babel/code-frame": "7.0.0-rc.1", "@babel/parser": "7.0.0-rc.1", "@babel/types": "7.0.0-rc.1", - "lodash": "^4.17.10" + "lodash": "4.17.10" } }, "@babel/traverse": { @@ -138,9 +161,9 @@ "@babel/helper-split-export-declaration": "7.0.0-rc.1", "@babel/parser": "7.0.0-rc.1", "@babel/types": "7.0.0-rc.1", - "debug": "^3.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.10" + "debug": "3.1.0", + "globals": "11.7.0", + "lodash": "4.17.10" }, "dependencies": { "debug": { @@ -166,9 +189,9 @@ "integrity": "sha512-MBwO1JQKin9BwKTGydrYe4VDJbStCUy35IhJzeZt3FByOdx/q3CYaqMRrH70qVD2RA7+Xk8e3RN0mzKZkYBYuQ==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "2.0.0" }, "dependencies": { "to-fast-properties": { @@ -179,23 +202,112 @@ } } }, + "@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" + } + }, + "@mapbox/geojson-area": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz", + "integrity": "sha1-GNeBSqNr8j+7zDefjiaiKSfevxA=", + "requires": { + "wgs84": "0.0.0" + } + }, + "@mapbox/gl-matrix": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/gl-matrix/-/gl-matrix-0.0.1.tgz", + "integrity": "sha1-5RJqq01kw2uBx6l9CuDd3eV3PSs=" + }, + "@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.4.0", + "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.4.0.tgz", + "integrity": "sha512-ZD0Io4XK+/vU/4zpANjOtdWfVszAgnaMPsGR6LKsWh4kLIEv9qoobTVmJPPuwuM+ZI2b3BlZ6DYw1XHVmv6YTA==" + }, + "@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/shelf-pack": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/shelf-pack/-/shelf-pack-3.2.0.tgz", + "integrity": "sha512-dyQxe6ukILV6qaEvxoKCIwhblgRjYp1ZGlClo4xvfbmxzFO5LYu7Tnrg2AZrRgN7VsSragsGcNjzUe9kCdKHYQ==" + }, + "@mapbox/tiny-sdf": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.1.0.tgz", + "integrity": "sha512-dnhyk8X2BkDRWImgHILYAGgo+kuciNYX30CUKj/Qd5eNjh54OWM/mdOS/PWsPeN+3abtN+QDGYM4G220ynVJKA==" + }, + "@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==" + }, + "@plotly/d3-sankey": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.5.1.tgz", + "integrity": "sha512-uMToNGexOSLG0hBm+uAzElfFW0Pt2utgJ//puL5nuerNnPnRTTe3Un7XFVcWqRhvXEViF00Xq/8wGoA8i8eZJA==", + "requires": { + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-interpolate": "1.2.0" + } + }, "@types/node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.2.tgz", "integrity": "sha512-pwZnkVyCGJ3LsQ0/3flQK5lCFao4esIzwUVzzk5NvL9vnkEyDhNf4fhHzUMHvyr56gNZywWTS2MR0euabMSz4A==", "dev": true }, + "a-big-triangle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/a-big-triangle/-/a-big-triangle-1.0.3.tgz", + "integrity": "sha1-7v0wsCqPUl6LH3K7a7GwwWdRx5Q=", + "requires": { + "gl-buffer": "2.1.2", + "gl-vao": "1.3.0", + "weak-map": "1.0.5" + } + }, "abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=" }, + "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.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "requires": { - "mime-types": "~2.1.18", + "mime-types": "2.1.18", "negotiator": "0.6.1" } }, @@ -209,7 +321,7 @@ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { - "acorn": "^4.0.3" + "acorn": "4.0.13" }, "dependencies": { "acorn": { @@ -224,7 +336,7 @@ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "requires": { - "acorn": "^4.0.4" + "acorn": "4.0.13" }, "dependencies": { "acorn": { @@ -239,7 +351,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "requires": { - "acorn": "^3.0.4" + "acorn": "3.3.0" }, "dependencies": { "acorn": { @@ -249,20 +361,36 @@ } } }, + "add-line-numbers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/add-line-numbers/-/add-line-numbers-1.0.1.tgz", + "integrity": "sha1-SNu96kfb0jTer+rGyTzqb3C0t+M=", + "requires": { + "pad-left": "1.0.2" + } + }, "address": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" }, + "affine-hull": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/affine-hull/-/affine-hull-1.0.0.tgz", + "integrity": "sha1-dj/x040GPOt+Jy8X7k17vK+QXF0=", + "requires": { + "robust-orientation": "1.1.3" + } + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { @@ -275,9 +403,9 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" }, "dependencies": { "kind-of": { @@ -285,11 +413,34 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } }, + "almost-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", + "integrity": "sha1-+FHGMROHV5lCdqou++jfowZszN0=" + }, + "alpha-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/alpha-complex/-/alpha-complex-1.0.0.tgz", + "integrity": "sha1-kIZYcNawVCrnPAwTHU75iWabctI=", + "requires": { + "circumradius": "1.0.0", + "delaunay-triangulate": "1.1.6" + } + }, + "alpha-shape": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/alpha-shape/-/alpha-shape-1.0.0.tgz", + "integrity": "sha1-yDEJkj7P2mZ9IWP+Tyb+JHJvZKk=", + "requires": { + "alpha-complex": "1.0.0", + "simplicial-complex-boundary": "1.0.1" + } + }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -305,7 +456,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "^2.0.0" + "string-width": "2.1.1" } }, "ansi-escapes": { @@ -328,16 +479,21 @@ "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" + "color-convert": "1.9.1" } }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" + }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" }, "dependencies": { "arr-diff": { @@ -345,7 +501,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -358,9 +514,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -368,7 +524,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -376,7 +532,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -384,7 +540,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -392,19 +548,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -414,7 +570,7 @@ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "requires": { - "default-require-extensions": "^1.0.0" + "default-require-extensions": "1.0.0" } }, "argparse": { @@ -422,7 +578,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "aria-query": { @@ -431,7 +587,7 @@ "integrity": "sha1-Jsu1r/ZBRLCoJb4YRuCxbPoAsR4=", "requires": { "ast-types-flow": "0.0.7", - "commander": "^2.11.0" + "commander": "2.15.1" } }, "arr-diff": { @@ -449,6 +605,11 @@ "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-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", @@ -479,8 +640,8 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" + "define-properties": "1.1.2", + "es-abstract": "1.11.0" } }, "array-map": { @@ -488,6 +649,24 @@ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" }, + "array-normalize": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.3.tgz", + "integrity": "sha1-c/uDf0gW7BkVHTxejYU6RZDOAb0=", + "requires": { + "array-bounds": "1.0.1" + } + }, + "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-reduce": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", @@ -498,7 +677,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "^1.0.1" + "array-uniq": "1.0.3" } }, "array-uniq": { @@ -517,9 +696,9 @@ "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" + "define-properties": "1.1.2", + "es-abstract": "1.11.0", + "function-bind": "1.1.1" } }, "arrify": { @@ -542,9 +721,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -575,7 +754,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "^4.14.0" + "lodash": "4.17.10" } }, "async-each": { @@ -593,17 +772,22 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" }, + "atob-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-1.0.0.tgz", + "integrity": "sha1-uI3KYAaSK5YglPdVaCa6sxxKKWs=" + }, "autoprefixer": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.1.6.tgz", "integrity": "sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==", "requires": { - "browserslist": "^2.5.1", - "caniuse-lite": "^1.0.30000748", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^6.0.13", - "postcss-value-parser": "^3.2.3" + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000839", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.22", + "postcss-value-parser": "3.3.0" } }, "aws-sign2": { @@ -629,9 +813,9 @@ "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" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" } }, "babel-core": { @@ -639,25 +823,25 @@ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.0", - "debug": "^2.6.8", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.7", - "slash": "^1.0.0", - "source-map": "^0.5.6" + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -673,12 +857,12 @@ "integrity": "sha512-Qt2lz2egBxNYWqN9JIO2z4NOOf8i4b5JS6CFoYrOZZTDssueiV1jH/jsefyg+86SeNY3rB361/mi3kE1WK2WYQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0-beta.40", - "@babel/traverse": "^7.0.0-beta.40", - "@babel/types": "^7.0.0-beta.40", - "babylon": "^7.0.0-beta.40", - "eslint-scope": "~3.7.1", - "eslint-visitor-keys": "^1.0.0" + "@babel/code-frame": "7.0.0-rc.1", + "@babel/traverse": "7.0.0-rc.1", + "@babel/types": "7.0.0-rc.1", + "babylon": "7.0.0-beta.47", + "eslint-scope": "3.7.3", + "eslint-visitor-keys": "1.0.0" }, "dependencies": { "babylon": { @@ -694,14 +878,14 @@ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "source-map": { @@ -716,9 +900,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-builder-react-jsx": { @@ -726,9 +910,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" } }, "babel-helper-call-delegate": { @@ -736,10 +920,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { @@ -747,10 +931,10 @@ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-helper-explode-assignable-expression": { @@ -758,9 +942,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -768,11 +952,11 @@ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -780,8 +964,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -789,8 +973,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { @@ -798,8 +982,8 @@ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { @@ -807,9 +991,9 @@ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-helper-remap-async-to-generator": { @@ -817,11 +1001,11 @@ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -829,12 +1013,12 @@ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -842,8 +1026,8 @@ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-jest": { @@ -851,9 +1035,9 @@ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-20.0.3.tgz", "integrity": "sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=", "requires": { - "babel-core": "^6.0.0", - "babel-plugin-istanbul": "^4.0.0", - "babel-preset-jest": "^20.0.3" + "babel-core": "6.26.0", + "babel-plugin-istanbul": "4.1.6", + "babel-preset-jest": "20.0.3" } }, "babel-loader": { @@ -861,9 +1045,9 @@ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" } }, "babel-messages": { @@ -871,7 +1055,7 @@ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-check-es2015-constants": { @@ -879,7 +1063,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-dynamic-import-node": { @@ -887,9 +1071,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-istanbul": { @@ -897,10 +1081,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.13.0", - "find-up": "^2.1.0", - "istanbul-lib-instrument": "^1.10.1", - "test-exclude": "^4.2.1" + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.10.1", + "test-exclude": "4.2.1" } }, "babel-plugin-jest-hoist": { @@ -953,9 +1137,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-class-properties": { @@ -963,10 +1147,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -974,7 +1158,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -982,7 +1166,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -990,11 +1174,11 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" } }, "babel-plugin-transform-es2015-classes": { @@ -1002,15 +1186,15 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -1018,8 +1202,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -1027,7 +1211,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -1035,8 +1219,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { @@ -1044,7 +1228,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -1052,9 +1236,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { @@ -1062,7 +1246,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -1070,9 +1254,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -1080,10 +1264,10 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -1091,9 +1275,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -1101,9 +1285,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { @@ -1111,8 +1295,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -1120,12 +1304,12 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -1133,8 +1317,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -1142,7 +1326,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -1150,9 +1334,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -1160,7 +1344,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -1168,7 +1352,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -1176,9 +1360,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -1186,9 +1370,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-flow-strip-types": { @@ -1196,8 +1380,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -1205,8 +1389,8 @@ "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-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-constant-elements": { @@ -1214,7 +1398,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-display-name": { @@ -1222,7 +1406,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx": { @@ -1230,9 +1414,9 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx-self": { @@ -1240,8 +1424,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-react-jsx-source": { @@ -1249,8 +1433,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -1258,7 +1442,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "requires": { - "regenerator-transform": "^0.10.0" + "regenerator-transform": "0.10.1" } }, "babel-plugin-transform-runtime": { @@ -1266,7 +1450,7 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-strict-mode": { @@ -1274,8 +1458,8 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-polyfill": { @@ -1283,9 +1467,9 @@ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "regenerator-runtime": "0.10.5" }, "dependencies": { "core-js": { @@ -1305,36 +1489,36 @@ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^2.1.2", - "invariant": "^2.2.2", - "semver": "^5.3.0" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.11.3", + "invariant": "2.2.4", + "semver": "5.5.0" } }, "babel-preset-flow": { @@ -1342,7 +1526,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" + "babel-plugin-transform-flow-strip-types": "6.22.0" } }, "babel-preset-jest": { @@ -1350,7 +1534,7 @@ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz", "integrity": "sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=", "requires": { - "babel-plugin-jest-hoist": "^20.0.3" + "babel-plugin-jest-hoist": "20.0.3" } }, "babel-preset-react": { @@ -1358,12 +1542,12 @@ "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" } }, "babel-preset-react-app": { @@ -1391,13 +1575,13 @@ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.6", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" }, "dependencies": { "core-js": { @@ -1412,8 +1596,8 @@ "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" + "core-js": "2.5.6", + "regenerator-runtime": "0.11.1" }, "dependencies": { "core-js": { @@ -1428,11 +1612,11 @@ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" } }, "babel-traverse": { @@ -1440,15 +1624,15 @@ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" } }, "babel-types": { @@ -1456,10 +1640,10 @@ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -1472,18 +1656,26 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "barycentric": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/barycentric/-/barycentric-1.0.1.tgz", + "integrity": "sha1-8VYruJGyb0/sRjqC7to2V4AOxog=", + "requires": { + "robust-linear-solve": "1.0.0" + } + }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "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" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -1491,7 +1683,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -1499,7 +1691,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1507,7 +1699,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1515,9 +1707,9 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -1538,7 +1730,17 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" + } + }, + "big-rat": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/big-rat/-/big-rat-1.0.4.tgz", + "integrity": "sha1-do0JO7V5MN0Y7Vdcf8on3FORreo=", + "requires": { + "bit-twiddle": "1.0.2", + "bn.js": "4.11.8", + "double-bits": "1.1.1" } }, "big.js": { @@ -1556,6 +1758,33 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, + "binary-search-bounds": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz", + "integrity": "sha1-MjyjF+PypA9CRMclX1OEpbIHu2k=" + }, + "bit-twiddle": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", + "integrity": "sha1-DGwfq+KyPRcXPZpht7cJPrnhdp4=" + }, + "bitmap-sdf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz", + "integrity": "sha512-ojYySSvWTx21cbgntR942zgEgqj38wHctN64vr4vYRFf3GKVmI23YlA94meWGkFslidwLwGCsMy2laJ3g/94Sg==", + "requires": { + "clamp": "1.0.1" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2" + } + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -1572,15 +1801,15 @@ "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "~1.6.15" + "type-is": "1.6.16" }, "dependencies": { "iconv-lite": { @@ -1600,12 +1829,12 @@ "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" + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" } }, "boolbase": { @@ -1618,7 +1847,15 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" + } + }, + "boundary-cells": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/boundary-cells/-/boundary-cells-2.0.1.tgz", + "integrity": "sha1-6QWo0UGc9Hyza+Pb9SXbXiTeAEI=", + "requires": { + "tape": "4.9.1" } }, "bowser": { @@ -1626,18 +1863,27 @@ "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.3.tgz", "integrity": "sha512-/gp96UlcFw5DbV2KQPCqTqi0Mb9gZRyDAHiDsGEH+4B/KOQjeoE5lM1PxlVX8DQDvfEfitmC1rW2Oy8fk/XBDg==" }, + "box-intersect": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/box-intersect/-/box-intersect-1.0.1.tgz", + "integrity": "sha1-tyilnj8aPHPCJJM8JmC5J6oTeQI=", + "requires": { + "bit-twiddle": "1.0.2", + "typedarray-pool": "1.1.0" + } + }, "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" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" }, "dependencies": { "camelcase": { @@ -1650,9 +1896,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -1662,7 +1908,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1671,16 +1917,16 @@ "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" + "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.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -1688,7 +1934,78 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" + } + } + } + }, + "brfs": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", + "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", + "requires": { + "quote-stream": "1.0.2", + "resolve": "1.6.0", + "static-module": "2.2.5", + "through2": "2.0.5" + }, + "dependencies": { + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "2.3.6" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "object-inspect": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", + "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" + }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "requires": { + "buffer-equal": "0.0.1", + "minimist": "1.2.0", + "through2": "2.0.5" + } + }, + "static-module": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", + "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", + "requires": { + "concat-stream": "1.6.2", + "convert-source-map": "1.5.1", + "duplexer2": "0.1.4", + "escodegen": "1.9.1", + "falafel": "2.1.0", + "has": "1.0.1", + "magic-string": "0.22.5", + "merge-source-map": "1.0.4", + "object-inspect": "1.4.1", + "quote-stream": "1.0.2", + "readable-stream": "2.3.6", + "shallow-copy": "0.0.1", + "static-eval": "2.0.0", + "through2": "2.0.5" + } + }, + "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" } } } @@ -1718,12 +2035,12 @@ "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" + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "browserify-cipher": { @@ -1731,9 +2048,9 @@ "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-aes": "1.2.0", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.3" } }, "browserify-des": { @@ -1741,9 +2058,9 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1" + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" } }, "browserify-rsa": { @@ -1751,8 +2068,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "bn.js": "4.11.8", + "randombytes": "2.0.6" } }, "browserify-sign": { @@ -1760,13 +2077,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -1774,7 +2091,7 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "~1.0.5" + "pako": "1.0.6" } }, "browserslist": { @@ -1782,8 +2099,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "^1.0.30000792", - "electron-to-chromium": "^1.3.30" + "caniuse-lite": "1.0.30000839", + "electron-to-chromium": "1.3.45" } }, "bser": { @@ -1791,7 +2108,94 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "requires": { - "node-int64": "^0.4.0" + "node-int64": "0.4.0" + } + }, + "buble": { + "version": "0.19.6", + "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.6.tgz", + "integrity": "sha512-9kViM6nJA1Q548Jrd06x0geh+BG2ru2+RMDkIHHgJY/8AcyCs34lTHwra9BX7YdPrZXd5aarkpr/SY8bmPgPdg==", + "requires": { + "chalk": "2.4.1", + "magic-string": "0.25.1", + "minimist": "1.2.0", + "os-homedir": "1.0.2", + "regexpu-core": "4.2.0", + "vlq": "1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "requires": { + "sourcemap-codec": "1.4.4" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regexpu-core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", + "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", + "requires": { + "regenerate": "1.4.0", + "regenerate-unicode-properties": "7.0.0", + "regjsgen": "0.4.0", + "regjsparser": "0.3.0", + "unicode-match-property-ecmascript": "1.0.4", + "unicode-match-property-value-ecmascript": "1.0.2" + } + }, + "regjsgen": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", + "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==" + }, + "regjsparser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", + "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", + "requires": { + "jsesc": "0.5.0" + } + }, + "vlq": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.0.tgz", + "integrity": "sha512-o3WmXySo+oI5thgqr7Qy8uBkT/v9Zr+sRyrh1lr8aWPUkgDWdWt4Nae2WKBrLsocgE8BuWWD0jLc+VW8LeU+2g==" + } + } + }, + "bubleify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bubleify/-/bubleify-1.2.0.tgz", + "integrity": "sha512-SJnUsR+f8WeDw0K2l1S+VuYI33Cu5Gfghe5jTow/fpJueNtnwyoECyfCGsDuFoQt4QGhjpV3LYPpN0hxy90LgA==", + "requires": { + "buble": "0.19.6" } }, "buffer": { @@ -1799,11 +2203,16 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "1.3.0", + "ieee754": "1.1.11", + "isarray": "1.0.0" } }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1839,15 +2248,15 @@ "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" + "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" } }, "caller-path": { @@ -1855,7 +2264,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "requires": { - "callsites": "^0.2.0" + "callsites": "0.2.0" } }, "callsites": { @@ -1868,8 +2277,8 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "camelcase": { @@ -1882,8 +2291,8 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "2.1.1", + "map-obj": "1.0.1" }, "dependencies": { "camelcase": { @@ -1898,10 +2307,10 @@ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000839", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" }, "dependencies": { "browserslist": { @@ -1909,8 +2318,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000839", + "electron-to-chromium": "1.3.45" } } } @@ -1925,11 +2334,28 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000839.tgz", "integrity": "sha512-gJZIfmkuy84agOeAZc7WJOexZhisZaBSFk96gkGM6TkH7+1mBfr/MSPnXC8lO0g7guh/ucbswYjruvDbzc6i0g==" }, + "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-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, + "cardinal": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.4.tgz", + "integrity": "sha1-ylu2iltRG5D+k7ms6km97lwyv+I=", + "requires": { + "ansicolors": "0.2.1", + "redeyed": "0.4.4" + } + }, "case-sensitive-paths-webpack-plugin": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz", @@ -1940,13 +2366,35 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "cdt2d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cdt2d/-/cdt2d-1.0.0.tgz", + "integrity": "sha1-TyEkNLzWe9s9aLj+9KzcLFRBUUE=", + "requires": { + "binary-search-bounds": "2.0.4", + "robust-in-sphere": "1.1.3", + "robust-orientation": "1.1.3" + }, + "dependencies": { + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + } + } + }, + "cell-orientation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cell-orientation/-/cell-orientation-1.0.1.tgz", + "integrity": "sha1-tQStlqZq0obZ7dmFoiU9A7gNKFA=" + }, "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chalk": { @@ -1954,11 +2402,11 @@ "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" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" }, "dependencies": { "ansi-styles": { @@ -1984,12 +2432,12 @@ "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", "dev": true, "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "parse5": "3.0.3" }, "dependencies": { "domhandler": { @@ -1998,7 +2446,7 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "htmlparser2": { @@ -2007,12 +2455,12 @@ "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "parse5": { @@ -2021,7 +2469,7 @@ "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "10.9.2" } } } @@ -2031,18 +2479,18 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.1.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.0" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.5" }, "dependencies": { "anymatch": { @@ -2050,8 +2498,8 @@ "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" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" } }, "glob-parent": { @@ -2059,8 +2507,8 @@ "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" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" }, "dependencies": { "is-glob": { @@ -2068,7 +2516,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -2083,7 +2531,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } } } @@ -2098,8 +2546,8 @@ "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" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "circular-json": { @@ -2107,12 +2555,34 @@ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" }, - "clap": { - "version": "1.2.3", + "circumcenter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/circumcenter/-/circumcenter-1.0.0.tgz", + "integrity": "sha1-INeqE7F/usUvUtpPVMasi5Bu5Sk=", + "requires": { + "dup": "1.0.0", + "robust-linear-solve": "1.0.0" + } + }, + "circumradius": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/circumradius/-/circumradius-1.0.0.tgz", + "integrity": "sha1-cGxEfj5VzR7T0RvRM+N8JSzDBbU=", + "requires": { + "circumcenter": "1.0.0" + } + }, + "clamp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", + "integrity": "sha1-ZqDmQBGBbjcZaCj9yMjBRzEshjQ=" + }, + "clap": { + "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "requires": { - "chalk": "^1.1.3" + "chalk": "1.1.3" } }, "class-utils": { @@ -2120,10 +2590,10 @@ "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" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -2131,7 +2601,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -2146,7 +2616,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", "requires": { - "source-map": "0.5.x" + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -2156,6 +2626,20 @@ } } }, + "clean-pslg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/clean-pslg/-/clean-pslg-1.1.2.tgz", + "integrity": "sha1-vTXHRgt+irWp92Gl7VF5aqPIbBE=", + "requires": { + "big-rat": "1.0.4", + "box-intersect": "1.0.1", + "nextafter": "1.0.0", + "rat-vec": "1.1.1", + "robust-segment-intersect": "1.0.1", + "union-find": "1.0.2", + "uniq": "1.0.1" + } + }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", @@ -2166,7 +2650,7 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { - "restore-cursor": "^2.0.0" + "restore-cursor": "2.0.0" } }, "cli-width": { @@ -2179,8 +2663,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" }, "dependencies": { @@ -2206,7 +2690,7 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "requires": { - "q": "^1.1.2" + "q": "1.5.1" } }, "code-point-at": { @@ -2219,8 +2703,8 @@ "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" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color": { @@ -2228,9 +2712,17 @@ "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" + "clone": "1.0.4", + "color-convert": "1.9.1", + "color-string": "0.3.0" + } + }, + "color-alpha": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.3.tgz", + "integrity": "sha512-ap5UCPpnpsSQu09ccl/5cNQDJlSFvkuXHMBY1+1vu6iKj6H9zw7Sz852snsETFsrYlPUnvTByCFAnYVynKJb9A==", + "requires": { + "color-parse": "1.3.7" } }, "color-convert": { @@ -2238,7 +2730,15 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" + } + }, + "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": { @@ -2246,12 +2746,59 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-normalize": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.3.0.tgz", + "integrity": "sha512-BfOC/x9Q7bmrR1t/Mflfr9c4ZEbr3B+Sz3pWNG6xkcB8mFtF8z32MStJK0NSBmFVhHtFlfXQKOYC/ADbqmxHzg==", + "requires": { + "clamp": "1.0.1", + "color-rgba": "2.1.0", + "dtype": "2.0.0" + } + }, + "color-parse": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.7.tgz", + "integrity": "sha512-8G6rPfyTZhWYKU7D2hwywTjA4YlqX/Z7ClqTEzh5ENc5QkLOff0u8EuyNZR6xScEBhWpAyiDrrVGNUE/Btg2LA==", + "requires": { + "color-name": "1.1.3", + "defined": "1.0.0", + "is-plain-obj": "1.1.0" + } + }, + "color-rgba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.0.tgz", + "integrity": "sha512-yAmMouVOLRAtYJwP52qymiscIMpw2g7VO82pkW+a88BpW1AZ+O6JDxAAojLljGO0pQkkvZLLN9oQNTEgT+RFiw==", + "requires": { + "clamp": "1.0.1", + "color-parse": "1.3.7", + "color-space": "1.16.0" + } + }, + "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": "0.3.0", "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { - "color-name": "^1.0.0" + "color-name": "1.1.3" + } + }, + "colormap": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/colormap/-/colormap-2.3.0.tgz", + "integrity": "sha512-Mkk6mQUMbCleXEeStFm2xLwv5zbRakZMUFB1T1+iNEv58VKBByfPwYIjMQDwSRmXNM1gvo5y3WTYAhmdMn/rbg==", + "requires": { + "lerp": "1.0.3" } }, "colormin": { @@ -2259,9 +2806,9 @@ "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "requires": { - "color": "^0.11.0", + "color": "0.11.4", "css-color-names": "0.0.4", - "has": "^1.0.1" + "has": "1.0.1" } }, "colors": { @@ -2274,7 +2821,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -2287,6 +2834,32 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, + "compare-angle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compare-angle/-/compare-angle-1.0.1.tgz", + "integrity": "sha1-pOtjQW6jx0f8a9bItjZotN5PoSk=", + "requires": { + "robust-orientation": "1.1.3", + "robust-product": "1.0.0", + "robust-sum": "1.0.0", + "signum": "0.0.0", + "two-sum": "1.0.0" + } + }, + "compare-cell": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/compare-cell/-/compare-cell-1.0.0.tgz", + "integrity": "sha1-qetwj24OQa73qlZrEw8ZaNyeGqo=" + }, + "compare-oriented-cell": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/compare-oriented-cell/-/compare-oriented-cell-1.0.1.tgz", + "integrity": "sha1-ahSf7vnfxPj8YjWOUd1C7/u9w54=", + "requires": { + "cell-orientation": "1.0.1", + "compare-cell": "1.0.0" + } + }, "compare-versions": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", @@ -2302,7 +2875,7 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", "requires": { - "mime-db": ">= 1.33.0 < 2" + "mime-db": "1.33.0" } }, "compression": { @@ -2310,13 +2883,13 @@ "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", "requires": { - "accepts": "~1.3.4", + "accepts": "1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.13", + "compressible": "2.0.13", "debug": "2.6.9", - "on-headers": "~1.0.1", + "on-headers": "1.0.1", "safe-buffer": "5.1.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "safe-buffer": { @@ -2336,10 +2909,10 @@ "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" + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" } }, "configstore": { @@ -2347,12 +2920,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "^4.1.0", - "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" + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" } }, "connect-history-api-fallback": { @@ -2365,7 +2938,7 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { - "date-now": "^0.1.4" + "date-now": "0.1.4" } }, "constants-browserify": { @@ -2398,6 +2971,16 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" }, + "convex-hull": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/convex-hull/-/convex-hull-1.0.3.tgz", + "integrity": "sha1-IKOqbOh/St6i/30XlxyfwcZ+H/8=", + "requires": { + "affine-hull": "1.0.0", + "incremental-convex-hull": "1.0.1", + "monotone-convex-hull-2d": "1.0.1" + } + }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", @@ -2428,13 +3011,13 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.4.3", - "minimist": "^1.2.0", - "object-assign": "^4.1.0", - "os-homedir": "^1.0.1", - "parse-json": "^2.2.0", - "require-from-string": "^1.1.0" + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" }, "dependencies": { "minimist": { @@ -2444,13 +3027,18 @@ } } }, + "country-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", + "integrity": "sha1-UcMz3N8Sknt+XuucEKyBEqYSCJY=" + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "bn.js": "4.11.8", + "elliptic": "6.4.0" } }, "create-error-class": { @@ -2458,7 +3046,7 @@ "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" + "capture-stack-trace": "1.0.0" } }, "create-hash": { @@ -2466,11 +3054,11 @@ "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" + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { @@ -2478,12 +3066,12 @@ "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" + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "create-react-context": { @@ -2491,8 +3079,8 @@ "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.3.tgz", "integrity": "sha512-CQBmD0+QGgTaxDL3OX1IDXYqjkp2It4RIbcb99jS6AEg27Ga+a9G3JtK6SIu0HBwPLZlmwt9F7UwWA4Bn92Rag==", "requires": { - "fbjs": "^0.8.0", - "gud": "^1.0.0" + "fbjs": "0.8.16", + "gud": "1.0.0" } }, "cross-spawn": { @@ -2500,9 +3088,9 @@ "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" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.0" } }, "cryptiles": { @@ -2510,7 +3098,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.x.x" + "boom": "5.2.0" }, "dependencies": { "boom": { @@ -2518,7 +3106,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } } } @@ -2528,17 +3116,17 @@ "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" + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "crypto-random-string": { @@ -2551,25 +3139,66 @@ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" }, + "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.1" + } + }, + "css-font-size-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", + "integrity": "sha1-hUh1rOmspqjS7g00WkSq6btttss=" + }, + "css-font-stretch-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", + "integrity": "sha1-UM7puboDH7XJUtRyMTnx4Qe1SxA=" + }, + "css-font-style-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", + "integrity": "sha1-XDUygT9jtKHelU0TzqhqtDM0CeQ=" + }, + "css-font-weight-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", + "integrity": "sha1-m8BGcayFvHJLV07106yWsNYE/Zc=" + }, + "css-global-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", + "integrity": "sha1-cqmupyeW0Bmx0qMlLeTlqqN+Smk=" + }, "css-loader": { "version": "0.28.7", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", "requires": { - "babel-code-frame": "^6.11.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": ">=2.6.1 <4", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.0", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.1.0", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.1.0", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.0", + "source-list-map": "2.0.0" }, "dependencies": { "has-flag": { @@ -2582,10 +3211,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -2598,7 +3227,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -2608,10 +3237,10 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", + "boolbase": "1.0.0", + "css-what": "2.1.0", "domutils": "1.5.1", - "nth-check": "~1.0.1" + "nth-check": "1.0.1" } }, "css-selector-tokenizer": { @@ -2619,9 +3248,9 @@ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" }, "dependencies": { "regexpu-core": { @@ -2629,18 +3258,28 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } } } }, + "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-what": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" }, + "csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs=" + }, "cssesc": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", @@ -2651,38 +3290,38 @@ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.1", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.2", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.0", + "postcss-zindex": "2.2.0" }, "dependencies": { "autoprefixer": { @@ -2690,12 +3329,12 @@ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000839", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" } }, "browserslist": { @@ -2703,8 +3342,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000839", + "electron-to-chromium": "1.3.45" } }, "has-flag": { @@ -2717,10 +3356,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -2733,7 +3372,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -2743,8 +3382,8 @@ "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" + "clap": "1.2.3", + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -2764,15 +3403,83 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "requires": { - "cssom": "0.3.x" + "cssom": "0.3.2" } }, + "cubic-hermite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", + "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "requires": { - "array-find-index": "^1.0.1" + "array-find-index": "1.0.2" + } + }, + "cwise": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/cwise/-/cwise-1.0.10.tgz", + "integrity": "sha1-JO7mBy69/WuMb12tsXCQtkmxK+8=", + "requires": { + "cwise-compiler": "1.1.3", + "cwise-parser": "1.0.3", + "static-module": "1.5.0", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "cwise-compiler": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cwise-compiler/-/cwise-compiler-1.1.3.tgz", + "integrity": "sha1-9NZnQQ6FDToxOn0tt7HlBbsDTMU=", + "requires": { + "uniq": "1.0.1" + } + }, + "cwise-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cwise-parser/-/cwise-parser-1.0.3.tgz", + "integrity": "sha1-jkk8F9VPl8sDCp6YVLyGyd+zVP4=", + "requires": { + "esprima": "1.2.5", + "uniq": "1.0.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", + "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=" + } } }, "d": { @@ -2780,9 +3487,14 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "0.10.42" } }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + }, "d3-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", @@ -2798,6 +3510,22 @@ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.2.0.tgz", "integrity": "sha512-dmL9Zr/v39aSSMnLOTd58in2RbregCg4UtGyUArvEKTTN6S3HKEy+ziBWVYo9PTzRyVW+pUBHUtRKz0HYX+SQg==" }, + "d3-dispatch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.5.tgz", + "integrity": "sha512-vwKx+lAqB1UuCeklr6Jh1bvC4SZgbSqbkGBLClItFBIYH4vqDJCA7qfoy14lXmJdnBOdxndAMxjCbImJYW7e6g==" + }, + "d3-force": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.2.tgz", + "integrity": "sha512-p1vcHAUF1qH7yR+e8ip7Bs61AHjLeKkIn8Z2gzwU2lwEf2wkSpWdjXG0axudTHsVFnYGlMkFaEsVy2l8tAg1Gw==", + "requires": { + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.5", + "d3-quadtree": "1.0.5", + "d3-timer": "1.0.9" + } + }, "d3-format": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.3.0.tgz", @@ -2808,7 +3536,7 @@ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.2.0.tgz", "integrity": "sha512-zLvTk8CREPFfc/2XglPQriAsXkzoRDAyBzndtKJWrZmHw7kmOWHNS11e40kPTd/oGk8P5mFJW5uBbcFQ+ybxyA==", "requires": { - "d3-color": "1" + "d3-color": "1.2.0" } }, "d3-path": { @@ -2816,18 +3544,23 @@ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", "integrity": "sha1-JB6xhJvZ6egCHA0KeZ+KDo5EF2Q=" }, + "d3-quadtree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.5.tgz", + "integrity": "sha512-U2tjwDFbZ75JRAg8A+cqMvqPg1G3BE7UTJn3h8DHjY/pnsAfWdbJKgyfcy7zKjqGtLAmI0q8aDSeG1TVIKRaHQ==" + }, "d3-scale": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.6.tgz", "integrity": "sha1-vOGdqA06DPQiyVQ64zIghiILNO0=", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.2.0", + "d3-format": "1.3.0", + "d3-interpolate": "1.2.0", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" } }, "d3-shape": { @@ -2835,7 +3568,7 @@ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", "requires": { - "d3-path": "1" + "d3-path": "1.0.5" } }, "d3-time": { @@ -2848,9 +3581,14 @@ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", "requires": { - "d3-time": "1" + "d3-time": "1.0.8" } }, + "d3-timer": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.9.tgz", + "integrity": "sha512-rT34J5HnQUHhcLvhSB9GjCkN0Ddd5Y8nCwDBG2u6wQEeYxT/Lf51fTFFkldeib/sE/J0clIe0pnCfs6g/lRbyg==" + }, "damerau-levenshtein": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", @@ -2861,7 +3599,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "date-now": { @@ -2917,7 +3655,7 @@ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "requires": { - "strip-bom": "^2.0.0" + "strip-bom": "2.0.0" } }, "define-properties": { @@ -2925,8 +3663,8 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" + "foreach": "2.0.5", + "object-keys": "1.0.11" } }, "define-property": { @@ -2934,8 +3672,8 @@ "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" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -2943,7 +3681,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2951,7 +3689,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2959,9 +3697,9 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -2976,13 +3714,22 @@ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "delaunay-triangulate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/delaunay-triangulate/-/delaunay-triangulate-1.1.6.tgz", + "integrity": "sha1-W7yiGweBmNS8PHV5ajXLuYwllUw=", + "requires": { + "incremental-convex-hull": "1.0.1", + "uniq": "1.0.1" } }, "delayed-stream": { @@ -3000,8 +3747,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -3014,9 +3761,14 @@ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, + "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-node": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", @@ -3027,8 +3779,8 @@ "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" + "address": "1.0.3", + "debug": "2.6.9" } }, "diff": { @@ -3041,9 +3793,9 @@ "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" + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" } }, "discontinuous-range": { @@ -3062,8 +3814,8 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "ip": "1.1.5", + "safe-buffer": "5.1.2" } }, "dns-txt": { @@ -3071,7 +3823,7 @@ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "buffer-indexof": "^1.0.0" + "buffer-indexof": "1.1.1" } }, "doctrine": { @@ -3079,7 +3831,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "requires": { - "esutils": "^2.0.2" + "esutils": "2.0.2" } }, "dom-converter": { @@ -3087,7 +3839,7 @@ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", "requires": { - "utila": "~0.3" + "utila": "0.3.3" }, "dependencies": { "utila": { @@ -3107,8 +3859,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "1.1.3", + "entities": "1.1.1" }, "dependencies": { "domelementtype": { @@ -3123,7 +3875,7 @@ "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz", "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=", "requires": { - "urijs": "^1.16.1" + "urijs": "1.19.1" } }, "domain-browser": { @@ -3141,7 +3893,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "domutils": { @@ -3149,8 +3901,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" } }, "dot-prop": { @@ -3158,7 +3910,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "dotenv": { @@ -3171,14 +3923,19 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" }, + "double-bits": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/double-bits/-/double-bits-1.1.1.tgz", + "integrity": "sha1-WKu6RUlNpND6Nrc60RoobJGEscY=" + }, "draft-js": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz", "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==", "requires": { - "fbjs": "^0.8.15", - "immutable": "~3.7.4", - "object-assign": "^4.1.0" + "fbjs": "0.8.16", + "immutable": "3.7.6", + "object-assign": "4.1.1" }, "dependencies": { "immutable": { @@ -3188,23 +3945,97 @@ } } }, + "draw-svg-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", + "integrity": "sha1-bxFtli3TFLmepTTW9Y3WbNvWk3k=", + "requires": { + "abs-svg-path": "0.1.1", + "normalize-svg-path": "0.1.0" + } + }, + "dtype": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", + "integrity": "sha1-zQUjI84GFETs0uj1dI9popvihDQ=" + }, + "dup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", + "integrity": "sha1-UfxaxoX4GWRp3wuQXpNLIK9bQCk=" + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, + "earcut": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.1.3.tgz", + "integrity": "sha512-AxdCdWUk1zzK/NuZ7e1ljj6IGC+VAdC3Qb7QQDsXpfNrc5IM8tL9nNXUmEGE6jRHTfZ10zhzRhtDmWVsR5pd3A==" + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" + } + }, + "edges-to-adjacency-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/edges-to-adjacency-list/-/edges-to-adjacency-list-1.0.0.tgz", + "integrity": "sha1-wUbS4ISt37p0pRKTxuAZmkn3V/E=", + "requires": { + "uniq": "1.0.1" } }, "ee-first": { @@ -3217,18 +4048,23 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", "integrity": "sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=" }, + "element-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", + "integrity": "sha1-ZOXxWdlxIWMYRby67K8nnDm1404=" + }, "elliptic": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "emoji-regex": { @@ -3251,7 +4087,15 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.23" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "1.4.0" } }, "enhanced-resolve": { @@ -3259,10 +4103,10 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" } }, "entities": { @@ -3276,24 +4120,24 @@ "integrity": "sha512-I51gsZvXiUjrJC3oJ9wo1tvKyWQrrLD+7esOwTw5sZeQ6a+GVcQYVroXBF13hB/kJQ4vurtxEm35+5T1Q8R2Pw==", "dev": true, "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3" + "array.prototype.flat": "1.2.1", + "cheerio": "1.0.0-rc.2", + "function.prototype.name": "1.1.0", + "has": "1.0.3", + "is-boolean-object": "1.0.0", + "is-callable": "1.1.4", + "is-number-object": "1.0.3", + "is-string": "1.0.4", + "is-subset": "0.1.1", + "lodash.escape": "4.0.1", + "lodash.isequal": "4.5.0", + "object-inspect": "1.6.0", + "object-is": "1.0.1", + "object.assign": "4.1.0", + "object.entries": "1.0.4", + "object.values": "1.0.4", + "raf": "3.4.0", + "rst-selector-parser": "2.2.3" }, "dependencies": { "has": { @@ -3302,7 +4146,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "function-bind": "1.1.1" } }, "is-callable": { @@ -3319,13 +4163,13 @@ "integrity": "sha512-TRX+Y5QPreGmqfFU3bPsJUmqNZX9paQCmQ93kj7hnfQoZzufO/pahGN/OviWn60YcgaQojhf0AWv3PxrIDARbA==", "dev": true, "requires": { - "enzyme-adapter-utils": "^1.6.0", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.values": "^1.0.4", - "prop-types": "^15.6.2", - "react-is": "^16.4.2", - "react-test-renderer": "^16.0.0-0" + "enzyme-adapter-utils": "1.6.0", + "function.prototype.name": "1.1.0", + "object.assign": "4.1.0", + "object.values": "1.0.4", + "prop-types": "15.6.2", + "react-is": "16.4.2", + "react-test-renderer": "16.4.2" }, "dependencies": { "prop-types": { @@ -3334,8 +4178,8 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "react-is": { @@ -3352,9 +4196,9 @@ "integrity": "sha512-8bzxmmBwYNqgEVVpTgONW3IzH3eYHiLZp+V+JL1GPKLVbIMnXSPChsQ7EKMdIimf6+aSHzANUEsGXG+zSRS23w==", "dev": true, "requires": { - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "prop-types": "^15.6.2" + "function.prototype.name": "1.1.0", + "object.assign": "4.1.0", + "prop-types": "15.6.2" }, "dependencies": { "prop-types": { @@ -3363,8 +4207,8 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } } } @@ -3374,7 +4218,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "error-ex": { @@ -3382,7 +4226,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es-abstract": { @@ -3390,11 +4234,11 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" } }, "es-to-primitive": { @@ -3402,9 +4246,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" } }, "es5-ext": { @@ -3412,9 +4256,9 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -3422,9 +4266,9 @@ "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" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-symbol": "3.1.1" } }, "es6-map": { @@ -3432,12 +4276,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-promise": { @@ -3450,11 +4294,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" } }, "es6-symbol": { @@ -3462,8 +4306,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.42" } }, "es6-weak-map": { @@ -3471,10 +4315,10 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "escape-html": { @@ -3492,11 +4336,11 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" }, "dependencies": { "esprima": { @@ -3511,10 +4355,10 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint": { @@ -3523,43 +4367,43 @@ "integrity": "sha512-gPSfpSRCHre1GLxGmO68tZNxOlL2y7xBd95VcLD+Eo4S2js31YoMum3CAQIOaxY24hqYOMksMvW38xuuWKQTgw==", "dev": true, "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.2", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.3", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.7.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.3", + "text-table": "0.2.0" }, "dependencies": { "ansi-regex": { @@ -3574,9 +4418,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "debug": { @@ -3606,8 +4450,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "strip-ansi": { @@ -3616,7 +4460,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -3627,7 +4471,7 @@ "integrity": "sha512-rQqOvAzrMC3BBCH6Dd/1RenDi+RW4vdgnh8xcPf6sgd324ad6aX7hSZ52L1SfDGe2VsZR2yB5uPvDfXYvxHZmA==", "dev": true, "requires": { - "eslint-restricted-globals": "^0.1.1" + "eslint-restricted-globals": "0.1.1" } }, "eslint-config-react-app": { @@ -3646,8 +4490,8 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" + "debug": "2.6.9", + "resolve": "1.6.0" } }, "eslint-import-resolver-webpack": { @@ -3656,17 +4500,17 @@ "integrity": "sha512-b6JxR57ruiMxq2tIu4T/SrYED5RKJfeBEs8u3+JWF+O2RxDmFpUH84c5uS1T5qiP0K4r0SL7CXhvd41hXdDlAg==", "dev": true, "requires": { - "array-find": "^1.0.0", - "debug": "^2.6.8", - "enhanced-resolve": "~0.9.0", - "find-root": "^0.1.1", - "has": "^1.0.1", - "interpret": "^1.0.0", - "is-absolute": "^0.2.3", - "lodash.get": "^3.7.0", - "node-libs-browser": "^1.0.0 || ^2.0.0", - "resolve": "^1.2.0", - "semver": "^5.3.0" + "array-find": "1.0.0", + "debug": "2.6.9", + "enhanced-resolve": "0.9.1", + "find-root": "0.1.2", + "has": "1.0.1", + "interpret": "1.1.0", + "is-absolute": "0.2.6", + "lodash.get": "3.7.0", + "node-libs-browser": "2.1.0", + "resolve": "1.6.0", + "semver": "5.5.0" }, "dependencies": { "enhanced-resolve": { @@ -3675,9 +4519,9 @@ "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" + "graceful-fs": "4.1.11", + "memory-fs": "0.2.0", + "tapable": "0.1.10" } }, "memory-fs": { @@ -3699,11 +4543,11 @@ "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.1" + "loader-fs-cache": "1.0.1", + "loader-utils": "1.1.0", + "object-assign": "4.1.1", + "object-hash": "1.3.0", + "rimraf": "2.6.2" } }, "eslint-module-utils": { @@ -3711,8 +4555,8 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "requires": { - "debug": "^2.6.8", - "pkg-dir": "^1.0.0" + "debug": "2.6.9", + "pkg-dir": "1.0.0" }, "dependencies": { "find-up": { @@ -3720,8 +4564,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -3729,7 +4573,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "pkg-dir": { @@ -3737,7 +4581,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" } } } @@ -3759,7 +4603,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz", "integrity": "sha512-RiQv+7Z9QDJuzt+NO8sYgkLGT+h+WeCrxP7y8lI7wpU41x3x/2o3PGtHk9ck8QnA9/mlbNcy/hG0eKvmd7npaA==", "requires": { - "lodash": "^4.15.0" + "lodash": "4.17.10" } }, "eslint-plugin-import": { @@ -3767,16 +4611,16 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", "requires": { - "builtin-modules": "^1.1.1", - "contains-path": "^0.1.0", - "debug": "^2.6.8", + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.1.1", - "has": "^1.0.1", - "lodash.cond": "^4.3.0", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0" + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.2.0", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" }, "dependencies": { "doctrine": { @@ -3784,8 +4628,8 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "2.0.2", + "isarray": "1.0.0" } }, "load-json-file": { @@ -3793,10 +4637,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" } }, "path-type": { @@ -3804,7 +4648,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" } }, "read-pkg": { @@ -3812,9 +4656,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" } }, "read-pkg-up": { @@ -3822,8 +4666,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "strip-bom": { @@ -3838,13 +4682,13 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz", "integrity": "sha512-5I9SpoP7gT4wBFOtXT8/tXNPYohHBVfyVfO17vkbC7r9kEIxYJF12D3pKqhk8+xnk12rfxKClS3WCFpVckFTPQ==", "requires": { - "aria-query": "^0.7.0", - "array-includes": "^3.0.3", + "aria-query": "0.7.1", + "array-includes": "3.0.3", "ast-types-flow": "0.0.7", - "axobject-query": "^0.1.0", - "damerau-levenshtein": "^1.0.0", - "emoji-regex": "^6.1.0", - "jsx-ast-utils": "^1.4.0" + "axobject-query": "0.1.0", + "damerau-levenshtein": "1.0.4", + "emoji-regex": "6.5.1", + "jsx-ast-utils": "1.4.1" } }, "eslint-plugin-node": { @@ -3853,9 +4697,9 @@ "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", "dev": true, "requires": { - "ignore": "^3.3.6", - "minimatch": "^3.0.4", - "resolve": "^1.3.3", + "ignore": "3.3.10", + "minimatch": "3.0.4", + "resolve": "1.6.0", "semver": "5.3.0" }, "dependencies": { @@ -3878,10 +4722,10 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz", "integrity": "sha512-tvjU9u3VqmW2vVuYnE8Qptq+6ji4JltjOjJ9u7VAOxVYkUkyBZWRvNYKbDv5fN+L6wiA+4we9+qQahZ0m63XEA==", "requires": { - "doctrine": "^2.0.0", - "has": "^1.0.1", - "jsx-ast-utils": "^2.0.0", - "prop-types": "^15.5.10" + "doctrine": "2.1.0", + "has": "1.0.1", + "jsx-ast-utils": "2.0.1", + "prop-types": "15.6.1" }, "dependencies": { "jsx-ast-utils": { @@ -3889,7 +4733,7 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", "requires": { - "array-includes": "^3.0.3" + "array-includes": "3.0.3" } } } @@ -3911,8 +4755,8 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint-visitor-keys": { @@ -3926,8 +4770,8 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "5.5.3", + "acorn-jsx": "3.0.1" } }, "esprima": { @@ -3940,7 +4784,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "requires": { - "estraverse": "^4.0.0" + "estraverse": "4.2.0" } }, "esrecurse": { @@ -3948,7 +4792,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "requires": { - "estraverse": "^4.1.0" + "estraverse": "4.2.0" } }, "estraverse": { @@ -3971,8 +4815,8 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.42" } }, "eventemitter3": { @@ -3990,7 +4834,7 @@ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "requires": { - "original": ">=0.0.5" + "original": "1.0.0" } }, "evp_bytestokey": { @@ -3998,8 +4842,8 @@ "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" + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" } }, "exec-sh": { @@ -4007,7 +4851,7 @@ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "requires": { - "merge": "^1.1.3" + "merge": "1.2.1" } }, "execa": { @@ -4015,13 +4859,13 @@ "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" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "exenv": { @@ -4034,13 +4878,13 @@ "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" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -4048,7 +4892,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -4056,7 +4900,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4066,7 +4910,7 @@ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.4" }, "dependencies": { "fill-range": { @@ -4074,11 +4918,11 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.0.0", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" } }, "is-number": { @@ -4086,7 +4930,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "isobject": { @@ -4102,7 +4946,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4112,44 +4956,49 @@ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "requires": { - "homedir-polyfill": "^1.0.1" + "homedir-polyfill": "1.0.1" } }, + "expect.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.2.0.tgz", + "integrity": "sha1-EChTPSwcNj90pnlv9X7AUg3tK+E=" + }, "express": { "version": "4.16.3", "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "accepts": "~1.3.5", + "accepts": "1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.3.1", "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", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", + "proxy-addr": "2.0.3", "qs": "6.5.1", - "range-parser": "~1.2.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.1", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "statuses": "1.4.0", + "type-is": "1.6.16", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "array-flatten": { @@ -4184,8 +5033,8 @@ "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" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -4193,7 +5042,7 @@ "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" + "is-plain-object": "2.0.4" } } } @@ -4203,9 +5052,9 @@ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" + "chardet": "0.4.2", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" } }, "extglob": { @@ -4213,14 +5062,14 @@ "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" + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -4228,7 +5077,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -4236,7 +5085,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -4244,7 +5093,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -4252,7 +5101,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -4260,22 +5109,27 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } }, + "extract-frustum-planes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extract-frustum-planes/-/extract-frustum-planes-1.0.0.tgz", + "integrity": "sha1-l9VwP/BWTIw8aDjKxF+ee8UsnvU=" + }, "extract-text-webpack-plugin": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" + "async": "2.6.0", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0", + "webpack-sources": "1.1.0" } }, "extsprintf": { @@ -4283,11 +5137,37 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, + "falafel": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", + "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "requires": { + "acorn": "5.5.3", + "foreach": "2.0.5", + "isarray": "0.0.1", + "object-keys": "1.0.11" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" }, + "fast-isnumeric": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.2.tgz", + "integrity": "sha512-D7zJht1+NZBBv4759yXn/CJFUNJpILdgdosPFN1AjqQn9TfQJqSeCZfu0SY4bwIlXuDhzkxKoQ8BOqdiXpVzvA==", + "requires": { + "is-string-blank": "1.0.1" + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -4308,7 +5188,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { - "websocket-driver": ">=0.5.1" + "websocket-driver": "0.7.0" } }, "fb-watchman": { @@ -4316,7 +5196,7 @@ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "requires": { - "bser": "^2.0.0" + "bser": "2.0.0" } }, "fbjs": { @@ -4324,13 +5204,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.9" + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.18" } }, "figures": { @@ -4338,7 +5218,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "1.0.5" } }, "file-entry-cache": { @@ -4346,8 +5226,8 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, "file-loader": { @@ -4355,8 +5235,8 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" } }, "file-saver": { @@ -4374,8 +5254,8 @@ "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "requires": { - "glob": "^7.0.3", - "minimatch": "^3.0.3" + "glob": "7.1.2", + "minimatch": "3.0.4" } }, "filesize": { @@ -4388,10 +5268,10 @@ "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" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -4399,23 +5279,32 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } }, + "filtered-vector": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.4.tgz", + "integrity": "sha1-VkU8A030MC0pPKjs3qw/kKvGeNM=", + "requires": { + "binary-search-bounds": "1.0.0", + "cubic-hermite": "1.0.0" + } + }, "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" } }, "find-cache-dir": { @@ -4423,9 +5312,9 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" } }, "find-root": { @@ -4439,7 +5328,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "flat-cache": { @@ -4447,10 +5336,10 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" } }, "flatten": { @@ -4458,6 +5347,14 @@ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, + "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" + } + }, "fn-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", @@ -4468,7 +5365,7 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", "requires": { - "debug": "^3.1.0" + "debug": "3.1.0" }, "dependencies": { "debug": { @@ -4481,6 +5378,39 @@ } } }, + "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.2.0" + } + }, + "font-atlas-sdf": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/font-atlas-sdf/-/font-atlas-sdf-1.3.3.tgz", + "integrity": "sha512-GxUpcdkdoHgC3UrpMuA7JmG1Ty/MY0BhfmV8r7ZSv3bkqBY5vmRIjcj7Pg8iqj20B03vlU6fUhdpyIgEo/Z35w==", + "requires": { + "optical-properties": "1.0.0", + "tiny-sdf": "1.0.2" + } + }, + "font-measure": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", + "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", + "requires": { + "css-font": "1.2.0" + } + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4491,7 +5421,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "foreach": { @@ -4509,9 +5439,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.18" } }, "formik": { @@ -4519,15 +5449,15 @@ "resolved": "https://registry.npmjs.org/formik/-/formik-1.2.0.tgz", "integrity": "sha512-WtVCIf5LrFdv2lhhReWPVbKkUai4BEoHCKTjdIklKAk/MjhrnAXJkOJMFq0aA8g8B2KWNs/oXBTkIeEWCIlVuA==", "requires": { - "create-react-context": "^0.2.2", - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^2.5.5", - "lodash.clonedeep": "^4.5.0", + "create-react-context": "0.2.3", + "deepmerge": "2.1.1", + "hoist-non-react-statics": "2.5.5", + "lodash.clonedeep": "4.5.0", "lodash.topath": "4.5.2", - "prop-types": "^15.6.1", - "react-fast-compare": "^1.0.0", - "tslib": "^1.9.3", - "warning": "^3.0.0" + "prop-types": "15.6.1", + "react-fast-compare": "1.0.0", + "tslib": "1.9.3", + "warning": "3.0.0" }, "dependencies": { "hoist-non-react-statics": { @@ -4547,7 +5477,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fresh": { @@ -4555,14 +5485,23 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "fs-extra": { - "version": "3.0.1", + "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.3", + "readable-stream": "2.3.6" + } + }, + "fs-extra": { + "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" + "graceful-fs": "4.1.11", + "jsonfile": "3.0.1", + "universalify": "0.1.1" } }, "fs.realpath": { @@ -4576,8 +5515,8 @@ "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.9.0" + "nan": "2.10.0", + "node-pre-gyp": "0.9.1" }, "dependencies": { "abbrev": { @@ -4603,8 +5542,8 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "balanced-match": { @@ -4617,7 +5556,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -4681,7 +5620,7 @@ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "fs.realpath": { @@ -4696,14 +5635,14 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" } }, "glob": { @@ -4712,12 +5651,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "has-unicode": { @@ -4732,7 +5671,7 @@ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": "2.1.2" } }, "ignore-walk": { @@ -4741,7 +5680,7 @@ "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "inflight": { @@ -4750,8 +5689,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -4770,7 +5709,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "isarray": { @@ -4784,7 +5723,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -4797,8 +5736,8 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "minizlib": { @@ -4807,7 +5746,7 @@ "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.2.4" } }, "mkdirp": { @@ -4830,9 +5769,9 @@ "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", "optional": true, "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" } }, "node-pre-gyp": { @@ -4841,16 +5780,16 @@ "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.6", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" } }, "nopt": { @@ -4859,8 +5798,8 @@ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "npm-bundled": { @@ -4875,8 +5814,8 @@ "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" } }, "npmlog": { @@ -4885,10 +5824,10 @@ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -4907,7 +5846,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -4928,8 +5867,8 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -4950,10 +5889,10 @@ "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "optional": true, "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -4970,13 +5909,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "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.2" } }, "rimraf": { @@ -4985,7 +5924,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -5028,9 +5967,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -5039,7 +5978,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } }, "strip-ansi": { @@ -5047,7 +5986,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -5062,13 +6001,13 @@ "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", "optional": true, "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" } }, "util-deprecate": { @@ -5083,7 +6022,7 @@ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" } }, "wrappy": { @@ -5109,9 +6048,9 @@ "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "is-callable": "^1.1.3" + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "is-callable": "1.1.3" } }, "functional-red-black-tree": { @@ -5119,11 +6058,44 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "gamma": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/gamma/-/gamma-0.1.0.tgz", + "integrity": "sha1-MxVkNAO/J5BsqAqzfDbs6UQO8zA=" + }, + "geojson-rewind": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/geojson-rewind/-/geojson-rewind-0.3.1.tgz", + "integrity": "sha1-IiQHl8hHzC8MHTE+SqDJFa+n8p0=", + "requires": { + "@mapbox/geojson-area": "0.2.2", + "concat-stream": "1.6.2", + "minimist": "1.2.0", + "sharkdown": "0.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "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": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, + "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-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -5144,20 +6116,437 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" + } + }, + "gl-axes3d": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gl-axes3d/-/gl-axes3d-1.4.0.tgz", + "integrity": "sha512-aakup65ywK7Bo0k/2IAq8AdvtZYHJANskePJpElcmuC1vm0l+4sRKmXevdR9AYBDNh5KEULFSnTe9RHVPvBtxQ==", + "requires": { + "bit-twiddle": "1.0.2", + "dup": "1.0.0", + "extract-frustum-planes": "1.0.0", + "gl-buffer": "2.1.2", + "gl-mat4": "1.2.0", + "gl-shader": "4.2.1", + "gl-state": "1.0.0", + "gl-vao": "1.3.0", + "gl-vec4": "1.0.1", + "glslify": "6.4.1", + "robust-orientation": "1.1.3", + "split-polygon": "1.0.0", + "vectorize-text": "3.2.0" + } + }, + "gl-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gl-buffer/-/gl-buffer-2.1.2.tgz", + "integrity": "sha1-LbjZwaVSf7oM25EonCBuiCuInNs=", + "requires": { + "ndarray": "1.0.18", + "ndarray-ops": "1.2.2", + "typedarray-pool": "1.1.0" + } + }, + "gl-cone3d": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/gl-cone3d/-/gl-cone3d-1.2.1.tgz", + "integrity": "sha512-6Hc/l2qHnQXtVWzE/9i3ZmCVrLaBUYO0VTTH3g46jdkBuNlbALr9bo8ZCtHMIkeZhvzfKzfNylQGLiJL7zqdxw==", + "requires": { + "gl-shader": "4.2.1", + "gl-vec3": "1.1.3", + "glsl-inverse": "1.0.0", + "glsl-out-of-range": "1.0.3", + "glslify": "6.4.1" + } + }, + "gl-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-constants/-/gl-constants-1.0.0.tgz", + "integrity": "sha1-WXpQTjZHUP9QJTqjX43qevSl0jM=" + }, + "gl-contour2d": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/gl-contour2d/-/gl-contour2d-1.1.4.tgz", + "integrity": "sha512-deoY6k5ZcQfh5brlF3nXKs8FqhMNejlxIqWcK+bKenLcThJF94OR7DtQDwLwNXsYAZlsoDt+G01efXid6Modkg==", + "requires": { + "binary-search-bounds": "2.0.4", + "cdt2d": "1.0.0", + "clean-pslg": "1.1.2", + "gl-buffer": "2.1.2", + "gl-shader": "4.2.1", + "glslify": "6.4.1", + "iota-array": "1.0.0", + "ndarray": "1.0.18", + "surface-nets": "1.0.2" + }, + "dependencies": { + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + } + } + }, + "gl-error3d": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/gl-error3d/-/gl-error3d-1.0.9.tgz", + "integrity": "sha512-YGwUzfPx8CqYDFD20+jaQTSi0K96s0DA+a/FO6d8OxrLnCyTvrRiglx2bdekAHxjgEAOep0CRaIe7iLvItbiyw==", + "requires": { + "gl-buffer": "2.1.2", + "gl-shader": "4.2.1", + "gl-vao": "1.3.0", + "glsl-out-of-range": "1.0.3", + "glslify": "6.4.1" + } + }, + "gl-fbo": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/gl-fbo/-/gl-fbo-2.0.5.tgz", + "integrity": "sha1-D6daSXz3h2lVMGkcjwSrtvtV+iI=", + "requires": { + "gl-texture2d": "2.1.0" + } + }, + "gl-format-compiler-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gl-format-compiler-error/-/gl-format-compiler-error-1.0.3.tgz", + "integrity": "sha1-DHmxdRiZzpcy6GJA8JCqQemEcag=", + "requires": { + "add-line-numbers": "1.0.1", + "gl-constants": "1.0.0", + "glsl-shader-name": "1.0.0", + "sprintf-js": "1.0.3" + } + }, + "gl-heatmap2d": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gl-heatmap2d/-/gl-heatmap2d-1.0.4.tgz", + "integrity": "sha512-AWJykMTbCM0ZT20jiFaauRVmLv9dxtNNuTS1NQlKD8yBD0iZ62mgWLeYLUMjil6XN8K3P9EpUCBolvcx1Wf0kA==", + "requires": { + "binary-search-bounds": "2.0.4", + "gl-buffer": "2.1.2", + "gl-shader": "4.2.1", + "glslify": "6.4.1", + "iota-array": "1.0.0", + "typedarray-pool": "1.1.0" + }, + "dependencies": { + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + } + } + }, + "gl-line3d": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/gl-line3d/-/gl-line3d-1.1.6.tgz", + "integrity": "sha512-22DcHvezFTJ0BK1lYyV9FRV4Z2moey0RAiFynGEIrvbUq3EBd7e+Sftv1/A6kxNUqdp5SIWmMdGznoAPD9P8FQ==", + "requires": { + "binary-search-bounds": "1.0.0", + "gl-buffer": "2.1.2", + "gl-shader": "4.2.1", + "gl-texture2d": "2.1.0", + "gl-vao": "1.3.0", + "glsl-out-of-range": "1.0.3", + "glsl-read-float": "1.1.0", + "glslify": "6.4.1", + "ndarray": "1.0.18" + } + }, + "gl-mat2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-mat2/-/gl-mat2-1.0.1.tgz", + "integrity": "sha1-FCUFcwpcL+Hp8l2ezj0NbMJxCjA=" + }, + "gl-mat3": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", + "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" + }, + "gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "gl-matrix-invert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-matrix-invert/-/gl-matrix-invert-1.0.0.tgz", + "integrity": "sha1-o2173jZUxFkKEn7nxo9uE/6oxj0=", + "requires": { + "gl-mat2": "1.0.1", + "gl-mat3": "1.0.0", + "gl-mat4": "1.2.0" + } + }, + "gl-mesh3d": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gl-mesh3d/-/gl-mesh3d-2.0.2.tgz", + "integrity": "sha512-gKkeEDBVP1rp6iDzz/aomAMsDkkoieihsXJccampo0zhfi9To6xhadEDt6axdUpv5rNjM8l02IPp/wuLDuLJOg==", + "requires": { + "barycentric": "1.0.1", + "colormap": "2.3.0", + "gl-buffer": "2.1.2", + "gl-mat4": "1.2.0", + "gl-shader": "4.2.1", + "gl-texture2d": "2.1.0", + "gl-vao": "1.3.0", + "glsl-face-normal": "1.0.2", + "glsl-out-of-range": "1.0.3", + "glsl-specular-cook-torrance": "2.0.1", + "glslify": "6.4.1", + "ndarray": "1.0.18", + "normals": "1.1.0", + "polytope-closest-point": "1.0.0", + "simplicial-complex-contour": "1.0.2", + "typedarray-pool": "1.1.0" + } + }, + "gl-plot2d": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gl-plot2d/-/gl-plot2d-1.4.0.tgz", + "integrity": "sha512-cO1R6TSMHZKxpsxT2jSxxZ/sN6KdkPLvpzp1t5W5qB5xUs4RiTmAw1jd9s1ogdZYBqYJVIrj6ktCrua3Ligc+Q==", + "requires": { + "binary-search-bounds": "2.0.4", + "gl-buffer": "2.1.2", + "gl-select-static": "2.0.2", + "gl-shader": "4.2.1", + "glsl-inverse": "1.0.0", + "glslify": "6.4.1", + "text-cache": "4.2.0" + }, + "dependencies": { + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + } + } + }, + "gl-plot3d": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gl-plot3d/-/gl-plot3d-1.6.0.tgz", + "integrity": "sha512-SWUXVuWlBE+GIQWysB5HmoqBDkkaCydT8JJl5CWyApau3bTtHzEEafMEBBfkc4THmk/3YXgmjmSlXF5vefTo/g==", + "requires": { + "3d-view-controls": "2.2.2", + "a-big-triangle": "1.0.3", + "gl-axes3d": "1.4.0", + "gl-fbo": "2.0.5", + "gl-mat4": "1.2.0", + "gl-select-static": "2.0.2", + "gl-shader": "4.2.1", + "gl-spikes3d": "1.0.6", + "glslify": "6.4.1", + "is-mobile": "2.0.0", + "mouse-change": "1.4.0", + "ndarray": "1.0.18" + } + }, + "gl-pointcloud2d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-pointcloud2d/-/gl-pointcloud2d-1.0.1.tgz", + "integrity": "sha512-bCNaPSrZjBiKRrlbhHdipnmTc5xteubksevbPrmdlk2R6PTwQlQ38TDxuRYan02j0uDtem9wEp8etYYMjZFMhA==", + "requires": { + "gl-buffer": "2.1.2", + "gl-shader": "4.2.1", + "glslify": "6.4.1", + "typedarray-pool": "1.1.0" + } + }, + "gl-quat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", + "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", + "requires": { + "gl-mat3": "1.0.0", + "gl-vec3": "1.1.3", + "gl-vec4": "1.0.1" + } + }, + "gl-scatter3d": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gl-scatter3d/-/gl-scatter3d-1.1.0.tgz", + "integrity": "sha512-8O/YXxRZloG0LPkmd5hr50IMmgbqdvQZ1axH+E90CpBrqez6D24WFJg74vPka2YJf89DIms8i6kElDlSFHCrCA==", + "requires": { + "gl-buffer": "2.1.2", + "gl-mat4": "1.2.0", + "gl-shader": "4.2.1", + "gl-vao": "1.3.0", + "glsl-out-of-range": "1.0.3", + "glslify": "6.4.1", + "is-string-blank": "1.0.1", + "typedarray-pool": "1.1.0", + "vectorize-text": "3.2.0" + } + }, + "gl-select-box": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/gl-select-box/-/gl-select-box-1.0.2.tgz", + "integrity": "sha512-QCheTcyHiamTgOQ92P9swHgJoR25T8GGRCANASRtjdMXndlAbQG4qxBP15MRJx7RFWlOVvEeUzCvPn7r116orA==", + "requires": { + "gl-buffer": "2.1.2", + "gl-shader": "4.2.1", + "glslify": "6.4.1" + } + }, + "gl-select-static": { + "version": "2.0.2", + "resolved": "http://registry.npmjs.org/gl-select-static/-/gl-select-static-2.0.2.tgz", + "integrity": "sha1-8+GQHfAxgdUy55WFMjBnnUr1fuk=", + "requires": { + "bit-twiddle": "1.0.2", + "cwise": "1.0.10", + "gl-fbo": "2.0.5", + "ndarray": "1.0.18", + "typedarray-pool": "1.1.0" + } + }, + "gl-shader": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gl-shader/-/gl-shader-4.2.1.tgz", + "integrity": "sha1-vJuAjpKTxRtmjojeYVsMETcI3C8=", + "requires": { + "gl-format-compiler-error": "1.0.3", + "weakmap-shim": "1.1.1" + } + }, + "gl-spikes2d": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/gl-spikes2d/-/gl-spikes2d-1.0.1.tgz", + "integrity": "sha1-ys2y09vNICuFNFLoUAqLB3lJzAM=" + }, + "gl-spikes3d": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/gl-spikes3d/-/gl-spikes3d-1.0.6.tgz", + "integrity": "sha512-mXRG+3iCs4bDH7if2aOr1G5UpbNqKxfWpy7GR/afOHDSNsrq2ZjnWAwPmIJG7KdClPNPgiK30cVo7XisLt8PCQ==", + "requires": { + "gl-buffer": "2.1.2", + "gl-shader": "4.2.1", + "gl-vao": "1.3.0", + "glslify": "6.4.1" + } + }, + "gl-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-state/-/gl-state-1.0.0.tgz", + "integrity": "sha1-Ji+qdYNbC5xTLBLzitxCXR0wzRc=", + "requires": { + "uniq": "1.0.1" + } + }, + "gl-streamtube3d": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gl-streamtube3d/-/gl-streamtube3d-1.1.1.tgz", + "integrity": "sha512-6UKZ4C9RQVTuVFYhEE/k0vgFvXCm5G0mmw8p+s6vaR+pwAxwU+bTQXLyW6n+gOIy7/F6DiViy1vIq0pc6MZxSw==", + "requires": { + "gl-vec3": "1.1.3", + "glsl-inverse": "1.0.0", + "glsl-out-of-range": "1.0.3", + "glslify": "6.4.1" + } + }, + "gl-surface3d": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/gl-surface3d/-/gl-surface3d-1.3.7.tgz", + "integrity": "sha512-Q8230JPRBqYb8yDR7ORDZfK3uRY0k0gmqlujPIL36SQdZ1utKSCn/dNIe9SKiqyE7ycfdIBp0Z1otZM23Nn6bA==", + "requires": { + "binary-search-bounds": "1.0.0", + "bit-twiddle": "1.0.2", + "colormap": "2.3.0", + "dup": "1.0.0", + "gl-buffer": "2.1.2", + "gl-mat4": "1.2.0", + "gl-shader": "4.2.1", + "gl-texture2d": "2.1.0", + "gl-vao": "1.3.0", + "glsl-out-of-range": "1.0.3", + "glsl-specular-beckmann": "1.1.2", + "glslify": "6.4.1", + "ndarray": "1.0.18", + "ndarray-gradient": "1.0.0", + "ndarray-ops": "1.2.2", + "ndarray-pack": "1.2.1", + "ndarray-scratch": "1.2.0", + "surface-nets": "1.0.2", + "typedarray-pool": "1.1.0" + } + }, + "gl-text": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.1.6.tgz", + "integrity": "sha512-OB+Nc5JKO1gyYYqBOJrYvCvRXIecfVpIKP7AviQNY63jrWPM9hUFSwZG7sH/paVnR1yCZBVirqOPfiFeF1Qo4g==", + "requires": { + "bit-twiddle": "1.0.2", + "color-normalize": "1.3.0", + "css-font": "1.2.0", + "detect-kerning": "2.1.2", + "es6-weak-map": "2.0.2", + "flatten-vertex-data": "1.0.2", + "font-atlas": "2.1.0", + "font-measure": "1.2.2", + "gl-util": "3.1.0", + "is-plain-obj": "1.1.0", + "object-assign": "4.1.1", + "parse-rect": "1.2.0", + "parse-unit": "1.0.1", + "pick-by-alias": "1.2.0", + "regl": "1.3.9", + "to-px": "1.1.0", + "typedarray-pool": "1.1.0" + } + }, + "gl-texture2d": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gl-texture2d/-/gl-texture2d-2.1.0.tgz", + "integrity": "sha1-/2gk5+fDGoum/c2+nlxpXX4hh8c=", + "requires": { + "ndarray": "1.0.18", + "ndarray-ops": "1.2.2", + "typedarray-pool": "1.1.0" + } + }, + "gl-util": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.0.tgz", + "integrity": "sha512-r/krwAgz7KWsp4A5XhUhSozmbjLaicoaiX1hJhgpUv/V5B7TCiEaRCBN20z/A4SR+u52HUjcAOW21lDg4CPZrA==", + "requires": { + "is-browser": "2.1.0", + "is-firefox": "1.0.3", + "is-plain-obj": "1.1.0", + "number-is-integer": "1.0.1", + "object-assign": "4.1.1", + "pick-by-alias": "1.2.0", + "weak-map": "1.0.5" } }, + "gl-vao": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/gl-vao/-/gl-vao-1.3.0.tgz", + "integrity": "sha1-6ekqqVWIyrnVwvBLaTRAw99pGSM=" + }, + "gl-vec3": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", + "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" + }, + "gl-vec4": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", + "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-base": { @@ -5165,8 +6554,8 @@ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" } }, "glob-parent": { @@ -5174,7 +6563,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" } }, "global-dirs": { @@ -5182,7 +6571,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "^1.3.4" + "ini": "1.3.5" } }, "global-modules": { @@ -5190,9 +6579,9 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, "global-prefix": { @@ -5200,11 +6589,11 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.0" } }, "globals": { @@ -5217,12 +6606,218 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "glsl-face-normal": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/glsl-face-normal/-/glsl-face-normal-1.0.2.tgz", + "integrity": "sha1-fud12Rmk8u6S9Xu2mOh8x12/Eog=" + }, + "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.1.0", + "glsl-token-string": "1.0.1", + "glsl-tokenizer": "2.1.5" + } + }, + "glsl-inverse": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/glsl-inverse/-/glsl-inverse-1.0.0.tgz", + "integrity": "sha1-EsCx0GX1WERNHm/q95td34qRiuY=" + }, + "glsl-out-of-range": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-out-of-range/-/glsl-out-of-range-1.0.3.tgz", + "integrity": "sha512-3uSoD4aX4TjHx3uRJnJbUpegePR0tRPf9VWLS7EjDMbHHV+qrKjl8ov93ifG3kqzcxIOmaSXDK248EmM5uoQ/g==" + }, + "glsl-read-float": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-read-float/-/glsl-read-float-1.1.0.tgz", + "integrity": "sha1-37CIsBYtz8xW/E7d0vhuGMrDLyY=" + }, + "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.3", + "xtend": "2.2.0" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=" + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=" + } + } + }, + "glsl-shader-name": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/glsl-shader-name/-/glsl-shader-name-1.0.0.tgz", + "integrity": "sha1-osMLO6c0mb77DMcYTXx3M91LSH0=", + "requires": { + "atob-lite": "1.0.0", + "glsl-tokenizer": "2.1.5" + } + }, + "glsl-specular-beckmann": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/glsl-specular-beckmann/-/glsl-specular-beckmann-1.1.2.tgz", + "integrity": "sha1-/OkFaTPs3yRWJ4N2pU0IKJPndfE=" + }, + "glsl-specular-cook-torrance": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/glsl-specular-cook-torrance/-/glsl-specular-cook-torrance-2.0.1.tgz", + "integrity": "sha1-qJHMBsjHtPRyhwK0gk/ay7ln148=", + "requires": { + "glsl-specular-beckmann": "1.1.2" + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "http://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=" + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", + "requires": { + "glsl-tokenizer": "2.1.5" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=" + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", + "requires": { + "glsl-token-assignments": "2.0.2", + "glsl-token-depth": "1.1.2", + "glsl-token-properties": "1.0.1", + "glsl-token-scope": "1.1.2" + } + }, + "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": "http://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=" + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "http://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": "http://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": "http://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.5" + } + }, + "glslify": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-6.4.1.tgz", + "integrity": "sha512-YDQ1Lei4Mj0TjJqjbf/llIJ1c10vsUTf6OQZ9N058PnVwOmIZyTmtr5Pgh9i99nxvP4M4sRWA5+IucQuOUnV5w==", + "requires": { + "bl": "1.2.2", + "concat-stream": "1.6.2", + "duplexify": "3.6.1", + "falafel": "2.1.0", + "from2": "2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "1.0.0", + "glslify-bundle": "5.1.1", + "glslify-deps": "1.3.1", + "minimist": "1.2.0", + "resolve": "1.6.0", + "stack-trace": "0.0.9", + "static-eval": "2.0.0", + "tape": "4.9.1", + "through2": "2.0.5", + "xtend": "4.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + } + } + }, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "requires": { + "glsl-inject-defines": "1.0.3", + "glsl-token-defines": "1.0.0", + "glsl-token-depth": "1.1.2", + "glsl-token-descope": "1.0.2", + "glsl-token-scope": "1.1.2", + "glsl-token-string": "1.0.1", + "glsl-token-whitespace-trim": "1.0.0", + "glsl-tokenizer": "2.1.5", + "murmurhash-js": "1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.1.tgz", + "integrity": "sha512-Ogm179MCazwIRyEqs3g3EOY4Y3XIAa0yl8J5RE9rJC6QH1w8weVOp2RZu0mvnYy/2xIas1w166YR2eZdDkWQxg==", + "requires": { + "@choojs/findup": "0.2.1", + "events": "1.1.1", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "2.1.5", + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "map-limit": "0.0.1", + "resolve": "1.6.0" } }, "got": { @@ -5230,17 +6825,17 @@ "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" + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" } }, "graceful-fs": { @@ -5248,6 +6843,51 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, + "gray-matter": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-3.1.1.tgz", + "integrity": "sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA==", + "requires": { + "extend-shallow": "2.0.1", + "js-yaml": "3.12.0", + "kind-of": "5.1.0", + "strip-bom-string": "1.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "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.1" + } + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + }, + "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==" + } + } + }, + "grid-index": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.0.0.tgz", + "integrity": "sha1-rSxdVM5bNUN/r/HXCprrPR0mERA=" + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -5263,7 +6903,7 @@ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", "requires": { - "duplexer": "^0.1.1" + "duplexer": "0.1.1" } }, "handle-thing": { @@ -5276,10 +6916,10 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" }, "dependencies": { "async": { @@ -5292,7 +6932,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } }, "uglify-js": { @@ -5301,9 +6941,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "source-map": { @@ -5320,9 +6960,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "optional": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -5338,8 +6978,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has": { @@ -5347,7 +6987,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "requires": { - "function-bind": "^1.0.2" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -5355,7 +6995,7 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-flag": { @@ -5363,6 +7003,22 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "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.1.0" + } + }, + "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.1.0" + } + }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", @@ -5374,9 +7030,9 @@ "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" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -5384,8 +7040,8 @@ "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" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -5393,7 +7049,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5403,8 +7059,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "hash.js": { @@ -5412,8 +7068,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "hawk": { @@ -5421,10 +7077,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "requires": { - "boom": "4.x.x", - "cryptiles": "3.x.x", - "hoek": "4.x.x", - "sntp": "2.x.x" + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" } }, "he": { @@ -5437,11 +7093,11 @@ "resolved": "https://registry.npmjs.org/history/-/history-4.7.2.tgz", "integrity": "sha512-1zkBRWW6XweO0NBcjiphtVJVsIQ+SXF29z9DVkceeaSLVMFXHool+fdCZD4spDCfZJCILPILc3bm7Bc+HRi0nA==", "requires": { - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "resolve-pathname": "^2.2.0", - "value-equal": "^0.4.0", - "warning": "^3.0.0" + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "resolve-pathname": "2.2.0", + "value-equal": "0.4.0", + "warning": "3.0.0" } }, "hmac-drbg": { @@ -5449,9 +7105,9 @@ "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" + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "hoek": { @@ -5469,8 +7125,8 @@ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "homedir-polyfill": { @@ -5478,7 +7134,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "requires": { - "parse-passwd": "^1.0.0" + "parse-passwd": "1.0.0" } }, "hosted-git-info": { @@ -5491,12 +7147,17 @@ "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" + "inherits": "2.0.3", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" } }, + "hsluv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, "html-comment-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", @@ -5507,7 +7168,7 @@ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "1.0.3" } }, "html-entities": { @@ -5520,13 +7181,13 @@ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz", "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==", "requires": { - "camel-case": "3.0.x", - "clean-css": "4.1.x", - "commander": "2.15.x", - "he": "1.1.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.3.x" + "camel-case": "3.0.0", + "clean-css": "4.1.11", + "commander": "2.15.1", + "he": "1.1.1", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.3.24" } }, "html-webpack-plugin": { @@ -5534,12 +7195,12 @@ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz", "integrity": "sha1-6Yf0IYU9O2k4yMTIFxhC5f0XryM=", "requires": { - "bluebird": "^3.4.7", - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "toposort": "^1.0.0" + "bluebird": "3.5.1", + "html-minifier": "3.5.15", + "loader-utils": "0.2.17", + "lodash": "4.17.10", + "pretty-error": "2.1.1", + "toposort": "1.0.7" }, "dependencies": { "loader-utils": { @@ -5547,10 +7208,10 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } } } @@ -5560,10 +7221,10 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" }, "dependencies": { "domutils": { @@ -5571,7 +7232,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "isarray": { @@ -5584,10 +7245,10 @@ "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", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -5607,10 +7268,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "statuses": "1.4.0" } }, "http-parser-js": { @@ -5623,9 +7284,9 @@ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "eventemitter3": "3.1.0", + "follow-redirects": "1.4.1", + "requires-port": "1.0.0" } }, "http-proxy-middleware": { @@ -5633,10 +7294,10 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^3.1.0", - "lodash": "^4.17.2", - "micromatch": "^2.3.11" + "http-proxy": "1.17.0", + "is-glob": "3.1.0", + "lodash": "4.17.10", + "micromatch": "2.3.11" }, "dependencies": { "arr-diff": { @@ -5644,7 +7305,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -5657,9 +7318,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -5667,7 +7328,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -5675,7 +7336,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" }, "dependencies": { "is-extglob": { @@ -5695,7 +7356,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } }, "kind-of": { @@ -5703,7 +7364,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -5711,19 +7372,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" }, "dependencies": { "is-extglob": { @@ -5736,7 +7397,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -5748,9 +7409,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" } }, "https-browserify": { @@ -5768,7 +7429,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "icss-replace-symbols": { @@ -5781,7 +7442,7 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.22" } }, "ieee754": { @@ -5809,8 +7470,8 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" } }, "imurmurhash": { @@ -5818,12 +7479,21 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, + "incremental-convex-hull": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/incremental-convex-hull/-/incremental-convex-hull-1.0.1.tgz", + "integrity": "sha1-UUKMFMudmmFEv+abKFH7N3M0vh4=", + "requires": { + "robust-orientation": "1.1.3", + "simplicial-complex": "1.0.0" + } + }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "indexes-of": { @@ -5841,8 +7511,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -5860,8 +7530,8 @@ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz", "integrity": "sha1-wVPH6I/YT+9cYC6VqBaLJ3BnH+c=", "requires": { - "bowser": "^1.0.0", - "hyphenate-style-name": "^1.0.1" + "bowser": "1.9.3", + "hyphenate-style-name": "1.0.2" } }, "inquirer": { @@ -5869,20 +7539,20 @@ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.10", "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" }, "dependencies": { "ansi-regex": { @@ -5895,9 +7565,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "strip-ansi": { @@ -5905,7 +7575,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -5915,7 +7585,7 @@ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", "requires": { - "meow": "^3.3.0" + "meow": "3.7.0" } }, "interpret": { @@ -5923,12 +7593,20 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" }, + "interval-tree-1d": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.3.tgz", + "integrity": "sha1-j9veArayx9verWNry+2OCHENhcE=", + "requires": { + "binary-search-bounds": "1.0.0" + } + }, "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" + "loose-envify": "1.3.1" } }, "invert-kv": { @@ -5936,6 +7614,16 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, + "invert-permutation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-permutation/-/invert-permutation-1.0.0.tgz", + "integrity": "sha1-oKeAQurbNrwXVR54fv0UOa3VSTM=" + }, + "iota-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", + "integrity": "sha1-ge9X/l0FgUzVjCSDYyqZwwoOgIc=" + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -5952,8 +7640,8 @@ "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "dev": true, "requires": { - "is-relative": "^0.2.1", - "is-windows": "^0.2.0" + "is-relative": "0.2.1", + "is-windows": "0.2.0" }, "dependencies": { "is-windows": { @@ -5974,7 +7662,7 @@ "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" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -5982,7 +7670,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5997,7 +7685,7 @@ "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" + "binary-extensions": "1.11.0" } }, "is-boolean-object": { @@ -6006,6 +7694,11 @@ "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", "dev": true }, + "is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -6016,7 +7709,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-callable": { @@ -6029,7 +7722,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "^1.0.0" + "ci-info": "1.1.3" } }, "is-data-descriptor": { @@ -6037,7 +7730,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -6045,7 +7738,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -6060,9 +7753,9 @@ "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" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -6087,7 +7780,7 @@ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-extendable": { @@ -6105,9 +7798,14 @@ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, + "is-firefox": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", + "integrity": "sha1-KioVZ3g6QX9uFYMjEI84YbCRhWI=" + }, "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", @@ -6118,18 +7816,28 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, + "is-iexplorer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", + "integrity": "sha1-HXK8ZtP+Iur2Fw3ajPEJQySM/HY=" + }, "is-installed-globally": { "version": "0.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" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" } }, + "is-mobile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.0.0.tgz", + "integrity": "sha512-k2+p7BBCzhqHMdYJwGUNNo+6zegGiMIVbM6bEPzxWXpQV6BUzV892UW0oDFgqxT6DygO7LdxRbwC0xmOhJdbew==" + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -6140,7 +7848,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -6148,7 +7856,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -6169,7 +7877,7 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -6189,7 +7897,7 @@ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "1.0.1" } }, "is-path-inside": { @@ -6197,7 +7905,7 @@ "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" + "path-is-inside": "1.0.2" } }, "is-plain-obj": { @@ -6210,7 +7918,7 @@ "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" + "isobject": "3.0.1" } }, "is-posix-bracket": { @@ -6238,7 +7946,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "requires": { - "has": "^1.0.1" + "has": "1.0.1" } }, "is-relative": { @@ -6247,7 +7955,7 @@ "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", "dev": true, "requires": { - "is-unc-path": "^0.1.1" + "is-unc-path": "0.1.2" } }, "is-resolvable": { @@ -6276,6 +7984,11 @@ "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", "dev": true }, + "is-string-blank": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", + "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" + }, "is-subset": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", @@ -6287,9 +8000,14 @@ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "requires": { - "html-comment-regex": "^1.1.0" + "html-comment-regex": "1.1.1" } }, + "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.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", @@ -6306,7 +8024,7 @@ "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", "dev": true, "requires": { - "unc-path-regex": "^0.1.0" + "unc-path-regex": "0.1.2" } }, "is-utf8": { @@ -6344,8 +8062,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.4" } }, "isstream": { @@ -6358,18 +8076,18 @@ "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "requires": { - "async": "^2.1.4", - "compare-versions": "^3.1.0", - "fileset": "^2.0.2", - "istanbul-lib-coverage": "^1.2.0", - "istanbul-lib-hook": "^1.2.0", - "istanbul-lib-instrument": "^1.10.1", - "istanbul-lib-report": "^1.1.4", - "istanbul-lib-source-maps": "^1.2.4", - "istanbul-reports": "^1.3.0", - "js-yaml": "^3.7.0", - "mkdirp": "^0.5.1", - "once": "^1.4.0" + "async": "2.6.0", + "compare-versions": "3.1.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "once": "1.4.0" }, "dependencies": { "debug": { @@ -6385,11 +8103,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" } }, "source-map": { @@ -6409,7 +8127,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "requires": { - "append-transform": "^0.4.0" + "append-transform": "0.4.0" } }, "istanbul-lib-instrument": { @@ -6417,13 +8135,13 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "requires": { - "babel-generator": "^6.18.0", - "babel-template": "^6.16.0", - "babel-traverse": "^6.18.0", - "babel-types": "^6.18.0", - "babylon": "^6.18.0", - "istanbul-lib-coverage": "^1.2.0", - "semver": "^5.3.0" + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" } }, "istanbul-lib-report": { @@ -6431,10 +8149,10 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "requires": { - "istanbul-lib-coverage": "^1.2.0", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" }, "dependencies": { "has-flag": { @@ -6447,7 +8165,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -6457,11 +8175,11 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" }, "dependencies": { "debug": { @@ -6484,7 +8202,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "requires": { - "handlebars": "^4.0.3" + "handlebars": "4.0.11" } }, "jest": { @@ -6492,7 +8210,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-20.0.4.tgz", "integrity": "sha1-PdJgwpidba1nix6cxNkZRPbWAqw=", "requires": { - "jest-cli": "^20.0.4" + "jest-cli": "20.0.4" }, "dependencies": { "ansi-escapes": { @@ -6505,7 +8223,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6518,9 +8236,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "callsites": { @@ -6533,7 +8251,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6541,7 +8259,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "jest-cli": { @@ -6549,36 +8267,36 @@ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-20.0.4.tgz", "integrity": "sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=", "requires": { - "ansi-escapes": "^1.4.0", - "callsites": "^2.0.0", - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "is-ci": "^1.0.10", - "istanbul-api": "^1.1.1", - "istanbul-lib-coverage": "^1.0.1", - "istanbul-lib-instrument": "^1.4.2", - "istanbul-lib-source-maps": "^1.1.0", - "jest-changed-files": "^20.0.3", - "jest-config": "^20.0.4", - "jest-docblock": "^20.0.3", - "jest-environment-jsdom": "^20.0.3", - "jest-haste-map": "^20.0.4", - "jest-jasmine2": "^20.0.4", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve-dependencies": "^20.0.3", - "jest-runtime": "^20.0.4", - "jest-snapshot": "^20.0.3", - "jest-util": "^20.0.3", - "micromatch": "^2.3.11", - "node-notifier": "^5.0.2", - "pify": "^2.3.0", - "slash": "^1.0.0", - "string-length": "^1.0.1", - "throat": "^3.0.0", - "which": "^1.2.12", - "worker-farm": "^1.3.1", - "yargs": "^7.0.2" + "ansi-escapes": "1.4.0", + "callsites": "2.0.0", + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "is-ci": "1.1.0", + "istanbul-api": "1.3.1", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-source-maps": "1.2.3", + "jest-changed-files": "20.0.3", + "jest-config": "20.0.4", + "jest-docblock": "20.0.3", + "jest-environment-jsdom": "20.0.3", + "jest-haste-map": "20.0.5", + "jest-jasmine2": "20.0.4", + "jest-message-util": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve-dependencies": "20.0.3", + "jest-runtime": "20.0.4", + "jest-snapshot": "20.0.3", + "jest-util": "20.0.3", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "pify": "2.3.0", + "slash": "1.0.0", + "string-length": "1.0.1", + "throat": "3.2.0", + "which": "1.3.0", + "worker-farm": "1.6.0", + "yargs": "7.1.0" } }, "kind-of": { @@ -6586,7 +8304,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6594,19 +8312,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -6621,16 +8339,16 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-20.0.4.tgz", "integrity": "sha1-43kwqyIXyRNgXv8T5712PsSPruo=", "requires": { - "chalk": "^1.1.3", - "glob": "^7.1.1", - "jest-environment-jsdom": "^20.0.3", - "jest-environment-node": "^20.0.3", - "jest-jasmine2": "^20.0.4", - "jest-matcher-utils": "^20.0.3", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-validate": "^20.0.3", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "glob": "7.1.2", + "jest-environment-jsdom": "20.0.3", + "jest-environment-node": "20.0.3", + "jest-jasmine2": "20.0.4", + "jest-matcher-utils": "20.0.3", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-validate": "20.0.3", + "pretty-format": "20.0.3" } }, "jest-diff": { @@ -6638,10 +8356,10 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-20.0.3.tgz", "integrity": "sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=", "requires": { - "chalk": "^1.1.3", - "diff": "^3.2.0", - "jest-matcher-utils": "^20.0.3", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "diff": "3.5.0", + "jest-matcher-utils": "20.0.3", + "pretty-format": "20.0.3" } }, "jest-docblock": { @@ -6654,9 +8372,9 @@ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz", "integrity": "sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=", "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3", - "jsdom": "^9.12.0" + "jest-mock": "20.0.3", + "jest-util": "20.0.3", + "jsdom": "9.12.0" } }, "jest-environment-node": { @@ -6664,8 +8382,8 @@ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-20.0.3.tgz", "integrity": "sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=", "requires": { - "jest-mock": "^20.0.3", - "jest-util": "^20.0.3" + "jest-mock": "20.0.3", + "jest-util": "20.0.3" } }, "jest-haste-map": { @@ -6673,12 +8391,12 @@ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-20.0.5.tgz", "integrity": "sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==", "requires": { - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.11", - "jest-docblock": "^20.0.3", - "micromatch": "^2.3.11", - "sane": "~1.6.0", - "worker-farm": "^1.3.1" + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "jest-docblock": "20.0.3", + "micromatch": "2.3.11", + "sane": "1.6.0", + "worker-farm": "1.6.0" }, "dependencies": { "arr-diff": { @@ -6686,7 +8404,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6699,9 +8417,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -6709,7 +8427,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6717,7 +8435,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -6725,7 +8443,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6733,19 +8451,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -6755,15 +8473,15 @@ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz", "integrity": "sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-matchers": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-snapshot": "^20.0.3", - "once": "^1.4.0", - "p-map": "^1.1.1" + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-matchers": "20.0.3", + "jest-message-util": "20.0.3", + "jest-snapshot": "20.0.3", + "once": "1.4.0", + "p-map": "1.2.0" } }, "jest-localstorage-mock": { @@ -6777,8 +8495,8 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz", "integrity": "sha1-s6a443yld4A7CDKpixZPRLeBVhI=", "requires": { - "chalk": "^1.1.3", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "pretty-format": "20.0.3" } }, "jest-matchers": { @@ -6786,10 +8504,10 @@ "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-20.0.3.tgz", "integrity": "sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=", "requires": { - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-message-util": "^20.0.3", - "jest-regex-util": "^20.0.3" + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-message-util": "20.0.3", + "jest-regex-util": "20.0.3" } }, "jest-message-util": { @@ -6797,9 +8515,9 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-20.0.3.tgz", "integrity": "sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=", "requires": { - "chalk": "^1.1.3", - "micromatch": "^2.3.11", - "slash": "^1.0.0" + "chalk": "1.1.3", + "micromatch": "2.3.11", + "slash": "1.0.0" }, "dependencies": { "arr-diff": { @@ -6807,7 +8525,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6820,9 +8538,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -6830,7 +8548,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6838,7 +8556,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -6846,7 +8564,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6854,19 +8572,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -6886,9 +8604,9 @@ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-20.0.4.tgz", "integrity": "sha1-lEiz6La6/BVHlETGSZBFt//ll6U=", "requires": { - "browser-resolve": "^1.11.2", - "is-builtin-module": "^1.0.0", - "resolve": "^1.3.2" + "browser-resolve": "1.11.2", + "is-builtin-module": "1.0.0", + "resolve": "1.6.0" } }, "jest-resolve-dependencies": { @@ -6896,7 +8614,7 @@ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz", "integrity": "sha1-bhSntxevDyyzZnxUneQK8Bexcjo=", "requires": { - "jest-regex-util": "^20.0.3" + "jest-regex-util": "20.0.3" } }, "jest-runtime": { @@ -6904,21 +8622,21 @@ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-20.0.4.tgz", "integrity": "sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=", "requires": { - "babel-core": "^6.0.0", - "babel-jest": "^20.0.3", - "babel-plugin-istanbul": "^4.0.0", - "chalk": "^1.1.3", - "convert-source-map": "^1.4.0", - "graceful-fs": "^4.1.11", - "jest-config": "^20.0.4", - "jest-haste-map": "^20.0.4", - "jest-regex-util": "^20.0.3", - "jest-resolve": "^20.0.4", - "jest-util": "^20.0.3", - "json-stable-stringify": "^1.0.1", - "micromatch": "^2.3.11", + "babel-core": "6.26.0", + "babel-jest": "20.0.3", + "babel-plugin-istanbul": "4.1.6", + "chalk": "1.1.3", + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "jest-config": "20.0.4", + "jest-haste-map": "20.0.5", + "jest-regex-util": "20.0.3", + "jest-resolve": "20.0.4", + "jest-util": "20.0.3", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", "strip-bom": "3.0.0", - "yargs": "^7.0.2" + "yargs": "7.1.0" }, "dependencies": { "arr-diff": { @@ -6926,7 +8644,7 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -6939,9 +8657,9 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "expand-brackets": { @@ -6949,7 +8667,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -6957,7 +8675,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -6965,7 +8683,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -6973,19 +8691,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } }, "strip-bom": { @@ -7000,12 +8718,12 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-20.0.3.tgz", "integrity": "sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=", "requires": { - "chalk": "^1.1.3", - "jest-diff": "^20.0.3", - "jest-matcher-utils": "^20.0.3", - "jest-util": "^20.0.3", - "natural-compare": "^1.4.0", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "jest-diff": "20.0.3", + "jest-matcher-utils": "20.0.3", + "jest-util": "20.0.3", + "natural-compare": "1.4.0", + "pretty-format": "20.0.3" } }, "jest-util": { @@ -7013,13 +8731,13 @@ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-20.0.3.tgz", "integrity": "sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=", "requires": { - "chalk": "^1.1.3", - "graceful-fs": "^4.1.11", - "jest-message-util": "^20.0.3", - "jest-mock": "^20.0.3", - "jest-validate": "^20.0.3", - "leven": "^2.1.0", - "mkdirp": "^0.5.1" + "chalk": "1.1.3", + "graceful-fs": "4.1.11", + "jest-message-util": "20.0.3", + "jest-mock": "20.0.3", + "jest-validate": "20.0.3", + "leven": "2.1.0", + "mkdirp": "0.5.1" } }, "jest-validate": { @@ -7027,10 +8745,10 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-20.0.3.tgz", "integrity": "sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=", "requires": { - "chalk": "^1.1.3", - "jest-matcher-utils": "^20.0.3", - "leven": "^2.1.0", - "pretty-format": "^20.0.3" + "chalk": "1.1.3", + "jest-matcher-utils": "20.0.3", + "leven": "2.1.0", + "pretty-format": "20.0.3" } }, "jquery": { @@ -7053,8 +8771,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" + "argparse": "1.0.10", + "esprima": "2.7.3" } }, "jsbn": { @@ -7068,25 +8786,25 @@ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "requires": { - "abab": "^1.0.3", - "acorn": "^4.0.4", - "acorn-globals": "^3.1.0", - "array-equal": "^1.0.0", - "content-type-parser": "^1.0.1", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "escodegen": "^1.6.1", - "html-encoding-sniffer": "^1.0.1", - "nwmatcher": ">= 1.3.9 < 2.0.0", - "parse5": "^1.5.1", - "request": "^2.79.0", - "sax": "^1.2.1", - "symbol-tree": "^3.2.1", - "tough-cookie": "^2.3.2", - "webidl-conversions": "^4.0.0", - "whatwg-encoding": "^1.0.1", - "whatwg-url": "^4.3.0", - "xml-name-validator": "^2.0.1" + "abab": "1.0.4", + "acorn": "4.0.13", + "acorn-globals": "3.1.0", + "array-equal": "1.0.0", + "content-type-parser": "1.0.2", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.9.1", + "html-encoding-sniffer": "1.0.2", + "nwmatcher": "1.4.4", + "parse5": "1.5.1", + "request": "2.85.0", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.4", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.3", + "whatwg-url": "4.8.0", + "xml-name-validator": "2.0.1" }, "dependencies": { "acorn": { @@ -7103,9 +8821,8 @@ }, "json-bigint": { "version": "github:databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", - "from": "json-bigint@github:databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", "requires": { - "bignumber.js": "^4.0.0" + "bignumber.js": "4.1.0" } }, "json-loader": { @@ -7128,7 +8845,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, "json-stable-stringify-without-jsonify": { @@ -7157,7 +8874,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "4.1.11" } }, "jsonify": { @@ -7181,6 +8898,11 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=" }, + "kdbush": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/kdbush/-/kdbush-1.0.1.tgz", + "integrity": "sha1-PL0D6d6tnA9vZszblkUOXOzGQOA=" + }, "keycode": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", @@ -7201,7 +8923,7 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "requires": { - "graceful-fs": "^4.1.9" + "graceful-fs": "4.1.11" } }, "latest-version": { @@ -7209,7 +8931,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "^4.0.0" + "package-json": "4.0.1" } }, "lazy-cache": { @@ -7222,9 +8944,19 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "lerp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lerp/-/lerp-1.0.3.tgz", + "integrity": "sha1-oYyJaPkXiW3hXM/MKNVaa3Med24=" + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -7235,8 +8967,8 @@ "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" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "load-json-file": { @@ -7244,11 +8976,11 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "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" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "loader-fs-cache": { @@ -7256,7 +8988,7 @@ "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", "requires": { - "find-cache-dir": "^0.1.1", + "find-cache-dir": "0.1.1", "mkdirp": "0.5.1" }, "dependencies": { @@ -7265,9 +8997,9 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" } }, "find-up": { @@ -7275,8 +9007,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -7284,7 +9016,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "pkg-dir": { @@ -7292,7 +9024,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" } } } @@ -7307,9 +9039,9 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } }, "locate-path": { @@ -7317,8 +9049,8 @@ "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-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -7353,7 +9085,7 @@ "integrity": "sha1-PsXiYGAU9MuX91X+aRTt2L/ADqw=", "dev": true, "requires": { - "lodash.isarray": "^3.0.0" + "lodash.isarray": "3.0.4" } }, "lodash.camelcase": { @@ -7399,8 +9131,8 @@ "integrity": "sha1-POaK4skWg7KBzFOUEoMDy/deaR8=", "dev": true, "requires": { - "lodash._baseget": "^3.0.0", - "lodash._topath": "^3.0.0" + "lodash._baseget": "3.7.2", + "lodash._topath": "3.8.1" } }, "lodash.isarguments": { @@ -7434,9 +9166,9 @@ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash.memoize": { @@ -7454,8 +9186,8 @@ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" } }, "lodash.templatesettings": { @@ -7463,7 +9195,7 @@ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "3.0.0" } }, "lodash.topath": { @@ -7491,7 +9223,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "requires": { - "js-tokens": "^3.0.0" + "js-tokens": "3.0.2" } }, "loud-rejection": { @@ -7499,8 +9231,8 @@ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" } }, "lower-case": { @@ -7518,8 +9250,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "macaddress": { @@ -7527,12 +9259,20 @@ "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=" }, + "magic-string": { + "version": "0.22.5", + "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", + "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", + "requires": { + "vlq": "0.2.3" + } + }, "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": "3.0.0" }, "dependencies": { "pify": { @@ -7547,7 +9287,7 @@ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.4" } }, "map-cache": { @@ -7555,6 +9295,24 @@ "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.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1.0.2" + } + } + } + }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -7565,7 +9323,88 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" + } + }, + "mapbox-gl": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-0.45.0.tgz", + "integrity": "sha1-r3HMgk8NflHM1cUF6q5BG8CRDM0=", + "requires": { + "@mapbox/gl-matrix": "0.0.1", + "@mapbox/jsonlint-lines-primitives": "2.0.2", + "@mapbox/mapbox-gl-supported": "1.4.0", + "@mapbox/point-geometry": "0.1.0", + "@mapbox/shelf-pack": "3.2.0", + "@mapbox/tiny-sdf": "1.1.0", + "@mapbox/unitbezier": "0.0.0", + "@mapbox/vector-tile": "1.3.1", + "@mapbox/whoots-js": "3.1.0", + "brfs": "1.6.1", + "csscolorparser": "1.0.3", + "earcut": "2.1.3", + "geojson-rewind": "0.3.1", + "geojson-vt": "3.2.1", + "gray-matter": "3.1.1", + "grid-index": "1.0.0", + "minimist": "0.0.8", + "pbf": "3.1.0", + "quickselect": "1.1.1", + "rw": "1.3.3", + "shuffle-seed": "1.1.6", + "sort-object": "0.3.2", + "supercluster": "2.3.0", + "through2": "2.0.5", + "tinyqueue": "1.2.3", + "vt-pbf": "3.1.1" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + } + } + }, + "marching-simplex-table": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/marching-simplex-table/-/marching-simplex-table-1.0.0.tgz", + "integrity": "sha1-vBYlbg+Pm1WKqbKHL4gy2UM/Uuo=", + "requires": { + "convex-hull": "1.0.3" + } + }, + "mat4-decompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", + "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", + "requires": { + "gl-mat4": "1.2.0", + "gl-vec3": "1.1.3" + } + }, + "mat4-interpolate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", + "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", + "requires": { + "gl-mat4": "1.2.0", + "gl-vec3": "1.1.3", + "mat4-decompose": "1.0.4", + "mat4-recompose": "1.0.4", + "quat-slerp": "1.0.1" + } + }, + "mat4-recompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", + "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", + "requires": { + "gl-mat4": "1.2.0" } }, "math-expression-evaluator": { @@ -7573,18 +9412,34 @@ "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" }, + "math-log2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", + "integrity": "sha1-+4lBvl9evol55xjmJzsXjlhpRWU=" + }, "math-random": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" }, + "matrix-camera-controller": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.3.tgz", + "integrity": "sha1-NeUmDMHNVQliunmfLY1OlLGjk3A=", + "requires": { + "binary-search-bounds": "1.0.0", + "gl-mat4": "1.2.0", + "gl-vec3": "1.1.3", + "mat4-interpolate": "1.0.4" + } + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "3.0.4", + "inherits": "2.0.3" } }, "media-typer": { @@ -7597,7 +9452,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "memory-fs": { @@ -7605,8 +9460,8 @@ "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" + "errno": "0.1.7", + "readable-stream": "2.3.6" } }, "meow": { @@ -7614,16 +9469,16 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "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" + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" }, "dependencies": { "minimist": { @@ -7643,6 +9498,21 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -7653,19 +9523,19 @@ "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" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "miller-rabin": { @@ -7673,8 +9543,8 @@ "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" + "bn.js": "4.11.8", + "brorand": "1.1.0" } }, "mime": { @@ -7692,7 +9562,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "mimic-fn": { @@ -7715,7 +9585,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -7728,8 +9598,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -7737,7 +9607,7 @@ "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" + "is-plain-object": "2.0.4" } } } @@ -7750,12 +9620,55 @@ "minimist": "0.0.8" } }, + "monotone-convex-hull-2d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/monotone-convex-hull-2d/-/monotone-convex-hull-2d-1.0.1.tgz", + "integrity": "sha1-R/Xa6t88Sv03dkuqGqh4ekDu4Iw=", + "requires": { + "robust-orientation": "1.1.3" + } + }, "moo": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", "dev": true }, + "mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "requires": { + "mouse-event": "1.0.5" + } + }, + "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.1.0" + }, + "dependencies": { + "signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7766,8 +9679,8 @@ "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" + "dns-packet": "1.3.1", + "thunky": "1.0.2" } }, "multicast-dns-service-types": { @@ -7775,6 +9688,19 @@ "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.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -7791,18 +9717,18 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "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-odd": "^2.0.0", - "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" + "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-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "natural-compare": { @@ -7810,17 +9736,109 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, + "ndarray": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.18.tgz", + "integrity": "sha1-tg06cyJOxVXQ+qeXEeUCRI/T95M=", + "requires": { + "iota-array": "1.0.0", + "is-buffer": "1.1.6" + } + }, + "ndarray-extract-contour": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-extract-contour/-/ndarray-extract-contour-1.0.1.tgz", + "integrity": "sha1-Cu4ROjozsia5DEiIz4d79HUTBeQ=", + "requires": { + "typedarray-pool": "1.1.0" + } + }, + "ndarray-fill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ndarray-fill/-/ndarray-fill-1.0.2.tgz", + "integrity": "sha1-owpg9xiODJWC/N1YiWrNy1IqHtY=", + "requires": { + "cwise": "1.0.10" + } + }, + "ndarray-gradient": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-gradient/-/ndarray-gradient-1.0.0.tgz", + "integrity": "sha1-t0kaUVxqZJ8ZpiMk//byf8jCU5M=", + "requires": { + "cwise-compiler": "1.1.3", + "dup": "1.0.0" + } + }, + "ndarray-homography": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-homography/-/ndarray-homography-1.0.0.tgz", + "integrity": "sha1-w1UW6oa8KGK06ASiNqJwcwn+KWs=", + "requires": { + "gl-matrix-invert": "1.0.0", + "ndarray-warp": "1.0.1" + } + }, + "ndarray-linear-interpolate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ndarray-linear-interpolate/-/ndarray-linear-interpolate-1.0.0.tgz", + "integrity": "sha1-eLySuFuavBW25n7mWCj54hN65ys=" + }, + "ndarray-ops": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-1.2.2.tgz", + "integrity": "sha1-WeiNLDKn7ryxvGkPrhQVeVV6YU4=", + "requires": { + "cwise-compiler": "1.1.3" + } + }, + "ndarray-pack": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ndarray-pack/-/ndarray-pack-1.2.1.tgz", + "integrity": "sha1-jK6+qqJNXs9w/4YCBjeXfajuWFo=", + "requires": { + "cwise-compiler": "1.1.3", + "ndarray": "1.0.18" + } + }, + "ndarray-scratch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ndarray-scratch/-/ndarray-scratch-1.2.0.tgz", + "integrity": "sha1-YwRjbWLrqT20cnrBPGkzQdulDgE=", + "requires": { + "ndarray": "1.0.18", + "ndarray-ops": "1.2.2", + "typedarray-pool": "1.1.0" + } + }, + "ndarray-sort": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-sort/-/ndarray-sort-1.0.1.tgz", + "integrity": "sha1-/qBbTLg0x/TgIWo1TzynUTAN/Wo=", + "requires": { + "typedarray-pool": "1.1.0" + } + }, + "ndarray-warp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ndarray-warp/-/ndarray-warp-1.0.1.tgz", + "integrity": "sha1-qKElqqu6C+v5O9bKg+ar1oIqNOA=", + "requires": { + "cwise": "1.0.10", + "ndarray-linear-interpolate": "1.0.0" + } + }, "nearley": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.15.1.tgz", "integrity": "sha512-8IUY/rUrKz2mIynUGh8k+tul1awMKEjeHHC5G3FHvvyAW6oq4mQfNp2c0BMea+sYZJvYcrrM6GmZVIle/GRXGw==", "dev": true, "requires": { - "moo": "^0.4.3", - "nomnom": "~1.6.2", - "railroad-diagrams": "^1.0.0", + "moo": "0.4.3", + "nomnom": "1.6.2", + "railroad-diagrams": "1.0.0", "randexp": "0.4.6", - "semver": "^5.4.1" + "semver": "5.5.0" } }, "negotiator": { @@ -7838,12 +9856,20 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "nextafter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nextafter/-/nextafter-1.0.0.tgz", + "integrity": "sha1-t9d7U1MQ4+CX5gJauwqQNHfsGjo=", + "requires": { + "double-bits": "1.1.1" + } + }, "no-case": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "node-fetch": { @@ -7851,8 +9877,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "encoding": "0.1.12", + "is-stream": "1.1.0" } }, "node-forge": { @@ -7870,28 +9896,28 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "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": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", "path-browserify": "0.0.0", - "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", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.2", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", + "url": "0.11.0", + "util": "0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -7907,10 +9933,10 @@ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", "requires": { - "growly": "^1.3.0", - "semver": "^5.4.1", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "growly": "1.3.0", + "semver": "5.5.0", + "shellwords": "0.1.1", + "which": "1.3.0" } }, "nomnom": { @@ -7919,8 +9945,8 @@ "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", "dev": true, "requires": { - "colors": "0.5.x", - "underscore": "~1.4.4" + "colors": "0.5.1", + "underscore": "1.4.4" }, "dependencies": { "colors": { @@ -7936,10 +9962,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" } }, "normalize-path": { @@ -7947,7 +9973,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "normalize-range": { @@ -7955,15 +9981,20 @@ "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" + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" }, "dependencies": { "query-string": { @@ -7971,8 +10002,8 @@ "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" + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" } }, "strict-uri-encode": { @@ -7982,129 +10013,134 @@ } } }, + "normals": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/normals/-/normals-1.1.0.tgz", + "integrity": "sha1-MltZXtNK/kZ6bFWhT9kIV4f/WcA=" + }, "npm": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/npm/-/npm-6.4.1.tgz", "integrity": "sha512-mXJL1NTVU136PtuopXCUQaNWuHlXCTp4McwlSW8S9/Aj8OEPAlSBgo8og7kJ01MjCDrkmqFQTvN5tTEhBMhXQg==", "requires": { - "JSONStream": "^1.3.4", - "abbrev": "~1.1.1", - "ansicolors": "~0.3.2", - "ansistyles": "~0.1.3", - "aproba": "~1.2.0", - "archy": "~1.0.0", - "bin-links": "^1.1.2", - "bluebird": "~3.5.1", - "byte-size": "^4.0.3", - "cacache": "^11.2.0", - "call-limit": "~1.1.0", - "chownr": "~1.0.1", - "ci-info": "^1.4.0", - "cli-columns": "^3.1.2", - "cli-table3": "^0.5.0", - "cmd-shim": "~2.0.2", - "columnify": "~1.5.4", - "config-chain": "~1.1.11", - "debuglog": "*", - "detect-indent": "~5.0.0", - "detect-newline": "^2.1.0", - "dezalgo": "~1.0.3", - "editor": "~1.0.0", - "figgy-pudding": "^3.4.1", - "find-npm-prefix": "^1.0.2", - "fs-vacuum": "~1.2.10", - "fs-write-stream-atomic": "~1.0.10", - "gentle-fs": "^2.0.1", - "glob": "~7.1.2", - "graceful-fs": "~4.1.11", - "has-unicode": "~2.0.1", - "hosted-git-info": "^2.7.1", - "iferr": "^1.0.2", - "imurmurhash": "*", - "inflight": "~1.0.6", - "inherits": "~2.0.3", - "ini": "^1.3.5", - "init-package-json": "^1.10.3", - "is-cidr": "^2.0.6", - "json-parse-better-errors": "^1.0.2", - "lazy-property": "~1.0.0", - "libcipm": "^2.0.2", - "libnpmhook": "^4.0.1", - "libnpx": "^10.2.0", - "lock-verify": "^2.0.2", - "lockfile": "^1.0.4", - "lodash._baseindexof": "*", - "lodash._baseuniq": "~4.6.0", - "lodash._bindcallback": "*", - "lodash._cacheindexof": "*", - "lodash._createcache": "*", - "lodash._getnative": "*", - "lodash.clonedeep": "~4.5.0", - "lodash.restparam": "*", - "lodash.union": "~4.6.0", - "lodash.uniq": "~4.5.0", - "lodash.without": "~4.4.0", - "lru-cache": "^4.1.3", - "meant": "~1.0.1", - "mississippi": "^3.0.0", - "mkdirp": "~0.5.1", - "move-concurrently": "^1.0.1", - "node-gyp": "^3.8.0", - "nopt": "~4.0.1", - "normalize-package-data": "~2.4.0", - "npm-audit-report": "^1.3.1", - "npm-cache-filename": "~1.0.2", - "npm-install-checks": "~3.0.0", - "npm-lifecycle": "^2.1.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.11", - "npm-pick-manifest": "^2.1.0", - "npm-profile": "^3.0.2", - "npm-registry-client": "^8.6.0", - "npm-registry-fetch": "^1.1.0", - "npm-user-validate": "~1.0.0", - "npmlog": "~4.1.2", - "once": "~1.4.0", - "opener": "^1.5.0", - "osenv": "^0.1.5", - "pacote": "^8.1.6", - "path-is-inside": "~1.0.2", - "promise-inflight": "~1.0.1", - "qrcode-terminal": "^0.12.0", - "query-string": "^6.1.0", - "qw": "~1.0.1", - "read": "~1.0.7", - "read-cmd-shim": "~1.0.1", - "read-installed": "~4.0.3", - "read-package-json": "^2.0.13", - "read-package-tree": "^5.2.1", - "readable-stream": "^2.3.6", - "readdir-scoped-modules": "*", - "request": "^2.88.0", - "retry": "^0.12.0", - "rimraf": "~2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "sha": "~2.0.1", - "slide": "~1.1.6", - "sorted-object": "~2.0.1", - "sorted-union-stream": "~2.1.3", - "ssri": "^6.0.0", - "stringify-package": "^1.0.0", - "tar": "^4.4.6", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", + "JSONStream": "1.3.4", + "abbrev": "1.1.1", + "ansicolors": "0.3.2", + "ansistyles": "0.1.3", + "aproba": "1.2.0", + "archy": "1.0.0", + "bin-links": "1.1.2", + "bluebird": "3.5.1", + "byte-size": "4.0.3", + "cacache": "11.2.0", + "call-limit": "1.1.0", + "chownr": "1.0.1", + "ci-info": "1.4.0", + "cli-columns": "3.1.2", + "cli-table3": "0.5.0", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "config-chain": "1.1.11", + "debuglog": "1.0.1", + "detect-indent": "5.0.0", + "detect-newline": "2.1.0", + "dezalgo": "1.0.3", + "editor": "1.0.0", + "figgy-pudding": "3.4.1", + "find-npm-prefix": "1.0.2", + "fs-vacuum": "1.2.10", + "fs-write-stream-atomic": "1.0.10", + "gentle-fs": "2.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "has-unicode": "2.0.1", + "hosted-git-info": "2.7.1", + "iferr": "1.0.2", + "imurmurhash": "0.1.4", + "inflight": "1.0.6", + "inherits": "2.0.3", + "ini": "1.3.5", + "init-package-json": "1.10.3", + "is-cidr": "2.0.6", + "json-parse-better-errors": "1.0.2", + "lazy-property": "1.0.0", + "libcipm": "2.0.2", + "libnpmhook": "4.0.1", + "libnpx": "10.2.0", + "lock-verify": "2.0.2", + "lockfile": "1.0.4", + "lodash._baseindexof": "3.1.0", + "lodash._baseuniq": "4.6.0", + "lodash._bindcallback": "3.0.1", + "lodash._cacheindexof": "3.0.2", + "lodash._createcache": "3.1.2", + "lodash._getnative": "3.9.1", + "lodash.clonedeep": "4.5.0", + "lodash.restparam": "3.6.1", + "lodash.union": "4.6.0", + "lodash.uniq": "4.5.0", + "lodash.without": "4.4.0", + "lru-cache": "4.1.3", + "meant": "1.0.1", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "node-gyp": "3.8.0", + "nopt": "4.0.1", + "normalize-package-data": "2.4.0", + "npm-audit-report": "1.3.1", + "npm-cache-filename": "1.0.2", + "npm-install-checks": "3.0.0", + "npm-lifecycle": "2.1.0", + "npm-package-arg": "6.1.0", + "npm-packlist": "1.1.11", + "npm-pick-manifest": "2.1.0", + "npm-profile": "3.0.2", + "npm-registry-client": "8.6.0", + "npm-registry-fetch": "1.1.0", + "npm-user-validate": "1.0.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "opener": "1.5.0", + "osenv": "0.1.5", + "pacote": "8.1.6", + "path-is-inside": "1.0.2", + "promise-inflight": "1.0.1", + "qrcode-terminal": "0.12.0", + "query-string": "6.1.0", + "qw": "1.0.1", + "read": "1.0.7", + "read-cmd-shim": "1.0.1", + "read-installed": "4.0.3", + "read-package-json": "2.0.13", + "read-package-tree": "5.2.1", + "readable-stream": "2.3.6", + "readdir-scoped-modules": "1.0.2", + "request": "2.88.0", + "retry": "0.12.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "sha": "2.0.1", + "slide": "1.1.6", + "sorted-object": "2.0.1", + "sorted-union-stream": "2.1.3", + "ssri": "6.0.0", + "stringify-package": "1.0.0", + "tar": "4.4.6", + "text-table": "0.2.0", + "tiny-relative-date": "1.3.0", "uid-number": "0.0.6", - "umask": "~1.1.0", - "unique-filename": "~1.1.0", - "unpipe": "~1.0.0", - "update-notifier": "^2.5.0", - "uuid": "^3.3.2", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "~3.0.0", - "which": "^1.3.1", - "worker-farm": "^1.6.0", - "write-file-atomic": "^2.3.0" + "umask": "1.1.0", + "unique-filename": "1.1.0", + "unpipe": "1.0.0", + "update-notifier": "2.5.0", + "uuid": "3.3.2", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "3.0.0", + "which": "1.3.1", + "worker-farm": "1.6.0", + "write-file-atomic": "2.3.0" }, "dependencies": { "JSONStream": { @@ -8112,8 +10148,8 @@ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "jsonparse": "1.3.1", + "through": "2.3.8" } }, "abbrev": { @@ -8126,7 +10162,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" } }, "agentkeepalive": { @@ -8134,7 +10170,7 @@ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.4.1.tgz", "integrity": "sha512-MPIwsZU9PP9kOrZpyu2042kYA8Fdt/AedQYkYXucHgF9QoD9dXVp0ypuGnHXSR0hTstBxdt85Xkh4JolYfK5wg==", "requires": { - "humanize-ms": "^1.2.1" + "humanize-ms": "1.2.1" } }, "ajv": { @@ -8142,10 +10178,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ansi-align": { @@ -8153,7 +10189,7 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "requires": { - "string-width": "^2.0.0" + "string-width": "2.1.1" } }, "ansi-regex": { @@ -8166,7 +10202,7 @@ "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" + "color-convert": "1.9.1" } }, "ansicolors": { @@ -8194,8 +10230,8 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "asap": { @@ -8208,7 +10244,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } }, "assert-plus": { @@ -8242,7 +10278,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "bin-links": { @@ -8250,11 +10286,11 @@ "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-1.1.2.tgz", "integrity": "sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg==", "requires": { - "bluebird": "^3.5.0", - "cmd-shim": "^2.0.2", - "gentle-fs": "^2.0.0", - "graceful-fs": "^4.1.11", - "write-file-atomic": "^2.3.0" + "bluebird": "3.5.1", + "cmd-shim": "2.0.2", + "gentle-fs": "2.0.1", + "graceful-fs": "4.1.11", + "write-file-atomic": "2.3.0" } }, "block-stream": { @@ -8262,7 +10298,7 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } }, "bluebird": { @@ -8275,13 +10311,13 @@ "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" + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" } }, "brace-expansion": { @@ -8289,7 +10325,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -8323,20 +10359,20 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "figgy-pudding": "^3.1.0", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.0", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "figgy-pudding": "3.4.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "6.0.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" } }, "call-limit": { @@ -8364,9 +10400,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "chownr": { @@ -8384,7 +10420,7 @@ "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-2.0.9.tgz", "integrity": "sha512-F7/fBRUU45FnvSPjXdpIrc++WRSBdCiSTlyq4ZNhLKOlHFNWgtzZ0Fd+zrqI/J1j0wmlx/f5ZQDmD2GcbrNcmw==", "requires": { - "ip-regex": "^2.1.0" + "ip-regex": "2.1.0" } }, "cli-boxes": { @@ -8397,8 +10433,8 @@ "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz", "integrity": "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=", "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" + "string-width": "2.1.1", + "strip-ansi": "3.0.1" } }, "cli-table3": { @@ -8406,9 +10442,9 @@ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.0.tgz", "integrity": "sha512-c7YHpUyO1SaKaO7kYtxd5NZ8FjAmSK3LpKkuzdwn+2CwpFxBpdoQLm+OAnnCfoEl7onKhN9PKQi1lsHuAIUqGQ==", "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" + "colors": "1.1.2", + "object-assign": "4.1.1", + "string-width": "2.1.1" } }, "cliui": { @@ -8416,9 +10452,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" }, "dependencies": { "ansi-regex": { @@ -8431,7 +10467,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -8446,8 +10482,8 @@ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" } }, "co": { @@ -8465,7 +10501,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -8484,8 +10520,8 @@ "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" } }, "combined-stream": { @@ -8493,7 +10529,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "concat-map": { @@ -8506,10 +10542,10 @@ "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" + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" } }, "config-chain": { @@ -8517,8 +10553,8 @@ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "ini": "1.3.5", + "proto-list": "1.2.4" } }, "configstore": { @@ -8526,12 +10562,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "dot-prop": "^4.1.0", - "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" + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" } }, "console-control-strings": { @@ -8544,12 +10580,12 @@ "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" + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" }, "dependencies": { "iferr": { @@ -8569,7 +10605,7 @@ "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" + "capture-stack-trace": "1.0.0" } }, "cross-spawn": { @@ -8577,9 +10613,9 @@ "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" + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "crypto-random-string": { @@ -8597,7 +10633,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "debug": { @@ -8640,7 +10676,7 @@ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "requires": { - "clone": "^1.0.2" + "clone": "1.0.4" } }, "delayed-stream": { @@ -8668,8 +10704,8 @@ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "requires": { - "asap": "^2.0.0", - "wrappy": "1" + "asap": "2.0.6", + "wrappy": "1.0.2" } }, "dot-prop": { @@ -8677,7 +10713,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "dotenv": { @@ -8695,10 +10731,10 @@ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" } }, "ecc-jsbn": { @@ -8707,8 +10743,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "optional": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "editor": { @@ -8721,7 +10757,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.23" } }, "end-of-stream": { @@ -8729,7 +10765,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "err-code": { @@ -8742,7 +10778,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "es6-promise": { @@ -8755,7 +10791,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.4" } }, "escape-string-regexp": { @@ -8768,13 +10804,13 @@ "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" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "extend": { @@ -8812,7 +10848,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "flush-write-stream": { @@ -8820,8 +10856,8 @@ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "forever-agent": { @@ -8834,9 +10870,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.19" } }, "from2": { @@ -8844,8 +10880,8 @@ "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" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "fs-minipass": { @@ -8853,7 +10889,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.3" } }, "fs-vacuum": { @@ -8861,9 +10897,9 @@ "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.10.tgz", "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", "requires": { - "graceful-fs": "^4.1.2", - "path-is-inside": "^1.0.1", - "rimraf": "^2.5.2" + "graceful-fs": "4.1.11", + "path-is-inside": "1.0.2", + "rimraf": "2.6.2" } }, "fs-write-stream-atomic": { @@ -8871,10 +10907,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" + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" }, "dependencies": { "iferr": { @@ -8894,10 +10930,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" } }, "gauge": { @@ -8905,14 +10941,14 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "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" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" }, "dependencies": { "string-width": { @@ -8920,9 +10956,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -8937,14 +10973,14 @@ "resolved": "https://registry.npmjs.org/gentle-fs/-/gentle-fs-2.0.1.tgz", "integrity": "sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew==", "requires": { - "aproba": "^1.1.2", - "fs-vacuum": "^1.2.10", - "graceful-fs": "^4.1.11", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "path-is-inside": "^1.0.2", - "read-cmd-shim": "^1.0.1", - "slide": "^1.1.6" + "aproba": "1.2.0", + "fs-vacuum": "1.2.10", + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "path-is-inside": "1.0.2", + "read-cmd-shim": "1.0.1", + "slide": "1.1.6" }, "dependencies": { "iferr": { @@ -8969,7 +11005,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -8977,12 +11013,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "global-dirs": { @@ -8990,7 +11026,7 @@ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "requires": { - "ini": "^1.3.4" + "ini": "1.3.5" } }, "got": { @@ -8998,17 +11034,17 @@ "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" + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" } }, "graceful-fs": { @@ -9026,8 +11062,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-flag": { @@ -9055,7 +11091,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "requires": { - "agent-base": "4", + "agent-base": "4.2.0", "debug": "3.1.0" } }, @@ -9064,9 +11100,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "https-proxy-agent": { @@ -9074,8 +11110,8 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.2.0", + "debug": "3.1.0" } }, "humanize-ms": { @@ -9083,7 +11119,7 @@ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "requires": { - "ms": "^2.0.0" + "ms": "2.1.1" } }, "iconv-lite": { @@ -9091,7 +11127,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "iferr": { @@ -9104,7 +11140,7 @@ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "import-lazy": { @@ -9122,8 +11158,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -9141,14 +11177,14 @@ "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", - "validate-npm-package-name": "^3.0.0" + "glob": "7.1.2", + "npm-package-arg": "6.1.0", + "promzard": "0.3.0", + "read": "1.0.7", + "read-package-json": "2.0.13", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "3.0.0" } }, "invert-kv": { @@ -9171,7 +11207,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "^1.0.0" + "builtin-modules": "1.1.1" } }, "is-ci": { @@ -9179,7 +11215,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "requires": { - "ci-info": "^1.0.0" + "ci-info": "1.4.0" } }, "is-cidr": { @@ -9187,7 +11223,7 @@ "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-2.0.6.tgz", "integrity": "sha512-A578p1dV22TgPXn6NCaDAPj6vJvYsBgAzUrAd28a4oldeXJjWqEUuSZOLIW3im51mazOKsoyVp8NU/OItlWacw==", "requires": { - "cidr-regex": "^2.0.8" + "cidr-regex": "2.0.9" } }, "is-fullwidth-code-point": { @@ -9195,7 +11231,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-installed-globally": { @@ -9203,8 +11239,8 @@ "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" + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" } }, "is-npm": { @@ -9222,7 +11258,7 @@ "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" + "path-is-inside": "1.0.2" } }, "is-redirect": { @@ -9307,7 +11343,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "requires": { - "package-json": "^4.0.0" + "package-json": "4.0.1" } }, "lazy-property": { @@ -9320,7 +11356,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "libcipm": { @@ -9328,20 +11364,20 @@ "resolved": "https://registry.npmjs.org/libcipm/-/libcipm-2.0.2.tgz", "integrity": "sha512-9uZ6/LAflVEijksTRq/RX0e+pGA4mr8tND9Cmk2JMg7j2fFUBrs8PpFX2DOAJR/XoxPzz+5h8bkWmtIYLunKAg==", "requires": { - "bin-links": "^1.1.2", - "bluebird": "^3.5.1", - "find-npm-prefix": "^1.0.2", - "graceful-fs": "^4.1.11", - "lock-verify": "^2.0.2", - "mkdirp": "^0.5.1", - "npm-lifecycle": "^2.0.3", - "npm-logical-tree": "^1.2.1", - "npm-package-arg": "^6.1.0", - "pacote": "^8.1.6", - "protoduck": "^5.0.0", - "read-package-json": "^2.0.13", - "rimraf": "^2.6.2", - "worker-farm": "^1.6.0" + "bin-links": "1.1.2", + "bluebird": "3.5.1", + "find-npm-prefix": "1.0.2", + "graceful-fs": "4.1.11", + "lock-verify": "2.0.2", + "mkdirp": "0.5.1", + "npm-lifecycle": "2.1.0", + "npm-logical-tree": "1.2.1", + "npm-package-arg": "6.1.0", + "pacote": "8.1.6", + "protoduck": "5.0.0", + "read-package-json": "2.0.13", + "rimraf": "2.6.2", + "worker-farm": "1.6.0" } }, "libnpmhook": { @@ -9349,8 +11385,8 @@ "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-4.0.1.tgz", "integrity": "sha512-3qqpfqvBD1712WA6iGe0stkG40WwAeoWcujA6BlC0Be1JArQbqwabnEnZ0CRcD05Tf1fPYJYdCbSfcfedEJCOg==", "requires": { - "figgy-pudding": "^3.1.0", - "npm-registry-fetch": "^3.0.0" + "figgy-pudding": "3.4.1", + "npm-registry-fetch": "3.1.1" }, "dependencies": { "npm-registry-fetch": { @@ -9358,11 +11394,11 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.1.1.tgz", "integrity": "sha512-xBobENeenvjIG8PgQ1dy77AXTI25IbYhmA3DusMIfw/4EL5BaQ5e1V9trkPrqHvyjR3/T0cnH6o0Wt/IzcI5Ag==", "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^3.1.0", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^4.0.0", - "npm-package-arg": "^6.0.0" + "bluebird": "3.5.1", + "figgy-pudding": "3.4.1", + "lru-cache": "4.1.3", + "make-fetch-happen": "4.0.1", + "npm-package-arg": "6.1.0" } } } @@ -9372,14 +11408,14 @@ "resolved": "https://registry.npmjs.org/libnpx/-/libnpx-10.2.0.tgz", "integrity": "sha512-X28coei8/XRCt15cYStbLBph+KGhFra4VQhRBPuH/HHMkC5dxM8v24RVgUsvODKCrUZ0eTgiTqJp6zbl0sskQQ==", "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": "^11.0.0" + "dotenv": "5.0.1", + "npm-package-arg": "6.1.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "update-notifier": "2.5.0", + "which": "1.3.1", + "y18n": "4.0.0", + "yargs": "11.0.0" } }, "locate-path": { @@ -9387,8 +11423,8 @@ "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-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lock-verify": { @@ -9396,8 +11432,8 @@ "resolved": "https://registry.npmjs.org/lock-verify/-/lock-verify-2.0.2.tgz", "integrity": "sha512-QNVwK0EGZBS4R3YQ7F1Ox8p41Po9VGl2QG/2GsuvTbkJZYSsPeWHKMbbH6iZMCHWSMww5nrJroZYnGzI4cePuw==", "requires": { - "npm-package-arg": "^5.1.2 || 6", - "semver": "^5.4.1" + "npm-package-arg": "6.1.0", + "semver": "5.5.0" } }, "lockfile": { @@ -9405,7 +11441,7 @@ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "requires": { - "signal-exit": "^3.0.2" + "signal-exit": "3.0.2" } }, "lodash._baseindexof": { @@ -9418,8 +11454,8 @@ "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "requires": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" + "lodash._createset": "4.0.3", + "lodash._root": "3.0.1" } }, "lodash._bindcallback": { @@ -9437,7 +11473,7 @@ "resolved": "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "requires": { - "lodash._getnative": "^3.0.0" + "lodash._getnative": "3.9.1" } }, "lodash._createset": { @@ -9490,8 +11526,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "make-dir": { @@ -9499,7 +11535,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "make-fetch-happen": { @@ -9507,17 +11543,17 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "agentkeepalive": "3.4.1", + "cacache": "11.2.0", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "4.0.1", + "ssri": "6.0.0" } }, "meant": { @@ -9530,7 +11566,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "mime-db": { @@ -9543,7 +11579,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "requires": { - "mime-db": "~1.35.0" + "mime-db": "1.35.0" } }, "mimic-fn": { @@ -9556,7 +11592,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -9569,8 +11605,8 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "safe-buffer": "5.1.2", + "yallist": "3.0.2" }, "dependencies": { "yallist": { @@ -9585,7 +11621,7 @@ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.3" } }, "mississippi": { @@ -9593,16 +11629,16 @@ "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" + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "3.0.0", + "pumpify": "1.5.1", + "stream-each": "1.2.2", + "through2": "2.0.3" } }, "mkdirp": { @@ -9618,12 +11654,12 @@ "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" + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" } }, "ms": { @@ -9641,9 +11677,9 @@ "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" + "encoding": "0.1.12", + "json-parse-better-errors": "1.0.2", + "safe-buffer": "5.1.2" } }, "node-gyp": { @@ -9651,18 +11687,18 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.88.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.1" }, "dependencies": { "nopt": { @@ -9670,7 +11706,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "requires": { - "abbrev": "1" + "abbrev": "1.1.1" } }, "semver": { @@ -9683,9 +11719,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" } } } @@ -9695,8 +11731,8 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "normalize-package-data": { @@ -9704,10 +11740,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.4" } }, "npm-audit-report": { @@ -9715,8 +11751,8 @@ "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-1.3.1.tgz", "integrity": "sha512-SjTF8ZP4rOu3JiFrTMi4M1CmVo2tni2sP4TzhyCMHwnMGf6XkdGLZKt9cdZ12esKf0mbQqFyU9LtY0SoeahL7g==", "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" + "cli-table3": "0.5.0", + "console-control-strings": "1.1.0" } }, "npm-bundled": { @@ -9734,7 +11770,7 @@ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-3.0.0.tgz", "integrity": "sha1-1K7N/VGlPjcjt7L5Oy7ijjB7wNc=", "requires": { - "semver": "^2.3.0 || 3.x || 4 || 5" + "semver": "5.5.0" } }, "npm-lifecycle": { @@ -9742,14 +11778,14 @@ "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz", "integrity": "sha512-QbBfLlGBKsktwBZLj6AviHC6Q9Y3R/AY4a2PYSIRhSKSS0/CxRyD/PfxEX6tPeOCXQgMSNdwGeECacstgptc+g==", "requires": { - "byline": "^5.0.0", - "graceful-fs": "^4.1.11", - "node-gyp": "^3.8.0", - "resolve-from": "^4.0.0", - "slide": "^1.1.6", + "byline": "5.0.0", + "graceful-fs": "4.1.11", + "node-gyp": "3.8.0", + "resolve-from": "4.0.0", + "slide": "1.1.6", "uid-number": "0.0.6", - "umask": "^1.1.0", - "which": "^1.3.1" + "umask": "1.1.0", + "which": "1.3.1" } }, "npm-logical-tree": { @@ -9762,10 +11798,10 @@ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "2.7.1", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" } }, "npm-packlist": { @@ -9773,8 +11809,8 @@ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.5" } }, "npm-pick-manifest": { @@ -9782,8 +11818,8 @@ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", "requires": { - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "npm-package-arg": "6.1.0", + "semver": "5.5.0" } }, "npm-profile": { @@ -9791,8 +11827,8 @@ "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-3.0.2.tgz", "integrity": "sha512-rEJOFR6PbwOvvhGa2YTNOJQKNuc6RovJ6T50xPU7pS9h/zKPNCJ+VHZY2OFXyZvEi+UQYtHRTp8O/YM3tUD20A==", "requires": { - "aproba": "^1.1.2 || 2", - "make-fetch-happen": "^2.5.0 || 3 || 4" + "aproba": "1.2.0", + "make-fetch-happen": "4.0.1" } }, "npm-registry-client": { @@ -9800,18 +11836,18 @@ "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", "requires": { - "concat-stream": "^1.5.2", - "graceful-fs": "^4.1.6", - "normalize-package-data": "~1.0.1 || ^2.0.0", - "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "npmlog": "2 || ^3.1.0 || ^4.0.0", - "once": "^1.3.3", - "request": "^2.74.0", - "retry": "^0.10.0", - "safe-buffer": "^5.1.1", - "semver": "2 >=2.2.1 || 3.x || 4 || 5", - "slide": "^1.1.3", - "ssri": "^5.2.4" + "concat-stream": "1.6.2", + "graceful-fs": "4.1.11", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "request": "2.88.0", + "retry": "0.10.1", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "slide": "1.1.6", + "ssri": "5.3.0" }, "dependencies": { "retry": { @@ -9824,7 +11860,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -9834,12 +11870,12 @@ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-1.1.0.tgz", "integrity": "sha512-XJPIBfMtgaooRtZmuA42xCeLf3tkxdIX0xqRsGWwNrcVvJ9UYFccD7Ho7QWCzvkM3i/QrkUC37Hu0a+vDBmt5g==", "requires": { - "bluebird": "^3.5.1", - "figgy-pudding": "^2.0.1", - "lru-cache": "^4.1.2", - "make-fetch-happen": "^3.0.0", - "npm-package-arg": "^6.0.0", - "safe-buffer": "^5.1.1" + "bluebird": "3.5.1", + "figgy-pudding": "2.0.1", + "lru-cache": "4.1.3", + "make-fetch-happen": "3.0.0", + "npm-package-arg": "6.1.0", + "safe-buffer": "5.1.2" }, "dependencies": { "cacache": { @@ -9847,19 +11883,19 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" }, "dependencies": { "mississippi": { @@ -9867,16 +11903,16 @@ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "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": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.2", + "through2": "2.0.3" } } } @@ -9891,17 +11927,17 @@ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-3.0.0.tgz", "integrity": "sha512-FmWY7gC0mL6Z4N86vE14+m719JKE4H0A+pyiOH18B025gF/C113pyfb4gHDDYP5cqnRMHOz06JGdmffC/SES+w==", "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^10.0.4", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lru-cache": "^4.1.2", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^3.0.1", - "ssri": "^5.2.4" + "agentkeepalive": "3.4.1", + "cacache": "10.0.4", + "http-cache-semantics": "3.8.1", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "mississippi": "3.0.0", + "node-fetch-npm": "2.0.2", + "promise-retry": "1.1.1", + "socks-proxy-agent": "3.0.1", + "ssri": "5.3.0" } }, "pump": { @@ -9909,8 +11945,8 @@ "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" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "smart-buffer": { @@ -9923,8 +11959,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", "requires": { - "ip": "^1.1.4", - "smart-buffer": "^1.0.13" + "ip": "1.1.5", + "smart-buffer": "1.1.15" } }, "socks-proxy-agent": { @@ -9932,8 +11968,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", "requires": { - "agent-base": "^4.1.0", - "socks": "^1.1.10" + "agent-base": "4.2.0", + "socks": "1.1.10" } }, "ssri": { @@ -9941,7 +11977,7 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } } } @@ -9951,7 +11987,7 @@ "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": "2.0.1" } }, "npm-user-validate": { @@ -9964,10 +12000,10 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { @@ -9990,7 +12026,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "opener": { @@ -10008,9 +12044,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "os-tmpdir": { @@ -10023,8 +12059,8 @@ "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" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "p-finally": { @@ -10037,7 +12073,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -10045,7 +12081,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" } }, "p-try": { @@ -10058,10 +12094,10 @@ "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" + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" } }, "pacote": { @@ -10069,31 +12105,31 @@ "resolved": "https://registry.npmjs.org/pacote/-/pacote-8.1.6.tgz", "integrity": "sha512-wTOOfpaAQNEQNtPEx92x9Y9kRWVu45v583XT8x2oEV2xRB74+xdqMZIeGW4uFvAyZdmSBtye+wKdyyLaT8pcmw==", "requires": { - "bluebird": "^3.5.1", - "cacache": "^11.0.2", - "get-stream": "^3.0.0", - "glob": "^7.1.2", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", - "minimatch": "^3.0.4", - "minipass": "^2.3.3", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.10", - "npm-pick-manifest": "^2.1.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", - "promise-retry": "^1.1.1", - "protoduck": "^5.0.0", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.5.0", - "ssri": "^6.0.0", - "tar": "^4.4.3", - "unique-filename": "^1.1.0", - "which": "^1.3.0" + "bluebird": "3.5.1", + "cacache": "11.2.0", + "get-stream": "3.0.0", + "glob": "7.1.2", + "lru-cache": "4.1.3", + "make-fetch-happen": "4.0.1", + "minimatch": "3.0.4", + "minipass": "2.3.3", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npm-packlist": "1.1.11", + "npm-pick-manifest": "2.1.0", + "osenv": "0.1.5", + "promise-inflight": "1.0.1", + "promise-retry": "1.1.1", + "protoduck": "5.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "ssri": "6.0.0", + "tar": "4.4.6", + "unique-filename": "1.1.0", + "which": "1.3.1" } }, "parallel-transform": { @@ -10101,9 +12137,9 @@ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "path-exists": { @@ -10156,8 +12192,8 @@ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" + "err-code": "1.1.2", + "retry": "0.10.1" }, "dependencies": { "retry": { @@ -10172,7 +12208,7 @@ "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "requires": { - "read": "1" + "read": "1.0.7" } }, "proto-list": { @@ -10185,7 +12221,7 @@ "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", "requires": { - "genfun": "^4.0.1" + "genfun": "4.0.1" } }, "prr": { @@ -10208,8 +12244,8 @@ "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" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { @@ -10217,9 +12253,9 @@ "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" + "duplexify": "3.6.0", + "inherits": "2.0.3", + "pump": "2.0.1" }, "dependencies": { "pump": { @@ -10227,8 +12263,8 @@ "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" + "end-of-stream": "1.4.1", + "once": "1.4.0" } } } @@ -10253,8 +12289,8 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.1.0.tgz", "integrity": "sha512-pNB/Gr8SA8ff8KpUFM36o/WFAlthgaThka5bV19AD9PNTH20Pwq5Zxodif2YyHwrctp6SkL4GqlOot0qR/wGaw==", "requires": { - "decode-uri-component": "^0.2.0", - "strict-uri-encode": "^2.0.0" + "decode-uri-component": "0.2.0", + "strict-uri-encode": "2.0.0" } }, "qw": { @@ -10267,10 +12303,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -10285,7 +12321,7 @@ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "requires": { - "mute-stream": "~0.0.4" + "mute-stream": "0.0.7" } }, "read-cmd-shim": { @@ -10293,7 +12329,7 @@ "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", "requires": { - "graceful-fs": "^4.1.2" + "graceful-fs": "4.1.11" } }, "read-installed": { @@ -10301,13 +12337,13 @@ "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" + "debuglog": "1.0.1", + "graceful-fs": "4.1.11", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2", + "semver": "5.5.0", + "slide": "1.1.6", + "util-extend": "1.0.3" } }, "read-package-json": { @@ -10315,11 +12351,11 @@ "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", "requires": { - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "json-parse-better-errors": "^1.0.1", - "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "json-parse-better-errors": "1.0.2", + "normalize-package-data": "2.4.0", + "slash": "1.0.0" } }, "read-package-tree": { @@ -10327,11 +12363,11 @@ "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "once": "1.4.0", + "read-package-json": "2.0.13", + "readdir-scoped-modules": "1.0.2" } }, "readable-stream": { @@ -10339,13 +12375,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "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" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "readdir-scoped-modules": { @@ -10353,10 +12389,10 @@ "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "debuglog": "1.0.1", + "dezalgo": "1.0.3", + "graceful-fs": "4.1.11", + "once": "1.4.0" } }, "registry-auth-token": { @@ -10364,8 +12400,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "1.2.7", + "safe-buffer": "5.1.2" } }, "registry-url": { @@ -10373,7 +12409,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "^1.0.1" + "rc": "1.2.7" } }, "request": { @@ -10381,26 +12417,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "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.0", + "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.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" } }, "require-directory": { @@ -10428,7 +12464,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "run-queue": { @@ -10436,7 +12472,7 @@ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { - "aproba": "^1.1.1" + "aproba": "1.2.0" } }, "safe-buffer": { @@ -10459,7 +12495,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "^5.0.3" + "semver": "5.5.0" } }, "set-blocking": { @@ -10472,8 +12508,8 @@ "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", "requires": { - "graceful-fs": "^4.1.2", - "readable-stream": "^2.0.2" + "graceful-fs": "4.1.11", + "readable-stream": "2.3.6" } }, "shebang-command": { @@ -10481,7 +12517,7 @@ "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": "1.0.0" } }, "shebang-regex": { @@ -10514,8 +12550,8 @@ "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.0.tgz", "integrity": "sha512-uRKV9uXQ9ytMbGm2+DilS1jB7N3AC0mmusmW5TVWjNuBZjxS8+lX38fasKVY9I4opv/bY/iqTbcpFFaTwpfwRg==", "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.0.1" + "ip": "1.1.5", + "smart-buffer": "4.0.1" } }, "socks-proxy-agent": { @@ -10523,8 +12559,8 @@ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", "requires": { - "agent-base": "~4.2.0", - "socks": "~2.2.0" + "agent-base": "4.2.0", + "socks": "2.2.0" } }, "sorted-object": { @@ -10537,8 +12573,8 @@ "resolved": "https://registry.npmjs.org/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz", "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", "requires": { - "from2": "^1.3.0", - "stream-iterate": "^1.1.0" + "from2": "1.3.0", + "stream-iterate": "1.2.0" }, "dependencies": { "from2": { @@ -10546,8 +12582,8 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-1.3.0.tgz", "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", "requires": { - "inherits": "~2.0.1", - "readable-stream": "~1.1.10" + "inherits": "2.0.3", + "readable-stream": "1.1.14" } }, "isarray": { @@ -10560,10 +12596,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -10578,8 +12614,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -10592,8 +12628,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -10606,15 +12642,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "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" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "ssri": { @@ -10627,8 +12663,8 @@ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" } }, "stream-iterate": { @@ -10636,8 +12672,8 @@ "resolved": "https://registry.npmjs.org/stream-iterate/-/stream-iterate-1.2.0.tgz", "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", "requires": { - "readable-stream": "^2.1.5", - "stream-shift": "^1.0.0" + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" } }, "stream-shift": { @@ -10655,8 +12691,8 @@ "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" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -10674,7 +12710,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -10684,7 +12720,7 @@ "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" + "safe-buffer": "5.1.2" } }, "stringify-package": { @@ -10697,7 +12733,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-eof": { @@ -10715,7 +12751,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "tar": { @@ -10723,13 +12759,13 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.3", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.2" }, "dependencies": { "yallist": { @@ -10744,7 +12780,7 @@ "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "requires": { - "execa": "^0.7.0" + "execa": "0.7.0" } }, "text-table": { @@ -10762,8 +12798,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.1" } }, "timed-out": { @@ -10781,8 +12817,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "1.1.29", + "punycode": "1.4.1" } }, "tunnel-agent": { @@ -10790,7 +12826,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -10819,7 +12855,7 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "2.0.0" } }, "unique-slug": { @@ -10827,7 +12863,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "requires": { - "imurmurhash": "^0.1.4" + "imurmurhash": "0.1.4" } }, "unique-string": { @@ -10835,7 +12871,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "1.0.0" } }, "unpipe": { @@ -10853,16 +12889,16 @@ "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" + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" } }, "url-parse-lax": { @@ -10870,7 +12906,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" } }, "util-deprecate": { @@ -10893,8 +12929,8 @@ "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" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "validate-npm-package-name": { @@ -10902,7 +12938,7 @@ "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" + "builtins": "1.0.3" } }, "verror": { @@ -10910,9 +12946,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "wcwidth": { @@ -10920,7 +12956,7 @@ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "requires": { - "defaults": "^1.0.3" + "defaults": "1.0.3" } }, "which": { @@ -10928,7 +12964,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -10941,7 +12977,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "requires": { - "string-width": "^1.0.2" + "string-width": "1.0.2" }, "dependencies": { "string-width": { @@ -10949,9 +12985,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -10961,7 +12997,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "^2.1.1" + "string-width": "2.1.1" } }, "worker-farm": { @@ -10969,7 +13005,7 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "~0.1.7" + "errno": "0.1.7" } }, "wrap-ansi": { @@ -10977,8 +13013,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "string-width": { @@ -10986,9 +13022,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -11003,9 +13039,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, "xdg-basedir": { @@ -11033,18 +13069,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" }, "dependencies": { "y18n": { @@ -11059,7 +13095,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -11069,7 +13105,7 @@ "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": "2.0.1" } }, "nth-check": { @@ -11077,7 +13113,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", "requires": { - "boolbase": "~1.0.0" + "boolbase": "1.0.0" } }, "num2fraction": { @@ -11085,11 +13121,24 @@ "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.2" + } + }, "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=" }, + "numeric": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/numeric/-/numeric-1.2.6.tgz", + "integrity": "sha1-dlsCvvl5iPz4gNTrPza4D6MTNao=" + }, "nwmatcher": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", @@ -11110,9 +13159,9 @@ "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" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -11120,7 +13169,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "kind-of": { @@ -11128,7 +13177,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -11141,8 +13190,7 @@ "object-inspect": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", - "dev": true + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" }, "object-is": { "version": "1.0.1", @@ -11160,7 +13208,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.assign": { @@ -11169,10 +13217,10 @@ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.11" } }, "object.entries": { @@ -11181,10 +13229,10 @@ "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "1.1.2", + "es-abstract": "1.11.0", + "function-bind": "1.1.1", + "has": "1.0.1" } }, "object.omit": { @@ -11192,8 +13240,8 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "object.pick": { @@ -11201,7 +13249,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "object.values": { @@ -11210,10 +13258,10 @@ "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.6.1", - "function-bind": "^1.1.0", - "has": "^1.0.1" + "define-properties": "1.1.2", + "es-abstract": "1.11.0", + "function-bind": "1.1.1", + "has": "1.0.1" } }, "obuf": { @@ -11239,7 +13287,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "onetime": { @@ -11247,7 +13295,7 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "opn": { @@ -11255,16 +13303,21 @@ "resolved": "https://registry.npmjs.org/opn/-/opn-5.2.0.tgz", "integrity": "sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==", "requires": { - "is-wsl": "^1.1.0" + "is-wsl": "1.1.0" } }, + "optical-properties": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/optical-properties/-/optical-properties-1.0.0.tgz", + "integrity": "sha512-XnBQYbIIzDVr7U3L7d3xyAEqp1W+HTkqmw/G4L/Ae/+dq57bT1jqW2uDwV0wCUzO8gsTDIZhGQsGrMb17VSkEA==" + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.8", + "wordwrap": "0.0.3" }, "dependencies": { "wordwrap": { @@ -11279,12 +13332,21 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "orbit-camera-controller": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", + "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", + "requires": { + "filtered-vector": "1.2.4", + "gl-mat4": "1.2.0" } }, "original": { @@ -11292,7 +13354,7 @@ "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", "requires": { - "url-parse": "1.0.x" + "url-parse": "1.0.5" }, "dependencies": { "url-parse": { @@ -11300,8 +13362,8 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", "requires": { - "querystringify": "0.0.x", - "requires-port": "1.0.x" + "querystringify": "0.0.4", + "requires-port": "1.0.0" } } } @@ -11321,7 +13383,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "os-tmpdir": { @@ -11339,7 +13401,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -11347,7 +13409,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.2.0" } }, "p-map": { @@ -11365,10 +13427,18 @@ "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" + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "pad-left": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-1.0.2.tgz", + "integrity": "sha1-GeVzXqmDlaJs7carkm6tEPMQDUw=", + "requires": { + "repeat-string": "1.6.1" } }, "pako": { @@ -11381,19 +13451,24 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, + "parenthesis": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.5.tgz", + "integrity": "sha512-9KbfUp3+gD0MIl4AGfLBwVNvcPf1fokUJtYxql511chVNnS8DrYFazqBfZDqD4GV76XUhQbbxmZJPPOsV4GIbw==" + }, "parse-asn1": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" } }, "parse-glob": { @@ -11401,10 +13476,10 @@ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "parse-json": { @@ -11412,7 +13487,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.1" } }, "parse-passwd": { @@ -11420,6 +13495,24 @@ "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": "1.5.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", @@ -11490,9 +13583,18 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pbf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.1.0.tgz", + "integrity": "sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w==", + "requires": { + "ieee754": "1.1.11", + "resolve-protobuf-schema": "2.1.0" } }, "pbkdf2": { @@ -11500,11 +13602,11 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "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" + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "performance-now": { @@ -11512,6 +13614,28 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "permutation-parity": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/permutation-parity/-/permutation-parity-1.0.0.tgz", + "integrity": "sha1-AXTVH8pwSxG5pLFSsj1Tf9xrXvQ=", + "requires": { + "typedarray-pool": "1.1.0" + } + }, + "permutation-rank": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/permutation-rank/-/permutation-rank-1.0.0.tgz", + "integrity": "sha1-n9mLvOzwj79ZlLXq3JSmLmeUg7U=", + "requires": { + "invert-permutation": "1.0.0", + "typedarray-pool": "1.1.0" + } + }, + "pick-by-alias": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", + "integrity": "sha1-X3yysfIabh6ISgyHhVqko3NhEHs=" + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -11527,7 +13651,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -11535,22 +13659,166 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "find-up": "^2.1.0" + "find-up": "2.1.0" + } + }, + "planar-dual": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/planar-dual/-/planar-dual-1.0.2.tgz", + "integrity": "sha1-tqQjVSOxsMt55fkm+OozXdmC1WM=", + "requires": { + "compare-angle": "1.0.1", + "dup": "1.0.0" + } + }, + "planar-graph-to-polyline": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/planar-graph-to-polyline/-/planar-graph-to-polyline-1.0.5.tgz", + "integrity": "sha1-iCuGBRmbqIv9RkyVUzA1VsUrmIo=", + "requires": { + "edges-to-adjacency-list": "1.0.0", + "planar-dual": "1.0.2", + "point-in-big-polygon": "2.0.0", + "robust-orientation": "1.1.3", + "robust-sum": "1.0.0", + "two-product": "1.0.2", + "uniq": "1.0.1" + } + }, + "plotly.js": { + "version": "1.42.5", + "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-1.42.5.tgz", + "integrity": "sha512-8CNLc4KGOv6Vjwm4tKVTSVNbBb2P2j7wqCrkSFNtKUA7iFkharaheY63lyg+/dZH4apucHYje/Yrh6eUPlF3GA==", + "requires": { + "3d-view": "2.0.0", + "@plotly/d3-sankey": "0.5.1", + "alpha-shape": "1.0.0", + "array-range": "1.0.1", + "canvas-fit": "1.5.0", + "color-normalize": "1.3.0", + "convex-hull": "1.0.3", + "country-regex": "1.1.0", + "d3": "3.5.17", + "d3-force": "1.1.2", + "delaunay-triangulate": "1.1.6", + "es6-promise": "3.3.1", + "fast-isnumeric": "1.1.2", + "font-atlas-sdf": "1.3.3", + "gl-cone3d": "1.2.1", + "gl-contour2d": "1.1.4", + "gl-error3d": "1.0.9", + "gl-heatmap2d": "1.0.4", + "gl-line3d": "1.1.6", + "gl-mat4": "1.2.0", + "gl-mesh3d": "2.0.2", + "gl-plot2d": "1.4.0", + "gl-plot3d": "1.6.0", + "gl-pointcloud2d": "1.0.1", + "gl-scatter3d": "1.1.0", + "gl-select-box": "1.0.2", + "gl-spikes2d": "1.0.1", + "gl-streamtube3d": "1.1.1", + "gl-surface3d": "1.3.7", + "gl-text": "1.1.6", + "glslify": "6.4.1", + "has-hover": "1.0.1", + "has-passive-events": "1.0.0", + "mapbox-gl": "0.45.0", + "matrix-camera-controller": "2.1.3", + "mouse-change": "1.4.0", + "mouse-event-offset": "3.0.2", + "mouse-wheel": "1.2.0", + "ndarray": "1.0.18", + "ndarray-fill": "1.0.2", + "ndarray-homography": "1.0.0", + "ndarray-ops": "1.2.2", + "point-cluster": "3.1.4", + "polybooljs": "1.2.0", + "regl": "1.3.9", + "regl-error2d": "2.0.5", + "regl-line2d": "3.0.12", + "regl-scatter2d": "3.0.6", + "regl-splom": "1.0.4", + "right-now": "1.0.0", + "robust-orientation": "1.1.3", + "sane-topojson": "2.0.0", + "strongly-connected-components": "1.0.1", + "superscript-text": "1.0.0", + "svg-path-sdf": "1.1.2", + "tinycolor2": "1.4.1", + "topojson-client": "2.1.0", + "webgl-context": "2.2.0", + "world-calendars": "1.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "3.3.1", + "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + } + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, + "point-cluster": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-3.1.4.tgz", + "integrity": "sha512-jVjzC1vYoZlvcLWi170i41he5LhJTncOgFPaZx1uoqNn+8q+24xjLS9yG68XfN6/U1F52kliD6a3oXjJduerTQ==", + "requires": { + "array-bounds": "1.0.1", + "array-normalize": "1.1.3", + "binary-search-bounds": "2.0.4", + "bubleify": "1.2.0", + "clamp": "1.0.1", + "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" + }, + "dependencies": { + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + } + } + }, + "point-in-big-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/point-in-big-polygon/-/point-in-big-polygon-2.0.0.tgz", + "integrity": "sha1-ObYT6mzxfWtD4Yj3fzTETGszulU=", + "requires": { + "binary-search-bounds": "1.0.0", + "interval-tree-1d": "1.0.3", + "robust-orientation": "1.1.3", + "slab-decomposition": "1.0.2" } }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + "polybooljs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", + "integrity": "sha1-tDkMLgedTCYtOyUExiiNlbp6R1g=" + }, + "polytope-closest-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz", + "integrity": "sha1-5uV/QIGrXox3i4Ee8G4sSK4zjD8=", + "requires": { + "numeric": "1.2.6" + } }, "portfinder": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" }, "dependencies": { "async": { @@ -11570,9 +13838,9 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "chalk": "2.4.1", + "source-map": "0.6.1", + "supports-color": "5.4.0" }, "dependencies": { "chalk": { @@ -11580,9 +13848,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -11592,9 +13860,9 @@ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" }, "dependencies": { "has-flag": { @@ -11607,10 +13875,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11623,7 +13891,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11633,9 +13901,9 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -11648,10 +13916,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11664,7 +13932,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11674,8 +13942,8 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -11688,10 +13956,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11704,7 +13972,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11714,7 +13982,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11727,10 +13995,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11743,7 +14011,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11753,7 +14021,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11766,10 +14034,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11782,7 +14050,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11792,7 +14060,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11805,10 +14073,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11821,7 +14089,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11831,7 +14099,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "requires": { - "postcss": "^5.0.16" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -11844,10 +14112,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11860,7 +14128,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11870,8 +14138,8 @@ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -11884,10 +14152,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11900,7 +14168,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11910,8 +14178,8 @@ "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "requires": { - "postcss": "^5.0.4", - "uniqid": "^4.0.0" + "postcss": "5.2.18", + "uniqid": "4.1.1" }, "dependencies": { "has-flag": { @@ -11924,10 +14192,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -11940,7 +14208,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -11950,7 +14218,7 @@ "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz", "integrity": "sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==", "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.22" } }, "postcss-load-config": { @@ -11958,10 +14226,10 @@ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0", - "postcss-load-options": "^1.2.0", - "postcss-load-plugins": "^2.3.0" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" } }, "postcss-load-options": { @@ -11969,8 +14237,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", "requires": { - "cosmiconfig": "^2.1.0", - "object-assign": "^4.1.0" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, "postcss-load-plugins": { @@ -11978,8 +14246,8 @@ "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", "requires": { - "cosmiconfig": "^2.1.1", - "object-assign": "^4.1.0" + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" } }, "postcss-loader": { @@ -11987,10 +14255,10 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.8.tgz", "integrity": "sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==", "requires": { - "loader-utils": "^1.1.0", - "postcss": "^6.0.0", - "postcss-load-config": "^1.2.0", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "postcss": "6.0.22", + "postcss-load-config": "1.2.0", + "schema-utils": "0.3.0" } }, "postcss-merge-idents": { @@ -11998,9 +14266,9 @@ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12013,10 +14281,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12029,7 +14297,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12039,7 +14307,7 @@ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -12052,10 +14320,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12068,7 +14336,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12078,11 +14346,11 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.2" }, "dependencies": { "browserslist": { @@ -12090,8 +14358,8 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000839", + "electron-to-chromium": "1.3.45" } }, "has-flag": { @@ -12104,10 +14372,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12120,7 +14388,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12135,9 +14403,9 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12150,10 +14418,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12166,7 +14434,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12176,8 +14444,8 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12190,10 +14458,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12206,7 +14474,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12216,10 +14484,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -12232,10 +14500,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12248,7 +14516,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12258,10 +14526,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" + "alphanum-sort": "1.0.2", + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" }, "dependencies": { "has-flag": { @@ -12274,10 +14542,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12290,7 +14558,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12300,7 +14568,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.22" } }, "postcss-modules-local-by-default": { @@ -12308,8 +14576,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.22" } }, "postcss-modules-scope": { @@ -12317,8 +14585,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "css-selector-tokenizer": "0.7.0", + "postcss": "6.0.22" } }, "postcss-modules-values": { @@ -12326,8 +14594,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.22" } }, "postcss-normalize-charset": { @@ -12335,7 +14603,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "requires": { - "postcss": "^5.0.5" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -12348,10 +14616,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12364,7 +14632,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12374,10 +14642,10 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12390,10 +14658,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12406,7 +14674,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12416,8 +14684,8 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12430,10 +14698,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12446,7 +14714,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12456,8 +14724,8 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12470,10 +14738,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12486,7 +14754,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12496,7 +14764,7 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" }, "dependencies": { "has-flag": { @@ -12509,10 +14777,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12525,7 +14793,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12535,9 +14803,9 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "has": "1.0.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" }, "dependencies": { "has-flag": { @@ -12550,10 +14818,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12566,7 +14834,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12576,9 +14844,9 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } }, "postcss-svgo": { @@ -12586,10 +14854,10 @@ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0", + "svgo": "0.7.2" }, "dependencies": { "has-flag": { @@ -12602,10 +14870,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12618,7 +14886,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12628,9 +14896,9 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -12643,10 +14911,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12659,7 +14927,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12674,9 +14942,9 @@ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "has": "1.0.1", + "postcss": "5.2.18", + "uniqs": "2.0.0" }, "dependencies": { "has-flag": { @@ -12689,10 +14957,10 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.4.3", + "source-map": "0.5.7", + "supports-color": "3.2.3" } }, "source-map": { @@ -12705,7 +14973,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -12735,8 +15003,8 @@ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "renderkid": "2.0.1", + "utila": "0.4.0" } }, "pretty-format": { @@ -12744,8 +15012,8 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-20.0.3.tgz", "integrity": "sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=", "requires": { - "ansi-regex": "^2.1.1", - "ansi-styles": "^3.0.0" + "ansi-regex": "2.1.1", + "ansi-styles": "3.2.1" } }, "private": { @@ -12773,7 +15041,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "requires": { - "asap": "~2.0.3" + "asap": "2.0.6" } }, "prop-types": { @@ -12781,9 +15049,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.1.tgz", "integrity": "sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } }, "prop-types-extra": { @@ -12791,8 +15059,8 @@ "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.0.tgz", "integrity": "sha512-QFyuDxvMipmIVKD2TwxLVPzMnO4e5oOf1vr3tJIomL8E7d0lr6phTHd5nkPhFIzTD1idBLLEPeylL9g+rrTzRg==", "requires": { - "react-is": "^16.3.2", - "warning": "^3.0.0" + "react-is": "16.3.2", + "warning": "3.0.0" } }, "property-expr": { @@ -12800,12 +15068,17 @@ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==" }, + "protocol-buffers-schema": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz", + "integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w==" + }, "proxy-addr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.6.0" } }, @@ -12824,11 +15097,11 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "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" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" } }, "punycode": { @@ -12846,6 +15119,14 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "quat-slerp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", + "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", + "requires": { + "gl-quat": "1.0.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -12861,15 +15142,74 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" }, + "quickselect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + }, + "quote-stream": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", + "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", + "requires": { + "minimist": "0.0.8", + "through2": "0.4.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.4.2", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "2.1.2" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "0.4.0" + } + } + } + }, "radium": { "version": "0.19.6", "resolved": "https://registry.npmjs.org/radium/-/radium-0.19.6.tgz", "integrity": "sha512-IABYntqCwYelUUIwA52maSCgJbqtJjHKIoD21wgpw3dGhIUbJ5chDShDGdaFiEzdF03hN9jfQqlmn0bF4YhfrQ==", "requires": { - "array-find": "^1.0.0", - "exenv": "^1.2.1", - "inline-style-prefixer": "^2.0.5", - "prop-types": "^15.5.8" + "array-find": "1.0.0", + "exenv": "1.2.2", + "inline-style-prefixer": "2.0.5", + "prop-types": "15.6.1" } }, "raf": { @@ -12877,7 +15217,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", "requires": { - "performance-now": "^2.1.0" + "performance-now": "2.1.0" } }, "railroad-diagrams": { @@ -12893,7 +15233,7 @@ "dev": true, "requires": { "discontinuous-range": "1.0.0", - "ret": "~0.1.10" + "ret": "0.1.15" } }, "randomatic": { @@ -12901,9 +15241,9 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { "is-number": { @@ -12918,7 +15258,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "requires": { - "safe-buffer": "^5.1.0" + "safe-buffer": "5.1.2" } }, "randomfill": { @@ -12926,8 +15266,8 @@ "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" + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" } }, "range-parser": { @@ -12935,6 +15275,14 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, + "rat-vec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rat-vec/-/rat-vec-1.1.1.tgz", + "integrity": "sha1-Dd4rZrezS7G80qI4BerIBth/0X8=", + "requires": { + "big-rat": "1.0.4" + } + }, "raw-body": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", @@ -12959,7 +15307,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" + "statuses": "1.4.0" } }, "iconv-lite": { @@ -12979,10 +15327,10 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -12997,10 +15345,10 @@ "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "schedule": "^0.5.0" + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.2", + "schedule": "0.5.0" }, "dependencies": { "prop-types": { @@ -13008,8 +15356,8 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "loose-envify": "1.3.1", + "object-assign": "4.1.1" } } } @@ -13019,7 +15367,7 @@ "resolved": "https://registry.npmjs.org/react-app-rewire-polyfills/-/react-app-rewire-polyfills-0.2.0.tgz", "integrity": "sha1-GMmn9ISdXA267ONVzxjBo8JVH9Q=", "requires": { - "babel-polyfill": "^6.20.0" + "babel-polyfill": "6.26.0" } }, "react-app-rewired": { @@ -13028,8 +15376,8 @@ "integrity": "sha512-/cbaFBaSYvCcj2BnolCh2Cx0J8QwFECg5RssXFPckhdzC9iEb5BKJGqt71ZTOF35gv6ebo4CPKJR4nZajzW4Sw==", "dev": true, "requires": { - "cross-spawn": "^5.1.0", - "dotenv": "^4.0.0" + "cross-spawn": "5.1.0", + "dotenv": "4.0.0" } }, "react-bootstrap": { @@ -13037,18 +15385,18 @@ "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-0.32.1.tgz", "integrity": "sha512-RbfzKUbsukWsToWqGHfCCyMFq9QQI0TznutdyxyJw6dih2NvIne25Mrssg8LZsprqtPpyQi8bN0L0Fx3fUsL8Q==", "requires": { - "babel-runtime": "^6.11.6", - "classnames": "^2.2.5", - "dom-helpers": "^3.2.0", - "invariant": "^2.2.1", - "keycode": "^2.1.2", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "react-overlays": "^0.8.0", - "react-prop-types": "^0.4.0", - "react-transition-group": "^2.0.0", - "uncontrollable": "^4.1.0", - "warning": "^3.0.0" + "babel-runtime": "6.26.0", + "classnames": "2.2.6", + "dom-helpers": "3.3.1", + "invariant": "2.2.4", + "keycode": "2.2.0", + "prop-types": "15.6.1", + "prop-types-extra": "1.1.0", + "react-overlays": "0.8.3", + "react-prop-types": "0.4.0", + "react-transition-group": "2.3.1", + "uncontrollable": "4.1.0", + "warning": "3.0.0" } }, "react-dev-utils": { @@ -13068,7 +15416,7 @@ "inquirer": "3.3.0", "is-root": "1.0.0", "opn": "5.2.0", - "react-error-overlay": "^4.0.0", + "react-error-overlay": "4.0.0", "recursive-readdir": "2.2.1", "shell-quote": "1.6.1", "sockjs-client": "1.1.4", @@ -13081,10 +15429,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", "requires": { - "fbjs": "^0.8.16", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0" + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.1" } }, "react-error-overlay": { @@ -13112,8 +15460,8 @@ "resolved": "https://registry.npmjs.org/react-mde/-/react-mde-5.8.0.tgz", "integrity": "sha512-/iLBMrnw9T8fdqf3qlK8gybIUlYhjDCVEQ/gxtD0rIncG0cS2oPmumRj6aaULQYkmqsjUGmFVUga6C/7g3cHWQ==", "requires": { - "classnames": "^2.2.5", - "npm": "^6.1.0" + "classnames": "2.2.6", + "npm": "6.4.1" } }, "react-modal": { @@ -13121,10 +15469,10 @@ "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.4.4.tgz", "integrity": "sha512-5VYNvy301Z0xxGBQhPmDdzOcyEkUG8sU7bpRsAPI4OHgEUkbBFrpjzs/ocNI0m824/lOqTxddXzwgmDJXx3s3Q==", "requires": { - "exenv": "^1.2.0", - "prop-types": "^15.5.10", - "react-lifecycles-compat": "^3.0.0", - "warning": "^3.0.0" + "exenv": "1.2.2", + "prop-types": "15.6.1", + "react-lifecycles-compat": "3.0.4", + "warning": "3.0.0" } }, "react-overlays": { @@ -13132,12 +15480,20 @@ "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-0.8.3.tgz", "integrity": "sha512-h6GT3jgy90PgctleP39Yu3eK1v9vaJAW73GOA/UbN9dJ7aAN4BTZD6793eI1D5U+ukMk17qiqN/wl3diK1Z5LA==", "requires": { - "classnames": "^2.2.5", - "dom-helpers": "^3.2.1", - "prop-types": "^15.5.10", - "prop-types-extra": "^1.0.1", - "react-transition-group": "^2.2.0", - "warning": "^3.0.0" + "classnames": "2.2.6", + "dom-helpers": "3.3.1", + "prop-types": "15.6.1", + "prop-types-extra": "1.1.0", + "react-transition-group": "2.3.1", + "warning": "3.0.0" + } + }, + "react-plotly.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.2.0.tgz", + "integrity": "sha512-+OWgUDZCMWJsZDhWupTvxvjZu/Q7Wbnaikq0PtdX2QQ4s/HuRj2uYydx3HfoDrW4Mc97aZsMnEVAqUxAEaf6FA==", + "requires": { + "prop-types": "15.6.1" } }, "react-prop-types": { @@ -13145,7 +15501,7 @@ "resolved": "https://registry.npmjs.org/react-prop-types/-/react-prop-types-0.4.0.tgz", "integrity": "sha1-+ZsL+0AGkpya8gUefBQUpcdbk9A=", "requires": { - "warning": "^3.0.0" + "warning": "3.0.0" } }, "react-redux": { @@ -13153,12 +15509,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", "requires": { - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.0.0", - "lodash": "^4.17.5", - "lodash-es": "^4.17.5", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.0" + "hoist-non-react-statics": "2.5.0", + "invariant": "2.2.4", + "lodash": "4.17.10", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "prop-types": "15.6.1" } }, "react-resize-detector": { @@ -13166,7 +15522,7 @@ "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-1.1.0.tgz", "integrity": "sha512-68KVcQlhcWQGXMAie82YueCa4f4yqwEoiQbVyYlSgJEin1zMtNBLLeU/+6FLNf1TTgjwSfpbMTJTw/uU0HNgtQ==", "requires": { - "prop-types": "^15.5.10" + "prop-types": "15.6.1" } }, "react-router": { @@ -13174,13 +15530,13 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.2.0.tgz", "integrity": "sha512-DY6pjwRhdARE4TDw7XjxjZsbx9lKmIcyZoZ+SDO7SBJ1KUeWNxT22Kara2AC7u6/c2SYEHlEDLnzBCcNhLE8Vg==", "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.3.0", - "invariant": "^2.2.2", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.5.4", - "warning": "^3.0.0" + "history": "4.7.2", + "hoist-non-react-statics": "2.5.0", + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "path-to-regexp": "1.7.0", + "prop-types": "15.6.1", + "warning": "3.0.0" } }, "react-router-dom": { @@ -13188,12 +15544,12 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.2.2.tgz", "integrity": "sha512-cHMFC1ZoLDfEaMFoKTjN7fry/oczMgRt5BKfMAkTu5zEuJvUiPp1J8d0eXSVTnBh6pxlbdqDhozunOOLtmKfPA==", "requires": { - "history": "^4.7.2", - "invariant": "^2.2.2", - "loose-envify": "^1.3.1", - "prop-types": "^15.5.4", - "react-router": "^4.2.0", - "warning": "^3.0.0" + "history": "4.7.2", + "invariant": "2.2.4", + "loose-envify": "1.3.1", + "prop-types": "15.6.1", + "react-router": "4.2.0", + "warning": "3.0.0" } }, "react-router-redux": { @@ -13211,7 +15567,7 @@ "babel-eslint": "7.2.3", "babel-jest": "20.0.3", "babel-loader": "7.1.2", - "babel-preset-react-app": "^3.1.1", + "babel-preset-react-app": "3.1.1", "babel-runtime": "6.26.0", "case-sensitive-paths-webpack-plugin": "2.1.1", "chalk": "1.1.3", @@ -13219,7 +15575,7 @@ "dotenv": "4.0.0", "dotenv-expand": "4.2.0", "eslint": "4.10.0", - "eslint-config-react-app": "^2.1.0", + "eslint-config-react-app": "2.1.0", "eslint-loader": "1.9.0", "eslint-plugin-flowtype": "2.39.1", "eslint-plugin-import": "2.8.0", @@ -13228,7 +15584,7 @@ "extract-text-webpack-plugin": "3.0.2", "file-loader": "1.1.5", "fs-extra": "3.0.1", - "fsevents": "^1.1.3", + "fsevents": "1.2.3", "html-webpack-plugin": "2.29.0", "jest": "20.0.4", "object-assign": "4.1.1", @@ -13236,7 +15592,7 @@ "postcss-loader": "2.0.8", "promise": "8.0.1", "raf": "3.4.0", - "react-dev-utils": "^5.0.1", + "react-dev-utils": "5.0.1", "resolve": "1.6.0", "style-loader": "0.19.0", "sw-precache-webpack-plugin": "0.11.4", @@ -13257,10 +15613,10 @@ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", "requires": { - "babel-code-frame": "^6.22.0", - "babel-traverse": "^6.23.1", - "babel-types": "^6.23.0", - "babylon": "^6.17.0" + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" } }, "debug": { @@ -13276,43 +15632,43 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.10.0.tgz", "integrity": "sha512-MMVl8P/dYUFZEvolL8PYt7qc5LNdS2lwheq9BYa5Y07FblhcZqFyaUqlS8TW5QITGex21tV4Lk0a3fK8lsJIkA==", "requires": { - "ajv": "^5.2.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.0.1", - "doctrine": "^2.0.0", - "eslint-scope": "^3.7.1", - "espree": "^3.5.1", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^9.17.0", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "^4.0.1", - "text-table": "~0.2.0" + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.4.1", + "concat-stream": "1.6.2", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.3", + "espree": "3.5.4", + "esquery": "1.0.1", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.12.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.3", + "text-table": "0.2.0" }, "dependencies": { "chalk": { @@ -13320,9 +15676,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -13337,8 +15693,8 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "promise": { @@ -13346,7 +15702,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.1.tgz", "integrity": "sha1-5F1osAoXZHttpxG/he1u1HII9FA=", "requires": { - "asap": "~2.0.3" + "asap": "2.0.6" } }, "strip-ansi": { @@ -13354,7 +15710,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "whatwg-fetch": { @@ -13369,10 +15725,10 @@ "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.0.tgz", "integrity": "sha1-sp2+vd3bBtIbWwiWIWf7nqwYl9g=", "requires": { - "lodash": "~4.17.4", - "prop-types": "^15.6.0", - "raf": "^3.2.0", - "react-transition-group": "^2.2.1" + "lodash": "4.17.10", + "prop-types": "15.6.1", + "raf": "3.4.0", + "react-transition-group": "2.3.1" } }, "react-sticky": { @@ -13380,8 +15736,8 @@ "resolved": "https://registry.npmjs.org/react-sticky/-/react-sticky-6.0.2.tgz", "integrity": "sha512-eXsij6ifE2k1d6eCwQzil0JRS3VLP6BYfiF7qEbVPL3GLqciedGJfbavpXx5T95x5HvhuAA4FChYEDv83r1NyQ==", "requires": { - "prop-types": "^15.5.8", - "raf": "^3.3.0" + "prop-types": "15.6.1", + "raf": "3.4.0" } }, "react-test-renderer": { @@ -13390,10 +15746,10 @@ "integrity": "sha512-vdTPnRMDbxfv4wL4lzN4EkVGXyYs7LE2uImOsqh1FKiP6L5o1oJl8nore5sFi9vxrP9PK3l4rgb/fZ4PVUaWSA==", "dev": true, "requires": { - "fbjs": "^0.8.16", - "object-assign": "^4.1.1", - "prop-types": "^15.6.0", - "react-is": "^16.4.2" + "fbjs": "0.8.16", + "object-assign": "4.1.1", + "prop-types": "15.6.1", + "react-is": "16.4.2" }, "dependencies": { "react-is": { @@ -13409,9 +15765,9 @@ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.3.1.tgz", "integrity": "sha512-hu4/LAOFSKjWt1+1hgnOv3ldxmt6lvZGTWz4KUkFrqzXrNDIVSu6txIcPszw7PNduR8en9YTN55JLRyd/L1ZiQ==", "requires": { - "dom-helpers": "^3.3.1", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1" + "dom-helpers": "3.3.1", + "loose-envify": "1.3.1", + "prop-types": "15.6.1" } }, "react-treebeard": { @@ -13419,12 +15775,12 @@ "resolved": "https://registry.npmjs.org/react-treebeard/-/react-treebeard-2.1.0.tgz", "integrity": "sha512-unoy8IJL1NR5jgTtK+CqOCZKZylh/Tlid0oYajW9bLZCbFelxzmCsF8Y2hyS6pvHqM4W501oOm5O/jvg3VZCrg==", "requires": { - "babel-runtime": "^6.23.0", - "deep-equal": "^1.0.1", - "prop-types": "^15.5.8", - "radium": "^0.19.0", - "shallowequal": "^0.2.2", - "velocity-react": "^1.3.1" + "babel-runtime": "6.26.0", + "deep-equal": "1.0.1", + "prop-types": "15.6.1", + "radium": "0.19.6", + "shallowequal": "0.2.2", + "velocity-react": "1.4.1" } }, "react-virtualized": { @@ -13432,12 +15788,12 @@ "resolved": "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.19.0.tgz", "integrity": "sha512-aeOGF964AnR7rcKtl2mQF8Ci2s3OJI2a4lmcCTTj1tNBk0V3xKjlhQETrnHs1xU66yNx2+CMTgS4CV82Pf/oNQ==", "requires": { - "babel-runtime": "^6.26.0", - "classnames": "^2.2.3", - "dom-helpers": "^2.4.0 || ^3.0.0", - "loose-envify": "^1.3.0", - "prop-types": "^15.6.0", - "react-lifecycles-compat": "^1.0.2" + "babel-runtime": "6.26.0", + "classnames": "2.2.6", + "dom-helpers": "3.3.1", + "loose-envify": "1.3.1", + "prop-types": "15.6.1", + "react-lifecycles-compat": "1.1.4" }, "dependencies": { "react-lifecycles-compat": { @@ -13452,9 +15808,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -13462,8 +15818,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" }, "dependencies": { "find-up": { @@ -13471,8 +15827,8 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -13480,7 +15836,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } } } @@ -13490,13 +15846,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "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" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "readdirp": { @@ -13504,10 +15860,10 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" } }, "recharts": { @@ -13517,11 +15873,11 @@ "requires": { "classnames": "2.2.5", "core-js": "2.5.1", - "d3-interpolate": "^1.1.5", + "d3-interpolate": "1.2.0", "d3-scale": "1.0.6", "d3-shape": "1.2.0", - "lodash": "~4.17.4", - "prop-types": "^15.6.0", + "lodash": "4.17.10", + "prop-types": "15.6.1", "react-resize-detector": "1.1.0", "react-smooth": "1.0.0", "recharts-scale": "0.3.2", @@ -13558,7 +15914,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "1.1.11" } } } @@ -13568,8 +15924,23 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "redeyed": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "integrity": "sha1-N+mQpvKyGyoRwuakj9QTVpjLqX8=", + "requires": { + "esprima": "1.0.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + } } }, "reduce-css-calc": { @@ -13577,9 +15948,9 @@ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" }, "dependencies": { "balanced-match": { @@ -13594,7 +15965,7 @@ "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "requires": { - "balanced-match": "^0.4.2" + "balanced-match": "0.4.2" }, "dependencies": { "balanced-match": { @@ -13604,15 +15975,25 @@ } } }, + "reduce-simplicial-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/reduce-simplicial-complex/-/reduce-simplicial-complex-1.0.0.tgz", + "integrity": "sha1-dNaWovg196bc2SBl/YxRgfLt+Lw=", + "requires": { + "cell-orientation": "1.0.1", + "compare-cell": "1.0.0", + "compare-oriented-cell": "1.0.1" + } + }, "redux": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "lodash": "4.17.10", + "lodash-es": "4.17.10", + "loose-envify": "1.3.1", + "symbol-observable": "1.2.0" } }, "redux-promise-middleware": { @@ -13630,6 +16011,21 @@ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" }, + "regenerate-unicode-properties": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz", + "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", + "requires": { + "regenerate": "1.4.0" + }, + "dependencies": { + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + } + } + }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", @@ -13640,9 +16036,9 @@ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" } }, "regex-cache": { @@ -13650,7 +16046,7 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regex-not": { @@ -13658,8 +16054,8 @@ "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" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexpu-core": { @@ -13667,9 +16063,9 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "registry-auth-token": { @@ -13677,8 +16073,8 @@ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "1.2.7", + "safe-buffer": "5.1.2" } }, "registry-url": { @@ -13686,7 +16082,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "requires": { - "rc": "^1.0.1" + "rc": "1.2.7" } }, "regjsgen": { @@ -13699,7 +16095,7 @@ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" }, "dependencies": { "jsesc": { @@ -13709,6 +16105,105 @@ } } }, + "regl": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/regl/-/regl-1.3.9.tgz", + "integrity": "sha512-CungQSUBsZNYZJWJlb2sPe4iwBjmxrgl1Yxt91HN3VuuEL7lJ5k03O3T1xEXVOCMN1q8wncddwJsxozuyzzmrA==" + }, + "regl-error2d": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.5.tgz", + "integrity": "sha512-hBxGSY0F9S3+JsobYiQBKdZ+0oWNpM6k8zeRxVDyv5rbZ2HNclVInrT82em+JPZ+GEh0OLmZdlS4BbPIuYAk2w==", + "requires": { + "array-bounds": "1.0.1", + "bubleify": "1.2.0", + "color-normalize": "1.3.0", + "flatten-vertex-data": "1.0.2", + "object-assign": "4.1.1", + "pick-by-alias": "1.2.0", + "to-float32": "1.0.1", + "update-diff": "1.1.0" + } + }, + "regl-line2d": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.0.12.tgz", + "integrity": "sha512-6KV6ZbVWeoMZDqkVdqbWpvzrQR1BFOOUHMoyi1HDkZ3TXuS88s1/vQghTJjaLDRBVV5krZfIMpBrePY7OMxDIQ==", + "requires": { + "array-bounds": "1.0.1", + "array-normalize": "1.1.3", + "bubleify": "1.2.0", + "color-normalize": "1.3.0", + "earcut": "2.1.3", + "es6-weak-map": "2.0.2", + "flatten-vertex-data": "1.0.2", + "glslify": "6.4.1", + "object-assign": "4.1.1", + "parse-rect": "1.2.0", + "pick-by-alias": "1.2.0", + "to-float32": "1.0.1" + } + }, + "regl-scatter2d": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.0.6.tgz", + "integrity": "sha512-l2/OcCRKTxsCtrGtb2TKUKYnDHzI07qOm2eK2kiRYKyDwiWiGyiLC6p3SlOxDoqhQ/8gbIue9BABPXuCJ0lpRQ==", + "requires": { + "array-range": "1.0.1", + "array-rearrange": "2.2.2", + "bubleify": "1.2.0", + "clamp": "1.0.1", + "color-id": "1.1.0", + "color-normalize": "1.3.0", + "flatten-vertex-data": "1.0.2", + "glslify": "6.4.1", + "is-iexplorer": "1.0.0", + "object-assign": "4.1.1", + "parse-rect": "1.2.0", + "pick-by-alias": "1.2.0", + "point-cluster": "3.1.4", + "to-float32": "1.0.1", + "update-diff": "1.1.0" + } + }, + "regl-splom": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.4.tgz", + "integrity": "sha512-+iq/RJAJdHCp48wPbEGQ5qw29OXFVF/m7CzcuLZxwptjdkB/FHGKiMuyqclOSNQcEKFxQTvRRJMJJ6brd8VvrA==", + "requires": { + "array-bounds": "1.0.1", + "array-range": "1.0.1", + "bubleify": "1.2.0", + "color-alpha": "1.0.3", + "defined": "1.0.0", + "flatten-vertex-data": "1.0.2", + "left-pad": "1.3.0", + "parse-rect": "1.2.0", + "pick-by-alias": "1.2.0", + "point-cluster": "1.0.2", + "raf": "3.4.0", + "regl-scatter2d": "3.0.6" + }, + "dependencies": { + "binary-search-bounds": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz", + "integrity": "sha512-2hg5kgdKql5ClF2ErBcSx0U5bnl5hgS4v7wMnLFodyR47yMtj2w+UAZB+0CiqyHct2q543i7Bi4/aMIegorCCg==" + }, + "point-cluster": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/point-cluster/-/point-cluster-1.0.2.tgz", + "integrity": "sha512-pau5Py38SKgEJZ8pvD/bfXrz2TmQy6BEtMFZZSpjsQ2EmAe4CRO+HLhHw1gmgHVFaY/9KqhrfSeUPIsBOw8tDA==", + "requires": { + "array-bounds": "1.0.1", + "array-normalize": "1.1.3", + "binary-search-bounds": "2.0.4", + "clamp": "1.0.1", + "parse-rect": "1.2.0" + } + } + } + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -13724,11 +16219,11 @@ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", "requires": { - "css-select": "^1.1.0", - "dom-converter": "~0.1", - "htmlparser2": "~3.3.0", - "strip-ansi": "^3.0.0", - "utila": "~0.3" + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" }, "dependencies": { "utila": { @@ -13753,7 +16248,7 @@ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" } }, "request": { @@ -13761,28 +16256,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "hawk": "~6.0.2", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "stringstream": "~0.0.5", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" } }, "require-directory": { @@ -13805,8 +16300,8 @@ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" } }, "requires-port": { @@ -13819,7 +16314,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.6.0.tgz", "integrity": "sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==", "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.5" } }, "resolve-cwd": { @@ -13827,7 +16322,7 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "3.0.0" }, "dependencies": { "resolve-from": { @@ -13842,8 +16337,8 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" } }, "resolve-from": { @@ -13856,6 +16351,14 @@ "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-2.2.0.tgz", "integrity": "sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==" }, + "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.2" + } + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -13866,8 +16369,16 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "requires": { + "through": "2.3.8" } }, "ret": { @@ -13880,15 +16391,20 @@ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, + "right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "ripemd160": { @@ -13896,18 +16412,109 @@ "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" + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "robust-compress": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-compress/-/robust-compress-1.0.0.tgz", + "integrity": "sha1-TPYsSzGNgwhRYBK7jBF1Lzkymxs=" + }, + "robust-determinant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/robust-determinant/-/robust-determinant-1.1.0.tgz", + "integrity": "sha1-jsrnm3nKqz509t6+IjflORon6cc=", + "requires": { + "robust-compress": "1.0.0", + "robust-scale": "1.0.2", + "robust-sum": "1.0.0", + "two-product": "1.0.2" + } + }, + "robust-dot-product": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-dot-product/-/robust-dot-product-1.0.0.tgz", + "integrity": "sha1-yboBeL0sMEv9cl9Y6Inx2UYARVM=", + "requires": { + "robust-sum": "1.0.0", + "two-product": "1.0.2" + } + }, + "robust-in-sphere": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/robust-in-sphere/-/robust-in-sphere-1.1.3.tgz", + "integrity": "sha1-HFiD0WpOkjkpR27zSBmFe/Kpz3U=", + "requires": { + "robust-scale": "1.0.2", + "robust-subtract": "1.0.0", + "robust-sum": "1.0.0", + "two-product": "1.0.2" + } + }, + "robust-linear-solve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-linear-solve/-/robust-linear-solve-1.0.0.tgz", + "integrity": "sha1-DNasUEBpGm8qo81jEdcokFyjofE=", + "requires": { + "robust-determinant": "1.1.0" + } + }, + "robust-orientation": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/robust-orientation/-/robust-orientation-1.1.3.tgz", + "integrity": "sha1-2v9bANO+TmByLw6cAVbvln8cIEk=", + "requires": { + "robust-scale": "1.0.2", + "robust-subtract": "1.0.0", + "robust-sum": "1.0.0", + "two-product": "1.0.2" + } + }, + "robust-product": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-product/-/robust-product-1.0.0.tgz", + "integrity": "sha1-aFJQAHzbunzx3nW/9tKScBEJir4=", + "requires": { + "robust-scale": "1.0.2", + "robust-sum": "1.0.0" + } + }, + "robust-scale": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/robust-scale/-/robust-scale-1.0.2.tgz", + "integrity": "sha1-d1Ey7QlULQKOWLLMecBikLz3jDI=", + "requires": { + "two-product": "1.0.2", + "two-sum": "1.0.0" + } + }, + "robust-segment-intersect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/robust-segment-intersect/-/robust-segment-intersect-1.0.1.tgz", + "integrity": "sha1-MlK2oPwboUreaRXMvgnLzpqrHBw=", + "requires": { + "robust-orientation": "1.1.3" } }, + "robust-subtract": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-subtract/-/robust-subtract-1.0.0.tgz", + "integrity": "sha1-4LFk4e2LpOOl3aRaEgODSNvtPpo=" + }, + "robust-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/robust-sum/-/robust-sum-1.0.0.tgz", + "integrity": "sha1-FmRuUlKStNJdgnV6KGlV4Lv6U9k=" + }, "rst-selector-parser": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", "dev": true, "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" + "lodash.flattendeep": "4.4.0", + "nearley": "2.15.1" } }, "run-async": { @@ -13915,9 +16522,14 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "requires": { - "is-promise": "^2.1.0" + "is-promise": "2.1.0" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" + }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", @@ -13928,7 +16540,7 @@ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "requires": { - "rx-lite": "*" + "rx-lite": "4.0.8" } }, "safe-buffer": { @@ -13941,7 +16553,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -13954,13 +16566,13 @@ "resolved": "https://registry.npmjs.org/sane/-/sane-1.6.0.tgz", "integrity": "sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=", "requires": { - "anymatch": "^1.3.0", - "exec-sh": "^0.2.0", - "fb-watchman": "^1.8.0", - "minimatch": "^3.0.2", - "minimist": "^1.1.1", - "walker": "~1.0.5", - "watch": "~0.10.0" + "anymatch": "1.3.2", + "exec-sh": "0.2.1", + "fb-watchman": "1.9.2", + "minimatch": "3.0.4", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.10.0" }, "dependencies": { "bser": { @@ -13968,7 +16580,7 @@ "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", "requires": { - "node-int64": "^0.4.0" + "node-int64": "0.4.0" } }, "fb-watchman": { @@ -13986,21 +16598,26 @@ } } }, + "sane-topojson": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sane-topojson/-/sane-topojson-2.0.0.tgz", + "integrity": "sha1-QOJXNqKMTM6qojP0W7hjc6J4W4Q=" + }, "sanitize-html": { "version": "1.18.5", "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.18.5.tgz", "integrity": "sha512-z0MV+AqOnDZVSQQHr/vwimRykKVyPuGZnjWDzIiV1mdgQEG9HMx9qrEapcOQeUmSsPvHZ04BXTuXQkB/vvbU9A==", "requires": { - "chalk": "^2.3.0", - "htmlparser2": "^3.9.0", - "lodash.clonedeep": "^4.5.0", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.mergewith": "^4.6.0", - "postcss": "^6.0.14", - "srcset": "^1.0.0", - "xtend": "^4.0.0" + "chalk": "2.4.1", + "htmlparser2": "3.9.2", + "lodash.clonedeep": "4.5.0", + "lodash.escaperegexp": "4.1.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mergewith": "4.6.1", + "postcss": "6.0.22", + "srcset": "1.0.0", + "xtend": "4.0.1" }, "dependencies": { "chalk": { @@ -14008,9 +16625,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "domhandler": { @@ -14018,7 +16635,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.0" } }, "htmlparser2": { @@ -14026,12 +16643,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" } } } @@ -14046,7 +16663,7 @@ "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", "requires": { - "object-assign": "^4.1.1" + "object-assign": "4.1.1" } }, "schema-utils": { @@ -14054,9 +16671,14 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "requires": { - "ajv": "^5.0.0" + "ajv": "5.5.2" } }, + "seedrandom": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", + "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==" + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -14080,7 +16702,7 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "requires": { - "semver": "^5.0.3" + "semver": "5.5.0" } }, "send": { @@ -14089,18 +16711,18 @@ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", "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", + "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.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" }, "dependencies": { "mime": { @@ -14115,13 +16737,13 @@ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { - "accepts": "~1.3.4", + "accepts": "1.3.5", "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" + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.18", + "parseurl": "1.3.2" } }, "serve-static": { @@ -14129,9 +16751,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", "send": "0.16.2" } }, @@ -14155,10 +16777,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -14166,7 +16788,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -14186,16 +16808,41 @@ "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" + "inherits": "2.0.3", + "safe-buffer": "5.1.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": "0.2.2", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", "requires": { - "lodash.keys": "^3.1.2" + "lodash.keys": "3.1.2" + } + }, + "sharkdown": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/sharkdown/-/sharkdown-0.1.0.tgz", + "integrity": "sha1-YdT+Up510CRCEnzJI0NiJlCZIU8=", + "requires": { + "cardinal": "0.4.4", + "expect.js": "0.2.0", + "minimist": "0.0.5", + "split": "0.2.10", + "stream-spigot": "2.1.2", + "through": "2.3.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.5", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", + "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=" + } } }, "shebang-command": { @@ -14203,7 +16850,7 @@ "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": "1.0.0" } }, "shebang-regex": { @@ -14216,10 +16863,10 @@ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" } }, "shellwords": { @@ -14232,7 +16879,7 @@ "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.8.6.tgz", "integrity": "sha1-kepO47elRIqspoIKTifmkMatdxw=", "requires": { - "yargs": "^10.0.3" + "yargs": "10.1.2" }, "dependencies": { "ansi-regex": { @@ -14250,9 +16897,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" } }, "os-locale": { @@ -14260,9 +16907,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "strip-ansi": { @@ -14270,7 +16917,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "which-module": { @@ -14283,18 +16930,18 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "8.1.0" } }, "yargs-parser": { @@ -14302,16 +16949,98 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } }, + "shuffle-seed": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/shuffle-seed/-/shuffle-seed-1.1.6.tgz", + "integrity": "sha1-UzwSaDurO0+j6HUfxOViFGdEJgs=", + "requires": { + "seedrandom": "2.4.4" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "signum": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-0.0.0.tgz", + "integrity": "sha1-q1UbEAM1EHCnBHg/GgnF52kfnPY=" + }, + "simplicial-complex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-1.0.0.tgz", + "integrity": "sha1-bDOk7Wn81Nkbe8rdOzC2NoPq4kE=", + "requires": { + "bit-twiddle": "1.0.2", + "union-find": "1.0.2" + } + }, + "simplicial-complex-boundary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simplicial-complex-boundary/-/simplicial-complex-boundary-1.0.1.tgz", + "integrity": "sha1-csn/HiTeqjdMm7L6DL8MCB6++BU=", + "requires": { + "boundary-cells": "2.0.1", + "reduce-simplicial-complex": "1.0.0" + } + }, + "simplicial-complex-contour": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/simplicial-complex-contour/-/simplicial-complex-contour-1.0.2.tgz", + "integrity": "sha1-iQqsrChDZTQBEFRc8mKaJuBL+dE=", + "requires": { + "marching-simplex-table": "1.0.0", + "ndarray": "1.0.18", + "ndarray-sort": "1.0.1", + "typedarray-pool": "1.1.0" + } + }, + "simplify-planar-graph": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/simplify-planar-graph/-/simplify-planar-graph-2.0.1.tgz", + "integrity": "sha1-vIWJNyXzLo+oriVoE5hEbSy892Y=", + "requires": { + "robust-orientation": "1.1.3", + "simplicial-complex": "0.3.3" + }, + "dependencies": { + "bit-twiddle": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-0.0.2.tgz", + "integrity": "sha1-wurruVKjuUrMFASX4c3NLxoz9Y4=" + }, + "simplicial-complex": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/simplicial-complex/-/simplicial-complex-0.3.3.tgz", + "integrity": "sha1-TDDK1X+eRXKd2PMGyHU1efRr6Z4=", + "requires": { + "bit-twiddle": "0.0.2", + "union-find": "0.0.4" + } + }, + "union-find": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/union-find/-/union-find-0.0.4.tgz", + "integrity": "sha1-uFSzMBYZva0USwAUx4+W6sDS8PY=" + } + } + }, + "slab-decomposition": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/slab-decomposition/-/slab-decomposition-1.0.2.tgz", + "integrity": "sha1-He1WdU1AixBznxRRA9/GGAf2UTQ=", + "requires": { + "binary-search-bounds": "1.0.0", + "functional-red-black-tree": "1.0.1", + "robust-orientation": "1.1.3" + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -14322,7 +17051,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "requires": { - "is-fullwidth-code-point": "^2.0.0" + "is-fullwidth-code-point": "2.0.0" } }, "snapdragon": { @@ -14330,14 +17059,14 @@ "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" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" }, "dependencies": { "define-property": { @@ -14345,7 +17074,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -14353,7 +17082,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "source-map": { @@ -14368,9 +17097,9 @@ "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" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -14378,7 +17107,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -14386,7 +17115,7 @@ "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" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -14394,7 +17123,7 @@ "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" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -14402,9 +17131,9 @@ "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" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -14414,7 +17143,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -14422,7 +17151,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -14432,7 +17161,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "requires": { - "hoek": "4.x.x" + "hoek": "4.2.1" } }, "sockjs": { @@ -14440,8 +17169,8 @@ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^2.0.2" + "faye-websocket": "0.10.0", + "uuid": "2.0.3" }, "dependencies": { "faye-websocket": { @@ -14449,7 +17178,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "requires": { - "websocket-driver": ">=0.5.1" + "websocket-driver": "0.7.0" } }, "uuid": { @@ -14464,20 +17193,39 @@ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "requires": { - "debug": "^2.6.6", + "debug": "2.6.9", "eventsource": "0.1.6", - "faye-websocket": "~0.11.0", - "inherits": "^2.0.1", - "json3": "^3.3.2", - "url-parse": "^1.1.8" + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.4.3" } }, + "sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha1-q3md9h/HPqCVbHnEtTHtHp53J+k=" + }, + "sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha1-GYuMDN6wlcRjNBhh45JdTuNZqe4=" + }, "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" + "is-plain-obj": "1.1.0" + } + }, + "sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha1-mODRme3kDgfGGoRAPGHWw7KQ+eI=", + "requires": { + "sort-asc": "0.1.0", + "sort-desc": "0.1.1" } }, "source-list-map": { @@ -14495,11 +17243,11 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-support": { @@ -14507,7 +17255,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -14522,13 +17270,18 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "sourcemap-codec": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==" + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" } }, "spdx-exceptions": { @@ -14541,8 +17294,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" } }, "spdx-license-ids": { @@ -14555,12 +17308,12 @@ "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", - "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", - "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.2", + "select-hose": "2.0.0", + "spdy-transport": "2.1.0" } }, "spdy-transport": { @@ -14568,13 +17321,30 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", - "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "wbuf": "1.7.3" + } + }, + "split": { + "version": "0.2.10", + "resolved": "http://registry.npmjs.org/split/-/split-0.2.10.tgz", + "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", + "requires": { + "through": "2.3.8" + } + }, + "split-polygon": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split-polygon/-/split-polygon-1.0.0.tgz", + "integrity": "sha1-DqzIoTanaxKj2VJW6n2kXbDC0kc=", + "requires": { + "robust-dot-product": "1.0.0", + "robust-sum": "1.0.0" } }, "split-string": { @@ -14582,7 +17352,7 @@ "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" + "extend-shallow": "3.0.2" } }, "sprintf-js": { @@ -14595,8 +17365,8 @@ "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=", "requires": { - "array-uniq": "^1.0.2", - "number-is-nan": "^1.0.0" + "array-uniq": "1.0.3", + "number-is-nan": "1.0.1" } }, "sshpk": { @@ -14604,14 +17374,27 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "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", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, + "static-eval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz", + "integrity": "sha512-6flshd3F1Gwm+Ksxq463LtFd1liC77N/PX1FVVc3OzL3hAmo2fwHFbuArkcfi7s9rTNsLEhcRmXGFZhlgy40uw==", + "requires": { + "escodegen": "1.9.1" } }, "static-extend": { @@ -14619,8 +17402,8 @@ "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" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -14628,7 +17411,140 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" + } + } + } + }, + "static-module": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", + "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", + "requires": { + "concat-stream": "1.6.2", + "duplexer2": "0.0.2", + "escodegen": "1.3.3", + "falafel": "2.1.0", + "has": "1.0.1", + "object-inspect": "0.4.0", + "quote-stream": "0.0.0", + "readable-stream": "1.0.34", + "shallow-copy": "0.0.1", + "static-eval": "0.2.4", + "through2": "0.4.2" + }, + "dependencies": { + "escodegen": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", + "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", + "requires": { + "esprima": "1.1.1", + "estraverse": "1.5.1", + "esutils": "1.0.0", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", + "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "object-inspect": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", + "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "static-eval": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", + "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", + "requires": { + "escodegen": "0.0.28" + }, + "dependencies": { + "escodegen": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", + "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", + "requires": { + "esprima": "1.0.4", + "estraverse": "1.3.2", + "source-map": "0.1.43" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "estraverse": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", + "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "through2": { + "version": "0.4.2", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "2.1.2" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "0.4.0" } } } @@ -14643,8 +17559,8 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "2.0.3", + "readable-stream": "2.3.6" } }, "stream-http": { @@ -14652,11 +17568,47 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", "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" + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "stream-spigot": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/stream-spigot/-/stream-spigot-2.1.2.tgz", + "integrity": "sha1-feFF6Bn43Q20UJDRPc9zqO08wDU=", + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } } }, "string-length": { @@ -14664,7 +17616,15 @@ "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", "requires": { - "strip-ansi": "^3.0.0" + "strip-ansi": "3.0.1" + } + }, + "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-width": { @@ -14672,8 +17632,8 @@ "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" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -14686,17 +17646,27 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } }, + "string.prototype.trim": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", + "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0", + "function-bind": "1.1.1" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "stringstream": { @@ -14709,7 +17679,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -14717,9 +17687,14 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -14730,7 +17705,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "requires": { - "get-stdin": "^4.0.1" + "get-stdin": "4.0.1" } }, "strip-json-comments": { @@ -14738,21 +17713,87 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, + "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": "0.19.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.0.tgz", "integrity": "sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==", "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + } + }, + "supercluster": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-2.3.0.tgz", + "integrity": "sha1-h6tWCBu+qaHXJN9TUe6ejDry9Is=", + "requires": { + "kdbush": "1.0.1" } }, + "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": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" + } + }, + "surface-nets": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/surface-nets/-/surface-nets-1.0.2.tgz", + "integrity": "sha1-5DPIy7qUpydMb0yZVStGG/H8eks=", + "requires": { + "ndarray-extract-contour": "1.0.1", + "triangulate-hypercube": "1.0.1", + "zero-crossings": "1.0.1" + } + }, + "svg-arc-to-cubic-bezier": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.1.2.tgz", + "integrity": "sha512-scEWWUoCDhBtgamRnW8C4b0Va73GdpxwWs01SH/wNsl+al7FHEHsval/ZnutHfzvrNTcn/A3YIsQ1oNULSFS7g==" + }, + "svg-path-bounds": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.1.tgz", + "integrity": "sha1-v0WLeDcmv1NDG0Yz8nkvYHSNn3Q=", + "requires": { + "abs-svg-path": "0.1.1", + "is-svg-path": "1.0.2", + "normalize-svg-path": "1.0.1", + "parse-svg-path": "0.1.2" + }, + "dependencies": { + "normalize-svg-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.0.1.tgz", + "integrity": "sha1-b3Ka1rcLtMpO/y/ksQdInv4dVv4=", + "requires": { + "svg-arc-to-cubic-bezier": "3.1.2" + } + } + } + }, + "svg-path-sdf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.2.tgz", + "integrity": "sha512-dOH+KAAQMPh3phURH1gg4PjulxyuEzGESMjHiy4l4vGCrXpzGemH19e4VUTAXs6ipEUoHsVNdaG0i0CMMdFNVQ==", + "requires": { + "bitmap-sdf": "1.0.3", + "draw-svg-path": "1.0.0", + "is-svg-path": "1.0.2", + "parse-svg-path": "0.1.2", + "svg-path-bounds": "1.0.1" } }, "svgo": { @@ -14760,13 +17801,13 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" } }, "sw-precache": { @@ -14774,16 +17815,16 @@ "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", "requires": { - "dom-urls": "^1.1.0", - "es6-promise": "^4.0.5", - "glob": "^7.1.1", - "lodash.defaults": "^4.2.0", - "lodash.template": "^4.4.0", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "pretty-bytes": "^4.0.2", - "sw-toolbox": "^3.4.0", - "update-notifier": "^2.3.0" + "dom-urls": "1.1.0", + "es6-promise": "4.2.4", + "glob": "7.1.2", + "lodash.defaults": "4.2.0", + "lodash.template": "4.4.0", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "pretty-bytes": "4.0.2", + "sw-toolbox": "3.6.0", + "update-notifier": "2.5.0" } }, "sw-precache-webpack-plugin": { @@ -14791,9 +17832,9 @@ "resolved": "https://registry.npmjs.org/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz", "integrity": "sha1-ppUBflTu1XVVFJOlGdwdqNotxeA=", "requires": { - "del": "^2.2.2", - "sw-precache": "^5.1.1", - "uglify-js": "^3.0.13" + "del": "2.2.2", + "sw-precache": "5.2.1", + "uglify-js": "3.3.24" } }, "sw-toolbox": { @@ -14801,8 +17842,8 @@ "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz", "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=", "requires": { - "path-to-regexp": "^1.0.1", - "serviceworker-cache-polyfill": "^4.0.0" + "path-to-regexp": "1.7.0", + "serviceworker-cache-polyfill": "4.0.0" } }, "symbol-observable": { @@ -14825,12 +17866,12 @@ "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", + "chalk": "2.4.1", + "lodash": "4.17.10", "slice-ansi": "1.0.0", - "string-width": "^2.1.1" + "string-width": "2.1.1" }, "dependencies": { "ajv": { @@ -14838,10 +17879,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "chalk": { @@ -14849,9 +17890,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } }, "fast-deep-equal": { @@ -14871,12 +17912,55 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" }, + "tape": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/tape/-/tape-4.9.1.tgz", + "integrity": "sha512-6fKIXknLpoe/Jp4rzHKFPpJUHDHDqn8jus99IfPnHIjyz78HYlefTGD3b5EkbQzuLfaEvmfPK3IolLgq2xT3kw==", + "requires": { + "deep-equal": "1.0.1", + "defined": "1.0.0", + "for-each": "0.3.3", + "function-bind": "1.1.1", + "glob": "7.1.2", + "has": "1.0.3", + "inherits": "2.0.3", + "minimist": "1.2.0", + "object-inspect": "1.6.0", + "resolve": "1.7.1", + "resumer": "0.0.0", + "string.prototype.trim": "1.1.2", + "through": "2.3.8" + }, + "dependencies": { + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "requires": { + "path-parse": "1.0.5" + } + } + } + }, "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" + "execa": "0.7.0" } }, "test-exclude": { @@ -14884,11 +17968,19 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" + "arrify": "1.0.1", + "micromatch": "3.1.10", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "text-cache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/text-cache/-/text-cache-4.2.0.tgz", + "integrity": "sha512-8+W9fHZYOamWTy0Yb7lxMszOWo6sqUT4XvwrCZfaGxM8C8uzOoTQWXgtr/jDpuwozQhKNS3AxnuIaYc1SvV8vg==", + "requires": { + "vectorize-text": "3.2.0" } }, "text-table": { @@ -14906,6 +17998,38 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "through2": { + "version": "0.6.5", + "resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "thunky": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", @@ -14926,15 +18050,30 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "requires": { - "setimmediate": "^1.0.4" + "setimmediate": "1.0.5" } }, + "tiny-sdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tiny-sdf/-/tiny-sdf-1.0.2.tgz", + "integrity": "sha1-KOdphcRMTlhMS2fY7N2bM6HKwow=" + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, + "tinyqueue": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-1.2.3.tgz", + "integrity": "sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA==" + }, "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" + "os-tmpdir": "1.0.2" } }, "tmpl": { @@ -14952,12 +18091,17 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" }, + "to-float32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.0.1.tgz", + "integrity": "sha512-nOy2WSwae3xhZbc+05xiCuU3ZPPmH0L4Rg4Q1qiOGFSuNSCTB9nVJaGgGl3ZScxAclX/L8hJuDHJGDAzbfuKCQ==" + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -14965,20 +18109,28 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } }, + "to-px": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", + "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", + "requires": { + "parse-unit": "1.0.1" + } + }, "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" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -14986,8 +18138,16 @@ "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" + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "topojson-client": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-2.1.0.tgz", + "integrity": "sha1-/59784mRGF4LQoTCsGroNPDqxsg=", + "requires": { + "commander": "2.15.1" } }, "toposort": { @@ -15000,7 +18160,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" }, "dependencies": { "punycode": { @@ -15015,6 +18175,24 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, + "triangulate-hypercube": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/triangulate-hypercube/-/triangulate-hypercube-1.0.1.tgz", + "integrity": "sha1-2Acdsuv8/VHzCNC88qXEils20Tc=", + "requires": { + "gamma": "0.1.0", + "permutation-parity": "1.0.0", + "permutation-rank": "1.0.0" + } + }, + "triangulate-polyline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/triangulate-polyline/-/triangulate-polyline-1.0.3.tgz", + "integrity": "sha1-v4uod6hQVBA/65+lphtOjXAXgU0=", + "requires": { + "cdt2d": "1.0.0" + } + }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -15040,7 +18218,17 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" + } + }, + "turntable-camera-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", + "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", + "requires": { + "filtered-vector": "1.2.4", + "gl-mat4": "1.2.0", + "gl-vec3": "1.1.3" } }, "tweetnacl": { @@ -15049,12 +18237,22 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, + "two-product": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/two-product/-/two-product-1.0.2.tgz", + "integrity": "sha1-Z9ldSyV6kh4stL16+VEfkIhSLqo=" + }, + "two-sum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/two-sum/-/two-sum-1.0.0.tgz", + "integrity": "sha1-MdPzIjnk9zHsqd+RVeKyl/AIq2Q=" + }, "type-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" + "prelude-ls": "1.1.2" } }, "type-is": { @@ -15063,7 +18261,7 @@ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.18" } }, "typedarray": { @@ -15071,6 +18269,15 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.1.0.tgz", + "integrity": "sha1-0RT0hIAUifU+yrXoCIqiMET0mNk=", + "requires": { + "bit-twiddle": "1.0.2", + "dup": "1.0.0" + } + }, "ua-parser-js": { "version": "0.7.18", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", @@ -15081,8 +18288,8 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.24.tgz", "integrity": "sha512-hS7+TDiqIqvWScCcKRybCQzmMnEzJ4ryl9ErRmW4GFyG48p0/dKZiy/5mVLbsFzU8CCnCgQdxMiJzZythvLzCg==", "requires": { - "commander": "~2.15.0", - "source-map": "~0.6.1" + "commander": "2.15.1", + "source-map": "0.6.1" } }, "uglify-to-browserify": { @@ -15096,9 +18303,9 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" }, "dependencies": { "source-map": { @@ -15111,9 +18318,9 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" } }, "yargs": { @@ -15121,9 +18328,9 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -15140,7 +18347,7 @@ "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", "requires": { - "invariant": "^2.1.0" + "invariant": "2.2.4" } }, "underscore": { @@ -15149,15 +18356,44 @@ "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", "dev": true }, + "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.0.2", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz", + "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==" + }, + "union-find": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/union-find/-/union-find-1.0.2.tgz", + "integrity": "sha1-KSusQV5q06iVNdI3AQ20pTYoTlg=" + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -15165,7 +18401,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -15173,10 +18409,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -15191,7 +18427,7 @@ "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", "requires": { - "macaddress": "^0.2.8" + "macaddress": "0.2.8" } }, "uniqs": { @@ -15204,7 +18440,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "requires": { - "crypto-random-string": "^1.0.0" + "crypto-random-string": "1.0.0" } }, "universalify": { @@ -15217,13 +18453,18 @@ "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" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -15231,9 +18472,9 @@ "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" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -15263,21 +18504,26 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==" }, + "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": "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" + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" }, "dependencies": { "chalk": { @@ -15285,9 +18531,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" } } } @@ -15302,7 +18548,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "urijs": { @@ -15336,9 +18582,9 @@ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "requires": { - "loader-utils": "^1.0.2", - "mime": "^1.4.1", - "schema-utils": "^0.3.0" + "loader-utils": "1.1.0", + "mime": "1.6.0", + "schema-utils": "0.3.0" } }, "url-parse": { @@ -15346,8 +18592,8 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" + "querystringify": "2.0.0", + "requires-port": "1.0.0" }, "dependencies": { "querystringify": { @@ -15362,7 +18608,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "1.0.4" } }, "use": { @@ -15370,7 +18616,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" } }, "util": { @@ -15413,8 +18659,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" } }, "value-equal": { @@ -15427,6 +18673,20 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "vectorize-text": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vectorize-text/-/vectorize-text-3.2.0.tgz", + "integrity": "sha512-N3eldFPkXY7mVK1aBuKPdQKYerBSPEAf+4Tl6DGdnVb1MZ8buD9SKv5TUCyRCEe5KblC56MoJcmf0I/IyGjOGQ==", + "requires": { + "cdt2d": "1.0.0", + "clean-pslg": "1.1.2", + "ndarray": "1.0.18", + "planar-graph-to-polyline": "1.0.5", + "simplify-planar-graph": "2.0.1", + "surface-nets": "1.0.2", + "triangulate-polyline": "1.0.3" + } + }, "velocity-animate": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.1.tgz", @@ -15437,10 +18697,10 @@ "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.4.1.tgz", "integrity": "sha512-ZyXBm+9C/6kNUNyc+aeNKEhtTu/Mn+OfpsNBGuTxU8S2DUcis/KQL0rTN6jWL+7ygdOrun18qhheNZTA7YERmg==", "requires": { - "lodash": "^4.17.5", - "prop-types": "^15.5.8", - "react-transition-group": "^2.0.0", - "velocity-animate": "^1.4.0" + "lodash": "4.17.10", + "prop-types": "15.6.1", + "react-transition-group": "2.3.1", + "velocity-animate": "1.5.1" } }, "vendors": { @@ -15453,11 +18713,16 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -15466,12 +18731,22 @@ "indexof": "0.0.1" } }, + "vt-pbf": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.1.tgz", + "integrity": "sha512-pHjWdrIoxurpmTcbfBWXaPwSmtPAHS105253P1qyEfSTV2HJddqjM+kIHquaT/L6lVJIk9ltTGc0IxR/G47hYA==", + "requires": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "1.3.1", + "pbf": "3.1.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" + "makeerror": "1.0.11" } }, "warning": { @@ -15479,7 +18754,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.3.1" } }, "watch": { @@ -15492,9 +18767,9 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" } }, "wbuf": { @@ -15502,7 +18777,25 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "1.0.1" + } + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "weakmap-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/weakmap-shim/-/weakmap-shim-1.1.1.tgz", + "integrity": "sha1-1lr9eEEJshZuAP9XHDMVDsKkC0k=" + }, + "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.2" } }, "webidl-conversions": { @@ -15515,28 +18808,28 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^5.1.5", - "ajv-keywords": "^2.0.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" + "acorn": "5.5.3", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" }, "dependencies": { "ajv-keywords": { @@ -15554,9 +18847,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" }, "dependencies": { "string-width": { @@ -15564,9 +18857,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -15581,7 +18874,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "load-json-file": { @@ -15589,10 +18882,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" } }, "os-locale": { @@ -15600,9 +18893,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "path-type": { @@ -15610,7 +18903,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" } }, "read-pkg": { @@ -15618,9 +18911,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" } }, "read-pkg-up": { @@ -15628,8 +18921,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "source-map": { @@ -15647,7 +18940,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "which-module": { @@ -15660,19 +18953,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" } }, "yargs-parser": { @@ -15680,7 +18973,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" } } } @@ -15690,11 +18983,11 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" } }, "webpack-dev-server": { @@ -15703,32 +18996,32 @@ "integrity": "sha512-thrqC0EQEoSjXeYgP6pUXcUCZ+LNrKsDPn+mItLnn5VyyNZOJKd06hUP5vqkYwL8nWWXsii0loSF9NHNccT6ow==", "requires": { "ansi-html": "0.0.7", - "array-includes": "^3.0.3", - "bonjour": "^3.5.0", - "chokidar": "^1.6.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.13.3", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.17.4", - "import-local": "^0.1.1", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "1.7.0", + "compression": "1.7.2", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.3", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "import-local": "0.1.1", "internal-ip": "1.2.0", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.1", + "opn": "5.2.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.3", + "serve-index": "1.9.1", "sockjs": "0.3.18", "sockjs-client": "1.1.4", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.1", - "supports-color": "^4.2.1", - "webpack-dev-middleware": "^1.11.0", - "yargs": "^6.6.0" + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "4.5.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" }, "dependencies": { "camelcase": { @@ -15741,15 +19034,15 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.2.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" } }, "cliui": { @@ -15757,9 +19050,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "debug": { @@ -15775,12 +19068,12 @@ "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" } }, "globby": { @@ -15788,11 +19081,11 @@ "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" + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" }, "dependencies": { "pify": { @@ -15812,7 +19105,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "pify": { @@ -15825,9 +19118,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "supports-color": { @@ -15835,7 +19128,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "yargs": { @@ -15843,19 +19136,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^4.2.0" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" } }, "yargs-parser": { @@ -15863,7 +19156,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "requires": { - "camelcase": "^3.0.0" + "camelcase": "3.0.0" } } } @@ -15873,8 +19166,8 @@ "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", "requires": { - "fs-extra": "^0.30.0", - "lodash": ">=3.5 <5" + "fs-extra": "0.30.0", + "lodash": "4.17.10" }, "dependencies": { "fs-extra": { @@ -15882,11 +19175,11 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" } }, "jsonfile": { @@ -15894,7 +19187,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "4.1.11" } } } @@ -15904,8 +19197,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "source-list-map": "2.0.0", + "source-map": "0.6.1" } }, "websocket-driver": { @@ -15913,8 +19206,8 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" + "http-parser-js": "0.4.12", + "websocket-extensions": "0.1.3" } }, "websocket-extensions": { @@ -15922,6 +19215,11 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, + "wgs84": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/wgs84/-/wgs84-0.0.0.tgz", + "integrity": "sha1-NP3FVZF7blfPKigu0ENxDASc3HY=" + }, "whatwg-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz", @@ -15947,8 +19245,8 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "tr46": "0.0.3", + "webidl-conversions": "3.0.1" }, "dependencies": { "webidl-conversions": { @@ -15968,7 +19266,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -15981,7 +19279,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "requires": { - "string-width": "^2.1.1" + "string-width": "2.1.1" } }, "window-size": { @@ -15999,7 +19297,15 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "requires": { - "errno": "~0.1.7" + "errno": "0.1.7" + } + }, + "world-calendars": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", + "integrity": "sha1-slxQMrokEo/8QdCfr0pewbnBQzU=", + "requires": { + "object-assign": "4.1.1" } }, "wrap-ansi": { @@ -16007,8 +19313,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -16016,7 +19322,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -16024,9 +19330,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -16041,7 +19347,7 @@ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { - "mkdirp": "^0.5.1" + "mkdirp": "0.5.1" } }, "write-file-atomic": { @@ -16049,9 +19355,9 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, "xdg-basedir": { @@ -16084,19 +19390,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" }, "dependencies": { "camelcase": { @@ -16109,9 +19415,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" } }, "is-fullwidth-code-point": { @@ -16119,7 +19425,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -16127,9 +19433,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -16139,7 +19445,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "requires": { - "camelcase": "^3.0.0" + "camelcase": "3.0.0" }, "dependencies": { "camelcase": { @@ -16155,11 +19461,11 @@ "integrity": "sha512-Jg8fLV+ax2E5kHtAFAvh/JzMnpgyQykZS1DG8NAqojzsLjfSWKi1fX6VxHkYuQyyqPcH4bvStTBX/aF5CFhv4Q==", "requires": { "@babel/runtime": "7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.10", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.5", - "toposort": "^2.0.2" + "fn-name": "2.0.1", + "lodash": "4.17.10", + "property-expr": "1.5.1", + "synchronous-promise": "2.0.5", + "toposort": "2.0.2" }, "dependencies": { "toposort": { @@ -16168,6 +19474,14 @@ "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=" } } + }, + "zero-crossings": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/zero-crossings/-/zero-crossings-1.0.1.tgz", + "integrity": "sha1-xWK9MRNkPzRDokXRJAa4i2m5qf8=", + "requires": { + "cwise-compiler": "1.1.3" + } } } } diff --git a/mlflow/server/js/package.json b/mlflow/server/js/package.json index 7150a7afe223e..1547138e4cb9f 100644 --- a/mlflow/server/js/package.json +++ b/mlflow/server/js/package.json @@ -10,10 +10,12 @@ "draft-js": "^0.10.5", "file-saver": "1.3.8", "formik": "^1.1.1", + "html-entities": "1.2.1", "immutable": "3.8.1", "jquery": "3.0.0", "json-bigint": "databricks/json-bigint#a1defaf9cd8dd749f0fd4d5f83a22cd846789658", "merge": "1.2.1", + "plotly.js": "1.42.5", "prop-types": "15.6.1", "qs": "6.5.2", "react": "16.5.2", @@ -23,6 +25,7 @@ "react-mde": "5.8.0", "react-modal": "^3.4.4", "react-redux": "5.0.7", + "react-plotly.js": "2.2.0", "react-router": "4.2.0", "react-router-dom": "4.2.2", "react-router-redux": "4.0.8", diff --git a/mlflow/server/js/src/components/App.css b/mlflow/server/js/src/components/App.css index 402f7952a568e..e51509a6c9b8e 100644 --- a/mlflow/server/js/src/components/App.css +++ b/mlflow/server/js/src/components/App.css @@ -190,3 +190,8 @@ img.center { display: block; margin: 0 auto; } + +.plotly-notifier, .plotly-notifier.notifier-note { + font-family: inherit !important; + font-size: 13px !important; +} diff --git a/mlflow/server/js/src/components/CompareRunScatter.css b/mlflow/server/js/src/components/CompareRunScatter.css index 9e46d3e2627e5..17e80f727e886 100644 --- a/mlflow/server/js/src/components/CompareRunScatter.css +++ b/mlflow/server/js/src/components/CompareRunScatter.css @@ -1,44 +1,5 @@ -.scatter-tooltip { - width: 340px; +.scatter-plotly { + width: 100%; + height: 100%; + min-height: 35vw; } - -.scatter-tooltip h3 { - font-size: 105%; - color: #888; -} - -.scatter-tooltip h4 { - font-size: 105%; - color: #888; - margin: 0; -} - -.scatter-tooltip ul { - margin: 0; - padding: 0; -} - -.scatter-tooltip ul li { - display: block; - margin: 0; - padding: 0 0 0 0; - text-indent: 0; -} - -.scatter-tooltip ul li .value { - display: inline-block; - max-width: 100%; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - text-indent: 0; - vertical-align: top; -} - -.recharts-responsive-container { - padding-bottom: 10px; -} - -.recharts-responsive-container svg { - overflow: visible; -} \ No newline at end of file diff --git a/mlflow/server/js/src/components/CompareRunScatter.js b/mlflow/server/js/src/components/CompareRunScatter.js index f19b8994b8918..a9cc409da6517 100644 --- a/mlflow/server/js/src/components/CompareRunScatter.js +++ b/mlflow/server/js/src/components/CompareRunScatter.js @@ -1,4 +1,6 @@ import React, { Component } from 'react'; +import { AllHtmlEntities } from 'html-entities'; +import Plot from 'react-plotly.js'; import PropTypes from 'prop-types'; import { getParams, getRunInfo } from '../reducers/Reducers'; import { connect } from 'react-redux'; @@ -6,16 +8,6 @@ import './CompareRunView.css'; import { RunInfo } from '../sdk/MlflowMessages'; import Utils from '../utils/Utils'; import { getLatestMetrics } from '../reducers/MetricReducer'; -import { - ScatterChart, - Scatter, - XAxis, - YAxis, - CartesianGrid, - Tooltip, - ResponsiveContainer, - Label, -} from 'recharts'; import './CompareRunScatter.css'; import CompareRunUtil from './CompareRunUtil'; @@ -27,13 +19,17 @@ class CompareRunScatter extends Component { runDisplayNames: PropTypes.arrayOf(String).isRequired, }; + // Size limits for displaying keys and values in our plot axes and tooltips + static MAX_PLOT_KEY_LENGTH = 40; + static MAX_PLOT_VALUE_LENGTH = 60; + constructor(props) { super(props); - this.renderTooltip = this.renderTooltip.bind(this); + this.entities = new AllHtmlEntities(); - this.metricKeys = CompareRunUtil.getKeys(this.props.metricLists, true); - this.paramKeys = CompareRunUtil.getKeys(this.props.paramLists, true); + this.metricKeys = CompareRunUtil.getKeys(this.props.metricLists, false); + this.paramKeys = CompareRunUtil.getKeys(this.props.paramLists, false); if (this.paramKeys.length + this.metricKeys.length < 2) { this.state = {disabled: true}; @@ -69,12 +65,23 @@ class CompareRunScatter extends Component { return value === undefined ? value : value.value; } + /** + * Encode HTML entities in a string (since Plotly's tooltips take HTML) + */ + encodeHtml(str) { + return this.entities.encode(str); + } + render() { if (this.state.disabled) { - return
; + return
; } - const scatterData = []; + const keyLength = CompareRunScatter.MAX_PLOT_KEY_LENGTH; + + const xs = []; + const ys = []; + const tooltips = []; this.props.runInfos.forEach((_, index) => { const x = this.getValue(index, this.state.x); @@ -82,7 +89,9 @@ class CompareRunScatter extends Component { if (x === undefined || y === undefined) { return; } - scatterData.push({index, x: +x, y: +y}); + xs.push(x); + ys.push(y); + tooltips.push(this.getPlotlyTooltip(index)); }); return (
@@ -100,43 +109,54 @@ class CompareRunScatter extends Component {
- - - - {this.renderAxisLabel('x')} - - - {this.renderAxisLabel('y')} - - - - - - +
); } - renderAxisLabel(axis) { - const key = this.state[axis]; - return (