mediawiki/extensions/GrowthExperiments (master)

sourcepatches
From 31210f74f3c49489932873b50e3de71ce90e9a44 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 10 May 2021 15:21:18 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* mediawiki/mediawiki-codesniffer: 35.0.0 → 36.0.0
* php-parallel-lint/php-parallel-lint: 1.2.0 → 1.3.0

npm:
* grunt: 1.3.0 → 1.4.0
* lodash: 4.17.19 → 4.17.21
  * https://npmjs.com/advisories/1673 (CVE-2021-23337)
* hosted-git-info: 2.8.8 → 3.0.8
  * https://npmjs.com/advisories/1677 (CVE-2021-23362)
* ua-parser-js: 0.7.21 → 0.7.28
  * https://npmjs.com/advisories/1679 (CVE-2021-27292)

Change-Id: I7d18622df7ce707f26ff3bf5e51b3845195795c7
---
 composer.json                                 |    4 +-
 package-lock.json                             | 1181 ++---------------
 package.json                                  |    2 +-
 .../phpunit/integration/ApiSetMentorTest.php  |    2 +-
 .../phpunit/integration/HomepageHooksTest.php |    4 +-
 .../MentorPageMentorManagerTest.php           |    8 +-
 .../integration/SpecialHomepageTest.php       |    2 +-
 tests/phpunit/unit/AqsEditInfoServiceTest.php |    4 +-
 .../HomepageModules/SuggestedEditsTest.php    |    2 +-
 .../unit/LocalSearchTaskSuggesterTest.php     |    6 +-
 .../unit/PageConfigurationLoaderTest.php      |   12 +-
 tests/phpunit/unit/ProtectionFilterTest.php   |    6 +-
 tests/phpunit/unit/QuestionPosterTest.php     |    6 +-
 .../unit/RemoteSearchTaskSuggesterTest.php    |    8 +-
 .../unit/SearchTaskSuggesterFactoryTest.php   |    4 +-
 .../phpunit/unit/SiteNoticeGeneratorTest.php  |    2 +-
 .../unit/StaticTaskSuggesterFactoryTest.php   |    2 +-
 tests/phpunit/unit/TopicTest.php              |    2 +-
 tests/phpunit/unit/WelcomeSurveyTest.php      |    2 +-
 .../phpunit/unit/WikiPageConfigLoaderTest.php |   16 +-
 20 files changed, 141 insertions(+), 1134 deletions(-)

diff --git a/composer.json b/composer.json
index 17ac315..d9a654b 100644
--- a/composer.json
+++ b/composer.json
@@ -1,10 +1,10 @@
 {
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "35.0.0",
+		"mediawiki/mediawiki-codesniffer": "36.0.0",
 		"mediawiki/mediawiki-phan-config": "0.10.6",
 		"mediawiki/minus-x": "1.1.1",
 		"php-parallel-lint/php-console-highlighter": "0.5.0",
-		"php-parallel-lint/php-parallel-lint": "1.2.0"
+		"php-parallel-lint/php-parallel-lint": "1.3.0"
 	},
 	"scripts": {
 		"fix": [
diff --git a/package-lock.json b/package-lock.json
index b7f7b2b..484809c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1190,24 +1190,6 @@
 				"sprintf-js": "~1.0.2"
 			}
 		},
-		"arr-diff": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-			"integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-			"dev": true
-		},
-		"arr-flatten": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-			"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-			"dev": true
-		},
-		"arr-union": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-			"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-			"dev": true
-		},
 		"array-differ": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
@@ -1232,12 +1214,6 @@
 			"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
 			"dev": true
 		},
-		"array-unique": {
-			"version": "0.3.2",
-			"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-			"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-			"dev": true
-		},
 		"arrify": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
@@ -1265,12 +1241,6 @@
 			"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
 			"dev": true
 		},
-		"assign-symbols": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-			"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-			"dev": true
-		},
 		"ast-metadata-inferer": {
 			"version": "0.4.0",
 			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz",
@@ -1307,12 +1277,6 @@
 			"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
 			"dev": true
 		},
-		"atob": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-			"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-			"dev": true
-		},
 		"autoprefixer": {
 			"version": "9.8.6",
 			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
@@ -1352,61 +1316,6 @@
 			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
 			"dev": true
 		},
-		"base": {
-			"version": "0.11.2",
-			"resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-			"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-			"dev": true,
-			"requires": {
-				"cache-base": "^1.0.1",
-				"class-utils": "^0.3.5",
-				"component-emitter": "^1.2.1",
-				"define-property": "^1.0.0",
-				"isobject": "^3.0.1",
-				"mixin-deep": "^1.2.0",
-				"pascalcase": "^0.1.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-					"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^1.0.0"
-					}
-				},
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
 		"base64-js": {
 			"version": "1.3.1",
 			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@@ -1556,23 +1465,6 @@
 				}
 			}
 		},
-		"cache-base": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-			"integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-			"dev": true,
-			"requires": {
-				"collection-visit": "^1.0.0",
-				"component-emitter": "^1.2.1",
-				"get-value": "^2.0.6",
-				"has-value": "^1.0.0",
-				"isobject": "^3.0.1",
-				"set-value": "^2.0.0",
-				"to-object-path": "^0.3.0",
-				"union-value": "^1.0.0",
-				"unset-value": "^1.0.0"
-			}
-		},
 		"cacheable-lookup": {
 			"version": "5.0.3",
 			"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz",
@@ -1726,29 +1618,6 @@
 				"rimraf": "^3.0.2"
 			}
 		},
-		"class-utils": {
-			"version": "0.3.6",
-			"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-			"integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-			"dev": true,
-			"requires": {
-				"arr-union": "^3.1.0",
-				"define-property": "^0.2.5",
-				"isobject": "^3.0.0",
-				"static-extend": "^0.1.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				}
-			}
-		},
 		"cli-cursor": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -1806,16 +1675,6 @@
 				"mimic-response": "^1.0.0"
 			}
 		},
-		"collection-visit": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-			"integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-			"dev": true,
-			"requires": {
-				"map-visit": "^1.0.0",
-				"object-visit": "^1.0.0"
-			}
-		},
 		"color-convert": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1914,12 +1773,6 @@
 			"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==",
 			"dev": true
 		},
-		"copy-descriptor": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-			"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-			"dev": true
-		},
 		"core-js": {
 			"version": "3.10.1",
 			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz",
@@ -2136,12 +1989,6 @@
 				"map-obj": "^1.0.0"
 			}
 		},
-		"decode-uri-component": {
-			"version": "0.2.0",
-			"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-			"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-			"dev": true
-		},
 		"decompress-response": {
 			"version": "6.0.0",
 			"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@@ -2205,47 +2052,6 @@
 				"object-keys": "^1.0.12"
 			}
 		},
-		"define-property": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-			"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-			"dev": true,
-			"requires": {
-				"is-descriptor": "^1.0.2",
-				"isobject": "^3.0.1"
-			},
-			"dependencies": {
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
 		"delayed-stream": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -3415,41 +3221,6 @@
 			"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
 			"dev": true
 		},
-		"expand-brackets": {
-			"version": "2.1.4",
-			"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-			"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-			"dev": true,
-			"requires": {
-				"debug": "^2.3.3",
-				"define-property": "^0.2.5",
-				"extend-shallow": "^2.0.1",
-				"posix-character-classes": "^0.1.0",
-				"regex-not": "^1.0.0",
-				"snapdragon": "^0.8.1",
-				"to-regex": "^3.0.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				},
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				}
-			}
-		},
 		"expand-tilde": {
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
@@ -3489,27 +3260,6 @@
 			"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
 			"dev": true
 		},
-		"extend-shallow": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-			"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-			"dev": true,
-			"requires": {
-				"assign-symbols": "^1.0.0",
-				"is-extendable": "^1.0.1"
-			},
-			"dependencies": {
-				"is-extendable": {
-					"version": "1.0.1",
-					"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-					"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-					"dev": true,
-					"requires": {
-						"is-plain-object": "^2.0.4"
-					}
-				}
-			}
-		},
 		"external-editor": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -3521,71 +3271,6 @@
 				"tmp": "^0.0.33"
 			}
 		},
-		"extglob": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-			"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-			"dev": true,
-			"requires": {
-				"array-unique": "^0.3.2",
-				"define-property": "^1.0.0",
-				"expand-brackets": "^2.1.4",
-				"extend-shallow": "^2.0.1",
-				"fragment-cache": "^0.2.1",
-				"regex-not": "^1.0.0",
-				"snapdragon": "^0.8.1",
-				"to-regex": "^3.0.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-					"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^1.0.0"
-					}
-				},
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				},
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
 		"extract-zip": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz",
@@ -3844,15 +3529,6 @@
 			"integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==",
 			"dev": true
 		},
-		"fragment-cache": {
-			"version": "0.2.1",
-			"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-			"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-			"dev": true,
-			"requires": {
-				"map-cache": "^0.2.2"
-			}
-		},
 		"fs-constants": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
@@ -3938,16 +3614,10 @@
 				"pump": "^3.0.0"
 			}
 		},
-		"get-value": {
-			"version": "2.0.6",
-			"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-			"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-			"dev": true
-		},
 		"getobject": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
-			"integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.0.tgz",
+			"integrity": "sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==",
 			"dev": true
 		},
 		"getpass": {
@@ -4106,9 +3776,9 @@
 			"dev": true
 		},
 		"grunt": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
-			"integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.0.tgz",
+			"integrity": "sha512-yRFc0GVCDu9yxqOFzpuXQ2pEdgtLDnFv5Qz54jfIcNnpJ8Z7B7P7kPkT4VMuRvm+N+QOsI8C4v/Q0DSaoj3LgQ==",
 			"dev": true,
 			"requires": {
 				"dateformat": "~3.0.3",
@@ -4116,10 +3786,10 @@
 				"exit": "~0.1.2",
 				"findup-sync": "~0.3.0",
 				"glob": "~7.1.6",
-				"grunt-cli": "~1.3.2",
-				"grunt-known-options": "~1.1.0",
+				"grunt-cli": "~1.4.2",
+				"grunt-known-options": "~1.1.1",
 				"grunt-legacy-log": "~3.0.0",
-				"grunt-legacy-util": "~2.0.0",
+				"grunt-legacy-util": "~2.0.1",
 				"iconv-lite": "~0.4.13",
 				"js-yaml": "~3.14.0",
 				"minimatch": "~3.0.4",
@@ -4129,16 +3799,16 @@
 			},
 			"dependencies": {
 				"grunt-cli": {
-					"version": "1.3.2",
-					"resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz",
-					"integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==",
+					"version": "1.4.2",
+					"resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.2.tgz",
+					"integrity": "sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw==",
 					"dev": true,
 					"requires": {
-						"grunt-known-options": "~1.1.0",
+						"grunt-known-options": "~1.1.1",
 						"interpret": "~1.1.0",
-						"liftoff": "~2.5.0",
+						"liftup": "~3.0.1",
 						"nopt": "~4.0.1",
-						"v8flags": "~3.1.1"
+						"v8flags": "~3.2.0"
 					},
 					"dependencies": {
 						"nopt": {
@@ -4154,9 +3824,9 @@
 					}
 				},
 				"js-yaml": {
-					"version": "3.14.0",
-					"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-					"integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+					"version": "3.14.1",
+					"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+					"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
 					"dev": true,
 					"requires": {
 						"argparse": "^1.0.7",
@@ -4216,9 +3886,9 @@
 			},
 			"dependencies": {
 				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+					"version": "4.1.1",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+					"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
 					"dev": true,
 					"requires": {
 						"ansi-styles": "^4.1.0",
@@ -4228,31 +3898,40 @@
 			}
 		},
 		"grunt-legacy-util": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
-			"integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
+			"integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
 			"dev": true,
 			"requires": {
-				"async": "~1.5.2",
-				"exit": "~0.1.1",
-				"getobject": "~0.1.0",
+				"async": "~3.2.0",
+				"exit": "~0.1.2",
+				"getobject": "~1.0.0",
 				"hooker": "~0.2.3",
-				"lodash": "~4.17.20",
+				"lodash": "~4.17.21",
 				"underscore.string": "~3.3.5",
-				"which": "~1.3.0"
+				"which": "~2.0.2"
 			},
 			"dependencies": {
 				"async": {
-					"version": "1.5.2",
-					"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-					"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+					"version": "3.2.0",
+					"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+					"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
 					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 					"dev": true
+				},
+				"which": {
+					"version": "2.0.2",
+					"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+					"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+					"dev": true,
+					"requires": {
+						"isexe": "^2.0.0"
+					}
 				}
 			}
 		},
@@ -4337,64 +4016,6 @@
 			"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
 			"dev": true
 		},
-		"has-value": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-			"integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-			"dev": true,
-			"requires": {
-				"get-value": "^2.0.6",
-				"has-values": "^1.0.0",
-				"isobject": "^3.0.0"
-			}
-		},
-		"has-values": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-			"integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-			"dev": true,
-			"requires": {
-				"is-number": "^3.0.0",
-				"kind-of": "^4.0.0"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"is-number": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-					"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-					"dev": true,
-					"requires": {
-						"kind-of": "^3.0.2"
-					},
-					"dependencies": {
-						"kind-of": {
-							"version": "3.2.2",
-							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-							"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-							"dev": true,
-							"requires": {
-								"is-buffer": "^1.1.5"
-							}
-						}
-					}
-				},
-				"kind-of": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-					"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"he": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -4417,9 +4038,9 @@
 			"dev": true
 		},
 		"hosted-git-info": {
-			"version": "2.8.8",
-			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-			"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+			"version": "2.8.9",
+			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 			"dev": true
 		},
 		"html-tags": {
@@ -4622,32 +4243,6 @@
 				"is-windows": "^1.0.1"
 			}
 		},
-		"is-accessor-descriptor": {
-			"version": "0.1.6",
-			"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-			"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-			"dev": true,
-			"requires": {
-				"kind-of": "^3.0.2"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"is-alphabetical": {
 			"version": "1.0.4",
 			"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
@@ -4691,30 +4286,13 @@
 			"integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
 			"dev": true
 		},
-		"is-data-descriptor": {
-			"version": "0.1.4",
-			"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-			"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+		"is-core-module": {
+			"version": "2.4.0",
+			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+			"integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
 			"dev": true,
 			"requires": {
-				"kind-of": "^3.0.2"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
+				"has": "^1.0.3"
 			}
 		},
 		"is-date-object": {
@@ -4729,37 +4307,12 @@
 			"integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
 			"dev": true
 		},
-		"is-descriptor": {
-			"version": "0.1.6",
-			"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-			"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-			"dev": true,
-			"requires": {
-				"is-accessor-descriptor": "^0.1.6",
-				"is-data-descriptor": "^0.1.4",
-				"kind-of": "^5.0.0"
-			},
-			"dependencies": {
-				"kind-of": {
-					"version": "5.1.0",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-					"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-					"dev": true
-				}
-			}
-		},
 		"is-docker": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
 			"integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==",
 			"dev": true
 		},
-		"is-extendable": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-			"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-			"dev": true
-		},
 		"is-extglob": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -5323,150 +4876,42 @@
 				"type-check": "~0.4.0"
 			}
 		},
-		"liftoff": {
-			"version": "2.5.0",
-			"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
-			"integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+		"liftup": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
+			"integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==",
 			"dev": true,
 			"requires": {
-				"extend": "^3.0.0",
-				"findup-sync": "^2.0.0",
-				"fined": "^1.0.1",
-				"flagged-respawn": "^1.0.0",
+				"extend": "^3.0.2",
+				"findup-sync": "^4.0.0",
+				"fined": "^1.2.0",
+				"flagged-respawn": "^1.0.1",
 				"is-plain-object": "^2.0.4",
-				"object.map": "^1.0.0",
-				"rechoir": "^0.6.2",
-				"resolve": "^1.1.7"
+				"object.map": "^1.0.1",
+				"rechoir": "^0.7.0",
+				"resolve": "^1.19.0"
 			},
 			"dependencies": {
-				"braces": {
-					"version": "2.3.2",
-					"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-					"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-					"dev": true,
-					"requires": {
-						"arr-flatten": "^1.1.0",
-						"array-unique": "^0.3.2",
-						"extend-shallow": "^2.0.1",
-						"fill-range": "^4.0.0",
-						"isobject": "^3.0.1",
-						"repeat-element": "^1.1.2",
-						"snapdragon": "^0.8.1",
-						"snapdragon-node": "^2.0.1",
-						"split-string": "^3.0.2",
-						"to-regex": "^3.0.1"
-					},
-					"dependencies": {
-						"extend-shallow": {
-							"version": "2.0.1",
-							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-							"dev": true,
-							"requires": {
-								"is-extendable": "^0.1.0"
-							}
-						}
-					}
-				},
-				"fill-range": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-					"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-					"dev": true,
-					"requires": {
-						"extend-shallow": "^2.0.1",
-						"is-number": "^3.0.0",
-						"repeat-string": "^1.6.1",
-						"to-regex-range": "^2.1.0"
-					},
-					"dependencies": {
-						"extend-shallow": {
-							"version": "2.0.1",
-							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-							"dev": true,
-							"requires": {
-								"is-extendable": "^0.1.0"
-							}
-						}
-					}
-				},
 				"findup-sync": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
-					"integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
+					"integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
 					"dev": true,
 					"requires": {
 						"detect-file": "^1.0.0",
-						"is-glob": "^3.1.0",
-						"micromatch": "^3.0.4",
+						"is-glob": "^4.0.0",
+						"micromatch": "^4.0.2",
 						"resolve-dir": "^1.0.1"
 					}
 				},
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"is-glob": {
-					"version": "3.1.0",
-					"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-					"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-					"dev": true,
-					"requires": {
-						"is-extglob": "^2.1.0"
-					}
-				},
-				"is-number": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-					"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-					"dev": true,
-					"requires": {
-						"kind-of": "^3.0.2"
-					},
-					"dependencies": {
-						"kind-of": {
-							"version": "3.2.2",
-							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-							"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-							"dev": true,
-							"requires": {
-								"is-buffer": "^1.1.5"
-							}
-						}
-					}
-				},
-				"micromatch": {
-					"version": "3.1.10",
-					"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-					"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+				"resolve": {
+					"version": "1.20.0",
+					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+					"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
 					"dev": true,
 					"requires": {
-						"arr-diff": "^4.0.0",
-						"array-unique": "^0.3.2",
-						"braces": "^2.3.1",
-						"define-property": "^2.0.2",
-						"extend-shallow": "^3.0.2",
-						"extglob": "^2.0.4",
-						"fragment-cache": "^0.2.1",
-						"kind-of": "^6.0.2",
-						"nanomatch": "^1.2.9",
-						"object.pick": "^1.3.0",
-						"regex-not": "^1.0.0",
-						"snapdragon": "^0.8.1",
-						"to-regex": "^3.0.2"
-					}
-				},
-				"to-regex-range": {
-					"version": "2.1.1",
-					"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-					"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-					"dev": true,
-					"requires": {
-						"is-number": "^3.0.0",
-						"repeat-string": "^1.6.1"
+						"is-core-module": "^2.2.0",
+						"path-parse": "^1.0.6"
 					}
 				}
 			}
@@ -5510,9 +4955,9 @@
 			}
 		},
 		"lodash": {
-			"version": "4.17.19",
-			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
-			"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 			"dev": true
 		},
 		"lodash.clonedeep": {
@@ -5732,15 +5177,6 @@
 			"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
 			"dev": true
 		},
-		"map-visit": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-			"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-			"dev": true,
-			"requires": {
-				"object-visit": "^1.0.0"
-			}
-		},
 		"marky": {
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz",
@@ -5816,9 +5252,9 @@
 					}
 				},
 				"hosted-git-info": {
-					"version": "3.0.7",
-					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
-					"integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+					"version": "3.0.8",
+					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz",
+					"integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==",
 					"dev": true,
 					"requires": {
 						"lru-cache": "^6.0.0"
@@ -5883,8 +5319,7 @@
 					"dependencies": {
 						"hosted-git-info": {
 							"version": "2.8.8",
-							"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-							"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+							"resolved": "",
 							"dev": true
 						},
 						"normalize-package-data": {
@@ -6080,27 +5515,6 @@
 				}
 			}
 		},
-		"mixin-deep": {
-			"version": "1.3.2",
-			"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-			"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-			"dev": true,
-			"requires": {
-				"for-in": "^1.0.2",
-				"is-extendable": "^1.0.1"
-			},
-			"dependencies": {
-				"is-extendable": {
-					"version": "1.0.1",
-					"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-					"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-					"dev": true,
-					"requires": {
-						"is-plain-object": "^2.0.4"
-					}
-				}
-			}
-		},
 		"mkdirp": {
 			"version": "0.5.5",
 			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
@@ -6415,25 +5829,6 @@
 			"integrity": "sha512-rndlDjbbHbcV3xi+R2fpJ+PbGMdfBxz5v1fATIQFq0DP64FsicQdwnKLy47K4kZHdRpmQXtz24eGsxQqamzYTA==",
 			"dev": true
 		},
-		"nanomatch": {
-			"version": "1.2.13",
-			"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-			"integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-			"dev": true,
-			"requires": {
-				"arr-diff": "^4.0.0",
-				"array-unique": "^0.3.2",
-				"define-property": "^2.0.2",
-				"extend-shallow": "^3.0.2",
-				"fragment-cache": "^0.2.1",
-				"is-windows": "^1.0.2",
-				"kind-of": "^6.0.2",
-				"object.pick": "^1.3.0",
-				"regex-not": "^1.0.0",
-				"snapdragon": "^0.8.1",
-				"to-regex": "^3.0.1"
-			}
-		},
 		"natural-compare": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -6513,43 +5908,6 @@
 			"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
 			"dev": true
 		},
-		"object-copy": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-			"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-			"dev": true,
-			"requires": {
-				"copy-descriptor": "^0.1.0",
-				"define-property": "^0.2.5",
-				"kind-of": "^3.0.3"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				},
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"object-inspect": {
 			"version": "1.7.0",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
@@ -6562,15 +5920,6 @@
 			"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
 			"dev": true
 		},
-		"object-visit": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-			"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-			"dev": true,
-			"requires": {
-				"isobject": "^3.0.0"
-			}
-		},
 		"object.assign": {
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
@@ -6763,12 +6112,6 @@
 			"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
 			"dev": true
 		},
-		"pascalcase": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-			"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-			"dev": true
-		},
 		"path-exists": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -6864,12 +6207,6 @@
 				"pinkie": "^2.0.0"
 			}
 		},
-		"posix-character-classes": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-			"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-			"dev": true
-		},
 		"postcss": {
 			"version": "7.0.35",
 			"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
@@ -7237,12 +6574,12 @@
 			}
 		},
 		"rechoir": {
-			"version": "0.6.2",
-			"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
-			"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+			"integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
 			"dev": true,
 			"requires": {
-				"resolve": "^1.1.6"
+				"resolve": "^1.9.0"
 			}
 		},
 		"redent": {
@@ -7263,16 +6600,6 @@
 				}
 			}
 		},
-		"regex-not": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-			"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-			"dev": true,
-			"requires": {
-				"extend-shallow": "^3.0.2",
-				"safe-regex": "^1.1.0"
-			}
-		},
 		"regexpp": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
@@ -7314,12 +6641,6 @@
 				"mdast-util-to-markdown": "^0.5.0"
 			}
 		},
-		"repeat-element": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-			"integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-			"dev": true
-		},
 		"repeat-string": {
 			"version": "1.6.1",
 			"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
@@ -7466,12 +6787,6 @@
 			"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
 			"dev": true
 		},
-		"resolve-url": {
-			"version": "0.2.1",
-			"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-			"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-			"dev": true
-		},
 		"responselike": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
@@ -7500,12 +6815,6 @@
 				"signal-exit": "^3.0.2"
 			}
 		},
-		"ret": {
-			"version": "0.1.15",
-			"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-			"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-			"dev": true
-		},
 		"reusify": {
 			"version": "1.0.4",
 			"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -7554,15 +6863,6 @@
 			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
 			"dev": true
 		},
-		"safe-regex": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-			"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-			"dev": true,
-			"requires": {
-				"ret": "~0.1.10"
-			}
-		},
 		"safer-buffer": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -7650,29 +6950,6 @@
 			"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
 			"dev": true
 		},
-		"set-value": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-			"integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-			"dev": true,
-			"requires": {
-				"extend-shallow": "^2.0.1",
-				"is-extendable": "^0.1.1",
-				"is-plain-object": "^2.0.3",
-				"split-string": "^3.0.1"
-			},
-			"dependencies": {
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				}
-			}
-		},
 		"shebang-command": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -7711,150 +6988,12 @@
 				"is-fullwidth-code-point": "^3.0.0"
 			}
 		},
-		"snapdragon": {
-			"version": "0.8.2",
-			"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-			"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-			"dev": true,
-			"requires": {
-				"base": "^0.11.1",
-				"debug": "^2.2.0",
-				"define-property": "^0.2.5",
-				"extend-shallow": "^2.0.1",
-				"map-cache": "^0.2.2",
-				"source-map": "^0.5.6",
-				"source-map-resolve": "^0.5.0",
-				"use": "^3.1.0"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				},
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				},
-				"source-map": {
-					"version": "0.5.7",
-					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-					"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-					"dev": true
-				}
-			}
-		},
-		"snapdragon-node": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-			"integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-			"dev": true,
-			"requires": {
-				"define-property": "^1.0.0",
-				"isobject": "^3.0.0",
-				"snapdragon-util": "^3.0.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-					"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^1.0.0"
-					}
-				},
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
-		"snapdragon-util": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-			"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-			"dev": true,
-			"requires": {
-				"kind-of": "^3.2.0"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"source-map": {
 			"version": "0.5.7",
 			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
 			"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
 			"dev": true
 		},
-		"source-map-resolve": {
-			"version": "0.5.3",
-			"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-			"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-			"dev": true,
-			"requires": {
-				"atob": "^2.1.2",
-				"decode-uri-component": "^0.2.0",
-				"resolve-url": "^0.2.1",
-				"source-map-url": "^0.4.0",
-				"urix": "^0.1.0"
-			}
-		},
-		"source-map-url": {
-			"version": "0.4.0",
-			"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-			"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-			"dev": true
-		},
 		"spdx-correct": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -7893,15 +7032,6 @@
 			"integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
 			"dev": true
 		},
-		"split-string": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-			"integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-			"dev": true,
-			"requires": {
-				"extend-shallow": "^3.0.0"
-			}
-		},
 		"split2": {
 			"version": "0.2.1",
 			"resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
@@ -7976,27 +7106,6 @@
 			"integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
 			"dev": true
 		},
-		"static-extend": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-			"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-			"dev": true,
-			"requires": {
-				"define-property": "^0.2.5",
-				"object-copy": "^0.1.0"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				}
-			}
-		},
 		"stream-buffers": {
 			"version": "3.0.2",
 			"resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz",
@@ -8239,9 +7348,9 @@
 					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 					"dev": true
 				},
 				"log-symbols": {
@@ -8513,44 +7622,6 @@
 			"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
 			"dev": true
 		},
-		"to-object-path": {
-			"version": "0.3.0",
-			"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-			"integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-			"dev": true,
-			"requires": {
-				"kind-of": "^3.0.2"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
-		"to-regex": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-			"integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-			"dev": true,
-			"requires": {
-				"define-property": "^2.0.2",
-				"extend-shallow": "^3.0.2",
-				"regex-not": "^1.0.2",
-				"safe-regex": "^1.1.0"
-			}
-		},
 		"to-regex-range": {
 			"version": "5.0.1",
 			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -8634,9 +7705,9 @@
 			}
 		},
 		"ua-parser-js": {
-			"version": "0.7.21",
-			"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
-			"integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
+			"version": "0.7.28",
+			"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz",
+			"integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==",
 			"dev": true
 		},
 		"unbzip2-stream": {
@@ -8679,18 +7750,6 @@
 				"vfile": "^4.0.0"
 			}
 		},
-		"union-value": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-			"integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-			"dev": true,
-			"requires": {
-				"arr-union": "^3.1.0",
-				"get-value": "^2.0.6",
-				"is-extendable": "^0.1.1",
-				"set-value": "^2.0.1"
-			}
-		},
 		"uniq": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
@@ -8727,46 +7786,6 @@
 			"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
 			"dev": true
 		},
-		"unset-value": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-			"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-			"dev": true,
-			"requires": {
-				"has-value": "^0.3.1",
-				"isobject": "^3.0.0"
-			},
-			"dependencies": {
-				"has-value": {
-					"version": "0.3.1",
-					"resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-					"integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-					"dev": true,
-					"requires": {
-						"get-value": "^2.0.3",
-						"has-values": "^0.1.4",
-						"isobject": "^2.0.0"
-					},
-					"dependencies": {
-						"isobject": {
-							"version": "2.1.0",
-							"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-							"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-							"dev": true,
-							"requires": {
-								"isarray": "1.0.0"
-							}
-						}
-					}
-				},
-				"has-values": {
-					"version": "0.1.4",
-					"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-					"integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-					"dev": true
-				}
-			}
-		},
 		"upath": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
@@ -8782,18 +7801,6 @@
 				"punycode": "^2.1.0"
 			}
 		},
-		"urix": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-			"integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-			"dev": true
-		},
-		"use": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-			"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-			"dev": true
-		},
 		"util-deprecate": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -8813,9 +7820,9 @@
 			"dev": true
 		},
 		"v8flags": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
-			"integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
+			"integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
 			"dev": true,
 			"requires": {
 				"homedir-polyfill": "^1.0.1"
diff --git a/package.json b/package.json
index 4c99ad8..b2ee310 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
 		"@wdio/sync": "6.1.14",
 		"api-testing": "^1.3.0",
 		"eslint-config-wikimedia": "0.20.0",
-		"grunt": "1.3.0",
+		"grunt": "1.4.0",
 		"grunt-banana-checker": "0.9.0",
 		"grunt-eslint": "23.0.0",
 		"grunt-stylelint": "0.16.0",
diff --git a/tests/phpunit/integration/ApiSetMentorTest.php b/tests/phpunit/integration/ApiSetMentorTest.php
index fedeb5b..18557c2 100644
--- a/tests/phpunit/integration/ApiSetMentorTest.php
+++ b/tests/phpunit/integration/ApiSetMentorTest.php
@@ -152,7 +152,7 @@ class ApiSetMentorTest extends ApiTestCase {
 					->getMock(),
 				false
 			] )
-			->setMethods( [ 'setMentorForUser' ] )
+			->onlyMethods( [ 'setMentorForUser' ] )
 			->getMock();
 	}
 
diff --git a/tests/phpunit/integration/HomepageHooksTest.php b/tests/phpunit/integration/HomepageHooksTest.php
index 124f97a..7f5c07c 100644
--- a/tests/phpunit/integration/HomepageHooksTest.php
+++ b/tests/phpunit/integration/HomepageHooksTest.php
@@ -37,7 +37,7 @@ class HomepageHooksTest extends MediaWikiIntegrationTestCase {
 	 */
 	public function testGetTaskTypesJson() {
 		$configurationLoader = $this->getMockBuilder( ConfigurationLoader::class )
-			->setMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
+			->onlyMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
 			->getMockForAbstractClass();
 		$configurationLoader->method( 'loadTaskTypes' )
 			->willReturn( [
@@ -56,7 +56,7 @@ class HomepageHooksTest extends MediaWikiIntegrationTestCase {
 	 */
 	public function testGetTaskTypesJson_error() {
 		$configurationLoader = $this->getMockBuilder( ConfigurationLoader::class )
-			->setMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
+			->onlyMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
 			->getMockForAbstractClass();
 		$configurationLoader->method( 'loadTaskTypes' )
 			->willReturn( StatusValue::newFatal( new RawMessage( 'foo' ) ) );
diff --git a/tests/phpunit/integration/MentorPageMentorManagerTest.php b/tests/phpunit/integration/MentorPageMentorManagerTest.php
index b861f78..f59fd2e 100644
--- a/tests/phpunit/integration/MentorPageMentorManagerTest.php
+++ b/tests/phpunit/integration/MentorPageMentorManagerTest.php
@@ -253,20 +253,20 @@ class MentorPageMentorManagerTest extends MediaWikiTestCase {
 	private function getMockWikiPageFactory( array $pages ) {
 		$wikiPageFactory = $this->getMockBuilder( WikiPageFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromTitle' ] )
+			->onlyMethods( [ 'newFromTitle' ] )
 			->getMock();
 		$wikiPageFactory->method( 'newFromTitle' )->willReturnCallback(
 			function ( Title $title ) use ( $pages ) {
 				[ $text, $mentors ] = $pages[$title->getPrefixedText()];
 				$wikiPage = $this->getMockBuilder( WikiPage::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'getContent', 'getParserOutput' ] )
+					->onlyMethods( [ 'getContent', 'getParserOutput' ] )
 					->getMock();
 				$content = $this->getMockBuilder( Content::class )
-					->setMethods( [ 'getText' ] )
+					->onlyMethods( [ 'getText' ] )
 					->getMockForAbstractClass();
 				$parserOutput = $this->getMockBuilder( ParserOutput::class )
-					->setMethods( [ 'getLinks' ] )
+					->onlyMethods( [ 'getLinks' ] )
 					->getMock();
 				$wikiPage->method( 'getContent' )->willReturn( $content );
 				$content->method( 'getText' )->willReturn( $text );
diff --git a/tests/phpunit/integration/SpecialHomepageTest.php b/tests/phpunit/integration/SpecialHomepageTest.php
index 7590a8f..3f776d1 100644
--- a/tests/phpunit/integration/SpecialHomepageTest.php
+++ b/tests/phpunit/integration/SpecialHomepageTest.php
@@ -147,7 +147,7 @@ class SpecialHomepageTest extends SpecialPageTestBase {
 	private function getContextForUserId( int $id ) {
 		$context = $this->getMockBuilder( RequestContext::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getConfig', 'getUser' ] )
+			->onlyMethods( [ 'getConfig', 'getUser' ] )
 			->getMock();
 		$config = new HashConfig( [ 'SecretKey' => '42' ] );
 		$context->method( 'getConfig' )->willReturn( $config );
diff --git a/tests/phpunit/unit/AqsEditInfoServiceTest.php b/tests/phpunit/unit/AqsEditInfoServiceTest.php
index c225996..f0f365d 100644
--- a/tests/phpunit/unit/AqsEditInfoServiceTest.php
+++ b/tests/phpunit/unit/AqsEditInfoServiceTest.php
@@ -68,14 +68,14 @@ class AqsEditInfoServiceTest extends MediaWikiUnitTestCase {
 
 		$request = $this->getMockBuilder( MWHttpRequest::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'execute', 'getContent' ] )
+			->onlyMethods( [ 'execute', 'getContent' ] )
 			->getMock();
 		$request->method( 'execute' )->willReturn( $result );
 		$request->method( 'getContent' )->willReturn( $content );
 
 		$requestFactory = $this->getMockBuilder( HttpRequestFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create', 'getUserAgent' ] )
+			->onlyMethods( [ 'create', 'getUserAgent' ] )
 			->getMock();
 		$requestFactory->method( 'getUserAgent' )->willReturn( 'Foo' );
 		$requestFactory->expects( $this->once() )
diff --git a/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php b/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php
index e0e1482..9080ae9 100644
--- a/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php
+++ b/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php
@@ -72,7 +72,7 @@ class SuggestedEditsTest extends \MediaWikiUnitTestCase {
 			->willReturn( true );
 		$requestMock = $this->getMockBuilder( WebRequest::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getCheck' ] )
+			->onlyMethods( [ 'getCheck' ] )
 			->getMock();
 		$requestMock->method( 'getCheck' )
 			->with( 'resetTaskCache' )
diff --git a/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php b/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php
index 8a91b82..23b2cef 100644
--- a/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php
+++ b/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php
@@ -127,7 +127,7 @@ class LocalSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	 */
 	private function getMockSearchResultSet() {
 		return $this->getMockBuilder( ISearchResultSet::class )
-			->setMethods( [] )
+			->onlyMethods( [] )
 			->getMockForAbstractClass();
 	}
 
@@ -143,12 +143,12 @@ class LocalSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	) {
 		$factory = $this->getMockBuilder( SearchEngineFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create' ] )
+			->onlyMethods( [ 'create' ] )
 			->getMockForAbstractClass();
 
 		$searchEngine = $this->getMockBuilder( SearchEngine::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'setLimitOffset', 'setNamespaces', 'setShowSuggestion', 'getValidSorts',
+			->onlyMethods( [ 'setLimitOffset', 'setNamespaces', 'setShowSuggestion', 'getValidSorts',
 				'setSort', 'searchText' ] )
 			->getMockForAbstractClass();
 		$factory->expects( $this->once() )
diff --git a/tests/phpunit/unit/PageConfigurationLoaderTest.php b/tests/phpunit/unit/PageConfigurationLoaderTest.php
index d2df0c1..2597bf8 100644
--- a/tests/phpunit/unit/PageConfigurationLoaderTest.php
+++ b/tests/phpunit/unit/PageConfigurationLoaderTest.php
@@ -502,7 +502,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitleFactory( array $map, bool $allowOther = true ) {
 		$titleFactory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromText' ] )
+			->onlyMethods( [ 'newFromText' ] )
 			->getMock();
 		$titleFactory->method( 'newFromText' )->willReturnCallback(
 			function ( string $titleText, int $defaultNamespace = 0 ) use ( $map, $allowOther ) {
@@ -527,7 +527,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitle( string $titleText, int $namespace = 0 ) {
 		$title = $this->getMockBuilder( Title::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getNamespace', 'inNamespace', 'getDBkey' ] )
+			->onlyMethods( [ 'getNamespace', 'inNamespace', 'getDBkey' ] )
 			->getMock();
 		$title->method( 'getNamespace' )->willReturn( $namespace );
 		$title->method( 'inNamespace' )->willReturnCallback(
@@ -544,7 +544,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	 */
 	protected function getMockMessageLocalizer( array $customMessages = [] ) {
 		$localizer = $this->getMockBuilder( MessageLocalizer::class )
-			->setMethods( [ 'msg' ] )
+			->onlyMethods( [ 'msg' ] )
 			->getMockForAbstractClass();
 		$localizer->method( 'msg' )
 			->willReturnCallback( function ( $key, ...$params ) use ( $customMessages ) {
@@ -564,7 +564,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockWikiPageConfigLoader( $map ) {
 		$loader = $this->getMockBuilder( WikiPageConfigLoader::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'load' ] )
+			->onlyMethods( [ 'load' ] )
 			->getMock();
 		$loader->expects( $this->atMost( 1 ) )
 			->method( 'load' )
@@ -582,7 +582,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	 */
 	protected function getMockContext( array $customMessages = [] ) {
 		$context = $this->getMockBuilder( IContextSource::class )
-			->setMethods( [ 'msg' ] )
+			->onlyMethods( [ 'msg' ] )
 			->getMockForAbstractClass();
 		$context->method( 'msg' )->willReturnCallback( function ( $key ) use ( $customMessages ) {
 			if ( isset( $customMessages[$key] ) ) {
@@ -599,7 +599,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockCollation() {
 		$collation = $this->getMockBuilder( Collation::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getSortKey' ] )
+			->onlyMethods( [ 'getSortKey' ] )
 			->getMockForAbstractClass();
 		$collation->method( 'getSortKey' )->willReturnArgument( 0 );
 		return $collation;
diff --git a/tests/phpunit/unit/ProtectionFilterTest.php b/tests/phpunit/unit/ProtectionFilterTest.php
index 1f07714..7f3f037 100644
--- a/tests/phpunit/unit/ProtectionFilterTest.php
+++ b/tests/phpunit/unit/ProtectionFilterTest.php
@@ -70,7 +70,7 @@ class ProtectionFilterTest extends MediaWikiUnitTestCase {
 	private function getMockTitleFactory( array $map ) {
 		$factory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromLinkTarget' ] )
+			->onlyMethods( [ 'newFromLinkTarget' ] )
 			->getMock();
 		$factory->method( 'newFromLinkTarget' )->willReturnCallback(
 			function ( LinkTarget $target ) use ( $map ) {
@@ -78,7 +78,7 @@ class ProtectionFilterTest extends MediaWikiUnitTestCase {
 				$data = $map[$target->getNamespace() . ':' . $target->getDBkey()];
 				$title = $this->getMockBuilder( Title::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'exists', 'isProtected' ] )
+					->onlyMethods( [ 'exists', 'isProtected' ] )
 					->getMock();
 				$title->method( 'exists' )->willReturn( $data[0] );
 				$title->method( 'isProtected' )->willReturn( $data[1] );
@@ -93,7 +93,7 @@ class ProtectionFilterTest extends MediaWikiUnitTestCase {
 	protected function getMockLinkBatchFactory() {
 		return $this->getMockBuilder( LinkBatchFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newLinkBatch' ] )
+			->onlyMethods( [ 'newLinkBatch' ] )
 			->getMock();
 	}
 
diff --git a/tests/phpunit/unit/QuestionPosterTest.php b/tests/phpunit/unit/QuestionPosterTest.php
index 722fda5..ac91f2d 100644
--- a/tests/phpunit/unit/QuestionPosterTest.php
+++ b/tests/phpunit/unit/QuestionPosterTest.php
@@ -23,7 +23,7 @@ class QuestionPosterTest extends MediaWikiUnitTestCase {
 	private function getQuestionPoster( $methods ) {
 		$questionPoster = $this->getMockBuilder( QuestionPoster::class )
 			->disableOriginalConstructor()
-			->setMethods( $methods )
+			->onlyMethods( $methods )
 			->getMockForAbstractClass();
 		$accessWrapper = TestingAccessWrapper::newFromObject( $questionPoster );
 
@@ -94,11 +94,11 @@ class QuestionPosterTest extends MediaWikiUnitTestCase {
 		$questionPoster->method( 'getTargetContentModel' )->willReturn( CONTENT_MODEL_WIKITEXT );
 		$pageUpdaterMock = $this->getMockBuilder( PageUpdater::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'grabParentRevision' ] )
+			->onlyMethods( [ 'grabParentRevision' ] )
 			->getMock();
 		$revisionRecordMock = $this->getMockBuilder( RevisionRecord::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getId' ] )
+			->onlyMethods( [ 'getId' ] )
 			->getMockForAbstractClass();
 		$revisionRecordMock->method( 'getId' )
 			->willReturn( 0 );
diff --git a/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php b/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php
index 3bab689..3f44ae7 100644
--- a/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php
+++ b/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php
@@ -658,7 +658,7 @@ class RemoteSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	protected function getMockRequestFactory( array $requests ) {
 		$requestFactory = $this->getMockBuilder( HttpRequestFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create', 'getUserAgent' ] )
+			->onlyMethods( [ 'create', 'getUserAgent' ] )
 			->getMock();
 		$requestFactory->method( 'getUserAgent' )->willReturn( 'Foo' );
 
@@ -696,7 +696,7 @@ class RemoteSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 
 				$request = $this->getMockBuilder( MWHttpRequest::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'execute', 'getContent' ] )
+					->onlyMethods( [ 'execute', 'getContent' ] )
 					->getMock();
 				$request->method( 'execute' )->willReturn( $status );
 				$request->method( 'getContent' )->willReturn( $response );
@@ -711,12 +711,12 @@ class RemoteSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	protected function getMockTitleFactory() {
 		$titleFactory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromText' ] )
+			->onlyMethods( [ 'newFromText' ] )
 			->getMock();
 		$titleFactory->method( 'newFromText' )->willReturnCallback( function ( $dbKey, $ns ) {
 			$title = $this->getMockBuilder( Title::class )
 				->disableOriginalConstructor()
-				->setMethods( [ 'getNamespace', 'getDBkey' ] )
+				->onlyMethods( [ 'getNamespace', 'getDBkey' ] )
 				->getMock();
 			$title->method( 'getNamespace' )->willReturn( $ns );
 			$title->method( 'getDBkey' )->willReturn( $dbKey );
diff --git a/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php b/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php
index f50286e..19d8347 100644
--- a/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php
+++ b/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php
@@ -18,7 +18,7 @@ abstract class SearchTaskSuggesterFactoryTest extends MediaWikiUnitTestCase {
 	public function provideCreate() {
 		$error = $this->getMockBuilder( Status::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getWikiText' ] )
+			->onlyMethods( [ 'getWikiText' ] )
 			->getMock();
 		$error->method( 'getWikiText' )->willReturn( 'foo' );
 		return [
@@ -52,7 +52,7 @@ abstract class SearchTaskSuggesterFactoryTest extends MediaWikiUnitTestCase {
 	protected function getNewcomerTasksConfigurationLoader( $taskTypes, $topics ) {
 		$configurationLoader = $this->getMockBuilder( ConfigurationLoader::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'loadTaskTypes', 'loadTopics', 'setMessageLocalizer' ] )
+			->onlyMethods( [ 'loadTaskTypes', 'loadTopics', 'setMessageLocalizer' ] )
 			->getMockForAbstractClass();
 		$configurationLoader->method( 'loadTaskTypes' )->willReturn( $taskTypes );
 		$configurationLoader->method( 'loadTopics' )->willReturn( $topics );
diff --git a/tests/phpunit/unit/SiteNoticeGeneratorTest.php b/tests/phpunit/unit/SiteNoticeGeneratorTest.php
index 7a6b57d..f2abb9b 100644
--- a/tests/phpunit/unit/SiteNoticeGeneratorTest.php
+++ b/tests/phpunit/unit/SiteNoticeGeneratorTest.php
@@ -311,7 +311,7 @@ class SiteNoticeGeneratorTest extends MediaWikiUnitTestCase {
 
 		$userMock = $this->getMockBuilder( \User::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getId', 'getName', 'getOption' ] )
+			->onlyMethods( [ 'getId', 'getName', 'getOption' ] )
 			->getMock();
 		// This will make user settings update job fail, but we don't care about that.
 		$userMock->method( 'getId' )
diff --git a/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php b/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php
index 5f6521e..e58ac4e 100644
--- a/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php
+++ b/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php
@@ -33,7 +33,7 @@ class StaticTaskSuggesterFactoryTest extends MediaWikiUnitTestCase {
 
 		$error = $this->getMockBuilder( Status::class )
 			->setConstructorArgs( [] )
-			->setMethods( [ 'getWikiText' ] )
+			->onlyMethods( [ 'getWikiText' ] )
 			->getMock();
 		// avoid triggering service loading when the factory tries to log the error
 		$error->method( 'getWikiText' )->willReturn( 'Test error' );
diff --git a/tests/phpunit/unit/TopicTest.php b/tests/phpunit/unit/TopicTest.php
index a70e36f..bbadf16 100644
--- a/tests/phpunit/unit/TopicTest.php
+++ b/tests/phpunit/unit/TopicTest.php
@@ -14,7 +14,7 @@ class TopicTest extends MediaWikiUnitTestCase {
 
 	public function testTopic() {
 		$fakeContext = $this->getMockBuilder( MessageLocalizer::class )
-			->setMethods( [ 'msg' ] )
+			->onlyMethods( [ 'msg' ] )
 			->getMockForAbstractClass();
 		$fakeContext->method( 'msg' )->willReturnCallback( function ( $id ) {
 			return $this->getMockMessage( $id );
diff --git a/tests/phpunit/unit/WelcomeSurveyTest.php b/tests/phpunit/unit/WelcomeSurveyTest.php
index dbabbd2..4ae7d2f 100644
--- a/tests/phpunit/unit/WelcomeSurveyTest.php
+++ b/tests/phpunit/unit/WelcomeSurveyTest.php
@@ -21,7 +21,7 @@ class WelcomeSurveyTest extends MediaWikiUnitTestCase {
 	public function testConstruct() {
 		$configMock = $this->getMockBuilder( Config::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'get', 'has' ] )
+			->onlyMethods( [ 'get', 'has' ] )
 			->getMock();
 		$contextMock = $this->getMockBuilder( RequestContext::class )
 			->disableOriginalConstructor()
diff --git a/tests/phpunit/unit/WikiPageConfigLoaderTest.php b/tests/phpunit/unit/WikiPageConfigLoaderTest.php
index 20bfa3e..258d28d 100644
--- a/tests/phpunit/unit/WikiPageConfigLoaderTest.php
+++ b/tests/phpunit/unit/WikiPageConfigLoaderTest.php
@@ -159,7 +159,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	public function testSetCache() {
 		$cache = $this->getMockBuilder( BagOStuff::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'get' ] )
+			->onlyMethods( [ 'get' ] )
 			->getMockForAbstractClass();
 		$cache->expects( $this->once() )
 			->method( 'get' )
@@ -192,7 +192,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitle( $url, $titleText, $isExternal = true ) {
 		$title = $this->getMockBuilder( Title::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getFullURL', 'getNamespace', 'getDBKey', 'isExternal' ] )
+			->onlyMethods( [ 'getFullURL', 'getNamespace', 'getDBKey', 'isExternal' ] )
 			->getMock();
 		$title->method( 'isExternal' )->willReturn( $isExternal );
 		$title->method( 'getFullURL' )->willReturn( $url );
@@ -216,14 +216,14 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 
 		$request = $this->getMockBuilder( MWHttpRequest::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'execute', 'getContent' ] )
+			->onlyMethods( [ 'execute', 'getContent' ] )
 			->getMock();
 		$request->method( 'execute' )->willReturn( $result );
 		$request->method( 'getContent' )->willReturn( $content );
 
 		$requestFactory = $this->getMockBuilder( HttpRequestFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create', 'getUserAgent' ] )
+			->onlyMethods( [ 'create', 'getUserAgent' ] )
 			->getMock();
 		$requestFactory->method( 'getUserAgent' )->willReturn( 'Foo' );
 		$requestFactory->expects( $this->exactly( $invokeCount ) )
@@ -243,7 +243,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockRevisionLookup( LinkTarget $expectedTitle, $content, $invokeCount = 1 ) {
 		$revisionLookup = $this->getMockBuilder( RevisionLookup::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getRevisionByTitle' ] )
+			->onlyMethods( [ 'getRevisionByTitle' ] )
 			->getMockForAbstractClass();
 		$revisionLookup->expects( $this->exactly( $invokeCount ) )
 			->method( 'getRevisionByTitle' )
@@ -256,7 +256,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 				}
 				$revision = $this->getMockBuilder( RevisionRecord::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'getContent' ] )
+					->onlyMethods( [ 'getContent' ] )
 					->getMockForAbstractClass();
 				$revision->expects( $this->once() )
 					->method( 'getContent' )
@@ -276,11 +276,11 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitleFactory( $fullUrl, $localUrl, $isExternal ) {
 		$titleFactory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromLinkTarget', 'makeTitle' ] )
+			->onlyMethods( [ 'newFromLinkTarget', 'makeTitle' ] )
 			->getMock();
 		$title = $this->getMockBuilder( Title::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getFullURL', 'getLocalURL', 'isExternal' ] )
+			->onlyMethods( [ 'getFullURL', 'getLocalURL', 'isExternal' ] )
 			->getMock();
 		$titleFactory->method( 'newFromLinkTarget' )
 			->willReturn( $title );
-- 
2.20.1

$ date
Mon May 10 15:16:09 UTC 2021

$ git clone file:///srv/git/mediawiki-extensions-GrowthExperiments.git repo --depth=1 -b master
Cloning into 'repo'...

$ git config user.name libraryupgrader

$ git config user.email tools.libraryupgrader@tools.wmflabs.org

$ git submodule update --init

$ grr init
Installed commit-msg hook.

$ git show-ref refs/heads/master
2765eb18e98cd1f8531ac251758196e5b7c0113b refs/heads/master

$ composer install
Loading composer repositories with package information
Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2
Updating dependencies (including require-dev)
Package operations: 31 installs, 0 updates, 0 removals
  - Installing squizlabs/php_codesniffer (3.5.8): Loading from cache
  - Installing composer/spdx-licenses (1.5.5): Loading from cache
  - Installing composer/semver (3.2.4): Loading from cache
  - Installing mediawiki/mediawiki-codesniffer (v35.0.0): Loading from cache
  - Installing symfony/polyfill-php80 (v1.22.1): Loading from cache
  - Installing symfony/polyfill-mbstring (v1.22.1): Loading from cache
  - Installing symfony/polyfill-intl-normalizer (v1.22.1): Loading from cache
  - Installing symfony/polyfill-intl-grapheme (v1.22.1): Loading from cache
  - Installing symfony/polyfill-ctype (v1.22.1): Loading from cache
  - Installing symfony/string (v5.2.6): Loading from cache
  - Installing psr/container (1.1.1): Loading from cache
  - Installing symfony/service-contracts (v2.4.0): Loading from cache
  - Installing symfony/polyfill-php73 (v1.22.1): Loading from cache
  - Installing symfony/console (v5.2.7): Loading from cache
  - Installing psr/log (1.1.4): Loading from cache
  - Installing sabre/event (5.1.2): Loading from cache
  - Installing netresearch/jsonmapper (v2.1.0): Loading from cache
  - Installing microsoft/tolerant-php-parser (v0.0.23): Loading from cache
  - Installing phpdocumentor/reflection-common (2.2.0): Loading from cache
  - Installing webmozart/assert (1.10.0): Loading from cache
  - Installing phpdocumentor/type-resolver (1.4.0): Loading from cache
  - Installing phpdocumentor/reflection-docblock (5.2.2): Loading from cache
  - Installing felixfbecker/advanced-json-rpc (v3.2.0): Loading from cache
  - Installing composer/xdebug-handler (1.4.6): Loading from cache
  - Installing phan/phan (3.2.6): Loading from cache
  - Installing mediawiki/phan-taint-check-plugin (3.2.1): Loading from cache
  - Installing mediawiki/mediawiki-phan-config (0.10.6): Loading from cache
  - Installing mediawiki/minus-x (1.1.1): Loading from cache
  - Installing php-parallel-lint/php-console-color (v0.3): Loading from cache
  - Installing php-parallel-lint/php-console-highlighter (v0.5): Loading from cache
  - Installing php-parallel-lint/php-parallel-lint (v1.2.0): Loading from cache
symfony/service-contracts suggests installing symfony/service-implementation
symfony/console suggests installing symfony/event-dispatcher
symfony/console suggests installing symfony/lock
symfony/console suggests installing symfony/process
phan/phan suggests installing ext-ast (Needed for parsing ASTs (unless --use-fallback-parser is used). 1.0.1+ is needed, 1.0.8+ is recommended.)
Writing lock file
Generating autoload files
12 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

Upgrading n:grunt from 1.3.0 -> 1.4.0
$ npm install

> fibers@4.0.3 install /src/repo/node_modules/fibers
> node build.js || nodejs build.js

`linux-x64-64-glibc` exists; testing
Binary is fine; exiting

> core-js@3.10.1 postinstall /src/repo/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"

Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon: 
> https://opencollective.com/core-js 
> https://www.patreon.com/zloirock 

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)


> ejs@3.1.3 postinstall /src/repo/node_modules/ejs
> node --harmony ./postinstall.js

Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 955 packages from 656 contributors and audited 957 packages in 114.981s

100 packages are looking for funding
  run `npm fund` for details

found 63 vulnerabilities (3 moderate, 60 high)
  run `npm audit fix` to fix them, or `npm audit` for details

$ npm ci
npm WARN prepare removing existing node_modules/ before installation

> ejs@3.1.3 postinstall /src/repo/node_modules/ejs
> node --harmony ./postinstall.js

Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)


> core-js@3.10.1 postinstall /src/repo/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"


> fibers@4.0.3 install /src/repo/node_modules/fibers
> node build.js || nodejs build.js

`linux-x64-64-glibc` exists; testing
Binary is fine; exiting
added 956 packages in 15.528s

$ npm test

> @ test /src/repo
> grunt test

Running "eslint:all" (eslint) task

/src/repo/modules/help/ext.growthExperiments.HelpPanelProcessDialog.js
   398:1  warning  This line has a length of 130. Maximum allowed is 100  max-len
   455:1  warning  This line has a length of 118. Maximum allowed is 100  max-len
   751:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  1003:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.HelpPanelProcessDialog.SuggestedEditsPanel.js
  85:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.HelpPanelProcessDialog.SwitchEditorPanel.js
  30:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  45:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  64:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  65:1  warning  This line has a length of 105. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.PostEdit.js
   46:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  129:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.PostEditDialog.js
  44:1  warning  This line has a length of 103. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.PostEditPanel.js
   15:1  warning  This line has a length of 104. Maximum allowed is 100  max-len
   16:1  warning  This line has a length of 105. Maximum allowed is 100  max-len
  178:1  warning  This line has a length of 102. Maximum allowed is 100  max-len

/src/repo/modules/helppanel/ext.growthExperiments.HelpPanel.cta.js
   45:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
   47:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  292:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/AddLinkArticleTarget.js
   83:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  226:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  238:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
  389:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/AddLinkOnboardingContent.js
  94:1  warning  This line has a length of 110. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/AddLinkSaveDialogMixin.js
  118:1  warning  This line has a length of 101. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/ceRecommendedLinkAnnotation.js
  34:0  warning  There must be a newline after the description of the JSDoc block  jsdoc/newline-after-description

/src/repo/modules/homepage/addlink/RecommendedLinkToolbarDialog.js
   35:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
   39:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  536:1  warning  This line has a length of 101. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/RecommendedLinkToolbarDialogDesktop.js
  44:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/RecommendedLinkToolbarDialogMobile.js
  44:1  warning  This line has a length of 106. Maximum allowed is 100  max-len

/src/repo/modules/homepage/ext.growthExperiments.Homepage.Mobile.js
   17:1  warning  This line has a length of 111. Maximum allowed is 100  max-len
   18:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
  190:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  223:1  warning  This line has a length of 112. Maximum allowed is 100  max-len
  224:1  warning  This line has a length of 112. Maximum allowed is 100  max-len
  246:1  warning  This line has a length of 109. Maximum allowed is 100  max-len

/src/repo/modules/homepage/ext.growthExperiments.Homepage.MobileOverlay.js
  58:1  warning  This line has a length of 106. Maximum allowed is 100  max-len

/src/repo/modules/homepage/ext.growthExperiments.Homepage.StartEditingDialog.js
   20:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
   21:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  316:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
  345:1  warning  This line has a length of 117. Maximum allowed is 100  max-len
  471:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  640:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  641:1  warning  This line has a length of 105. Maximum allowed is 100  max-len
  642:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  651:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  652:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  653:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  658:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  659:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  660:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  756:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.GrowthTasksApi.js
   23:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
   26:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
   44:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
   47:1  warning  This line has a length of 104. Maximum allowed is 100  max-len
   63:1  warning  This line has a length of 118. Maximum allowed is 100  max-len
  103:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  221:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  229:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  283:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  288:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  289:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  350:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.SuggestedEdits.js
  240:1  warning  This line has a length of 107. Maximum allowed is 100  max-len
  274:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  275:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  557:1  warning  This line has a length of 101. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.SuggestedEdits.TaskExplanationWidget.js
  37:1  warning  This line has a length of 109. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.TaskTypeSelectionWidget.js
  123:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  124:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  125:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  146:1  warning  This line has a length of 108. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.NewcomerTaskLogger.js
  60:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/TaskTypesAbFilter.js
  11:0  warning  There must be a newline after the description of the JSDoc block  jsdoc/newline-after-description
  42:2  warning  Missing JSDoc @return declaration                                 jsdoc/require-returns
  44:0  warning  There must be a newline after the description of the JSDoc block  jsdoc/newline-after-description

/src/repo/modules/utils/ext.growthExperiments.Utils.js
  86:2  warning  Missing JSDoc @return declaration                      jsdoc/require-returns
  89:0  warning  Invalid JSDoc tag name "internal"                      jsdoc/check-tag-names
  96:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

✖ 80 problems (0 errors, 80 warnings)
  0 errors and 3 warnings potentially fixable with the `--fix` option.


Running "banana:docs" (banana) task
>> 8 message directories checked.

Running "stylelint:all" (stylelint) task
>> Linted 41 files without errors

Done.

Upgrading c:mediawiki/mediawiki-codesniffer from 35.0.0 -> 36.0.0
Upgrading c:php-parallel-lint/php-parallel-lint from 1.2.0 -> 1.3.0
$ composer update
Loading composer repositories with package information
Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2
Updating dependencies (including require-dev)
Package operations: 0 installs, 3 updates, 0 removals
  - Updating squizlabs/php_codesniffer (3.5.8 => 3.6.0): Loading from cache
  - Updating mediawiki/mediawiki-codesniffer (v35.0.0 => v36.0.0): Loading from cache
  - Updating php-parallel-lint/php-parallel-lint (v1.2.0 => v1.3.0): Loading from cache
Writing lock file
Generating autoload files
12 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

{'MediaWiki.Commenting.FunctionComment.WrongStyle', 'MediaWiki.Commenting.PropertyDocumentation.MissingDocumentationPrivate', 'MediaWiki.Commenting.FunctionComment.MissingDocumentationPrivate'}
Tests fail!
$ vendor/bin/phpcbf

PHPCBF RESULT SUMMARY
----------------------------------------------------------------------
FILE                                                  FIXED  REMAINING
----------------------------------------------------------------------
...s/phpunit/unit/SearchTaskSuggesterFactoryTest.php  2      0
...ts/phpunit/unit/RemoteSearchTaskSuggesterTest.php  4      0
/src/repo/tests/phpunit/unit/WelcomeSurveyTest.php    1      0
/src/repo/tests/phpunit/unit/QuestionPosterTest.php   3      0
...po/tests/phpunit/unit/SiteNoticeGeneratorTest.php  1      0
.../repo/tests/phpunit/unit/ProtectionFilterTest.php  3      0
...sts/phpunit/unit/LocalSearchTaskSuggesterTest.php  3      0
...punit/unit/HomepageModules/SuggestedEditsTest.php  1      0
...epo/tests/phpunit/unit/AqsEditInfoServiceTest.php  2      0
...s/phpunit/unit/StaticTaskSuggesterFactoryTest.php  1      0
...o/tests/phpunit/unit/WikiPageConfigLoaderTest.php  8      0
/src/repo/tests/phpunit/unit/TopicTest.php            1      0
...ests/phpunit/unit/PageConfigurationLoaderTest.php  6      0
...punit/integration/MentorPageMentorManagerTest.php  4      0
...tests/phpunit/integration/SpecialHomepageTest.php  1      0
...o/tests/phpunit/integration/HomepageHooksTest.php  2      0
...po/tests/phpunit/integration/ApiSetMentorTest.php  1      0
----------------------------------------------------------------------
A TOTAL OF 44 ERRORS WERE FIXED IN 17 FILES
----------------------------------------------------------------------

Time: 4.51 secs; Memory: 22MB



$ git checkout .phpcs.xml

$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Generating autoload files
12 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

$ composer test
> parallel-lint . --exclude vendor --exclude node_modules
PHP 7.3.27 | 10 parallel jobs
............................................................  60/246 (24 %)
............................................................ 120/246 (48 %)
............................................................ 180/246 (73 %)
............................................................ 240/246 (97 %)
......                                                       246/246 (100 %)


Checked 246 files in 0.9 seconds
No syntax error found
> phpcs -s -p --cache
............................................................  60 / 237 (25%)
............................................................ 120 / 237 (51%)
............................................................ 180 / 237 (76%)
.........................................................    237 / 237 (100%)


Time: 143ms; Memory: 14MB

> minus-x check .
MinusX
======
Processing /src/repo...
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
..........................
All good!

Attempting to npm audit fix
$ npm audit fix --only=dev
updated 4 packages in 14.953s

101 packages are looking for funding
  run `npm fund` for details

fixed 61 of 63 vulnerabilities in 957 scanned packages
  2 vulnerabilities required manual review and could not be updated

$ npm audit fix --only=dev
updated 2 packages in 6.899s

101 packages are looking for funding
  run `npm fund` for details

fixed 2 of 2 vulnerabilities in 957 scanned packages

$ npm audit fix --only=dev
updated 1 package in 7.064s

101 packages are looking for funding
  run `npm fund` for details

fixed 1 of 1 vulnerability in 957 scanned packages

Verifying that tests still pass
$ npm ci
npm WARN prepare removing existing node_modules/ before installation

> ejs@3.1.3 postinstall /src/repo/node_modules/ejs
> node --harmony ./postinstall.js

Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)


> core-js@3.10.1 postinstall /src/repo/node_modules/core-js
> node -e "try{require('./postinstall')}catch(e){}"


> fibers@4.0.3 install /src/repo/node_modules/fibers
> node build.js || nodejs build.js

`linux-x64-64-glibc` exists; testing
Binary is fine; exiting
added 956 packages in 16.117s

$ npm test

> @ test /src/repo
> grunt test

Running "eslint:all" (eslint) task

/src/repo/modules/help/ext.growthExperiments.HelpPanelProcessDialog.js
   398:1  warning  This line has a length of 130. Maximum allowed is 100  max-len
   455:1  warning  This line has a length of 118. Maximum allowed is 100  max-len
   751:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  1003:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.HelpPanelProcessDialog.SuggestedEditsPanel.js
  85:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.HelpPanelProcessDialog.SwitchEditorPanel.js
  30:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  45:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  64:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
  65:1  warning  This line has a length of 105. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.PostEdit.js
   46:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  129:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.PostEditDialog.js
  44:1  warning  This line has a length of 103. Maximum allowed is 100  max-len

/src/repo/modules/help/ext.growthExperiments.PostEditPanel.js
   15:1  warning  This line has a length of 104. Maximum allowed is 100  max-len
   16:1  warning  This line has a length of 105. Maximum allowed is 100  max-len
  178:1  warning  This line has a length of 102. Maximum allowed is 100  max-len

/src/repo/modules/helppanel/ext.growthExperiments.HelpPanel.cta.js
   45:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
   47:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  292:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/AddLinkArticleTarget.js
   83:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  226:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  238:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
  389:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/AddLinkOnboardingContent.js
  94:1  warning  This line has a length of 110. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/AddLinkSaveDialogMixin.js
  118:1  warning  This line has a length of 101. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/ceRecommendedLinkAnnotation.js
  34:0  warning  There must be a newline after the description of the JSDoc block  jsdoc/newline-after-description

/src/repo/modules/homepage/addlink/RecommendedLinkToolbarDialog.js
   35:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
   39:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  536:1  warning  This line has a length of 101. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/RecommendedLinkToolbarDialogDesktop.js
  44:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/homepage/addlink/RecommendedLinkToolbarDialogMobile.js
  44:1  warning  This line has a length of 106. Maximum allowed is 100  max-len

/src/repo/modules/homepage/ext.growthExperiments.Homepage.Mobile.js
   17:1  warning  This line has a length of 111. Maximum allowed is 100  max-len
   18:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
  190:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  223:1  warning  This line has a length of 112. Maximum allowed is 100  max-len
  224:1  warning  This line has a length of 112. Maximum allowed is 100  max-len
  246:1  warning  This line has a length of 109. Maximum allowed is 100  max-len

/src/repo/modules/homepage/ext.growthExperiments.Homepage.MobileOverlay.js
  58:1  warning  This line has a length of 106. Maximum allowed is 100  max-len

/src/repo/modules/homepage/ext.growthExperiments.Homepage.StartEditingDialog.js
   20:1  warning  This line has a length of 109. Maximum allowed is 100  max-len
   21:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  316:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
  345:1  warning  This line has a length of 117. Maximum allowed is 100  max-len
  471:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  640:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  641:1  warning  This line has a length of 105. Maximum allowed is 100  max-len
  642:1  warning  This line has a length of 103. Maximum allowed is 100  max-len
  651:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  652:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  653:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  658:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  659:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  660:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  756:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.GrowthTasksApi.js
   23:1  warning  This line has a length of 101. Maximum allowed is 100  max-len
   26:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
   44:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
   47:1  warning  This line has a length of 104. Maximum allowed is 100  max-len
   63:1  warning  This line has a length of 118. Maximum allowed is 100  max-len
  103:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  221:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  229:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  283:1  warning  This line has a length of 113. Maximum allowed is 100  max-len
  288:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  289:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  350:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.SuggestedEdits.js
  240:1  warning  This line has a length of 107. Maximum allowed is 100  max-len
  274:1  warning  This line has a length of 106. Maximum allowed is 100  max-len
  275:1  warning  This line has a length of 102. Maximum allowed is 100  max-len
  557:1  warning  This line has a length of 101. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.SuggestedEdits.TaskExplanationWidget.js
  37:1  warning  This line has a length of 109. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.Homepage.TaskTypeSelectionWidget.js
  123:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  124:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  125:1  warning  This line has a length of 108. Maximum allowed is 100  max-len
  146:1  warning  This line has a length of 108. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/ext.growthExperiments.NewcomerTaskLogger.js
  60:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/modules/homepage/suggestededits/TaskTypesAbFilter.js
  11:0  warning  There must be a newline after the description of the JSDoc block  jsdoc/newline-after-description
  42:2  warning  Missing JSDoc @return declaration                                 jsdoc/require-returns
  44:0  warning  There must be a newline after the description of the JSDoc block  jsdoc/newline-after-description

/src/repo/modules/utils/ext.growthExperiments.Utils.js
  86:2  warning  Missing JSDoc @return declaration                      jsdoc/require-returns
  89:0  warning  Invalid JSDoc tag name "internal"                      jsdoc/check-tag-names
  96:1  warning  This line has a length of 104. Maximum allowed is 100  max-len

✖ 80 problems (0 errors, 80 warnings)
  0 errors and 3 warnings potentially fixable with the `--fix` option.


Running "banana:docs" (banana) task
>> 8 message directories checked.

Running "stylelint:all" (stylelint) task
>> Linted 41 files without errors

Done.

Upgrading n:lodash from 4.17.19 -> 4.17.21
Upgrading n:hosted-git-info from 2.8.8 -> 3.0.8
Upgrading n:ua-parser-js from 0.7.21 -> 0.7.28
$ git add .

$ git commit -F /tmp/tmpum1spwn4
[master 31210f7] build: Updating dependencies
 20 files changed, 141 insertions(+), 1134 deletions(-)

$ git format-patch HEAD~1 --stdout
From 31210f74f3c49489932873b50e3de71ce90e9a44 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 10 May 2021 15:21:18 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* mediawiki/mediawiki-codesniffer: 35.0.0 → 36.0.0
* php-parallel-lint/php-parallel-lint: 1.2.0 → 1.3.0

npm:
* grunt: 1.3.0 → 1.4.0
* lodash: 4.17.19 → 4.17.21
  * https://npmjs.com/advisories/1673 (CVE-2021-23337)
* hosted-git-info: 2.8.8 → 3.0.8
  * https://npmjs.com/advisories/1677 (CVE-2021-23362)
* ua-parser-js: 0.7.21 → 0.7.28
  * https://npmjs.com/advisories/1679 (CVE-2021-27292)

Change-Id: I7d18622df7ce707f26ff3bf5e51b3845195795c7
---
 composer.json                                 |    4 +-
 package-lock.json                             | 1181 ++---------------
 package.json                                  |    2 +-
 .../phpunit/integration/ApiSetMentorTest.php  |    2 +-
 .../phpunit/integration/HomepageHooksTest.php |    4 +-
 .../MentorPageMentorManagerTest.php           |    8 +-
 .../integration/SpecialHomepageTest.php       |    2 +-
 tests/phpunit/unit/AqsEditInfoServiceTest.php |    4 +-
 .../HomepageModules/SuggestedEditsTest.php    |    2 +-
 .../unit/LocalSearchTaskSuggesterTest.php     |    6 +-
 .../unit/PageConfigurationLoaderTest.php      |   12 +-
 tests/phpunit/unit/ProtectionFilterTest.php   |    6 +-
 tests/phpunit/unit/QuestionPosterTest.php     |    6 +-
 .../unit/RemoteSearchTaskSuggesterTest.php    |    8 +-
 .../unit/SearchTaskSuggesterFactoryTest.php   |    4 +-
 .../phpunit/unit/SiteNoticeGeneratorTest.php  |    2 +-
 .../unit/StaticTaskSuggesterFactoryTest.php   |    2 +-
 tests/phpunit/unit/TopicTest.php              |    2 +-
 tests/phpunit/unit/WelcomeSurveyTest.php      |    2 +-
 .../phpunit/unit/WikiPageConfigLoaderTest.php |   16 +-
 20 files changed, 141 insertions(+), 1134 deletions(-)

diff --git a/composer.json b/composer.json
index 17ac315..d9a654b 100644
--- a/composer.json
+++ b/composer.json
@@ -1,10 +1,10 @@
 {
 	"require-dev": {
-		"mediawiki/mediawiki-codesniffer": "35.0.0",
+		"mediawiki/mediawiki-codesniffer": "36.0.0",
 		"mediawiki/mediawiki-phan-config": "0.10.6",
 		"mediawiki/minus-x": "1.1.1",
 		"php-parallel-lint/php-console-highlighter": "0.5.0",
-		"php-parallel-lint/php-parallel-lint": "1.2.0"
+		"php-parallel-lint/php-parallel-lint": "1.3.0"
 	},
 	"scripts": {
 		"fix": [
diff --git a/package-lock.json b/package-lock.json
index b7f7b2b..484809c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1190,24 +1190,6 @@
 				"sprintf-js": "~1.0.2"
 			}
 		},
-		"arr-diff": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-			"integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-			"dev": true
-		},
-		"arr-flatten": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-			"integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-			"dev": true
-		},
-		"arr-union": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-			"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-			"dev": true
-		},
 		"array-differ": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
@@ -1232,12 +1214,6 @@
 			"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
 			"dev": true
 		},
-		"array-unique": {
-			"version": "0.3.2",
-			"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-			"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-			"dev": true
-		},
 		"arrify": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
@@ -1265,12 +1241,6 @@
 			"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
 			"dev": true
 		},
-		"assign-symbols": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-			"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-			"dev": true
-		},
 		"ast-metadata-inferer": {
 			"version": "0.4.0",
 			"resolved": "https://registry.npmjs.org/ast-metadata-inferer/-/ast-metadata-inferer-0.4.0.tgz",
@@ -1307,12 +1277,6 @@
 			"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
 			"dev": true
 		},
-		"atob": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-			"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-			"dev": true
-		},
 		"autoprefixer": {
 			"version": "9.8.6",
 			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
@@ -1352,61 +1316,6 @@
 			"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
 			"dev": true
 		},
-		"base": {
-			"version": "0.11.2",
-			"resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-			"integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-			"dev": true,
-			"requires": {
-				"cache-base": "^1.0.1",
-				"class-utils": "^0.3.5",
-				"component-emitter": "^1.2.1",
-				"define-property": "^1.0.0",
-				"isobject": "^3.0.1",
-				"mixin-deep": "^1.2.0",
-				"pascalcase": "^0.1.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-					"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^1.0.0"
-					}
-				},
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
 		"base64-js": {
 			"version": "1.3.1",
 			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
@@ -1556,23 +1465,6 @@
 				}
 			}
 		},
-		"cache-base": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-			"integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-			"dev": true,
-			"requires": {
-				"collection-visit": "^1.0.0",
-				"component-emitter": "^1.2.1",
-				"get-value": "^2.0.6",
-				"has-value": "^1.0.0",
-				"isobject": "^3.0.1",
-				"set-value": "^2.0.0",
-				"to-object-path": "^0.3.0",
-				"union-value": "^1.0.0",
-				"unset-value": "^1.0.0"
-			}
-		},
 		"cacheable-lookup": {
 			"version": "5.0.3",
 			"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz",
@@ -1726,29 +1618,6 @@
 				"rimraf": "^3.0.2"
 			}
 		},
-		"class-utils": {
-			"version": "0.3.6",
-			"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-			"integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-			"dev": true,
-			"requires": {
-				"arr-union": "^3.1.0",
-				"define-property": "^0.2.5",
-				"isobject": "^3.0.0",
-				"static-extend": "^0.1.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				}
-			}
-		},
 		"cli-cursor": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -1806,16 +1675,6 @@
 				"mimic-response": "^1.0.0"
 			}
 		},
-		"collection-visit": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-			"integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-			"dev": true,
-			"requires": {
-				"map-visit": "^1.0.0",
-				"object-visit": "^1.0.0"
-			}
-		},
 		"color-convert": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1914,12 +1773,6 @@
 			"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==",
 			"dev": true
 		},
-		"copy-descriptor": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-			"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-			"dev": true
-		},
 		"core-js": {
 			"version": "3.10.1",
 			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.1.tgz",
@@ -2136,12 +1989,6 @@
 				"map-obj": "^1.0.0"
 			}
 		},
-		"decode-uri-component": {
-			"version": "0.2.0",
-			"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-			"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-			"dev": true
-		},
 		"decompress-response": {
 			"version": "6.0.0",
 			"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@@ -2205,47 +2052,6 @@
 				"object-keys": "^1.0.12"
 			}
 		},
-		"define-property": {
-			"version": "2.0.2",
-			"resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-			"integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-			"dev": true,
-			"requires": {
-				"is-descriptor": "^1.0.2",
-				"isobject": "^3.0.1"
-			},
-			"dependencies": {
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
 		"delayed-stream": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -3415,41 +3221,6 @@
 			"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
 			"dev": true
 		},
-		"expand-brackets": {
-			"version": "2.1.4",
-			"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-			"integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-			"dev": true,
-			"requires": {
-				"debug": "^2.3.3",
-				"define-property": "^0.2.5",
-				"extend-shallow": "^2.0.1",
-				"posix-character-classes": "^0.1.0",
-				"regex-not": "^1.0.0",
-				"snapdragon": "^0.8.1",
-				"to-regex": "^3.0.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				},
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				}
-			}
-		},
 		"expand-tilde": {
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
@@ -3489,27 +3260,6 @@
 			"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
 			"dev": true
 		},
-		"extend-shallow": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-			"integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-			"dev": true,
-			"requires": {
-				"assign-symbols": "^1.0.0",
-				"is-extendable": "^1.0.1"
-			},
-			"dependencies": {
-				"is-extendable": {
-					"version": "1.0.1",
-					"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-					"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-					"dev": true,
-					"requires": {
-						"is-plain-object": "^2.0.4"
-					}
-				}
-			}
-		},
 		"external-editor": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -3521,71 +3271,6 @@
 				"tmp": "^0.0.33"
 			}
 		},
-		"extglob": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-			"integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-			"dev": true,
-			"requires": {
-				"array-unique": "^0.3.2",
-				"define-property": "^1.0.0",
-				"expand-brackets": "^2.1.4",
-				"extend-shallow": "^2.0.1",
-				"fragment-cache": "^0.2.1",
-				"regex-not": "^1.0.0",
-				"snapdragon": "^0.8.1",
-				"to-regex": "^3.0.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-					"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^1.0.0"
-					}
-				},
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				},
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
 		"extract-zip": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz",
@@ -3844,15 +3529,6 @@
 			"integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==",
 			"dev": true
 		},
-		"fragment-cache": {
-			"version": "0.2.1",
-			"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-			"integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-			"dev": true,
-			"requires": {
-				"map-cache": "^0.2.2"
-			}
-		},
 		"fs-constants": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
@@ -3938,16 +3614,10 @@
 				"pump": "^3.0.0"
 			}
 		},
-		"get-value": {
-			"version": "2.0.6",
-			"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-			"integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-			"dev": true
-		},
 		"getobject": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz",
-			"integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=",
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.0.tgz",
+			"integrity": "sha512-tbUz6AKKKr2YiMB+fLWIgq5ZeBOobop9YMMAU9dC54/ot2ksMXt3DOFyBuhZw6ptcVszEykgByK20j7W9jHFag==",
 			"dev": true
 		},
 		"getpass": {
@@ -4106,9 +3776,9 @@
 			"dev": true
 		},
 		"grunt": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.3.0.tgz",
-			"integrity": "sha512-6ILlMXv11/4cxuhSMfSU+SfvbxrPuqZrAtLN64+tZpQ3DAKfSQPQHRbTjSbdtxfyQhGZPtN0bDZJ/LdCM5WXXA==",
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.0.tgz",
+			"integrity": "sha512-yRFc0GVCDu9yxqOFzpuXQ2pEdgtLDnFv5Qz54jfIcNnpJ8Z7B7P7kPkT4VMuRvm+N+QOsI8C4v/Q0DSaoj3LgQ==",
 			"dev": true,
 			"requires": {
 				"dateformat": "~3.0.3",
@@ -4116,10 +3786,10 @@
 				"exit": "~0.1.2",
 				"findup-sync": "~0.3.0",
 				"glob": "~7.1.6",
-				"grunt-cli": "~1.3.2",
-				"grunt-known-options": "~1.1.0",
+				"grunt-cli": "~1.4.2",
+				"grunt-known-options": "~1.1.1",
 				"grunt-legacy-log": "~3.0.0",
-				"grunt-legacy-util": "~2.0.0",
+				"grunt-legacy-util": "~2.0.1",
 				"iconv-lite": "~0.4.13",
 				"js-yaml": "~3.14.0",
 				"minimatch": "~3.0.4",
@@ -4129,16 +3799,16 @@
 			},
 			"dependencies": {
 				"grunt-cli": {
-					"version": "1.3.2",
-					"resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz",
-					"integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==",
+					"version": "1.4.2",
+					"resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.2.tgz",
+					"integrity": "sha512-wsu6BZh7KCnfeaSkDrKIAvOlqGKxNRTZjc8xfZlvxCByQIqUfZ31kh5uHpPnhQ4NdVgvaWaVxa1LUbVU80nACw==",
 					"dev": true,
 					"requires": {
-						"grunt-known-options": "~1.1.0",
+						"grunt-known-options": "~1.1.1",
 						"interpret": "~1.1.0",
-						"liftoff": "~2.5.0",
+						"liftup": "~3.0.1",
 						"nopt": "~4.0.1",
-						"v8flags": "~3.1.1"
+						"v8flags": "~3.2.0"
 					},
 					"dependencies": {
 						"nopt": {
@@ -4154,9 +3824,9 @@
 					}
 				},
 				"js-yaml": {
-					"version": "3.14.0",
-					"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-					"integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+					"version": "3.14.1",
+					"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+					"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
 					"dev": true,
 					"requires": {
 						"argparse": "^1.0.7",
@@ -4216,9 +3886,9 @@
 			},
 			"dependencies": {
 				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+					"version": "4.1.1",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+					"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
 					"dev": true,
 					"requires": {
 						"ansi-styles": "^4.1.0",
@@ -4228,31 +3898,40 @@
 			}
 		},
 		"grunt-legacy-util": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.0.tgz",
-			"integrity": "sha512-ZEmYFB44bblwPE2oz3q3ygfF6hseQja9tx8I3UZIwbUik32FMWewA+d1qSFicMFB+8dNXDkh35HcDCWlpRsGlA==",
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz",
+			"integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==",
 			"dev": true,
 			"requires": {
-				"async": "~1.5.2",
-				"exit": "~0.1.1",
-				"getobject": "~0.1.0",
+				"async": "~3.2.0",
+				"exit": "~0.1.2",
+				"getobject": "~1.0.0",
 				"hooker": "~0.2.3",
-				"lodash": "~4.17.20",
+				"lodash": "~4.17.21",
 				"underscore.string": "~3.3.5",
-				"which": "~1.3.0"
+				"which": "~2.0.2"
 			},
 			"dependencies": {
 				"async": {
-					"version": "1.5.2",
-					"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-					"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+					"version": "3.2.0",
+					"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+					"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
 					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 					"dev": true
+				},
+				"which": {
+					"version": "2.0.2",
+					"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+					"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+					"dev": true,
+					"requires": {
+						"isexe": "^2.0.0"
+					}
 				}
 			}
 		},
@@ -4337,64 +4016,6 @@
 			"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
 			"dev": true
 		},
-		"has-value": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
-			"integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
-			"dev": true,
-			"requires": {
-				"get-value": "^2.0.6",
-				"has-values": "^1.0.0",
-				"isobject": "^3.0.0"
-			}
-		},
-		"has-values": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
-			"integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
-			"dev": true,
-			"requires": {
-				"is-number": "^3.0.0",
-				"kind-of": "^4.0.0"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"is-number": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-					"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-					"dev": true,
-					"requires": {
-						"kind-of": "^3.0.2"
-					},
-					"dependencies": {
-						"kind-of": {
-							"version": "3.2.2",
-							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-							"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-							"dev": true,
-							"requires": {
-								"is-buffer": "^1.1.5"
-							}
-						}
-					}
-				},
-				"kind-of": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
-					"integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"he": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -4417,9 +4038,9 @@
 			"dev": true
 		},
 		"hosted-git-info": {
-			"version": "2.8.8",
-			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-			"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+			"version": "2.8.9",
+			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+			"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
 			"dev": true
 		},
 		"html-tags": {
@@ -4622,32 +4243,6 @@
 				"is-windows": "^1.0.1"
 			}
 		},
-		"is-accessor-descriptor": {
-			"version": "0.1.6",
-			"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
-			"integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
-			"dev": true,
-			"requires": {
-				"kind-of": "^3.0.2"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"is-alphabetical": {
 			"version": "1.0.4",
 			"resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
@@ -4691,30 +4286,13 @@
 			"integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
 			"dev": true
 		},
-		"is-data-descriptor": {
-			"version": "0.1.4",
-			"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
-			"integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+		"is-core-module": {
+			"version": "2.4.0",
+			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+			"integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
 			"dev": true,
 			"requires": {
-				"kind-of": "^3.0.2"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
+				"has": "^1.0.3"
 			}
 		},
 		"is-date-object": {
@@ -4729,37 +4307,12 @@
 			"integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
 			"dev": true
 		},
-		"is-descriptor": {
-			"version": "0.1.6",
-			"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
-			"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
-			"dev": true,
-			"requires": {
-				"is-accessor-descriptor": "^0.1.6",
-				"is-data-descriptor": "^0.1.4",
-				"kind-of": "^5.0.0"
-			},
-			"dependencies": {
-				"kind-of": {
-					"version": "5.1.0",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-					"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-					"dev": true
-				}
-			}
-		},
 		"is-docker": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
 			"integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==",
 			"dev": true
 		},
-		"is-extendable": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-			"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
-			"dev": true
-		},
 		"is-extglob": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -5323,150 +4876,42 @@
 				"type-check": "~0.4.0"
 			}
 		},
-		"liftoff": {
-			"version": "2.5.0",
-			"resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
-			"integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+		"liftup": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
+			"integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==",
 			"dev": true,
 			"requires": {
-				"extend": "^3.0.0",
-				"findup-sync": "^2.0.0",
-				"fined": "^1.0.1",
-				"flagged-respawn": "^1.0.0",
+				"extend": "^3.0.2",
+				"findup-sync": "^4.0.0",
+				"fined": "^1.2.0",
+				"flagged-respawn": "^1.0.1",
 				"is-plain-object": "^2.0.4",
-				"object.map": "^1.0.0",
-				"rechoir": "^0.6.2",
-				"resolve": "^1.1.7"
+				"object.map": "^1.0.1",
+				"rechoir": "^0.7.0",
+				"resolve": "^1.19.0"
 			},
 			"dependencies": {
-				"braces": {
-					"version": "2.3.2",
-					"resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-					"integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-					"dev": true,
-					"requires": {
-						"arr-flatten": "^1.1.0",
-						"array-unique": "^0.3.2",
-						"extend-shallow": "^2.0.1",
-						"fill-range": "^4.0.0",
-						"isobject": "^3.0.1",
-						"repeat-element": "^1.1.2",
-						"snapdragon": "^0.8.1",
-						"snapdragon-node": "^2.0.1",
-						"split-string": "^3.0.2",
-						"to-regex": "^3.0.1"
-					},
-					"dependencies": {
-						"extend-shallow": {
-							"version": "2.0.1",
-							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-							"dev": true,
-							"requires": {
-								"is-extendable": "^0.1.0"
-							}
-						}
-					}
-				},
-				"fill-range": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-					"integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-					"dev": true,
-					"requires": {
-						"extend-shallow": "^2.0.1",
-						"is-number": "^3.0.0",
-						"repeat-string": "^1.6.1",
-						"to-regex-range": "^2.1.0"
-					},
-					"dependencies": {
-						"extend-shallow": {
-							"version": "2.0.1",
-							"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-							"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-							"dev": true,
-							"requires": {
-								"is-extendable": "^0.1.0"
-							}
-						}
-					}
-				},
 				"findup-sync": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
-					"integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz",
+					"integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==",
 					"dev": true,
 					"requires": {
 						"detect-file": "^1.0.0",
-						"is-glob": "^3.1.0",
-						"micromatch": "^3.0.4",
+						"is-glob": "^4.0.0",
+						"micromatch": "^4.0.2",
 						"resolve-dir": "^1.0.1"
 					}
 				},
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"is-glob": {
-					"version": "3.1.0",
-					"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-					"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-					"dev": true,
-					"requires": {
-						"is-extglob": "^2.1.0"
-					}
-				},
-				"is-number": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-					"integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-					"dev": true,
-					"requires": {
-						"kind-of": "^3.0.2"
-					},
-					"dependencies": {
-						"kind-of": {
-							"version": "3.2.2",
-							"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-							"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-							"dev": true,
-							"requires": {
-								"is-buffer": "^1.1.5"
-							}
-						}
-					}
-				},
-				"micromatch": {
-					"version": "3.1.10",
-					"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-					"integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+				"resolve": {
+					"version": "1.20.0",
+					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+					"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
 					"dev": true,
 					"requires": {
-						"arr-diff": "^4.0.0",
-						"array-unique": "^0.3.2",
-						"braces": "^2.3.1",
-						"define-property": "^2.0.2",
-						"extend-shallow": "^3.0.2",
-						"extglob": "^2.0.4",
-						"fragment-cache": "^0.2.1",
-						"kind-of": "^6.0.2",
-						"nanomatch": "^1.2.9",
-						"object.pick": "^1.3.0",
-						"regex-not": "^1.0.0",
-						"snapdragon": "^0.8.1",
-						"to-regex": "^3.0.2"
-					}
-				},
-				"to-regex-range": {
-					"version": "2.1.1",
-					"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-					"integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
-					"dev": true,
-					"requires": {
-						"is-number": "^3.0.0",
-						"repeat-string": "^1.6.1"
+						"is-core-module": "^2.2.0",
+						"path-parse": "^1.0.6"
 					}
 				}
 			}
@@ -5510,9 +4955,9 @@
 			}
 		},
 		"lodash": {
-			"version": "4.17.19",
-			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
-			"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+			"version": "4.17.21",
+			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 			"dev": true
 		},
 		"lodash.clonedeep": {
@@ -5732,15 +5177,6 @@
 			"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
 			"dev": true
 		},
-		"map-visit": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
-			"integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
-			"dev": true,
-			"requires": {
-				"object-visit": "^1.0.0"
-			}
-		},
 		"marky": {
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz",
@@ -5816,9 +5252,9 @@
 					}
 				},
 				"hosted-git-info": {
-					"version": "3.0.7",
-					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz",
-					"integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==",
+					"version": "3.0.8",
+					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz",
+					"integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==",
 					"dev": true,
 					"requires": {
 						"lru-cache": "^6.0.0"
@@ -5883,8 +5319,7 @@
 					"dependencies": {
 						"hosted-git-info": {
 							"version": "2.8.8",
-							"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-							"integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+							"resolved": "",
 							"dev": true
 						},
 						"normalize-package-data": {
@@ -6080,27 +5515,6 @@
 				}
 			}
 		},
-		"mixin-deep": {
-			"version": "1.3.2",
-			"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
-			"integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
-			"dev": true,
-			"requires": {
-				"for-in": "^1.0.2",
-				"is-extendable": "^1.0.1"
-			},
-			"dependencies": {
-				"is-extendable": {
-					"version": "1.0.1",
-					"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-					"integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-					"dev": true,
-					"requires": {
-						"is-plain-object": "^2.0.4"
-					}
-				}
-			}
-		},
 		"mkdirp": {
 			"version": "0.5.5",
 			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
@@ -6415,25 +5829,6 @@
 			"integrity": "sha512-rndlDjbbHbcV3xi+R2fpJ+PbGMdfBxz5v1fATIQFq0DP64FsicQdwnKLy47K4kZHdRpmQXtz24eGsxQqamzYTA==",
 			"dev": true
 		},
-		"nanomatch": {
-			"version": "1.2.13",
-			"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
-			"integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
-			"dev": true,
-			"requires": {
-				"arr-diff": "^4.0.0",
-				"array-unique": "^0.3.2",
-				"define-property": "^2.0.2",
-				"extend-shallow": "^3.0.2",
-				"fragment-cache": "^0.2.1",
-				"is-windows": "^1.0.2",
-				"kind-of": "^6.0.2",
-				"object.pick": "^1.3.0",
-				"regex-not": "^1.0.0",
-				"snapdragon": "^0.8.1",
-				"to-regex": "^3.0.1"
-			}
-		},
 		"natural-compare": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
@@ -6513,43 +5908,6 @@
 			"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
 			"dev": true
 		},
-		"object-copy": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
-			"integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
-			"dev": true,
-			"requires": {
-				"copy-descriptor": "^0.1.0",
-				"define-property": "^0.2.5",
-				"kind-of": "^3.0.3"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				},
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"object-inspect": {
 			"version": "1.7.0",
 			"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
@@ -6562,15 +5920,6 @@
 			"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
 			"dev": true
 		},
-		"object-visit": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
-			"integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
-			"dev": true,
-			"requires": {
-				"isobject": "^3.0.0"
-			}
-		},
 		"object.assign": {
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
@@ -6763,12 +6112,6 @@
 			"integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
 			"dev": true
 		},
-		"pascalcase": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-			"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
-			"dev": true
-		},
 		"path-exists": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -6864,12 +6207,6 @@
 				"pinkie": "^2.0.0"
 			}
 		},
-		"posix-character-classes": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
-			"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
-			"dev": true
-		},
 		"postcss": {
 			"version": "7.0.35",
 			"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
@@ -7237,12 +6574,12 @@
 			}
 		},
 		"rechoir": {
-			"version": "0.6.2",
-			"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
-			"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+			"integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
 			"dev": true,
 			"requires": {
-				"resolve": "^1.1.6"
+				"resolve": "^1.9.0"
 			}
 		},
 		"redent": {
@@ -7263,16 +6600,6 @@
 				}
 			}
 		},
-		"regex-not": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-			"integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
-			"dev": true,
-			"requires": {
-				"extend-shallow": "^3.0.2",
-				"safe-regex": "^1.1.0"
-			}
-		},
 		"regexpp": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
@@ -7314,12 +6641,6 @@
 				"mdast-util-to-markdown": "^0.5.0"
 			}
 		},
-		"repeat-element": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-			"integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
-			"dev": true
-		},
 		"repeat-string": {
 			"version": "1.6.1",
 			"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
@@ -7466,12 +6787,6 @@
 			"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
 			"dev": true
 		},
-		"resolve-url": {
-			"version": "0.2.1",
-			"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-			"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
-			"dev": true
-		},
 		"responselike": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
@@ -7500,12 +6815,6 @@
 				"signal-exit": "^3.0.2"
 			}
 		},
-		"ret": {
-			"version": "0.1.15",
-			"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-			"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-			"dev": true
-		},
 		"reusify": {
 			"version": "1.0.4",
 			"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -7554,15 +6863,6 @@
 			"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
 			"dev": true
 		},
-		"safe-regex": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-			"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
-			"dev": true,
-			"requires": {
-				"ret": "~0.1.10"
-			}
-		},
 		"safer-buffer": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -7650,29 +6950,6 @@
 			"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
 			"dev": true
 		},
-		"set-value": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-			"integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
-			"dev": true,
-			"requires": {
-				"extend-shallow": "^2.0.1",
-				"is-extendable": "^0.1.1",
-				"is-plain-object": "^2.0.3",
-				"split-string": "^3.0.1"
-			},
-			"dependencies": {
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				}
-			}
-		},
 		"shebang-command": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -7711,150 +6988,12 @@
 				"is-fullwidth-code-point": "^3.0.0"
 			}
 		},
-		"snapdragon": {
-			"version": "0.8.2",
-			"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-			"integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-			"dev": true,
-			"requires": {
-				"base": "^0.11.1",
-				"debug": "^2.2.0",
-				"define-property": "^0.2.5",
-				"extend-shallow": "^2.0.1",
-				"map-cache": "^0.2.2",
-				"source-map": "^0.5.6",
-				"source-map-resolve": "^0.5.0",
-				"use": "^3.1.0"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				},
-				"extend-shallow": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-					"integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-					"dev": true,
-					"requires": {
-						"is-extendable": "^0.1.0"
-					}
-				},
-				"source-map": {
-					"version": "0.5.7",
-					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-					"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-					"dev": true
-				}
-			}
-		},
-		"snapdragon-node": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-			"integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
-			"dev": true,
-			"requires": {
-				"define-property": "^1.0.0",
-				"isobject": "^3.0.0",
-				"snapdragon-util": "^3.0.1"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-					"integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^1.0.0"
-					}
-				},
-				"is-accessor-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-					"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-data-descriptor": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-					"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-					"dev": true,
-					"requires": {
-						"kind-of": "^6.0.0"
-					}
-				},
-				"is-descriptor": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-					"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-					"dev": true,
-					"requires": {
-						"is-accessor-descriptor": "^1.0.0",
-						"is-data-descriptor": "^1.0.0",
-						"kind-of": "^6.0.2"
-					}
-				}
-			}
-		},
-		"snapdragon-util": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-			"integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-			"dev": true,
-			"requires": {
-				"kind-of": "^3.2.0"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
 		"source-map": {
 			"version": "0.5.7",
 			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
 			"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
 			"dev": true
 		},
-		"source-map-resolve": {
-			"version": "0.5.3",
-			"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-			"integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-			"dev": true,
-			"requires": {
-				"atob": "^2.1.2",
-				"decode-uri-component": "^0.2.0",
-				"resolve-url": "^0.2.1",
-				"source-map-url": "^0.4.0",
-				"urix": "^0.1.0"
-			}
-		},
-		"source-map-url": {
-			"version": "0.4.0",
-			"resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-			"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-			"dev": true
-		},
 		"spdx-correct": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@@ -7893,15 +7032,6 @@
 			"integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
 			"dev": true
 		},
-		"split-string": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-			"integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-			"dev": true,
-			"requires": {
-				"extend-shallow": "^3.0.0"
-			}
-		},
 		"split2": {
 			"version": "0.2.1",
 			"resolved": "https://registry.npmjs.org/split2/-/split2-0.2.1.tgz",
@@ -7976,27 +7106,6 @@
 			"integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
 			"dev": true
 		},
-		"static-extend": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-			"integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-			"dev": true,
-			"requires": {
-				"define-property": "^0.2.5",
-				"object-copy": "^0.1.0"
-			},
-			"dependencies": {
-				"define-property": {
-					"version": "0.2.5",
-					"resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-					"integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-					"dev": true,
-					"requires": {
-						"is-descriptor": "^0.1.0"
-					}
-				}
-			}
-		},
 		"stream-buffers": {
 			"version": "3.0.2",
 			"resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz",
@@ -8239,9 +7348,9 @@
 					"dev": true
 				},
 				"lodash": {
-					"version": "4.17.20",
-					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
-					"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+					"version": "4.17.21",
+					"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+					"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
 					"dev": true
 				},
 				"log-symbols": {
@@ -8513,44 +7622,6 @@
 			"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
 			"dev": true
 		},
-		"to-object-path": {
-			"version": "0.3.0",
-			"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
-			"integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
-			"dev": true,
-			"requires": {
-				"kind-of": "^3.0.2"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "1.1.6",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-					"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
-					"dev": true
-				},
-				"kind-of": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-					"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-					"dev": true,
-					"requires": {
-						"is-buffer": "^1.1.5"
-					}
-				}
-			}
-		},
-		"to-regex": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
-			"integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
-			"dev": true,
-			"requires": {
-				"define-property": "^2.0.2",
-				"extend-shallow": "^3.0.2",
-				"regex-not": "^1.0.2",
-				"safe-regex": "^1.1.0"
-			}
-		},
 		"to-regex-range": {
 			"version": "5.0.1",
 			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -8634,9 +7705,9 @@
 			}
 		},
 		"ua-parser-js": {
-			"version": "0.7.21",
-			"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
-			"integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==",
+			"version": "0.7.28",
+			"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz",
+			"integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==",
 			"dev": true
 		},
 		"unbzip2-stream": {
@@ -8679,18 +7750,6 @@
 				"vfile": "^4.0.0"
 			}
 		},
-		"union-value": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
-			"integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
-			"dev": true,
-			"requires": {
-				"arr-union": "^3.1.0",
-				"get-value": "^2.0.6",
-				"is-extendable": "^0.1.1",
-				"set-value": "^2.0.1"
-			}
-		},
 		"uniq": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
@@ -8727,46 +7786,6 @@
 			"integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
 			"dev": true
 		},
-		"unset-value": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
-			"integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
-			"dev": true,
-			"requires": {
-				"has-value": "^0.3.1",
-				"isobject": "^3.0.0"
-			},
-			"dependencies": {
-				"has-value": {
-					"version": "0.3.1",
-					"resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
-					"integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
-					"dev": true,
-					"requires": {
-						"get-value": "^2.0.3",
-						"has-values": "^0.1.4",
-						"isobject": "^2.0.0"
-					},
-					"dependencies": {
-						"isobject": {
-							"version": "2.1.0",
-							"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
-							"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
-							"dev": true,
-							"requires": {
-								"isarray": "1.0.0"
-							}
-						}
-					}
-				},
-				"has-values": {
-					"version": "0.1.4",
-					"resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
-					"integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
-					"dev": true
-				}
-			}
-		},
 		"upath": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
@@ -8782,18 +7801,6 @@
 				"punycode": "^2.1.0"
 			}
 		},
-		"urix": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
-			"integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
-			"dev": true
-		},
-		"use": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
-			"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
-			"dev": true
-		},
 		"util-deprecate": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -8813,9 +7820,9 @@
 			"dev": true
 		},
 		"v8flags": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
-			"integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
+			"integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
 			"dev": true,
 			"requires": {
 				"homedir-polyfill": "^1.0.1"
diff --git a/package.json b/package.json
index 4c99ad8..b2ee310 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
 		"@wdio/sync": "6.1.14",
 		"api-testing": "^1.3.0",
 		"eslint-config-wikimedia": "0.20.0",
-		"grunt": "1.3.0",
+		"grunt": "1.4.0",
 		"grunt-banana-checker": "0.9.0",
 		"grunt-eslint": "23.0.0",
 		"grunt-stylelint": "0.16.0",
diff --git a/tests/phpunit/integration/ApiSetMentorTest.php b/tests/phpunit/integration/ApiSetMentorTest.php
index fedeb5b..18557c2 100644
--- a/tests/phpunit/integration/ApiSetMentorTest.php
+++ b/tests/phpunit/integration/ApiSetMentorTest.php
@@ -152,7 +152,7 @@ class ApiSetMentorTest extends ApiTestCase {
 					->getMock(),
 				false
 			] )
-			->setMethods( [ 'setMentorForUser' ] )
+			->onlyMethods( [ 'setMentorForUser' ] )
 			->getMock();
 	}
 
diff --git a/tests/phpunit/integration/HomepageHooksTest.php b/tests/phpunit/integration/HomepageHooksTest.php
index 124f97a..7f5c07c 100644
--- a/tests/phpunit/integration/HomepageHooksTest.php
+++ b/tests/phpunit/integration/HomepageHooksTest.php
@@ -37,7 +37,7 @@ class HomepageHooksTest extends MediaWikiIntegrationTestCase {
 	 */
 	public function testGetTaskTypesJson() {
 		$configurationLoader = $this->getMockBuilder( ConfigurationLoader::class )
-			->setMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
+			->onlyMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
 			->getMockForAbstractClass();
 		$configurationLoader->method( 'loadTaskTypes' )
 			->willReturn( [
@@ -56,7 +56,7 @@ class HomepageHooksTest extends MediaWikiIntegrationTestCase {
 	 */
 	public function testGetTaskTypesJson_error() {
 		$configurationLoader = $this->getMockBuilder( ConfigurationLoader::class )
-			->setMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
+			->onlyMethods( [ 'loadTaskTypes', 'setMessageLocalizer' ] )
 			->getMockForAbstractClass();
 		$configurationLoader->method( 'loadTaskTypes' )
 			->willReturn( StatusValue::newFatal( new RawMessage( 'foo' ) ) );
diff --git a/tests/phpunit/integration/MentorPageMentorManagerTest.php b/tests/phpunit/integration/MentorPageMentorManagerTest.php
index b861f78..f59fd2e 100644
--- a/tests/phpunit/integration/MentorPageMentorManagerTest.php
+++ b/tests/phpunit/integration/MentorPageMentorManagerTest.php
@@ -253,20 +253,20 @@ class MentorPageMentorManagerTest extends MediaWikiTestCase {
 	private function getMockWikiPageFactory( array $pages ) {
 		$wikiPageFactory = $this->getMockBuilder( WikiPageFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromTitle' ] )
+			->onlyMethods( [ 'newFromTitle' ] )
 			->getMock();
 		$wikiPageFactory->method( 'newFromTitle' )->willReturnCallback(
 			function ( Title $title ) use ( $pages ) {
 				[ $text, $mentors ] = $pages[$title->getPrefixedText()];
 				$wikiPage = $this->getMockBuilder( WikiPage::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'getContent', 'getParserOutput' ] )
+					->onlyMethods( [ 'getContent', 'getParserOutput' ] )
 					->getMock();
 				$content = $this->getMockBuilder( Content::class )
-					->setMethods( [ 'getText' ] )
+					->onlyMethods( [ 'getText' ] )
 					->getMockForAbstractClass();
 				$parserOutput = $this->getMockBuilder( ParserOutput::class )
-					->setMethods( [ 'getLinks' ] )
+					->onlyMethods( [ 'getLinks' ] )
 					->getMock();
 				$wikiPage->method( 'getContent' )->willReturn( $content );
 				$content->method( 'getText' )->willReturn( $text );
diff --git a/tests/phpunit/integration/SpecialHomepageTest.php b/tests/phpunit/integration/SpecialHomepageTest.php
index 7590a8f..3f776d1 100644
--- a/tests/phpunit/integration/SpecialHomepageTest.php
+++ b/tests/phpunit/integration/SpecialHomepageTest.php
@@ -147,7 +147,7 @@ class SpecialHomepageTest extends SpecialPageTestBase {
 	private function getContextForUserId( int $id ) {
 		$context = $this->getMockBuilder( RequestContext::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getConfig', 'getUser' ] )
+			->onlyMethods( [ 'getConfig', 'getUser' ] )
 			->getMock();
 		$config = new HashConfig( [ 'SecretKey' => '42' ] );
 		$context->method( 'getConfig' )->willReturn( $config );
diff --git a/tests/phpunit/unit/AqsEditInfoServiceTest.php b/tests/phpunit/unit/AqsEditInfoServiceTest.php
index c225996..f0f365d 100644
--- a/tests/phpunit/unit/AqsEditInfoServiceTest.php
+++ b/tests/phpunit/unit/AqsEditInfoServiceTest.php
@@ -68,14 +68,14 @@ class AqsEditInfoServiceTest extends MediaWikiUnitTestCase {
 
 		$request = $this->getMockBuilder( MWHttpRequest::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'execute', 'getContent' ] )
+			->onlyMethods( [ 'execute', 'getContent' ] )
 			->getMock();
 		$request->method( 'execute' )->willReturn( $result );
 		$request->method( 'getContent' )->willReturn( $content );
 
 		$requestFactory = $this->getMockBuilder( HttpRequestFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create', 'getUserAgent' ] )
+			->onlyMethods( [ 'create', 'getUserAgent' ] )
 			->getMock();
 		$requestFactory->method( 'getUserAgent' )->willReturn( 'Foo' );
 		$requestFactory->expects( $this->once() )
diff --git a/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php b/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php
index e0e1482..9080ae9 100644
--- a/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php
+++ b/tests/phpunit/unit/HomepageModules/SuggestedEditsTest.php
@@ -72,7 +72,7 @@ class SuggestedEditsTest extends \MediaWikiUnitTestCase {
 			->willReturn( true );
 		$requestMock = $this->getMockBuilder( WebRequest::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getCheck' ] )
+			->onlyMethods( [ 'getCheck' ] )
 			->getMock();
 		$requestMock->method( 'getCheck' )
 			->with( 'resetTaskCache' )
diff --git a/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php b/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php
index 8a91b82..23b2cef 100644
--- a/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php
+++ b/tests/phpunit/unit/LocalSearchTaskSuggesterTest.php
@@ -127,7 +127,7 @@ class LocalSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	 */
 	private function getMockSearchResultSet() {
 		return $this->getMockBuilder( ISearchResultSet::class )
-			->setMethods( [] )
+			->onlyMethods( [] )
 			->getMockForAbstractClass();
 	}
 
@@ -143,12 +143,12 @@ class LocalSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	) {
 		$factory = $this->getMockBuilder( SearchEngineFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create' ] )
+			->onlyMethods( [ 'create' ] )
 			->getMockForAbstractClass();
 
 		$searchEngine = $this->getMockBuilder( SearchEngine::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'setLimitOffset', 'setNamespaces', 'setShowSuggestion', 'getValidSorts',
+			->onlyMethods( [ 'setLimitOffset', 'setNamespaces', 'setShowSuggestion', 'getValidSorts',
 				'setSort', 'searchText' ] )
 			->getMockForAbstractClass();
 		$factory->expects( $this->once() )
diff --git a/tests/phpunit/unit/PageConfigurationLoaderTest.php b/tests/phpunit/unit/PageConfigurationLoaderTest.php
index d2df0c1..2597bf8 100644
--- a/tests/phpunit/unit/PageConfigurationLoaderTest.php
+++ b/tests/phpunit/unit/PageConfigurationLoaderTest.php
@@ -502,7 +502,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitleFactory( array $map, bool $allowOther = true ) {
 		$titleFactory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromText' ] )
+			->onlyMethods( [ 'newFromText' ] )
 			->getMock();
 		$titleFactory->method( 'newFromText' )->willReturnCallback(
 			function ( string $titleText, int $defaultNamespace = 0 ) use ( $map, $allowOther ) {
@@ -527,7 +527,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitle( string $titleText, int $namespace = 0 ) {
 		$title = $this->getMockBuilder( Title::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getNamespace', 'inNamespace', 'getDBkey' ] )
+			->onlyMethods( [ 'getNamespace', 'inNamespace', 'getDBkey' ] )
 			->getMock();
 		$title->method( 'getNamespace' )->willReturn( $namespace );
 		$title->method( 'inNamespace' )->willReturnCallback(
@@ -544,7 +544,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	 */
 	protected function getMockMessageLocalizer( array $customMessages = [] ) {
 		$localizer = $this->getMockBuilder( MessageLocalizer::class )
-			->setMethods( [ 'msg' ] )
+			->onlyMethods( [ 'msg' ] )
 			->getMockForAbstractClass();
 		$localizer->method( 'msg' )
 			->willReturnCallback( function ( $key, ...$params ) use ( $customMessages ) {
@@ -564,7 +564,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockWikiPageConfigLoader( $map ) {
 		$loader = $this->getMockBuilder( WikiPageConfigLoader::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'load' ] )
+			->onlyMethods( [ 'load' ] )
 			->getMock();
 		$loader->expects( $this->atMost( 1 ) )
 			->method( 'load' )
@@ -582,7 +582,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	 */
 	protected function getMockContext( array $customMessages = [] ) {
 		$context = $this->getMockBuilder( IContextSource::class )
-			->setMethods( [ 'msg' ] )
+			->onlyMethods( [ 'msg' ] )
 			->getMockForAbstractClass();
 		$context->method( 'msg' )->willReturnCallback( function ( $key ) use ( $customMessages ) {
 			if ( isset( $customMessages[$key] ) ) {
@@ -599,7 +599,7 @@ class PageConfigurationLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockCollation() {
 		$collation = $this->getMockBuilder( Collation::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getSortKey' ] )
+			->onlyMethods( [ 'getSortKey' ] )
 			->getMockForAbstractClass();
 		$collation->method( 'getSortKey' )->willReturnArgument( 0 );
 		return $collation;
diff --git a/tests/phpunit/unit/ProtectionFilterTest.php b/tests/phpunit/unit/ProtectionFilterTest.php
index 1f07714..7f3f037 100644
--- a/tests/phpunit/unit/ProtectionFilterTest.php
+++ b/tests/phpunit/unit/ProtectionFilterTest.php
@@ -70,7 +70,7 @@ class ProtectionFilterTest extends MediaWikiUnitTestCase {
 	private function getMockTitleFactory( array $map ) {
 		$factory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromLinkTarget' ] )
+			->onlyMethods( [ 'newFromLinkTarget' ] )
 			->getMock();
 		$factory->method( 'newFromLinkTarget' )->willReturnCallback(
 			function ( LinkTarget $target ) use ( $map ) {
@@ -78,7 +78,7 @@ class ProtectionFilterTest extends MediaWikiUnitTestCase {
 				$data = $map[$target->getNamespace() . ':' . $target->getDBkey()];
 				$title = $this->getMockBuilder( Title::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'exists', 'isProtected' ] )
+					->onlyMethods( [ 'exists', 'isProtected' ] )
 					->getMock();
 				$title->method( 'exists' )->willReturn( $data[0] );
 				$title->method( 'isProtected' )->willReturn( $data[1] );
@@ -93,7 +93,7 @@ class ProtectionFilterTest extends MediaWikiUnitTestCase {
 	protected function getMockLinkBatchFactory() {
 		return $this->getMockBuilder( LinkBatchFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newLinkBatch' ] )
+			->onlyMethods( [ 'newLinkBatch' ] )
 			->getMock();
 	}
 
diff --git a/tests/phpunit/unit/QuestionPosterTest.php b/tests/phpunit/unit/QuestionPosterTest.php
index 722fda5..ac91f2d 100644
--- a/tests/phpunit/unit/QuestionPosterTest.php
+++ b/tests/phpunit/unit/QuestionPosterTest.php
@@ -23,7 +23,7 @@ class QuestionPosterTest extends MediaWikiUnitTestCase {
 	private function getQuestionPoster( $methods ) {
 		$questionPoster = $this->getMockBuilder( QuestionPoster::class )
 			->disableOriginalConstructor()
-			->setMethods( $methods )
+			->onlyMethods( $methods )
 			->getMockForAbstractClass();
 		$accessWrapper = TestingAccessWrapper::newFromObject( $questionPoster );
 
@@ -94,11 +94,11 @@ class QuestionPosterTest extends MediaWikiUnitTestCase {
 		$questionPoster->method( 'getTargetContentModel' )->willReturn( CONTENT_MODEL_WIKITEXT );
 		$pageUpdaterMock = $this->getMockBuilder( PageUpdater::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'grabParentRevision' ] )
+			->onlyMethods( [ 'grabParentRevision' ] )
 			->getMock();
 		$revisionRecordMock = $this->getMockBuilder( RevisionRecord::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getId' ] )
+			->onlyMethods( [ 'getId' ] )
 			->getMockForAbstractClass();
 		$revisionRecordMock->method( 'getId' )
 			->willReturn( 0 );
diff --git a/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php b/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php
index 3bab689..3f44ae7 100644
--- a/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php
+++ b/tests/phpunit/unit/RemoteSearchTaskSuggesterTest.php
@@ -658,7 +658,7 @@ class RemoteSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	protected function getMockRequestFactory( array $requests ) {
 		$requestFactory = $this->getMockBuilder( HttpRequestFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create', 'getUserAgent' ] )
+			->onlyMethods( [ 'create', 'getUserAgent' ] )
 			->getMock();
 		$requestFactory->method( 'getUserAgent' )->willReturn( 'Foo' );
 
@@ -696,7 +696,7 @@ class RemoteSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 
 				$request = $this->getMockBuilder( MWHttpRequest::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'execute', 'getContent' ] )
+					->onlyMethods( [ 'execute', 'getContent' ] )
 					->getMock();
 				$request->method( 'execute' )->willReturn( $status );
 				$request->method( 'getContent' )->willReturn( $response );
@@ -711,12 +711,12 @@ class RemoteSearchTaskSuggesterTest extends MediaWikiUnitTestCase {
 	protected function getMockTitleFactory() {
 		$titleFactory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromText' ] )
+			->onlyMethods( [ 'newFromText' ] )
 			->getMock();
 		$titleFactory->method( 'newFromText' )->willReturnCallback( function ( $dbKey, $ns ) {
 			$title = $this->getMockBuilder( Title::class )
 				->disableOriginalConstructor()
-				->setMethods( [ 'getNamespace', 'getDBkey' ] )
+				->onlyMethods( [ 'getNamespace', 'getDBkey' ] )
 				->getMock();
 			$title->method( 'getNamespace' )->willReturn( $ns );
 			$title->method( 'getDBkey' )->willReturn( $dbKey );
diff --git a/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php b/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php
index f50286e..19d8347 100644
--- a/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php
+++ b/tests/phpunit/unit/SearchTaskSuggesterFactoryTest.php
@@ -18,7 +18,7 @@ abstract class SearchTaskSuggesterFactoryTest extends MediaWikiUnitTestCase {
 	public function provideCreate() {
 		$error = $this->getMockBuilder( Status::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getWikiText' ] )
+			->onlyMethods( [ 'getWikiText' ] )
 			->getMock();
 		$error->method( 'getWikiText' )->willReturn( 'foo' );
 		return [
@@ -52,7 +52,7 @@ abstract class SearchTaskSuggesterFactoryTest extends MediaWikiUnitTestCase {
 	protected function getNewcomerTasksConfigurationLoader( $taskTypes, $topics ) {
 		$configurationLoader = $this->getMockBuilder( ConfigurationLoader::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'loadTaskTypes', 'loadTopics', 'setMessageLocalizer' ] )
+			->onlyMethods( [ 'loadTaskTypes', 'loadTopics', 'setMessageLocalizer' ] )
 			->getMockForAbstractClass();
 		$configurationLoader->method( 'loadTaskTypes' )->willReturn( $taskTypes );
 		$configurationLoader->method( 'loadTopics' )->willReturn( $topics );
diff --git a/tests/phpunit/unit/SiteNoticeGeneratorTest.php b/tests/phpunit/unit/SiteNoticeGeneratorTest.php
index 7a6b57d..f2abb9b 100644
--- a/tests/phpunit/unit/SiteNoticeGeneratorTest.php
+++ b/tests/phpunit/unit/SiteNoticeGeneratorTest.php
@@ -311,7 +311,7 @@ class SiteNoticeGeneratorTest extends MediaWikiUnitTestCase {
 
 		$userMock = $this->getMockBuilder( \User::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getId', 'getName', 'getOption' ] )
+			->onlyMethods( [ 'getId', 'getName', 'getOption' ] )
 			->getMock();
 		// This will make user settings update job fail, but we don't care about that.
 		$userMock->method( 'getId' )
diff --git a/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php b/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php
index 5f6521e..e58ac4e 100644
--- a/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php
+++ b/tests/phpunit/unit/StaticTaskSuggesterFactoryTest.php
@@ -33,7 +33,7 @@ class StaticTaskSuggesterFactoryTest extends MediaWikiUnitTestCase {
 
 		$error = $this->getMockBuilder( Status::class )
 			->setConstructorArgs( [] )
-			->setMethods( [ 'getWikiText' ] )
+			->onlyMethods( [ 'getWikiText' ] )
 			->getMock();
 		// avoid triggering service loading when the factory tries to log the error
 		$error->method( 'getWikiText' )->willReturn( 'Test error' );
diff --git a/tests/phpunit/unit/TopicTest.php b/tests/phpunit/unit/TopicTest.php
index a70e36f..bbadf16 100644
--- a/tests/phpunit/unit/TopicTest.php
+++ b/tests/phpunit/unit/TopicTest.php
@@ -14,7 +14,7 @@ class TopicTest extends MediaWikiUnitTestCase {
 
 	public function testTopic() {
 		$fakeContext = $this->getMockBuilder( MessageLocalizer::class )
-			->setMethods( [ 'msg' ] )
+			->onlyMethods( [ 'msg' ] )
 			->getMockForAbstractClass();
 		$fakeContext->method( 'msg' )->willReturnCallback( function ( $id ) {
 			return $this->getMockMessage( $id );
diff --git a/tests/phpunit/unit/WelcomeSurveyTest.php b/tests/phpunit/unit/WelcomeSurveyTest.php
index dbabbd2..4ae7d2f 100644
--- a/tests/phpunit/unit/WelcomeSurveyTest.php
+++ b/tests/phpunit/unit/WelcomeSurveyTest.php
@@ -21,7 +21,7 @@ class WelcomeSurveyTest extends MediaWikiUnitTestCase {
 	public function testConstruct() {
 		$configMock = $this->getMockBuilder( Config::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'get', 'has' ] )
+			->onlyMethods( [ 'get', 'has' ] )
 			->getMock();
 		$contextMock = $this->getMockBuilder( RequestContext::class )
 			->disableOriginalConstructor()
diff --git a/tests/phpunit/unit/WikiPageConfigLoaderTest.php b/tests/phpunit/unit/WikiPageConfigLoaderTest.php
index 20bfa3e..258d28d 100644
--- a/tests/phpunit/unit/WikiPageConfigLoaderTest.php
+++ b/tests/phpunit/unit/WikiPageConfigLoaderTest.php
@@ -159,7 +159,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	public function testSetCache() {
 		$cache = $this->getMockBuilder( BagOStuff::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'get' ] )
+			->onlyMethods( [ 'get' ] )
 			->getMockForAbstractClass();
 		$cache->expects( $this->once() )
 			->method( 'get' )
@@ -192,7 +192,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitle( $url, $titleText, $isExternal = true ) {
 		$title = $this->getMockBuilder( Title::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getFullURL', 'getNamespace', 'getDBKey', 'isExternal' ] )
+			->onlyMethods( [ 'getFullURL', 'getNamespace', 'getDBKey', 'isExternal' ] )
 			->getMock();
 		$title->method( 'isExternal' )->willReturn( $isExternal );
 		$title->method( 'getFullURL' )->willReturn( $url );
@@ -216,14 +216,14 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 
 		$request = $this->getMockBuilder( MWHttpRequest::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'execute', 'getContent' ] )
+			->onlyMethods( [ 'execute', 'getContent' ] )
 			->getMock();
 		$request->method( 'execute' )->willReturn( $result );
 		$request->method( 'getContent' )->willReturn( $content );
 
 		$requestFactory = $this->getMockBuilder( HttpRequestFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'create', 'getUserAgent' ] )
+			->onlyMethods( [ 'create', 'getUserAgent' ] )
 			->getMock();
 		$requestFactory->method( 'getUserAgent' )->willReturn( 'Foo' );
 		$requestFactory->expects( $this->exactly( $invokeCount ) )
@@ -243,7 +243,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockRevisionLookup( LinkTarget $expectedTitle, $content, $invokeCount = 1 ) {
 		$revisionLookup = $this->getMockBuilder( RevisionLookup::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getRevisionByTitle' ] )
+			->onlyMethods( [ 'getRevisionByTitle' ] )
 			->getMockForAbstractClass();
 		$revisionLookup->expects( $this->exactly( $invokeCount ) )
 			->method( 'getRevisionByTitle' )
@@ -256,7 +256,7 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 				}
 				$revision = $this->getMockBuilder( RevisionRecord::class )
 					->disableOriginalConstructor()
-					->setMethods( [ 'getContent' ] )
+					->onlyMethods( [ 'getContent' ] )
 					->getMockForAbstractClass();
 				$revision->expects( $this->once() )
 					->method( 'getContent' )
@@ -276,11 +276,11 @@ class WikiPageConfigLoaderTest extends MediaWikiUnitTestCase {
 	protected function getMockTitleFactory( $fullUrl, $localUrl, $isExternal ) {
 		$titleFactory = $this->getMockBuilder( TitleFactory::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'newFromLinkTarget', 'makeTitle' ] )
+			->onlyMethods( [ 'newFromLinkTarget', 'makeTitle' ] )
 			->getMock();
 		$title = $this->getMockBuilder( Title::class )
 			->disableOriginalConstructor()
-			->setMethods( [ 'getFullURL', 'getLocalURL', 'isExternal' ] )
+			->onlyMethods( [ 'getFullURL', 'getLocalURL', 'isExternal' ] )
 			->getMock();
 		$titleFactory->method( 'newFromLinkTarget' )
 			->willReturn( $title );
-- 
2.20.1

composer dependencies

Development dependencies

npm dependencies

Development dependencies

Logs

Source code is licensed under the AGPL.