diff --git a/CI/minify.mjs b/CI/minify.mjs
index 1993241b8fa09a278f2fc4aaf89d781b25cc8acb..66a21abcf4ae8003adc7d171332c209214eefbb6 100644
--- a/CI/minify.mjs
+++ b/CI/minify.mjs
@@ -1,7 +1,6 @@
 import {readdirSync, readFileSync, writeFileSync} from 'node:fs';
-import {minify} from 'terser';
+import {transform} from 'esbuild';
 
-const minifyCache = {};
 minFold('generated/npm/browser/');
 minFold('generated/npm/nodejs/');
 
@@ -9,17 +8,7 @@ async function minFold(folder) {
 	readdirSync(folder).forEach(async fileName => {
 		if (!fileName.includes('.mjs')) return;
 		const orgContent = readFileSync(folder + fileName, 'utf8').replace(/import '[^ ']+';/g,'');
-		const minified = await minify(orgContent, {
-			toplevel: true,
-			ecma: 2020,
-			nameCache: minifyCache,
-			compress: {
-				passes: 2
-			},
-			format: {
-				comments: false
-			}
-		});
+		const minified = await transform(orgContent, { minify: true, treeShaking:true, target: "esnext", legalComments:'none', format: 'esm' });
 		writeFileSync(folder + fileName, minified.code);
 	});
 }
diff --git a/package-lock.json b/package-lock.json
index 52ef04a92aad1ca3976ec880a74bbedd5df3dfa3..52f146d1bba64eacb76ca36a58a6e877826b5697 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,15 +23,15 @@
 				"c8": "^7.12.0",
 				"chokidar-cli": "^3.0.0",
 				"es6-plato": "https://github.com/1000i100/es6-plato#master",
+				"esbuild": "^0.15.15",
 				"eslint-plugin-ava": "^13.2.0",
 				"eslint-plugin-promise": "^6.1.1",
-				"eslint-plugin-unicorn": "^44.0.2",
+				"eslint-plugin-unicorn": "^45.0.0",
 				"jscpd": "^3.5.1",
 				"mkdirp": "^1.0.4",
 				"npm-run-all": "^4.1.5",
-				"rollup": "^3.3.0",
-				"terser": "^5.15.1",
-				"xo": "^0.52.4"
+				"rollup": "^3.4.0",
+				"xo": "^0.53.1"
 			}
 		},
 		"node_modules/@babel/code-frame": {
@@ -176,10 +176,42 @@
 				"node": ">=0.1.90"
 			}
 		},
+		"node_modules/@esbuild/android-arm": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
+			"integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
+			"cpu": [
+				"arm"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"android"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/@esbuild/linux-loong64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
+			"integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
+			"cpu": [
+				"loong64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
 		"node_modules/@eslint/eslintrc": {
-			"version": "1.3.2",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz",
-			"integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==",
+			"version": "1.3.3",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
+			"integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
 			"dev": true,
 			"dependencies": {
 				"ajv": "^6.12.4",
@@ -200,29 +232,19 @@
 			}
 		},
 		"node_modules/@humanwhocodes/config-array": {
-			"version": "0.10.7",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
-			"integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
+			"version": "0.11.7",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz",
+			"integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==",
 			"dev": true,
 			"dependencies": {
 				"@humanwhocodes/object-schema": "^1.2.1",
 				"debug": "^4.1.1",
-				"minimatch": "^3.0.4"
+				"minimatch": "^3.0.5"
 			},
 			"engines": {
 				"node": ">=10.10.0"
 			}
 		},
-		"node_modules/@humanwhocodes/gitignore-to-minimatch": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
-			"integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
-			"dev": true,
-			"funding": {
-				"type": "github",
-				"url": "https://github.com/sponsors/nzakas"
-			}
-		},
 		"node_modules/@humanwhocodes/module-importer": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -256,6 +278,7 @@
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
 			"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
 			"dev": true,
+			"peer": true,
 			"dependencies": {
 				"@jridgewell/set-array": "^1.0.1",
 				"@jridgewell/sourcemap-codec": "^1.4.10",
@@ -279,6 +302,7 @@
 			"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
 			"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
 			"dev": true,
+			"peer": true,
 			"engines": {
 				"node": ">=6.0.0"
 			}
@@ -288,6 +312,7 @@
 			"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
 			"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
 			"dev": true,
+			"peer": true,
 			"dependencies": {
 				"@jridgewell/gen-mapping": "^0.3.0",
 				"@jridgewell/trace-mapping": "^0.3.9"
@@ -1183,7 +1208,8 @@
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
 			"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-			"dev": true
+			"dev": true,
+			"peer": true
 		},
 		"node_modules/builtin-modules": {
 			"version": "3.3.0",
@@ -1359,42 +1385,42 @@
 			}
 		},
 		"node_modules/camelcase": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-			"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz",
+			"integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=14.16"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/camelcase-keys": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
-			"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
+			"version": "8.0.2",
+			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz",
+			"integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==",
 			"dev": true,
 			"dependencies": {
-				"camelcase": "^6.3.0",
-				"map-obj": "^4.1.0",
-				"quick-lru": "^5.1.1",
-				"type-fest": "^1.2.1"
+				"camelcase": "^7.0.0",
+				"map-obj": "^4.3.0",
+				"quick-lru": "^6.1.1",
+				"type-fest": "^2.13.0"
 			},
 			"engines": {
-				"node": ">=12"
+				"node": ">=14.16"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/camelcase-keys/node_modules/type-fest": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-			"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+			"version": "2.19.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+			"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=12.20"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
@@ -2013,12 +2039,6 @@
 			"integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
 			"dev": true
 		},
-		"node_modules/commondir": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-			"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
-			"dev": true
-		},
 		"node_modules/concat-map": {
 			"version": "0.0.1",
 			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2133,9 +2153,9 @@
 			}
 		},
 		"node_modules/cosmiconfig": {
-			"version": "7.0.1",
-			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-			"integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+			"integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
 			"dev": true,
 			"dependencies": {
 				"@types/parse-json": "^4.0.0",
@@ -2218,21 +2238,21 @@
 			"dev": true
 		},
 		"node_modules/decamelize": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
-			"integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz",
+			"integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/decamelize-keys": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
-			"integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+			"integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
 			"dev": true,
 			"dependencies": {
 				"decamelize": "^1.1.0",
@@ -2240,6 +2260,9 @@
 			},
 			"engines": {
 				"node": ">=0.10.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/decamelize-keys/node_modules/decamelize": {
@@ -3108,6 +3131,363 @@
 				"which": "bin/which"
 			}
 		},
+		"node_modules/esbuild": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
+			"integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
+			"dev": true,
+			"hasInstallScript": true,
+			"bin": {
+				"esbuild": "bin/esbuild"
+			},
+			"engines": {
+				"node": ">=12"
+			},
+			"optionalDependencies": {
+				"@esbuild/android-arm": "0.15.15",
+				"@esbuild/linux-loong64": "0.15.15",
+				"esbuild-android-64": "0.15.15",
+				"esbuild-android-arm64": "0.15.15",
+				"esbuild-darwin-64": "0.15.15",
+				"esbuild-darwin-arm64": "0.15.15",
+				"esbuild-freebsd-64": "0.15.15",
+				"esbuild-freebsd-arm64": "0.15.15",
+				"esbuild-linux-32": "0.15.15",
+				"esbuild-linux-64": "0.15.15",
+				"esbuild-linux-arm": "0.15.15",
+				"esbuild-linux-arm64": "0.15.15",
+				"esbuild-linux-mips64le": "0.15.15",
+				"esbuild-linux-ppc64le": "0.15.15",
+				"esbuild-linux-riscv64": "0.15.15",
+				"esbuild-linux-s390x": "0.15.15",
+				"esbuild-netbsd-64": "0.15.15",
+				"esbuild-openbsd-64": "0.15.15",
+				"esbuild-sunos-64": "0.15.15",
+				"esbuild-windows-32": "0.15.15",
+				"esbuild-windows-64": "0.15.15",
+				"esbuild-windows-arm64": "0.15.15"
+			}
+		},
+		"node_modules/esbuild-android-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
+			"integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"android"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-android-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
+			"integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
+			"cpu": [
+				"arm64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"android"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-darwin-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
+			"integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"darwin"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-darwin-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
+			"integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
+			"cpu": [
+				"arm64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"darwin"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-freebsd-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
+			"integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"freebsd"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-freebsd-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
+			"integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
+			"cpu": [
+				"arm64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"freebsd"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-32": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
+			"integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
+			"cpu": [
+				"ia32"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
+			"integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-arm": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
+			"integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
+			"cpu": [
+				"arm"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
+			"integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
+			"cpu": [
+				"arm64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-mips64le": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
+			"integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
+			"cpu": [
+				"mips64el"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-ppc64le": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
+			"integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
+			"cpu": [
+				"ppc64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-riscv64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
+			"integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
+			"cpu": [
+				"riscv64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-linux-s390x": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
+			"integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
+			"cpu": [
+				"s390x"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"linux"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-netbsd-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
+			"integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"netbsd"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-openbsd-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
+			"integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"openbsd"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-sunos-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
+			"integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"sunos"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-windows-32": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
+			"integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
+			"cpu": [
+				"ia32"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"win32"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-windows-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
+			"integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
+			"cpu": [
+				"x64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"win32"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/esbuild-windows-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
+			"integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
+			"cpu": [
+				"arm64"
+			],
+			"dev": true,
+			"optional": true,
+			"os": [
+				"win32"
+			],
+			"engines": {
+				"node": ">=12"
+			}
+		},
 		"node_modules/escalade": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -3173,15 +3553,15 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.24.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz",
-			"integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==",
+			"version": "8.28.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz",
+			"integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==",
 			"dev": true,
 			"dependencies": {
-				"@eslint/eslintrc": "^1.3.2",
-				"@humanwhocodes/config-array": "^0.10.5",
-				"@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
+				"@eslint/eslintrc": "^1.3.3",
+				"@humanwhocodes/config-array": "^0.11.6",
 				"@humanwhocodes/module-importer": "^1.0.1",
+				"@nodelib/fs.walk": "^1.2.8",
 				"ajv": "^6.10.0",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
@@ -3197,14 +3577,14 @@
 				"fast-deep-equal": "^3.1.3",
 				"file-entry-cache": "^6.0.1",
 				"find-up": "^5.0.0",
-				"glob-parent": "^6.0.1",
+				"glob-parent": "^6.0.2",
 				"globals": "^13.15.0",
-				"globby": "^11.1.0",
 				"grapheme-splitter": "^1.0.4",
 				"ignore": "^5.2.0",
 				"import-fresh": "^3.0.0",
 				"imurmurhash": "^0.1.4",
 				"is-glob": "^4.0.0",
+				"is-path-inside": "^3.0.3",
 				"js-sdsl": "^4.1.4",
 				"js-yaml": "^4.1.0",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
@@ -3241,9 +3621,9 @@
 			}
 		},
 		"node_modules/eslint-config-xo": {
-			"version": "0.42.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.42.0.tgz",
-			"integrity": "sha512-HIfd+AM6tHFoaZ/NXYDV3Mr/CJrAj/DoP6IOYt1/v+90XtCwVYOfW7LXbRDYDmhQMzT16h7eqPRcex72waRqdA==",
+			"version": "0.43.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.43.1.tgz",
+			"integrity": "sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==",
 			"dev": true,
 			"dependencies": {
 				"confusing-browser-globals": "1.0.11"
@@ -3255,7 +3635,7 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.14.0"
+				"eslint": ">=8.27.0"
 			}
 		},
 		"node_modules/eslint-formatter-pretty": {
@@ -3631,19 +4011,19 @@
 			"dev": true
 		},
 		"node_modules/eslint-plugin-n": {
-			"version": "15.3.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.3.0.tgz",
-			"integrity": "sha512-IyzPnEWHypCWasDpxeJnim60jhlumbmq0pubL6IOcnk8u2y53s5QfT8JnXy7skjHJ44yWHRb11PLtDHuu1kg/Q==",
+			"version": "15.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.5.1.tgz",
+			"integrity": "sha512-kAd+xhZm7brHoFLzKLB7/FGRFJNg/srmv67mqb7tto22rpr4wv/LV6RuXzAfv3jbab7+k1wi42PsIhGviywaaw==",
 			"dev": true,
 			"dependencies": {
 				"builtins": "^5.0.1",
 				"eslint-plugin-es": "^4.1.0",
 				"eslint-utils": "^3.0.0",
 				"ignore": "^5.1.1",
-				"is-core-module": "^2.10.0",
+				"is-core-module": "^2.11.0",
 				"minimatch": "^3.1.2",
 				"resolve": "^1.22.1",
-				"semver": "^7.3.7"
+				"semver": "^7.3.8"
 			},
 			"engines": {
 				"node": ">=12.22.0"
@@ -3704,24 +4084,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"version": "44.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz",
-			"integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==",
+			"version": "45.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.0.tgz",
+			"integrity": "sha512-iP8cMRxXKHonKioOhnCoCcqVhoqhAp6rB+nsoLjXFDxTHz3btWMAp8xwzjHA0B1K6YV/U/Yvqn1bUXZt8sJPuQ==",
 			"dev": true,
 			"dependencies": {
 				"@babel/helper-validator-identifier": "^7.19.1",
-				"ci-info": "^3.4.0",
+				"ci-info": "^3.6.1",
 				"clean-regexp": "^1.0.0",
 				"eslint-utils": "^3.0.0",
 				"esquery": "^1.4.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.0",
+				"jsesc": "3.0.2",
 				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
 				"regexp-tree": "^0.1.24",
+				"regjsparser": "0.9.1",
 				"safe-regex": "^2.1.1",
-				"semver": "^7.3.7",
+				"semver": "^7.3.8",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
@@ -3731,7 +4113,7 @@
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.23.1"
+				"eslint": ">=8.28.0"
 			}
 		},
 		"node_modules/eslint-plugin-unicorn/node_modules/indent-string": {
@@ -3868,24 +4250,13 @@
 				"node": ">=10.13.0"
 			}
 		},
-		"node_modules/eslint/node_modules/globby": {
-			"version": "11.1.0",
-			"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-			"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+		"node_modules/eslint/node_modules/is-path-inside": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+			"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
 			"dev": true,
-			"dependencies": {
-				"array-union": "^2.1.0",
-				"dir-glob": "^3.0.1",
-				"fast-glob": "^3.2.9",
-				"ignore": "^5.2.0",
-				"merge2": "^1.4.1",
-				"slash": "^3.0.0"
-			},
 			"engines": {
-				"node": ">=10"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/sindresorhus"
+				"node": ">=8"
 			}
 		},
 		"node_modules/eslint/node_modules/strip-ansi": {
@@ -4146,84 +4517,116 @@
 			}
 		},
 		"node_modules/find-cache-dir": {
-			"version": "3.3.2",
-			"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
-			"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+			"integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
 			"dev": true,
 			"dependencies": {
-				"commondir": "^1.0.1",
-				"make-dir": "^3.0.2",
-				"pkg-dir": "^4.1.0"
+				"common-path-prefix": "^3.0.0",
+				"pkg-dir": "^7.0.0"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": ">=14.16"
 			},
 			"funding": {
-				"url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/find-cache-dir/node_modules/find-up": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-			"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+			"version": "6.3.0",
+			"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+			"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
 			"dev": true,
 			"dependencies": {
-				"locate-path": "^5.0.0",
-				"path-exists": "^4.0.0"
+				"locate-path": "^7.1.0",
+				"path-exists": "^5.0.0"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/find-cache-dir/node_modules/locate-path": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-			"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz",
+			"integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==",
 			"dev": true,
 			"dependencies": {
-				"p-locate": "^4.1.0"
+				"p-locate": "^6.0.0"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/find-cache-dir/node_modules/p-limit": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-			"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+			"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
 			"dev": true,
 			"dependencies": {
-				"p-try": "^2.0.0"
+				"yocto-queue": "^1.0.0"
 			},
 			"engines": {
-				"node": ">=6"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/find-cache-dir/node_modules/p-locate": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-			"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+			"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
 			"dev": true,
 			"dependencies": {
-				"p-limit": "^2.2.0"
+				"p-limit": "^4.0.0"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/find-cache-dir/node_modules/path-exists": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+			"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+			"dev": true,
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 			}
 		},
 		"node_modules/find-cache-dir/node_modules/pkg-dir": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-			"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
+			"integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
 			"dev": true,
 			"dependencies": {
-				"find-up": "^4.0.0"
+				"find-up": "^6.3.0"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": ">=14.16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/find-cache-dir/node_modules/yocto-queue": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+			"integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+			"dev": true,
+			"engines": {
+				"node": ">=12.20"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
 		"node_modules/find-root": {
@@ -4310,6 +4713,20 @@
 			"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
 			"dev": true
 		},
+		"node_modules/fsevents": {
+			"version": "2.3.2",
+			"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+			"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+			"dev": true,
+			"hasInstallScript": true,
+			"optional": true,
+			"os": [
+				"darwin"
+			],
+			"engines": {
+				"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+			}
+		},
 		"node_modules/function-bind": {
 			"version": "1.1.1",
 			"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -5065,9 +5482,9 @@
 			}
 		},
 		"node_modules/is-core-module": {
-			"version": "2.10.0",
-			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
-			"integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+			"version": "2.11.0",
+			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+			"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
 			"dev": true,
 			"dependencies": {
 				"has": "^1.0.3"
@@ -5598,6 +6015,18 @@
 				"jscpd": "bin/jscpd"
 			}
 		},
+		"node_modules/jsesc": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+			"integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+			"dev": true,
+			"bin": {
+				"jsesc": "bin/jsesc"
+			},
+			"engines": {
+				"node": ">=6"
+			}
+		},
 		"node_modules/json-parse-better-errors": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -6095,91 +6524,244 @@
 			"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
 			"dev": true,
 			"engines": {
-				"node": ">=12"
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/md5-hex": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz",
+			"integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==",
+			"dev": true,
+			"dependencies": {
+				"blueimp-md5": "^2.10.0"
+			},
+			"engines": {
+				"node": ">=8"
+			}
+		},
+		"node_modules/media-typer": {
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+			"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.6"
+			}
+		},
+		"node_modules/mem": {
+			"version": "9.0.2",
+			"resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz",
+			"integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==",
+			"dev": true,
+			"dependencies": {
+				"map-age-cleaner": "^0.1.3",
+				"mimic-fn": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=12.20"
+			},
+			"funding": {
+				"url": "https://github.com/sindresorhus/mem?sponsor=1"
+			}
+		},
+		"node_modules/memory-fs": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
+			"integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==",
+			"dev": true
+		},
+		"node_modules/memorystream": {
+			"version": "0.3.1",
+			"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+			"integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+			"dev": true,
+			"engines": {
+				"node": ">= 0.10.0"
+			}
+		},
+		"node_modules/meow": {
+			"version": "11.0.0",
+			"resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz",
+			"integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==",
+			"dev": true,
+			"dependencies": {
+				"@types/minimist": "^1.2.2",
+				"camelcase-keys": "^8.0.2",
+				"decamelize": "^6.0.0",
+				"decamelize-keys": "^1.1.0",
+				"hard-rejection": "^2.1.0",
+				"minimist-options": "4.1.0",
+				"normalize-package-data": "^4.0.1",
+				"read-pkg-up": "^9.1.0",
+				"redent": "^4.0.0",
+				"trim-newlines": "^4.0.2",
+				"type-fest": "^3.1.0",
+				"yargs-parser": "^21.1.1"
+			},
+			"engines": {
+				"node": ">=14.16"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/meow/node_modules/find-up": {
+			"version": "6.3.0",
+			"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+			"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+			"dev": true,
+			"dependencies": {
+				"locate-path": "^7.1.0",
+				"path-exists": "^5.0.0"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/meow/node_modules/hosted-git-info": {
+			"version": "5.2.1",
+			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz",
+			"integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==",
+			"dev": true,
+			"dependencies": {
+				"lru-cache": "^7.5.1"
+			},
+			"engines": {
+				"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+			}
+		},
+		"node_modules/meow/node_modules/locate-path": {
+			"version": "7.1.1",
+			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz",
+			"integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==",
+			"dev": true,
+			"dependencies": {
+				"p-locate": "^6.0.0"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
+			}
+		},
+		"node_modules/meow/node_modules/lru-cache": {
+			"version": "7.14.1",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
+			"integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==",
+			"dev": true,
+			"engines": {
+				"node": ">=12"
+			}
+		},
+		"node_modules/meow/node_modules/normalize-package-data": {
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz",
+			"integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==",
+			"dev": true,
+			"dependencies": {
+				"hosted-git-info": "^5.0.0",
+				"is-core-module": "^2.8.1",
+				"semver": "^7.3.5",
+				"validate-npm-package-license": "^3.0.4"
+			},
+			"engines": {
+				"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+			}
+		},
+		"node_modules/meow/node_modules/p-limit": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+			"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+			"dev": true,
+			"dependencies": {
+				"yocto-queue": "^1.0.0"
+			},
+			"engines": {
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/md5-hex": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz",
-			"integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==",
+		"node_modules/meow/node_modules/p-locate": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+			"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
 			"dev": true,
 			"dependencies": {
-				"blueimp-md5": "^2.10.0"
+				"p-limit": "^4.0.0"
 			},
 			"engines": {
-				"node": ">=8"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/media-typer": {
-			"version": "0.3.0",
-			"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-			"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+		"node_modules/meow/node_modules/path-exists": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+			"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
 			"dev": true,
 			"engines": {
-				"node": ">= 0.6"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
 			}
 		},
-		"node_modules/mem": {
-			"version": "9.0.2",
-			"resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz",
-			"integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==",
+		"node_modules/meow/node_modules/read-pkg": {
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz",
+			"integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==",
 			"dev": true,
 			"dependencies": {
-				"map-age-cleaner": "^0.1.3",
-				"mimic-fn": "^4.0.0"
+				"@types/normalize-package-data": "^2.4.1",
+				"normalize-package-data": "^3.0.2",
+				"parse-json": "^5.2.0",
+				"type-fest": "^2.0.0"
 			},
 			"engines": {
 				"node": ">=12.20"
 			},
 			"funding": {
-				"url": "https://github.com/sindresorhus/mem?sponsor=1"
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/memory-fs": {
-			"version": "0.2.0",
-			"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
-			"integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==",
-			"dev": true
-		},
-		"node_modules/memorystream": {
-			"version": "0.3.1",
-			"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
-			"integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+		"node_modules/meow/node_modules/read-pkg-up": {
+			"version": "9.1.0",
+			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz",
+			"integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==",
 			"dev": true,
+			"dependencies": {
+				"find-up": "^6.3.0",
+				"read-pkg": "^7.1.0",
+				"type-fest": "^2.5.0"
+			},
 			"engines": {
-				"node": ">= 0.10.0"
+				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/meow": {
-			"version": "10.1.5",
-			"resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
-			"integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
+		"node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": {
+			"version": "2.19.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+			"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
 			"dev": true,
-			"dependencies": {
-				"@types/minimist": "^1.2.2",
-				"camelcase-keys": "^7.0.0",
-				"decamelize": "^5.0.0",
-				"decamelize-keys": "^1.1.0",
-				"hard-rejection": "^2.1.0",
-				"minimist-options": "4.1.0",
-				"normalize-package-data": "^3.0.2",
-				"read-pkg-up": "^8.0.0",
-				"redent": "^4.0.0",
-				"trim-newlines": "^4.0.2",
-				"type-fest": "^1.2.2",
-				"yargs-parser": "^20.2.9"
-			},
 			"engines": {
-				"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+				"node": ">=12.20"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/meow/node_modules/hosted-git-info": {
+		"node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": {
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
 			"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
@@ -6191,7 +6773,19 @@
 				"node": ">=10"
 			}
 		},
-		"node_modules/meow/node_modules/normalize-package-data": {
+		"node_modules/meow/node_modules/read-pkg/node_modules/lru-cache": {
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+			"dev": true,
+			"dependencies": {
+				"yallist": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
+		"node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": {
 			"version": "3.0.3",
 			"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
 			"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
@@ -6206,48 +6800,46 @@
 				"node": ">=10"
 			}
 		},
-		"node_modules/meow/node_modules/read-pkg": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
-			"integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
+		"node_modules/meow/node_modules/read-pkg/node_modules/type-fest": {
+			"version": "2.19.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+			"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
 			"dev": true,
-			"dependencies": {
-				"@types/normalize-package-data": "^2.4.0",
-				"normalize-package-data": "^3.0.2",
-				"parse-json": "^5.2.0",
-				"type-fest": "^1.0.1"
-			},
 			"engines": {
-				"node": ">=12"
+				"node": ">=12.20"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/meow/node_modules/read-pkg-up": {
-			"version": "8.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
-			"integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
+		"node_modules/meow/node_modules/type-fest": {
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz",
+			"integrity": "sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og==",
 			"dev": true,
-			"dependencies": {
-				"find-up": "^5.0.0",
-				"read-pkg": "^6.0.0",
-				"type-fest": "^1.0.1"
-			},
 			"engines": {
-				"node": ">=12"
+				"node": ">=14.16"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/meow/node_modules/type-fest": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-			"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+		"node_modules/meow/node_modules/yargs-parser": {
+			"version": "21.1.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+			"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=12"
+			}
+		},
+		"node_modules/meow/node_modules/yocto-queue": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+			"integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+			"dev": true,
+			"engines": {
+				"node": ">=12.20"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
@@ -7570,12 +8162,12 @@
 			]
 		},
 		"node_modules/quick-lru": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-			"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz",
+			"integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==",
 			"dev": true,
 			"engines": {
-				"node": ">=10"
+				"node": ">=12"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
@@ -7834,6 +8426,27 @@
 				"url": "https://github.com/sponsors/mysticatea"
 			}
 		},
+		"node_modules/regjsparser": {
+			"version": "0.9.1",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+			"integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+			"dev": true,
+			"dependencies": {
+				"jsesc": "~0.5.0"
+			},
+			"bin": {
+				"regjsparser": "bin/parser"
+			}
+		},
+		"node_modules/regjsparser/node_modules/jsesc": {
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+			"integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+			"dev": true,
+			"bin": {
+				"jsesc": "bin/jsesc"
+			}
+		},
 		"node_modules/remove-trailing-separator": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -8017,9 +8630,9 @@
 			}
 		},
 		"node_modules/rollup": {
-			"version": "3.3.0",
-			"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.3.0.tgz",
-			"integrity": "sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==",
+			"version": "3.4.0",
+			"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.4.0.tgz",
+			"integrity": "sha512-4g8ZrEFK7UbDvy3JF+d5bLiC8UKkS3n/27/cnVeESwB1LVPl6MoPL32/6+SCQ1vHTp6Mvp2veIHtwELhi+uXEw==",
 			"dev": true,
 			"bin": {
 				"rollup": "dist/bin/rollup"
@@ -8142,9 +8755,9 @@
 			"integrity": "sha512-NkkoREZSg/KbM+60R1xwAReTcJJBVbWmnorf5rksso+Q3zlNJofhk/Ty32FqpAyuHLLIduLz/T+DvEBs8EELHg=="
 		},
 		"node_modules/semver": {
-			"version": "7.3.7",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-			"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+			"version": "7.3.8",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+			"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
 			"dev": true,
 			"dependencies": {
 				"lru-cache": "^6.0.0"
@@ -8282,6 +8895,7 @@
 			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 			"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 			"dev": true,
+			"peer": true,
 			"engines": {
 				"node": ">=0.10.0"
 			}
@@ -8291,6 +8905,7 @@
 			"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
 			"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
 			"dev": true,
+			"peer": true,
 			"dependencies": {
 				"buffer-from": "^1.0.0",
 				"source-map": "^0.6.0"
@@ -8677,6 +9292,7 @@
 			"resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
 			"integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
 			"dev": true,
+			"peer": true,
 			"dependencies": {
 				"@jridgewell/source-map": "^0.3.2",
 				"acorn": "^8.5.0",
@@ -8729,7 +9345,8 @@
 			"version": "2.20.3",
 			"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
 			"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-			"dev": true
+			"dev": true,
+			"peer": true
 		},
 		"node_modules/test-exclude": {
 			"version": "6.0.0",
@@ -8926,9 +9543,9 @@
 			}
 		},
 		"node_modules/typescript": {
-			"version": "4.8.4",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
-			"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+			"version": "4.9.3",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz",
+			"integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==",
 			"dev": true,
 			"bin": {
 				"tsc": "bin/tsc",
@@ -9547,9 +10164,9 @@
 			}
 		},
 		"node_modules/xo": {
-			"version": "0.52.4",
-			"resolved": "https://registry.npmjs.org/xo/-/xo-0.52.4.tgz",
-			"integrity": "sha512-5K+2bSy+nPO1fE6TS5KydgqhZ5pyXvO1P6Rw98aflxHi2LFWoShLmDpJOCxSpIP5867LVOCdH/WO+7iXk6/WVQ==",
+			"version": "0.53.1",
+			"resolved": "https://registry.npmjs.org/xo/-/xo-0.53.1.tgz",
+			"integrity": "sha512-/2R8SPehv1UhiIqJ9uSvrAjslcoygICNsUlEb/Zf2V6rMtr7YCoggc6hlt6b/kbncpR989Roqt6AvEO779dFxw==",
 			"bundleDependencies": [
 				"@typescript-eslint/eslint-plugin",
 				"@typescript-eslint/parser",
@@ -9557,48 +10174,48 @@
 			],
 			"dev": true,
 			"dependencies": {
-				"@eslint/eslintrc": "^1.3.0",
-				"@typescript-eslint/eslint-plugin": "*",
-				"@typescript-eslint/parser": "*",
+				"@eslint/eslintrc": "^1.3.3",
+				"@typescript-eslint/eslint-plugin": "^5.43.0",
+				"@typescript-eslint/parser": "^5.43.0",
 				"arrify": "^3.0.0",
-				"cosmiconfig": "^7.0.1",
+				"cosmiconfig": "^7.1.0",
 				"define-lazy-prop": "^3.0.0",
-				"eslint": "^8.22.0",
+				"eslint": "^8.27.0",
 				"eslint-config-prettier": "^8.5.0",
-				"eslint-config-xo": "^0.42.0",
-				"eslint-config-xo-typescript": "*",
+				"eslint-config-xo": "^0.43.1",
+				"eslint-config-xo-typescript": "^0.55.0",
 				"eslint-formatter-pretty": "^4.1.0",
 				"eslint-import-resolver-webpack": "^0.13.2",
 				"eslint-plugin-ava": "^13.2.0",
 				"eslint-plugin-eslint-comments": "^3.2.0",
 				"eslint-plugin-import": "^2.26.0",
-				"eslint-plugin-n": "^15.2.5",
+				"eslint-plugin-n": "^15.5.1",
 				"eslint-plugin-no-use-extend-native": "^0.5.0",
-				"eslint-plugin-prettier": "^4.0.0",
-				"eslint-plugin-unicorn": "^42.0.0",
+				"eslint-plugin-prettier": "^4.2.1",
+				"eslint-plugin-unicorn": "^44.0.2",
 				"esm-utils": "^4.1.0",
-				"find-cache-dir": "^3.3.2",
+				"find-cache-dir": "^4.0.0",
 				"find-up": "^6.3.0",
 				"get-stdin": "^9.0.0",
-				"globby": "^13.1.1",
+				"globby": "^13.1.2",
 				"imurmurhash": "^0.1.4",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
 				"json5": "^2.2.1",
 				"lodash-es": "^4.17.21",
-				"meow": "^10.1.2",
+				"meow": "^11.0.0",
 				"micromatch": "^4.0.5",
 				"open-editor": "^4.0.0",
-				"prettier": "^2.6.2",
-				"semver": "^7.3.7",
-				"slash": "^4.0.0",
+				"prettier": "^2.7.1",
+				"semver": "^7.3.8",
+				"slash": "^5.0.0",
 				"to-absolute-glob": "^2.0.2",
-				"typescript": "^4.7.3"
+				"typescript": "^4.9.3"
 			},
 			"bin": {
 				"xo": "cli.js"
 			},
 			"engines": {
-				"node": ">=12.20"
+				"node": ">=14.16"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
@@ -9645,17 +10262,24 @@
 			"inBundle": true,
 			"license": "MIT"
 		},
+		"node_modules/xo/node_modules/@types/semver": {
+			"version": "7.3.13",
+			"dev": true,
+			"inBundle": true,
+			"license": "MIT"
+		},
 		"node_modules/xo/node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "5.39.0",
-				"@typescript-eslint/type-utils": "5.39.0",
-				"@typescript-eslint/utils": "5.39.0",
+				"@typescript-eslint/scope-manager": "5.43.0",
+				"@typescript-eslint/type-utils": "5.43.0",
+				"@typescript-eslint/utils": "5.43.0",
 				"debug": "^4.3.4",
 				"ignore": "^5.2.0",
+				"natural-compare-lite": "^1.4.0",
 				"regexpp": "^3.2.0",
 				"semver": "^7.3.7",
 				"tsutils": "^3.21.0"
@@ -9678,14 +10302,14 @@
 			}
 		},
 		"node_modules/xo/node_modules/@typescript-eslint/parser": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "BSD-2-Clause",
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "5.39.0",
-				"@typescript-eslint/types": "5.39.0",
-				"@typescript-eslint/typescript-estree": "5.39.0",
+				"@typescript-eslint/scope-manager": "5.43.0",
+				"@typescript-eslint/types": "5.43.0",
+				"@typescript-eslint/typescript-estree": "5.43.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
@@ -9705,13 +10329,13 @@
 			}
 		},
 		"node_modules/xo/node_modules/@typescript-eslint/scope-manager": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "5.39.0",
-				"@typescript-eslint/visitor-keys": "5.39.0"
+				"@typescript-eslint/types": "5.43.0",
+				"@typescript-eslint/visitor-keys": "5.43.0"
 			},
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -9722,13 +10346,13 @@
 			}
 		},
 		"node_modules/xo/node_modules/@typescript-eslint/type-utils": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/typescript-estree": "5.39.0",
-				"@typescript-eslint/utils": "5.39.0",
+				"@typescript-eslint/typescript-estree": "5.43.0",
+				"@typescript-eslint/utils": "5.43.0",
 				"debug": "^4.3.4",
 				"tsutils": "^3.21.0"
 			},
@@ -9749,7 +10373,7 @@
 			}
 		},
 		"node_modules/xo/node_modules/@typescript-eslint/types": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "MIT",
@@ -9762,13 +10386,13 @@
 			}
 		},
 		"node_modules/xo/node_modules/@typescript-eslint/typescript-estree": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "BSD-2-Clause",
 			"dependencies": {
-				"@typescript-eslint/types": "5.39.0",
-				"@typescript-eslint/visitor-keys": "5.39.0",
+				"@typescript-eslint/types": "5.43.0",
+				"@typescript-eslint/visitor-keys": "5.43.0",
 				"debug": "^4.3.4",
 				"globby": "^11.1.0",
 				"is-glob": "^4.0.3",
@@ -9818,17 +10442,19 @@
 			}
 		},
 		"node_modules/xo/node_modules/@typescript-eslint/utils": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "MIT",
 			"dependencies": {
 				"@types/json-schema": "^7.0.9",
-				"@typescript-eslint/scope-manager": "5.39.0",
-				"@typescript-eslint/types": "5.39.0",
-				"@typescript-eslint/typescript-estree": "5.39.0",
+				"@types/semver": "^7.3.12",
+				"@typescript-eslint/scope-manager": "5.43.0",
+				"@typescript-eslint/types": "5.43.0",
+				"@typescript-eslint/typescript-estree": "5.43.0",
 				"eslint-scope": "^5.1.1",
-				"eslint-utils": "^3.0.0"
+				"eslint-utils": "^3.0.0",
+				"semver": "^7.3.7"
 			},
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -9842,12 +10468,12 @@
 			}
 		},
 		"node_modules/xo/node_modules/@typescript-eslint/visitor-keys": {
-			"version": "5.39.0",
+			"version": "5.43.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "5.39.0",
+				"@typescript-eslint/types": "5.43.0",
 				"eslint-visitor-keys": "^3.3.0"
 			},
 			"engines": {
@@ -9915,7 +10541,7 @@
 			}
 		},
 		"node_modules/xo/node_modules/eslint-config-xo-typescript": {
-			"version": "0.53.0",
+			"version": "0.55.0",
 			"dev": true,
 			"inBundle": true,
 			"license": "MIT",
@@ -9926,41 +10552,41 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": ">=5.31.0",
-				"@typescript-eslint/parser": ">=5.31.0",
+				"@typescript-eslint/eslint-plugin": ">=5.43.0",
+				"@typescript-eslint/parser": ">=5.43.0",
 				"eslint": ">=8.0.0",
 				"typescript": ">=4.4"
 			}
 		},
 		"node_modules/xo/node_modules/eslint-plugin-unicorn": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz",
-			"integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==",
+			"version": "44.0.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz",
+			"integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.15.7",
-				"ci-info": "^3.3.0",
+				"@babel/helper-validator-identifier": "^7.19.1",
+				"ci-info": "^3.4.0",
 				"clean-regexp": "^1.0.0",
 				"eslint-utils": "^3.0.0",
 				"esquery": "^1.4.0",
 				"indent-string": "^4.0.0",
-				"is-builtin-module": "^3.1.0",
+				"is-builtin-module": "^3.2.0",
 				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
 				"regexp-tree": "^0.1.24",
 				"safe-regex": "^2.1.1",
-				"semver": "^7.3.5",
+				"semver": "^7.3.7",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
-				"node": ">=12"
+				"node": ">=14.18"
 			},
 			"funding": {
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.8.0"
+				"eslint": ">=8.23.1"
 			}
 		},
 		"node_modules/xo/node_modules/eslint-scope": {
@@ -10170,18 +10796,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/xo/node_modules/lru-cache": {
-			"version": "6.0.0",
-			"dev": true,
-			"inBundle": true,
-			"license": "ISC",
-			"dependencies": {
-				"yallist": "^4.0.0"
-			},
-			"engines": {
-				"node": ">=10"
-			}
-		},
 		"node_modules/xo/node_modules/merge2": {
 			"version": "1.4.1",
 			"dev": true,
@@ -10204,6 +10818,12 @@
 				"node": ">=8.6"
 			}
 		},
+		"node_modules/xo/node_modules/natural-compare-lite": {
+			"version": "1.4.0",
+			"dev": true,
+			"inBundle": true,
+			"license": "MIT"
+		},
 		"node_modules/xo/node_modules/p-limit": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
@@ -10330,7 +10950,7 @@
 			}
 		},
 		"node_modules/xo/node_modules/semver": {
-			"version": "7.3.7",
+			"version": "7.3.8",
 			"dev": true,
 			"inBundle": true,
 			"license": "ISC",
@@ -10344,13 +10964,25 @@
 				"node": ">=10"
 			}
 		},
+		"node_modules/xo/node_modules/semver/node_modules/lru-cache": {
+			"version": "6.0.0",
+			"dev": true,
+			"inBundle": true,
+			"license": "ISC",
+			"dependencies": {
+				"yallist": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=10"
+			}
+		},
 		"node_modules/xo/node_modules/slash": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
-			"integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/slash/-/slash-5.0.0.tgz",
+			"integrity": "sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==",
 			"dev": true,
 			"engines": {
-				"node": ">=12"
+				"node": ">=14.16"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/sindresorhus"
@@ -10645,10 +11277,24 @@
 			"dev": true,
 			"optional": true
 		},
+		"@esbuild/android-arm": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.15.tgz",
+			"integrity": "sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw==",
+			"dev": true,
+			"optional": true
+		},
+		"@esbuild/linux-loong64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz",
+			"integrity": "sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA==",
+			"dev": true,
+			"optional": true
+		},
 		"@eslint/eslintrc": {
-			"version": "1.3.2",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz",
-			"integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==",
+			"version": "1.3.3",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
+			"integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
 			"dev": true,
 			"requires": {
 				"ajv": "^6.12.4",
@@ -10663,22 +11309,16 @@
 			}
 		},
 		"@humanwhocodes/config-array": {
-			"version": "0.10.7",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz",
-			"integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==",
+			"version": "0.11.7",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz",
+			"integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==",
 			"dev": true,
 			"requires": {
 				"@humanwhocodes/object-schema": "^1.2.1",
 				"debug": "^4.1.1",
-				"minimatch": "^3.0.4"
+				"minimatch": "^3.0.5"
 			}
 		},
-		"@humanwhocodes/gitignore-to-minimatch": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz",
-			"integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==",
-			"dev": true
-		},
 		"@humanwhocodes/module-importer": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -10702,6 +11342,7 @@
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
 			"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
 			"dev": true,
+			"peer": true,
 			"requires": {
 				"@jridgewell/set-array": "^1.0.1",
 				"@jridgewell/sourcemap-codec": "^1.4.10",
@@ -10718,13 +11359,15 @@
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
 			"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
-			"dev": true
+			"dev": true,
+			"peer": true
 		},
 		"@jridgewell/source-map": {
 			"version": "0.3.2",
 			"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
 			"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
 			"dev": true,
+			"peer": true,
 			"requires": {
 				"@jridgewell/gen-mapping": "^0.3.0",
 				"@jridgewell/trace-mapping": "^0.3.9"
@@ -11464,7 +12107,8 @@
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
 			"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-			"dev": true
+			"dev": true,
+			"peer": true
 		},
 		"builtin-modules": {
 			"version": "3.3.0",
@@ -11600,27 +12244,27 @@
 			"dev": true
 		},
 		"camelcase": {
-			"version": "6.3.0",
-			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-			"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+			"version": "7.0.0",
+			"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz",
+			"integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==",
 			"dev": true
 		},
 		"camelcase-keys": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz",
-			"integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==",
+			"version": "8.0.2",
+			"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz",
+			"integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==",
 			"dev": true,
 			"requires": {
-				"camelcase": "^6.3.0",
-				"map-obj": "^4.1.0",
-				"quick-lru": "^5.1.1",
-				"type-fest": "^1.2.1"
+				"camelcase": "^7.0.0",
+				"map-obj": "^4.3.0",
+				"quick-lru": "^6.1.1",
+				"type-fest": "^2.13.0"
 			},
 			"dependencies": {
 				"type-fest": {
-					"version": "1.4.0",
-					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-					"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+					"version": "2.19.0",
+					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+					"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
 					"dev": true
 				}
 			}
@@ -12089,12 +12733,6 @@
 			"integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
 			"dev": true
 		},
-		"commondir": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-			"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
-			"dev": true
-		},
 		"concat-map": {
 			"version": "0.0.1",
 			"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -12182,9 +12820,9 @@
 			}
 		},
 		"cosmiconfig": {
-			"version": "7.0.1",
-			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-			"integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+			"version": "7.1.0",
+			"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+			"integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
 			"dev": true,
 			"requires": {
 				"@types/parse-json": "^4.0.0",
@@ -12249,15 +12887,15 @@
 			}
 		},
 		"decamelize": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz",
-			"integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==",
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz",
+			"integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==",
 			"dev": true
 		},
 		"decamelize-keys": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
-			"integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==",
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+			"integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
 			"dev": true,
 			"requires": {
 				"decamelize": "^1.1.0",
@@ -12934,6 +13572,176 @@
 				}
 			}
 		},
+		"esbuild": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.15.tgz",
+			"integrity": "sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w==",
+			"dev": true,
+			"requires": {
+				"@esbuild/android-arm": "0.15.15",
+				"@esbuild/linux-loong64": "0.15.15",
+				"esbuild-android-64": "0.15.15",
+				"esbuild-android-arm64": "0.15.15",
+				"esbuild-darwin-64": "0.15.15",
+				"esbuild-darwin-arm64": "0.15.15",
+				"esbuild-freebsd-64": "0.15.15",
+				"esbuild-freebsd-arm64": "0.15.15",
+				"esbuild-linux-32": "0.15.15",
+				"esbuild-linux-64": "0.15.15",
+				"esbuild-linux-arm": "0.15.15",
+				"esbuild-linux-arm64": "0.15.15",
+				"esbuild-linux-mips64le": "0.15.15",
+				"esbuild-linux-ppc64le": "0.15.15",
+				"esbuild-linux-riscv64": "0.15.15",
+				"esbuild-linux-s390x": "0.15.15",
+				"esbuild-netbsd-64": "0.15.15",
+				"esbuild-openbsd-64": "0.15.15",
+				"esbuild-sunos-64": "0.15.15",
+				"esbuild-windows-32": "0.15.15",
+				"esbuild-windows-64": "0.15.15",
+				"esbuild-windows-arm64": "0.15.15"
+			}
+		},
+		"esbuild-android-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz",
+			"integrity": "sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-android-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz",
+			"integrity": "sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-darwin-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz",
+			"integrity": "sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-darwin-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz",
+			"integrity": "sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-freebsd-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz",
+			"integrity": "sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-freebsd-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz",
+			"integrity": "sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-32": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz",
+			"integrity": "sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz",
+			"integrity": "sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-arm": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz",
+			"integrity": "sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz",
+			"integrity": "sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-mips64le": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz",
+			"integrity": "sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-ppc64le": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz",
+			"integrity": "sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-riscv64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz",
+			"integrity": "sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-linux-s390x": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz",
+			"integrity": "sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-netbsd-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz",
+			"integrity": "sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-openbsd-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz",
+			"integrity": "sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-sunos-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz",
+			"integrity": "sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-windows-32": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz",
+			"integrity": "sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-windows-64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz",
+			"integrity": "sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA==",
+			"dev": true,
+			"optional": true
+		},
+		"esbuild-windows-arm64": {
+			"version": "0.15.15",
+			"resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz",
+			"integrity": "sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ==",
+			"dev": true,
+			"optional": true
+		},
 		"escalade": {
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -12990,15 +13798,15 @@
 			}
 		},
 		"eslint": {
-			"version": "8.24.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz",
-			"integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==",
+			"version": "8.28.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz",
+			"integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==",
 			"dev": true,
 			"requires": {
-				"@eslint/eslintrc": "^1.3.2",
-				"@humanwhocodes/config-array": "^0.10.5",
-				"@humanwhocodes/gitignore-to-minimatch": "^1.0.2",
+				"@eslint/eslintrc": "^1.3.3",
+				"@humanwhocodes/config-array": "^0.11.6",
 				"@humanwhocodes/module-importer": "^1.0.1",
+				"@nodelib/fs.walk": "^1.2.8",
 				"ajv": "^6.10.0",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
@@ -13014,14 +13822,14 @@
 				"fast-deep-equal": "^3.1.3",
 				"file-entry-cache": "^6.0.1",
 				"find-up": "^5.0.0",
-				"glob-parent": "^6.0.1",
+				"glob-parent": "^6.0.2",
 				"globals": "^13.15.0",
-				"globby": "^11.1.0",
 				"grapheme-splitter": "^1.0.4",
 				"ignore": "^5.2.0",
 				"import-fresh": "^3.0.0",
 				"imurmurhash": "^0.1.4",
 				"is-glob": "^4.0.0",
+				"is-path-inside": "^3.0.3",
 				"js-sdsl": "^4.1.4",
 				"js-yaml": "^4.1.0",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
@@ -13085,19 +13893,11 @@
 						"is-glob": "^4.0.3"
 					}
 				},
-				"globby": {
-					"version": "11.1.0",
-					"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
-					"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
-					"dev": true,
-					"requires": {
-						"array-union": "^2.1.0",
-						"dir-glob": "^3.0.1",
-						"fast-glob": "^3.2.9",
-						"ignore": "^5.2.0",
-						"merge2": "^1.4.1",
-						"slash": "^3.0.0"
-					}
+				"is-path-inside": {
+					"version": "3.0.3",
+					"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+					"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+					"dev": true
 				},
 				"strip-ansi": {
 					"version": "6.0.1",
@@ -13118,9 +13918,9 @@
 			"requires": {}
 		},
 		"eslint-config-xo": {
-			"version": "0.42.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.42.0.tgz",
-			"integrity": "sha512-HIfd+AM6tHFoaZ/NXYDV3Mr/CJrAj/DoP6IOYt1/v+90XtCwVYOfW7LXbRDYDmhQMzT16h7eqPRcex72waRqdA==",
+			"version": "0.43.1",
+			"resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.43.1.tgz",
+			"integrity": "sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==",
 			"dev": true,
 			"requires": {
 				"confusing-browser-globals": "1.0.11"
@@ -13411,19 +14211,19 @@
 			}
 		},
 		"eslint-plugin-n": {
-			"version": "15.3.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.3.0.tgz",
-			"integrity": "sha512-IyzPnEWHypCWasDpxeJnim60jhlumbmq0pubL6IOcnk8u2y53s5QfT8JnXy7skjHJ44yWHRb11PLtDHuu1kg/Q==",
+			"version": "15.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.5.1.tgz",
+			"integrity": "sha512-kAd+xhZm7brHoFLzKLB7/FGRFJNg/srmv67mqb7tto22rpr4wv/LV6RuXzAfv3jbab7+k1wi42PsIhGviywaaw==",
 			"dev": true,
 			"requires": {
 				"builtins": "^5.0.1",
 				"eslint-plugin-es": "^4.1.0",
 				"eslint-utils": "^3.0.0",
 				"ignore": "^5.1.1",
-				"is-core-module": "^2.10.0",
+				"is-core-module": "^2.11.0",
 				"minimatch": "^3.1.2",
 				"resolve": "^1.22.1",
-				"semver": "^7.3.7"
+				"semver": "^7.3.8"
 			}
 		},
 		"eslint-plugin-no-use-extend-native": {
@@ -13455,24 +14255,26 @@
 			"requires": {}
 		},
 		"eslint-plugin-unicorn": {
-			"version": "44.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz",
-			"integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==",
+			"version": "45.0.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.0.tgz",
+			"integrity": "sha512-iP8cMRxXKHonKioOhnCoCcqVhoqhAp6rB+nsoLjXFDxTHz3btWMAp8xwzjHA0B1K6YV/U/Yvqn1bUXZt8sJPuQ==",
 			"dev": true,
 			"requires": {
 				"@babel/helper-validator-identifier": "^7.19.1",
-				"ci-info": "^3.4.0",
+				"ci-info": "^3.6.1",
 				"clean-regexp": "^1.0.0",
 				"eslint-utils": "^3.0.0",
 				"esquery": "^1.4.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.0",
+				"jsesc": "3.0.2",
 				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
 				"regexp-tree": "^0.1.24",
+				"regjsparser": "0.9.1",
 				"safe-regex": "^2.1.1",
-				"semver": "^7.3.7",
+				"semver": "^7.3.8",
 				"strip-indent": "^3.0.0"
 			},
 			"dependencies": {
@@ -13710,61 +14512,72 @@
 			}
 		},
 		"find-cache-dir": {
-			"version": "3.3.2",
-			"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
-			"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+			"integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
 			"dev": true,
 			"requires": {
-				"commondir": "^1.0.1",
-				"make-dir": "^3.0.2",
-				"pkg-dir": "^4.1.0"
+				"common-path-prefix": "^3.0.0",
+				"pkg-dir": "^7.0.0"
 			},
 			"dependencies": {
 				"find-up": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-					"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+					"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
 					"dev": true,
 					"requires": {
-						"locate-path": "^5.0.0",
-						"path-exists": "^4.0.0"
+						"locate-path": "^7.1.0",
+						"path-exists": "^5.0.0"
 					}
 				},
 				"locate-path": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-					"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+					"version": "7.1.1",
+					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz",
+					"integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==",
 					"dev": true,
 					"requires": {
-						"p-locate": "^4.1.0"
+						"p-locate": "^6.0.0"
 					}
 				},
 				"p-limit": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-					"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+					"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
 					"dev": true,
 					"requires": {
-						"p-try": "^2.0.0"
+						"yocto-queue": "^1.0.0"
 					}
 				},
 				"p-locate": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-					"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+					"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
 					"dev": true,
 					"requires": {
-						"p-limit": "^2.2.0"
+						"p-limit": "^4.0.0"
 					}
 				},
+				"path-exists": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+					"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+					"dev": true
+				},
 				"pkg-dir": {
-					"version": "4.2.0",
-					"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-					"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+					"version": "7.0.0",
+					"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
+					"integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
 					"dev": true,
 					"requires": {
-						"find-up": "^4.0.0"
+						"find-up": "^6.3.0"
 					}
+				},
+				"yocto-queue": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+					"integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+					"dev": true
 				}
 			}
 		},
@@ -13834,6 +14647,13 @@
 			"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
 			"dev": true
 		},
+		"fsevents": {
+			"version": "2.3.2",
+			"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+			"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+			"dev": true,
+			"optional": true
+		},
 		"function-bind": {
 			"version": "1.1.1",
 			"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
@@ -14379,9 +15199,9 @@
 			"dev": true
 		},
 		"is-core-module": {
-			"version": "2.10.0",
-			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz",
-			"integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==",
+			"version": "2.11.0",
+			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+			"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
 			"dev": true,
 			"requires": {
 				"has": "^1.0.3"
@@ -14759,6 +15579,12 @@
 				"gitignore-to-glob": "^0.3.0"
 			}
 		},
+		"jsesc": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+			"integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+			"dev": true
+		},
 		"json-parse-better-errors": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -15183,73 +16009,180 @@
 			"dev": true
 		},
 		"meow": {
-			"version": "10.1.5",
-			"resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz",
-			"integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==",
+			"version": "11.0.0",
+			"resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz",
+			"integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==",
 			"dev": true,
 			"requires": {
 				"@types/minimist": "^1.2.2",
-				"camelcase-keys": "^7.0.0",
-				"decamelize": "^5.0.0",
+				"camelcase-keys": "^8.0.2",
+				"decamelize": "^6.0.0",
 				"decamelize-keys": "^1.1.0",
 				"hard-rejection": "^2.1.0",
 				"minimist-options": "4.1.0",
-				"normalize-package-data": "^3.0.2",
-				"read-pkg-up": "^8.0.0",
+				"normalize-package-data": "^4.0.1",
+				"read-pkg-up": "^9.1.0",
 				"redent": "^4.0.0",
 				"trim-newlines": "^4.0.2",
-				"type-fest": "^1.2.2",
-				"yargs-parser": "^20.2.9"
+				"type-fest": "^3.1.0",
+				"yargs-parser": "^21.1.1"
 			},
 			"dependencies": {
+				"find-up": {
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+					"integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+					"dev": true,
+					"requires": {
+						"locate-path": "^7.1.0",
+						"path-exists": "^5.0.0"
+					}
+				},
 				"hosted-git-info": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
-					"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+					"version": "5.2.1",
+					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz",
+					"integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==",
 					"dev": true,
 					"requires": {
-						"lru-cache": "^6.0.0"
+						"lru-cache": "^7.5.1"
 					}
 				},
+				"locate-path": {
+					"version": "7.1.1",
+					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz",
+					"integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==",
+					"dev": true,
+					"requires": {
+						"p-locate": "^6.0.0"
+					}
+				},
+				"lru-cache": {
+					"version": "7.14.1",
+					"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz",
+					"integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==",
+					"dev": true
+				},
 				"normalize-package-data": {
-					"version": "3.0.3",
-					"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
-					"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+					"version": "4.0.1",
+					"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz",
+					"integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==",
 					"dev": true,
 					"requires": {
-						"hosted-git-info": "^4.0.1",
-						"is-core-module": "^2.5.0",
-						"semver": "^7.3.4",
-						"validate-npm-package-license": "^3.0.1"
+						"hosted-git-info": "^5.0.0",
+						"is-core-module": "^2.8.1",
+						"semver": "^7.3.5",
+						"validate-npm-package-license": "^3.0.4"
 					}
 				},
-				"read-pkg": {
+				"p-limit": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+					"integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+					"dev": true,
+					"requires": {
+						"yocto-queue": "^1.0.0"
+					}
+				},
+				"p-locate": {
 					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz",
-					"integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==",
+					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+					"integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
 					"dev": true,
 					"requires": {
-						"@types/normalize-package-data": "^2.4.0",
+						"p-limit": "^4.0.0"
+					}
+				},
+				"path-exists": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+					"integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+					"dev": true
+				},
+				"read-pkg": {
+					"version": "7.1.0",
+					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz",
+					"integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==",
+					"dev": true,
+					"requires": {
+						"@types/normalize-package-data": "^2.4.1",
 						"normalize-package-data": "^3.0.2",
 						"parse-json": "^5.2.0",
-						"type-fest": "^1.0.1"
+						"type-fest": "^2.0.0"
+					},
+					"dependencies": {
+						"hosted-git-info": {
+							"version": "4.1.0",
+							"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+							"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+							"dev": true,
+							"requires": {
+								"lru-cache": "^6.0.0"
+							}
+						},
+						"lru-cache": {
+							"version": "6.0.0",
+							"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+							"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+							"dev": true,
+							"requires": {
+								"yallist": "^4.0.0"
+							}
+						},
+						"normalize-package-data": {
+							"version": "3.0.3",
+							"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+							"integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+							"dev": true,
+							"requires": {
+								"hosted-git-info": "^4.0.1",
+								"is-core-module": "^2.5.0",
+								"semver": "^7.3.4",
+								"validate-npm-package-license": "^3.0.1"
+							}
+						},
+						"type-fest": {
+							"version": "2.19.0",
+							"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+							"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+							"dev": true
+						}
 					}
 				},
 				"read-pkg-up": {
-					"version": "8.0.0",
-					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz",
-					"integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==",
+					"version": "9.1.0",
+					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz",
+					"integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==",
 					"dev": true,
 					"requires": {
-						"find-up": "^5.0.0",
-						"read-pkg": "^6.0.0",
-						"type-fest": "^1.0.1"
+						"find-up": "^6.3.0",
+						"read-pkg": "^7.1.0",
+						"type-fest": "^2.5.0"
+					},
+					"dependencies": {
+						"type-fest": {
+							"version": "2.19.0",
+							"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+							"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+							"dev": true
+						}
 					}
 				},
 				"type-fest": {
-					"version": "1.4.0",
-					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
-					"integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
+					"version": "3.2.0",
+					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.2.0.tgz",
+					"integrity": "sha512-Il3wdLRzWvbAEtocgxGQA9YOoRVeVUGOMBtel5LdEpNeEAol6GJTLw8GbX6Z8EIMfvfhoOXs2bwOijtAZdK5og==",
+					"dev": true
+				},
+				"yargs-parser": {
+					"version": "21.1.1",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+					"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+					"dev": true
+				},
+				"yocto-queue": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+					"integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
 					"dev": true
 				}
 			}
@@ -16208,9 +17141,9 @@
 			"dev": true
 		},
 		"quick-lru": {
-			"version": "5.1.1",
-			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-			"integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz",
+			"integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==",
 			"dev": true
 		},
 		"randombytes": {
@@ -16402,6 +17335,23 @@
 			"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
 			"dev": true
 		},
+		"regjsparser": {
+			"version": "0.9.1",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
+			"integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+			"dev": true,
+			"requires": {
+				"jsesc": "~0.5.0"
+			},
+			"dependencies": {
+				"jsesc": {
+					"version": "0.5.0",
+					"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+					"integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+					"dev": true
+				}
+			}
+		},
 		"remove-trailing-separator": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
@@ -16543,9 +17493,9 @@
 			}
 		},
 		"rollup": {
-			"version": "3.3.0",
-			"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.3.0.tgz",
-			"integrity": "sha512-wqOV/vUJCYEbWsXvwCkgGWvgaEnsbn4jxBQWKpN816CqsmCimDmCNJI83c6if7QVD4v/zlyRzxN7U2yDT5rfoA==",
+			"version": "3.4.0",
+			"resolved": "https://registry.npmjs.org/rollup/-/rollup-3.4.0.tgz",
+			"integrity": "sha512-4g8ZrEFK7UbDvy3JF+d5bLiC8UKkS3n/27/cnVeESwB1LVPl6MoPL32/6+SCQ1vHTp6Mvp2veIHtwELhi+uXEw==",
 			"dev": true,
 			"requires": {
 				"fsevents": "~2.3.2"
@@ -16631,9 +17581,9 @@
 			"integrity": "sha512-NkkoREZSg/KbM+60R1xwAReTcJJBVbWmnorf5rksso+Q3zlNJofhk/Ty32FqpAyuHLLIduLz/T+DvEBs8EELHg=="
 		},
 		"semver": {
-			"version": "7.3.7",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-			"integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+			"version": "7.3.8",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+			"integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
 			"dev": true,
 			"requires": {
 				"lru-cache": "^6.0.0"
@@ -16736,13 +17686,15 @@
 			"version": "0.6.1",
 			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 			"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-			"dev": true
+			"dev": true,
+			"peer": true
 		},
 		"source-map-support": {
 			"version": "0.5.21",
 			"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
 			"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
 			"dev": true,
+			"peer": true,
 			"requires": {
 				"buffer-from": "^1.0.0",
 				"source-map": "^0.6.0"
@@ -17042,6 +17994,7 @@
 			"resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz",
 			"integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==",
 			"dev": true,
+			"peer": true,
 			"requires": {
 				"@jridgewell/source-map": "^0.3.2",
 				"acorn": "^8.5.0",
@@ -17053,7 +18006,8 @@
 					"version": "2.20.3",
 					"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
 					"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-					"dev": true
+					"dev": true,
+					"peer": true
 				}
 			}
 		},
@@ -17223,9 +18177,9 @@
 			}
 		},
 		"typescript": {
-			"version": "4.8.4",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
-			"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
+			"version": "4.9.3",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz",
+			"integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==",
 			"dev": true
 		},
 		"typhonjs-ast-walker": {
@@ -17697,47 +18651,47 @@
 			"dev": true
 		},
 		"xo": {
-			"version": "0.52.4",
-			"resolved": "https://registry.npmjs.org/xo/-/xo-0.52.4.tgz",
-			"integrity": "sha512-5K+2bSy+nPO1fE6TS5KydgqhZ5pyXvO1P6Rw98aflxHi2LFWoShLmDpJOCxSpIP5867LVOCdH/WO+7iXk6/WVQ==",
+			"version": "0.53.1",
+			"resolved": "https://registry.npmjs.org/xo/-/xo-0.53.1.tgz",
+			"integrity": "sha512-/2R8SPehv1UhiIqJ9uSvrAjslcoygICNsUlEb/Zf2V6rMtr7YCoggc6hlt6b/kbncpR989Roqt6AvEO779dFxw==",
 			"dev": true,
 			"requires": {
-				"@eslint/eslintrc": "^1.3.0",
-				"@typescript-eslint/eslint-plugin": "*",
-				"@typescript-eslint/parser": "*",
+				"@eslint/eslintrc": "^1.3.3",
+				"@typescript-eslint/eslint-plugin": "^5.43.0",
+				"@typescript-eslint/parser": "^5.43.0",
 				"arrify": "^3.0.0",
-				"cosmiconfig": "^7.0.1",
+				"cosmiconfig": "^7.1.0",
 				"define-lazy-prop": "^3.0.0",
-				"eslint": "^8.22.0",
+				"eslint": "^8.27.0",
 				"eslint-config-prettier": "^8.5.0",
-				"eslint-config-xo": "^0.42.0",
-				"eslint-config-xo-typescript": "*",
+				"eslint-config-xo": "^0.43.1",
+				"eslint-config-xo-typescript": "^0.55.0",
 				"eslint-formatter-pretty": "^4.1.0",
 				"eslint-import-resolver-webpack": "^0.13.2",
 				"eslint-plugin-ava": "^13.2.0",
 				"eslint-plugin-eslint-comments": "^3.2.0",
 				"eslint-plugin-import": "^2.26.0",
-				"eslint-plugin-n": "^15.2.5",
+				"eslint-plugin-n": "^15.5.1",
 				"eslint-plugin-no-use-extend-native": "^0.5.0",
-				"eslint-plugin-prettier": "^4.0.0",
-				"eslint-plugin-unicorn": "^42.0.0",
+				"eslint-plugin-prettier": "^4.2.1",
+				"eslint-plugin-unicorn": "^44.0.2",
 				"esm-utils": "^4.1.0",
-				"find-cache-dir": "^3.3.2",
+				"find-cache-dir": "^4.0.0",
 				"find-up": "^6.3.0",
 				"get-stdin": "^9.0.0",
-				"globby": "^13.1.1",
+				"globby": "^13.1.2",
 				"imurmurhash": "^0.1.4",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
 				"json5": "^2.2.1",
 				"lodash-es": "^4.17.21",
-				"meow": "^10.1.2",
+				"meow": "^11.0.0",
 				"micromatch": "^4.0.5",
 				"open-editor": "^4.0.0",
-				"prettier": "^2.6.2",
-				"semver": "^7.3.7",
-				"slash": "^4.0.0",
+				"prettier": "^2.7.1",
+				"semver": "^7.3.8",
+				"slash": "^5.0.0",
 				"to-absolute-glob": "^2.0.2",
-				"typescript": "^4.7.3"
+				"typescript": "^4.9.3"
 			},
 			"dependencies": {
 				"@nodelib/fs.scandir": {
@@ -17768,64 +18722,70 @@
 					"bundled": true,
 					"dev": true
 				},
+				"@types/semver": {
+					"version": "7.3.13",
+					"bundled": true,
+					"dev": true
+				},
 				"@typescript-eslint/eslint-plugin": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {
-						"@typescript-eslint/scope-manager": "5.39.0",
-						"@typescript-eslint/type-utils": "5.39.0",
-						"@typescript-eslint/utils": "5.39.0",
+						"@typescript-eslint/scope-manager": "5.43.0",
+						"@typescript-eslint/type-utils": "5.43.0",
+						"@typescript-eslint/utils": "5.43.0",
 						"debug": "^4.3.4",
 						"ignore": "^5.2.0",
+						"natural-compare-lite": "^1.4.0",
 						"regexpp": "^3.2.0",
 						"semver": "^7.3.7",
 						"tsutils": "^3.21.0"
 					}
 				},
 				"@typescript-eslint/parser": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {
-						"@typescript-eslint/scope-manager": "5.39.0",
-						"@typescript-eslint/types": "5.39.0",
-						"@typescript-eslint/typescript-estree": "5.39.0",
+						"@typescript-eslint/scope-manager": "5.43.0",
+						"@typescript-eslint/types": "5.43.0",
+						"@typescript-eslint/typescript-estree": "5.43.0",
 						"debug": "^4.3.4"
 					}
 				},
 				"@typescript-eslint/scope-manager": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {
-						"@typescript-eslint/types": "5.39.0",
-						"@typescript-eslint/visitor-keys": "5.39.0"
+						"@typescript-eslint/types": "5.43.0",
+						"@typescript-eslint/visitor-keys": "5.43.0"
 					}
 				},
 				"@typescript-eslint/type-utils": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {
-						"@typescript-eslint/typescript-estree": "5.39.0",
-						"@typescript-eslint/utils": "5.39.0",
+						"@typescript-eslint/typescript-estree": "5.43.0",
+						"@typescript-eslint/utils": "5.43.0",
 						"debug": "^4.3.4",
 						"tsutils": "^3.21.0"
 					}
 				},
 				"@typescript-eslint/types": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true
 				},
 				"@typescript-eslint/typescript-estree": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {
-						"@typescript-eslint/types": "5.39.0",
-						"@typescript-eslint/visitor-keys": "5.39.0",
+						"@typescript-eslint/types": "5.43.0",
+						"@typescript-eslint/visitor-keys": "5.43.0",
 						"debug": "^4.3.4",
 						"globby": "^11.1.0",
 						"is-glob": "^4.0.3",
@@ -17854,24 +18814,26 @@
 					}
 				},
 				"@typescript-eslint/utils": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {
 						"@types/json-schema": "^7.0.9",
-						"@typescript-eslint/scope-manager": "5.39.0",
-						"@typescript-eslint/types": "5.39.0",
-						"@typescript-eslint/typescript-estree": "5.39.0",
+						"@types/semver": "^7.3.12",
+						"@typescript-eslint/scope-manager": "5.43.0",
+						"@typescript-eslint/types": "5.43.0",
+						"@typescript-eslint/typescript-estree": "5.43.0",
 						"eslint-scope": "^5.1.1",
-						"eslint-utils": "^3.0.0"
+						"eslint-utils": "^3.0.0",
+						"semver": "^7.3.7"
 					}
 				},
 				"@typescript-eslint/visitor-keys": {
-					"version": "5.39.0",
+					"version": "5.43.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {
-						"@typescript-eslint/types": "5.39.0",
+						"@typescript-eslint/types": "5.43.0",
 						"eslint-visitor-keys": "^3.3.0"
 					}
 				},
@@ -17912,30 +18874,30 @@
 					}
 				},
 				"eslint-config-xo-typescript": {
-					"version": "0.53.0",
+					"version": "0.55.0",
 					"bundled": true,
 					"dev": true,
 					"requires": {}
 				},
 				"eslint-plugin-unicorn": {
-					"version": "42.0.0",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-42.0.0.tgz",
-					"integrity": "sha512-ixBsbhgWuxVaNlPTT8AyfJMlhyC5flCJFjyK3oKE8TRrwBnaHvUbuIkCM1lqg8ryYrFStL/T557zfKzX4GKSlg==",
+					"version": "44.0.2",
+					"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-44.0.2.tgz",
+					"integrity": "sha512-GLIDX1wmeEqpGaKcnMcqRvMVsoabeF0Ton0EX4Th5u6Kmf7RM9WBl705AXFEsns56ESkEs0uyelLuUTvz9Tr0w==",
 					"dev": true,
 					"requires": {
-						"@babel/helper-validator-identifier": "^7.15.7",
-						"ci-info": "^3.3.0",
+						"@babel/helper-validator-identifier": "^7.19.1",
+						"ci-info": "^3.4.0",
 						"clean-regexp": "^1.0.0",
 						"eslint-utils": "^3.0.0",
 						"esquery": "^1.4.0",
 						"indent-string": "^4.0.0",
-						"is-builtin-module": "^3.1.0",
+						"is-builtin-module": "^3.2.0",
 						"lodash": "^4.17.21",
 						"pluralize": "^8.0.0",
 						"read-pkg-up": "^7.0.1",
 						"regexp-tree": "^0.1.24",
 						"safe-regex": "^2.1.1",
-						"semver": "^7.3.5",
+						"semver": "^7.3.7",
 						"strip-indent": "^3.0.0"
 					}
 				},
@@ -18072,14 +19034,6 @@
 						"p-locate": "^6.0.0"
 					}
 				},
-				"lru-cache": {
-					"version": "6.0.0",
-					"bundled": true,
-					"dev": true,
-					"requires": {
-						"yallist": "^4.0.0"
-					}
-				},
 				"merge2": {
 					"version": "1.4.1",
 					"bundled": true,
@@ -18094,6 +19048,11 @@
 						"picomatch": "^2.3.1"
 					}
 				},
+				"natural-compare-lite": {
+					"version": "1.4.0",
+					"bundled": true,
+					"dev": true
+				},
 				"p-limit": {
 					"version": "4.0.0",
 					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
@@ -18152,17 +19111,27 @@
 					}
 				},
 				"semver": {
-					"version": "7.3.7",
+					"version": "7.3.8",
 					"bundled": true,
 					"dev": true,
 					"requires": {
 						"lru-cache": "^6.0.0"
+					},
+					"dependencies": {
+						"lru-cache": {
+							"version": "6.0.0",
+							"bundled": true,
+							"dev": true,
+							"requires": {
+								"yallist": "^4.0.0"
+							}
+						}
 					}
 				},
 				"slash": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
-					"integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/slash/-/slash-5.0.0.tgz",
+					"integrity": "sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==",
 					"dev": true
 				},
 				"to-regex-range": {
diff --git a/package.json b/package.json
index 5531d9977a4c0a1b0cc3b1f96cb239642d29ee05..95c9ad0cd1b4e6a2a8f340345a3f8e7e8773a3e0 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
 		"build:npm:rollup": "rollup --config CI/rollup.config.mjs",
 		"build:npm:cp": "cp npm/* generated/npm/",
 		"build:npm:cp:readme": "cp README* generated/npm/",
-		"build:npm:min:terser": "node CI/minify.mjs",
+		"build:npm:min": "node CI/minify.mjs",
 		"test": "run-s test:dev",
 		"test:dev": "run-s test:dev:**",
 		"xtest:dev:qualityCheck": "xo",
@@ -55,15 +55,15 @@
 		"c8": "^7.12.0",
 		"chokidar-cli": "^3.0.0",
 		"es6-plato": "https://github.com/1000i100/es6-plato#master",
+		"esbuild": "^0.15.15",
 		"eslint-plugin-ava": "^13.2.0",
 		"eslint-plugin-promise": "^6.1.1",
-		"eslint-plugin-unicorn": "^44.0.2",
+		"eslint-plugin-unicorn": "^45.0.0",
 		"jscpd": "^3.5.1",
 		"mkdirp": "^1.0.4",
 		"npm-run-all": "^4.1.5",
-		"rollup": "^3.3.0",
-		"terser": "^5.15.1",
-		"xo": "^0.52.4"
+		"rollup": "^3.4.0",
+		"xo": "^0.53.1"
 	},
 	"disabledDependenciesTODOAddComplexityQualityCheck": {
 		"ecma-nacl": "^2.5.0",
diff --git a/src/crypto.mjs b/src/crypto.mjs
index afae94205836192c267c258af63deef11328eef6..110c0012b11a269ae28801eef63a977d789061a6 100644
--- a/src/crypto.mjs
+++ b/src/crypto.mjs
@@ -207,9 +207,7 @@ export function strOrBin2bin(strOrBin){
 	const encoder = new TextEncoder();
 	return (typeof strOrBin === 'string')?encoder.encode(strOrBin):strOrBin;
 }
-export function b64orBin2bin(b64orBin){
-	return typedStrOrBin2Bin(b64orBin,b64.decode);
-}
+
 export function b58orBin2bin(b58orBin){
 	return typedStrOrBin2Bin(b58orBin,b58.decode);
 }
@@ -224,7 +222,6 @@ function secKey2bin(secretKey){
 
 export function textEncrypt(jsonMessage, senderPrivateKey, receiverPubKey, nowInSecond=0, b58nonce=''){
 	const bNonce = b58nonce?b58.decode(b58nonce):nacl.randomBytes(NONCE_BYTES);
-	console.log("Défini : ", receiverPubKey)
 	const bReceiverPubKey = convertPublicKey(pubKey2bin(receiverPubKey));
 	const bSenderPrivateKey = convertSecretKey(secKey2bin(senderPrivateKey));
 	const encrypt = utf8text => b64.encode(nacl.box(strOrBin2bin(utf8text),bNonce,bReceiverPubKey,bSenderPrivateKey));
diff --git a/src/dictionary-builder.mjs b/src/dictionary-builder.mjs
deleted file mode 100644
index 3dffde12e5acf95a741ef422bea59ead24bd5f82..0000000000000000000000000000000000000000
--- a/src/dictionary-builder.mjs
+++ /dev/null
@@ -1,157 +0,0 @@
-import latinize from '../node_modules/latinize-to-ascii/latinize.mjs';
-
-export {dedup, noAccentVariant, casesVariants, regLikeVariants, resetCache};
-
-function dedup(array) {
-	const result = {};
-	array.forEach(v => result[v] = v); // eslint-disable-line no-return-assign
-	return Object.keys(result);
-}
-
-function noAccentVariant(string) {
-	return dedup([string, latinize(string)]);
-}
-
-function casesVariants(string) {
-	return dedup([
-		string,
-		string.toLowerCase(),
-		string.split(' ').map(str => str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()).join(' '),
-		string.toUpperCase()
-	]);
-}
-
-function regLikeVariants(theString, allStrings = []) {
-	return _regLikeVariants(escape2utfSpecial(theString), allStrings.map(escape2utfSpecial)).map(utfSpecial2unEscaped);
-}
-
-function swapKeyValue(object) {
-	const result = {};
-	for (const key in object) {
-		result[object[key]] = key;
-	}
-
-	return result;
-}
-
-const specialMap = {
-	'(': String.fromCharCode(0x01),
-	')': String.fromCharCode(0x02),
-	'|': String.fromCharCode(0x03),
-	'{': String.fromCharCode(0x04),
-	'}': String.fromCharCode(0x05),
-	',': String.fromCharCode(0x06),
-	'[': String.fromCharCode(0x07),
-	']': String.fromCharCode(0x08),
-	'-': String.fromCharCode(0x09),
-	'<': String.fromCharCode(0x0a),
-	'>': String.fromCharCode(0x0b),
-	':': String.fromCharCode(0x0c),
-	'=': String.fromCharCode(0x0d)
-};
-const revertSpecial = swapKeyValue(specialMap);
-
-function escape2utfSpecial(str) {
-	return str.replace(/\\(.)/g, (a, chr) => specialMap[chr] ? specialMap[chr] : chr);
-}
-
-function utfSpecial2unEscaped(str) {
-	return str.split('').map(chr => revertSpecial[chr] ? revertSpecial[chr] : chr).join('');
-}
-
-function bracketsHandler(theString) {
-	// Handle []
-	const lower = 'abcdefghijklmnopqrstuvwxyz';
-	const upper = lower.toUpperCase();
-	const number = '0123456789';
-	theString = theString.replace(/(\[[^\]]*)([a-z]-[a-z])([^\]]*])/g, (osef, before, chrs, after) => before + lower.slice(lower.indexOf(chrs.split('-')[0]), lower.indexOf(chrs.split('-')[1]) + 1) + after);
-	theString = theString.replace(/(\[[^\]]*)([A-Z]-[A-Z])([^\]]*])/g, (osef, before, chrs, after) => before + upper.slice(upper.indexOf(chrs.split('-')[0]), upper.indexOf(chrs.split('-')[1]) + 1) + after);
-	theString = theString.replace(/(\[[^\]]*)([0-9]-[0-9])([^\]]*])/g, (osef, before, chrs, after) => before + number.slice(number.indexOf(chrs.split('-')[0]), number.indexOf(chrs.split('-')[1]) + 1) + after); // eslint-disable-line unicorn/better-regex
-	theString = theString.replace(/\[([^\]]+)]/g, (osef, chrs) => `(${chrs.split('').join('|')})`);
-	return theString;
-}
-
-function resetCache() {
-	cache();
-}
-
-function cache(key, func, ...args) {
-	/* Init */ if (!cache.cached) cache.cached = {};
-	/* Reset cache */ if (arguments.length === 0) return cache.cached = {}; // eslint-disable-line no-return-assign
-	/* Compute and cache */ if (typeof cache.cached[key] === 'undefined') cache.cached[key] = func(...args);
-	/* Answer from cache */ return cache.cached[key];
-}
-
-function labelExpressions(str) {
-	return str.slice(str.indexOf('::') + 2);
-}
-
-function computedLabel(label, allStrings) {
-	return cache(`label::${label}`, _computedLabel, label, allStrings);
-}
-
-function _computedLabel(label, allStrings) {
-	const matchingLabel = allStrings.filter(str => str.trim().indexOf(`${label}::`) === 0);
-	return flatten(matchingLabel.map(str => _regLikeVariants(labelExpressions(str)), allStrings));
-}
-
-function refHandler(theString, allStrings) {
-	// Handle <ref>
-	theString = theString.replace(/<([^>]+)>/g, (osef, ref) => `(${computedLabel(ref, allStrings).join('|')})`);
-	return theString;
-}
-
-function syncRefHandler(theString, allStrings) {
-	// Handle =ref>
-	const syncRef = dedup(theString.match(/=[^>]+>/g) || []).map(str => str.substring(1, str.length - 1));
-	let results = [theString];
-	for (const ref of syncRef) {
-		const variantes = computedLabel(ref, allStrings);
-		const tmpRes = [];
-		for (const v of variantes) {
-			for (const r of results) {
-				tmpRes.push(r.replace(new RegExp(`=${ref}>`, 'g'), v));
-			}
-		}
-
-		results = tmpRes;
-	}
-
-	return results;
-}
-
-function qtyHandlerReplaceCallback(all, chr, qty) {
-	const mm = qty.split(',').map(n => n.trim() * 1); // eslint-disable-line no-implicit-coercion
-	const min = mm[0];
-	const max = (mm.length === 2) ? mm[1] : min;
-	const result = [];
-	for (let i = min; i <= max; i++) result.push(new Array(i + 1).join(chr)); // eslint-disable-line unicorn/no-new-array
-	return `(${result.join('|')})`;
-}
-
-function qtyHandler(theString) {
-	// Handle {qty} and {min,max}
-	theString = theString.replace(/([^)]){([^}]+)}/g, qtyHandlerReplaceCallback);
-	theString = theString.replace(/^(.*)\(([^)]*)\){([^}]+)}(.*)$/, (all, before, choices, qty, after) => before + qtyHandlerReplaceCallback('', `(${choices})`, qty) + after); // eslint-disable-line max-params
-	return theString;
-}
-
-function optionsHandler(theString, allStrings) {
-	// Handle (|)
-	let multiString = theString.replace(/^(.*)\(([^)]*)\)(.*)$/, (all, before, choices, after) => choices.split('|').map(c => before + c + after).join('=$##$=')).split('=$##$=');
-	multiString = [].concat(...multiString.map(str => (str.includes('(')) ? _regLikeVariants(str, allStrings) : str));
-	return dedup(multiString);
-}
-
-function _regLikeVariants(theString, allStrings) {
-	if (theString.indexOf('::') > 0) return []; // Remove label definition lines.
-	theString = bracketsHandler(theString); // Handle []
-	theString = refHandler(theString, allStrings);// Handle <ref> and ref::
-	theString = qtyHandler(theString); // Handle {qty} and {min,max}
-	const strings = optionsHandler(theString, allStrings); // Handle (|)
-	return flatten(strings.map(string => syncRefHandler(string, allStrings)));// Handle =ref> and ref::
-}
-
-function flatten(arrayOfArray) {
-	return dedup([].concat(...arrayOfArray));
-}
diff --git a/src/dictionary-builder.test.mjs b/src/dictionary-builder.test.mjs
deleted file mode 100644
index 65cef4f056774ce4b0ed7914f32416968870d53d..0000000000000000000000000000000000000000
--- a/src/dictionary-builder.test.mjs
+++ /dev/null
@@ -1,69 +0,0 @@
-import test from 'ava';
-import * as app from './dictionary-builder.mjs';
-
-test.beforeEach(app.resetCache);
-test('add no accents variant', t => {
-	t.deepEqual(app.noAccentVariant('Ǧ1'), ['Ǧ1', 'G1']);
-});
-test('add case variants', t => {
-	t.deepEqual(app.casesVariants('moT'), ['moT', 'mot', 'Mot', 'MOT']);
-});
-test('add multi word case variants', t => {
-	t.deepEqual(app.casesVariants('autre mot'), ['autre mot', 'Autre Mot', 'AUTRE MOT']);
-});
-test('regLikeVariants remove ref:: lines', t => {
-	t.deepEqual(app.regLikeVariants('ref::truc'), []);
-});
-// TODO: handle ref infinite loop by returning §infiniteRecursion§
-test('regLikeVariants handle <ref>', t => {
-	t.deepEqual(app.regLikeVariants('<ref> <ref>', ['ref::truc', 'ref::bidule', '<ref> <ref>']), ['truc truc', 'bidule truc', 'truc bidule', 'bidule bidule']);
-	t.deepEqual(app.regLikeVariants('<ref> <ref>', ['ref::(truc|bidule)', '<ref> <ref>']), ['truc truc', 'bidule truc', 'truc bidule', 'bidule bidule']);
-});
-test('regLikeVariants handle =ref>', t => {
-	t.deepEqual(app.regLikeVariants('=ref> =ref>', ['ref::truc', 'ref::bidule', '=ref> =ref>']), ['truc truc', 'bidule bidule']);
-	t.deepEqual(app.regLikeVariants('=ref> =ref>', ['ref::(truc|bidule)', '=ref> =ref>']), ['truc truc', 'bidule bidule']);
-});
-test('regLikeVariants handle multiple =ref>', t => {
-	t.deepEqual(
-		app.regLikeVariants('=ref> =ref2> =ref> =ref2>', ['ref::(truc|bidule)', 'ref2::(machin|chose)', '=ref> =ref>']),
-		['truc machin truc machin', 'bidule machin bidule machin', 'truc chose truc chose', 'bidule chose bidule chose']);
-});
-test('regLikeVariants handle (this|that)', t => {
-	t.deepEqual(app.regLikeVariants('(this|that)'), ['this', 'that']);
-});
-test('regLikeVariants handle [ -_]', t => {
-	t.deepEqual(app.regLikeVariants('[ -_]'), [' ', '-', '_']);
-});
-test('regLikeVariants handle [a-f]', t => {
-	t.deepEqual(app.regLikeVariants('[a-f]'), ['a', 'b', 'c', 'd', 'e', 'f']);
-	t.deepEqual(app.regLikeVariants('[7-9]'), ['7', '8', '9']);
-	t.deepEqual(app.regLikeVariants('[C-F]'), ['C', 'D', 'E', 'F']);
-});
-test('regLikeVariants handle [a-c-]', t => {
-	t.deepEqual(app.regLikeVariants('[a-c-]'), ['a', 'b', 'c', '-']);
-});
-test('regLikeVariants handle {qty}', t => {
-	t.deepEqual(app.regLikeVariants('a{5}'), ['aaaaa']);
-});
-test('regLikeVariants handle {min,max}', t => {
-	t.deepEqual(app.regLikeVariants('b{3,5}'), ['bbb', 'bbbb', 'bbbbb']);
-});
-test('regLikeVariants handle (string){qty}', t => {
-	t.deepEqual(app.regLikeVariants(`c'est (toto|tata){0,2}`), [`c'est `, `c'est toto`, `c'est totototo`, `c'est tata`, `c'est tatatoto`, `c'est tototata`, `c'est tatatata`]);
-});
-test.serial('regLikeVariants handle nested -([a-f]|<ref>){0,1}', t => {
-	t.deepEqual(
-		app.regLikeVariants('-([B-D]|<ref>){0,1}', ['ref::plop']),
-		['-', '-B', '-plop', '-C', '-D']);
-});
-test('regLikeVariants handle plop:\\:', t => {
-	t.deepEqual(app.regLikeVariants('plop:\\:ici'), ['plop::ici']);
-	t.deepEqual(app.regLikeVariants('plop\\::ici'), ['plop::ici']);
-	t.deepEqual(app.regLikeVariants('plop::ici'), []);
-});
-test('regLikeVariants handle [\\]*]', t => {
-	t.deepEqual(app.regLikeVariants('[\\]*]'), [']', '*']);
-});
-test('regLikeVariants handle escaping common chr \\a', t => {
-	t.deepEqual(app.regLikeVariants('\\a'), ['a']);
-});
diff --git a/src/dictionary-parser.mjs b/src/dictionary-parser.mjs
index 5ae91798b97a08a1691593f7bb2fda47d95cfc11..ff172a77c4ad056c24966ad97bee0663201d72fe 100644
--- a/src/dictionary-parser.mjs
+++ b/src/dictionary-parser.mjs
@@ -1,27 +1,306 @@
+import latinize from '../node_modules/latinize-to-ascii/latinize.mjs';
 import * as tree from './dictionary-tree.mjs';
 
-export function parse(dictionaryString) {
-	const allLines = dictionaryString.split('\n');
+export function parse(dictionaryString,idSecPwd=true,accent=0,lowerCase=0,leet=0) {
+	resetCache();
+	const escapedString = escape2utfSpecial(dictionaryString);
+	const unbracketed = bracketsHandler(escapedString);
+	const allLines = unbracketed.split('\n');
 	const parsedLines = parseAllLines(allLines);
-	return combineUnspecified2IdSecPwd(parsedLines);
+	const monoLined = `(${parsedLines.join('|')})`
+		.replace(/§void§\|/g,'')
+		.replace(/\|§void§/g,'')
+		.replace(/§void§/g,'');
+	if(monoLined.includes('§infiniteRecursion§')) throw new Error(`Unable to parse : ${utfSpecial2unEscaped(flattenIt(monoLined))}`);
+	if(!idSecPwd) return parseEnd(monoLined,allLines,accent,lowerCase,leet);
+	const parts = tree.splitAround('@@',tree.buildTreeStruct(monoLined));
+	const flatParts = [];
+	if(parts.matching) flatParts.push(parts.matching);
+	if(parts.notMatching) flatParts.push(parts.notMatching);
+	const combined = combineUnspecified2IdSecPwd(flatParts);
+	return parseEnd(combined,allLines,accent,lowerCase,leet);
 }
+function parseEnd(str,allLines,accent,lowerCase,leet) {
+	let theString = syncRefHandler(str,allLines)
+	if(theString.match(/=[^>]+>/)) throw new Error(`Unable to parse : ${utfSpecial2unEscaped(flattenIt(theString))}`);
+	theString = qtyHandler(theString);
+	if(accent===1) theString = zeroAccent(theString);
+	if(accent===2) theString = optionalAccent(theString);
+	if(lowerCase===1) theString = zeroUpperCase(theString);
+	if(lowerCase===2) theString = optionalUpperCase(theString);
+	if(lowerCase===3) theString = allUpperCase(allCapitalized(theString));
+	if(lowerCase===4) theString = optionalCapitalized(theString);
+	if(leet===1) theString = optionalLeetSpeak(theString);
+	if(leet===2) theString = allLeetSpeak(theString);
+	if(leet===3) theString = everyLeetSpeak(theString);
+	//TODO: bigLeet Variants
+	return utfSpecial2unEscaped(flattenIt(theString));
+}
+function zeroVariant(str,func){
+	const zero = func(str);
+	if(zero===str) return str;
+	return `(${str}|${zero})`;
+}
+function optionalVariant(str,func) {
+	return str.split('').map(func).join('');
+}
+function zeroAccent(string) {
+	return zeroVariant(string,latinize);
+}
+function optionalAccent(string) {
+	return optionalVariant(string,zeroAccent);
+}
+function zeroUpperCase(string) {
+	return zeroVariant(string,str=>str.toLowerCase() );
+}
+function allUpperCase(string) {
+	return zeroVariant(string,str=>str.toUpperCase() );
+}
+function optionalUpperCase(string) {
+	return optionalVariant(string,zeroUpperCase);
+}
+function allCapitalized(string) {
+	let str = zeroVariant(flattenIt(string),str=>str.split(' ').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(' ') );
+	let str2 = zeroVariant(flattenIt(string),str=>str.split(' ').map(s => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase()).join(' ') );
+	return zeroVariant(str,()=>str2 );
+}
+function optionalCapitalized(string) {
+	return optionalUpperCase(allCapitalized(string));
+}
+function zeroLeetSpeak(string) {
+	return zeroVariant(string,fromLeet);
+}
+function allLeetSpeak(string) {
+	return zeroVariant(string,toLeet);
+}
+function optionalLeetSpeak(string) {
+	return optionalVariant(string,zeroLeetSpeak);
+}
+function everyLeetSpeak(string) {
+	return optionalLeetSpeak(optionalVariant(string,allLeetSpeak));
+}
+function replaceList(applyOnThisString,list){
+	return applyOnThisString.split('').map(chr => list[chr] || chr).join('');
+}
+function replaceUpperKeyList(applyOnThisString,list){
+	return applyOnThisString.split('').map(chr => list[chr.toUpperCase()] || chr).join('');
+}
+/*
+function toBigLeet(str){
+	return replaceUpperKeyList(str,{
+		'A': '(4|@|^|∂|q)',
+		'B': '(8|6|13|ß|!3|/3)',
+		'C': '(¢|©)',
+		'D': '(0|?)',
+		'E': '(3|&|€|£|є|ë)',
+		'F': '(ƒ|φ)',
+		'G': '(6|&|9)',
+		'H': '(#|?)',
+		'I': '(1|!)',
+		'J': '(;|¿)',
+		'K': '(x|X)',
+		'L': '(1|£)',
+		'M': '^^',
+		'N': '/V',
+		'O': '(0|°|¤)',
+		'P': '(9|7|?|φ)',
+		'Q': '0',
+		'R': '(2|z|Z|Я|®)',
+		'S': '(5|$|z|§)',
+		'T': '(7|1|†|+)',
+		'U': '(v|V|µ)',
+		'V': '(u|U|µ)',
+		'W': 'vv',
+		'X': '(8|×)',
+		'Y': '(7|j|λ)',
+		'Z': '(2|%)',
+	});
+}
+function fromBigLeet(str) {
+	//TODO:fromBigLeet
+}
+*/
+function toLeet(str){
+	return replaceUpperKeyList(str,{
+		'O': '0',
+		'I': '1',
+		'L': '1',
+		'R': '2',
+		'Z': '2',
+		'E': '3',
+		'A': '(4|@)',
+		'S': '(5|$)',
+		'G': '(6|9)',
+		'T': '(7|1)',
+		'Y': '7',
+		'B': '(8|6)',
+	});
+}
+function fromLeet(str){
+	return replaceList(str,{
+		'@': '(a|A)',
+		'$': '(s|S)',
+		'0': '(o|O)',
+		'1': '(i|l|I|L|t|T)',
+		'2': '(r|R|z|Z)',
+		'3': '(e|E)',
+		'4': '(a|A)',
+		'5': '(s|S)',
+		'6': '(g|G|b|B)',
+		'7': '(t|T|y|Y)',
+		'8': '(b|B)',
+		'9': '(g|G)',
+	});
+}
+function flattenIt(regStr){
+	return tree.serialize(tree.buildTreeStruct(regStr));
+}
+function resetCache() {
+	cache();
+}
+function cache(key, func, ...args) {
+	/* Init */ if (!cache.cached) cache.cached = {};
+	/* Reset cache */ if (arguments.length === 0) return cache.cached = {}; // eslint-disable-line no-return-assign
+	/* Compute and cache */ if (typeof cache.cached[key] === 'undefined') cache.cached[key] = func(...args);
+	/* Answer from cache */ return cache.cached[key];
+}
+const specialMap = {
+	'(': String.fromCharCode(0x01),
+	')': String.fromCharCode(0x02),
+	'|': String.fromCharCode(0x03),
+	'{': String.fromCharCode(0x04),
+	'}': String.fromCharCode(0x05),
+	',': String.fromCharCode(0x06),
+	'[': String.fromCharCode(0x07),
+	']': String.fromCharCode(0x08),
+	'-': String.fromCharCode(0x09),
+	'<': String.fromCharCode(0x0a),
+	'>': String.fromCharCode(0x0b),
+	':': String.fromCharCode(0x0c),
+	'=': String.fromCharCode(0x0d),
+	'@': String.fromCharCode(0x0e)
+};
+const revertSpecial = swapKeyValue(specialMap);
+function swapKeyValue(object) {
+	const result = {};
+	for (const key in object) {
+		result[object[key]] = key;
+	}
 
+	return result;
+}
+function escape2utfSpecial(str) {
+	return str.replace(/\\(.)/g, (a, chr) => specialMap[chr] ? specialMap[chr] : chr);
+}
+function utfSpecial2unEscaped(str) {
+	return str.split('').map(chr => revertSpecial[chr] ? revertSpecial[chr] : chr).join('');
+}
+function bracketsHandler(theString) {
+	// Handle []
+	const lower = 'abcdefghijklmnopqrstuvwxyz';
+	const upper = lower.toUpperCase();
+	const number = '0123456789';
+	theString = theString.replace(/(\[[^\]]*)([a-z]-[a-z])([^\]]*])/g, (osef, before, chrs, after) => before + lower.slice(lower.indexOf(chrs.split('-')[0]), lower.indexOf(chrs.split('-')[1]) + 1) + after);
+	theString = theString.replace(/(\[[^\]]*)([A-Z]-[A-Z])([^\]]*])/g, (osef, before, chrs, after) => before + upper.slice(upper.indexOf(chrs.split('-')[0]), upper.indexOf(chrs.split('-')[1]) + 1) + after);
+	theString = theString.replace(/(\[[^\]]*)([0-9]-[0-9])([^\]]*])/g, (osef, before, chrs, after) => before + number.slice(number.indexOf(chrs.split('-')[0]), number.indexOf(chrs.split('-')[1]) + 1) + after); // eslint-disable-line unicorn/better-regex
+	theString = theString.replace(/\[([^\]]+)]/g, (osef, chrs) => `(${chrs.split('').join('|')})`);
+	return theString;
+}
+function qtyHandlerReplaceCallback(all, chr, qty) {
+	const mm = qty.split(',').map(n => n.trim() * 1); // eslint-disable-line no-implicit-coercion
+	const min = mm[0];
+	const max = (mm.length === 2) ? mm[1] : min;
+	let result = new Array(min + 1).join(chr);// eslint-disable-line unicorn/no-new-array
+	for (let i = min; i < max; i++) result += `(|${chr})`;
+	return result;
+}
+function qtyHandler(theString) {
+	// Handle {qty} and {min,max}
+	theString = theString.replace(/([^)]){([^}]+)}/g, qtyHandlerReplaceCallback);
+	theString = theString.replace(/^(.*)\(([^)]*)\){([^}]+)}(.*)$/, (all, before, choices, qty, after) => before + qtyHandlerReplaceCallback('', `(${choices})`, qty) + after); // eslint-disable-line max-params
+	while(1){
+		const qtyFound = rightParser(theString,'{','}');
+		if(!qtyFound.before || !qtyFound.inside) break;
+		const qtyPerimeter = rightParser(qtyFound.before,'(',')');
+		theString = qtyPerimeter.before + qtyHandlerReplaceCallback('',`(${qtyPerimeter.inside})`,qtyFound.inside)+qtyFound.after;
+	}
+	return theString;
+}
+function rightParser(fullString,openLeftChr,closeRightChr) {
+	const chrList = fullString.split('');
+	const res = {
+		before: '',
+		inside: '',
+		after: ''
+	};
+	function insideParser(){
+		while (chrList.length) {
+			const chr = chrList.pop();
+			res.inside = chr+res.inside;
+			if(chr===openLeftChr) return;
+			if(chr===closeRightChr) insideParser();
+		}
+	}
+	while (chrList.length) {
+		const chr = chrList.pop();
+		if(chr!==closeRightChr) res.after = chr+res.after;
+		if(chr===closeRightChr) {
+			insideParser();
+			res.inside = res.inside.substring(1);
+			res.before = chrList.join('');
+			return res;
+		}
+	}
+	return res;
+}
 function parseAllLines(lines) {
-	return lines;
+	return lines.map(line=>parseLine(line,lines));
 }
-
-function parseLine(theLine, allLines) {
+function parseLine(theLine, allLines,labelBreadCrumb='>') {
+	if(theLine.includes('::')) return '§void§';
+	theLine = refHandler(theLine, allLines, labelBreadCrumb)
 	return theLine;
 }
-
+function refHandler(theString, allStrings, labelBreadCrumb) {
+	// Handle <ref>
+	theString = theString.replace(/<([^>]+)>/g, (osef, ref) => computedLabel(ref, allStrings, labelBreadCrumb));
+	return theString;
+}
+function syncRefHandler(theString, allStrings, labelBreadCrumb='>') {
+	// Handle =ref>
+	const syncRef = {};
+	theString.replace(/=([^>]+)>/g,(osef,ref)=> syncRef[ref] = computedLabel(ref, allStrings, labelBreadCrumb));
+	Object.keys(syncRef).forEach(ref=>{
+		const altList = [];
+		const altTree = tree.buildTreeStruct(syncRef[ref]);
+		const treeSize = tree.altCount(altTree);
+		for(let altIndex = 0; altIndex<treeSize; altIndex++){
+			const currentAlt = tree.getAlternative(altIndex,altTree);
+			altList.push(theString.replace(new RegExp(`=${ref}>`,'g'),currentAlt));
+		}
+		theString = flattenIt(`(${altList.join('|')})`);
+	});
+	return theString;
+}
+function computedLabel(label, allStrings, labelBreadCrumb) {
+	return cache(`label::${label}`, _computedLabel, label, allStrings,labelBreadCrumb);
+}
+function _computedLabel(label, allStrings, labelBreadCrumb) {
+	if(labelBreadCrumb.includes(label)) return '§infiniteRecursion§';
+	labelBreadCrumb+=label+'>';
+	const matchingLabel = allStrings.filter(str => str.trim().indexOf(`${label}::`) === 0);
+	return flattenIt(`(${matchingLabel.map(str => parseLine(labelExpressions(str), allStrings,labelBreadCrumb)).join('|')})`);
+}
+function labelExpressions(str) {
+	return str.slice(str.indexOf('::') + 2);
+}
 function combineUnspecified2IdSecPwd(lines) {
 	const idSecPwdLines = [];
 	const unspecifiedLines = [];
-	lines.forEach(line => line.includes('@@@@') ? idSecPwdLines.push(line) : unspecifiedLines.push(line));
-	if (unspecifiedLines.length) idSecPwdLines.push(`${mergeLines(unspecifiedLines)}@@@@${mergeLines(unspecifiedLines)}`)
+	lines.forEach(line => line.includes('@@') ? idSecPwdLines.push(line) : unspecifiedLines.push(line));
+	if (unspecifiedLines.length) idSecPwdLines.push(`${mergeLines(unspecifiedLines)}@@${mergeLines(unspecifiedLines)}`)
 	return mergeLines(idSecPwdLines);
 }
-
 function mergeLines(lines) {
 	if (!lines.length) return '';
 	lines = lines.filter(l => l.length);
diff --git a/src/dictionary-parser.test.mjs b/src/dictionary-parser.test.mjs
index b414b48bc38c0f37f4fedba036719db3107cda5c..b96bc42643743d560d94604109999a44c553fa83 100644
--- a/src/dictionary-parser.test.mjs
+++ b/src/dictionary-parser.test.mjs
@@ -1,17 +1,112 @@
 import test from 'ava';
 import * as app from './dictionary-parser.mjs';
 
-test('no @@@@ idSec password separator ? implicit add it', t => {
-	t.is(app.parse('a'), 'a@@@@a');
+test('parse remove ref:: lines', t => {
+	t.is(app.parse('ref::truc',false), '');
 });
-test('@@@@ present, do not add it', t => {
-	t.is(app.parse('a@@@@b'), 'a@@@@b');
+test('parse handle <ref>', t => {
+	t.is(app.parse(`ref::truc\nref::bidule\n<ref> <ref>`,false), '(truc|bidule) (truc|bidule)');
+	t.is(app.parse(`ref::(truc|bidule)\n<ref> <ref>`,false), '(truc|bidule) (truc|bidule)');
 });
-test('no @@@@ on each line ? combine no @@@@ lines', t => {
+test('parse handle <ref> complex inclusion', t => {
+	t.is(app.parse(`ref::a<ref2>\n<ref>\nref2::(b|c)`,false), 'a(b|c)');
+});
+test('parse detect infinite recursion with <ref> and throw', t => {
+	t.throws(()=>app.parse(`ref::a<ref>\n<ref>`,false));
+});
+test('parse detect infinite recursion with nested <ref> and throw', t => {
+	t.throws(()=>app.parse(`ref::a<ref2>\n<ref>\nref2::b<ref>`,false));
+});
+
+test('parse handle [ -_]', t => {
+	t.is(app.parse('[ -_]',false), '( |-|_)');
+});
+test('parse handle [a-f]', t => {
+	t.is(app.parse('[a-f]',false), '(a|b|c|d|e|f)');
+	t.is(app.parse('[7-9]',false), '(7|8|9)');
+	t.is(app.parse('[C-F]',false), '(C|D|E|F)');
+});
+test('parse handle [a-c-]', t => {
+	t.is(app.parse('[a-c-]',false), '(a|b|c|-)');
+});
+
+test('parse handle {qty}', t => {
+	t.is(app.parse('a{5}',false), 'aaaaa');
+});
+test('parse handle {min,max}', t => {
+	t.is(app.parse('b{3,5}',false), 'bbb(|b)(|b)');
+});
+test('parse handle (string){qty}', t => {
+	t.is(app.parse(`c'est (toto|tata){0,2}`,false), `c'est (|toto|tata)(|toto|tata)`);
+});
+test('parse handle nested (s|t(ri|ng)){qty}', t => {
+	t.is(app.parse(`(s|t(ri|ng)){1,2}`,false), `(s|t(ri|ng))(|s|t(ri|ng))`);
+});
+
+test('parse handle plop:\\:', t => {
+	t.is(app.parse('plop:\\:ici',false), 'plop::ici');
+	t.is(app.parse('plop\\::ici',false), 'plop::ici');
+	t.is(app.parse('plop::ici',false), '');
+});
+test('parse handle [\\]*]', t => {
+	t.is(app.parse('[\\]*]',false), '(]|*)');
+});
+test('parse handle escaping common chr \\a', t => {
+	t.is(app.parse('\\a',false), 'a');
+});
+
+test('parse handle =ref>', t => {
+	t.is(app.parse(`ref::truc\nref::bidule\n=ref> =ref>`,false), '(truc truc|bidule bidule)');
+	t.is(app.parse(`ref::(truc|bidule)\n=ref> =ref>`,false), '(truc truc|bidule bidule)');
+});
+test('parse handle =ref> without generating duplication', t => {
+	t.is(app.parse(`ref::(truc|bidule)\n(=ref> =ref>|machin)`,false), '(truc truc|machin|bidule bidule)');
+});
+test('parse handle multiple =ref>', t => {
+	t.is(
+		app.parse(`=ref> =ref2> =ref> =ref2>\nref::(truc|bidule)\nref2::(machin|chose)`,false),
+		'(truc machin truc machin|bidule machin bidule machin|truc chose truc chose|bidule chose bidule chose)');
+});
+test('parse handle multi-level =ref>', t => {
+	t.is(app.parse(`=ref> =ref> =ref2>\nref::(truc|=ref2>)\nref2::(machin|chose)`,false),
+		'(truc truc machin|machin machin machin|truc truc chose|chose chose chose)');
+});
+test('parse throw if unconverted =ref>', t => t.throws(()=>app.parse(`=ref>\nref::=ref>`,false)));
+/*TODO: test('parse handle multi-level =ref> in all case', t => {
+	t.is(app.parse(`=ref2> =ref> =ref>\nref::(truc|=ref2>)\nref2::(machin|chose)`,false),
+		'(machin truc truc|chose truc truc|machin machin machin|chose chose chose)');
+});*/
+
+test('no @@ idSec password separator ? implicit add it', t => {
+	t.is(app.parse('a'), 'a@@a');
+});
+test('@@ present, do not add it', t => {
+	t.is(app.parse('a@@b'), 'a@@b');
+});
+test('no @@ on each line ? combine no @@ lines', t => {
 	t.is(app.parse(`
-a@@@@(b|c)
+a@@(b|c)
 (d|e)
 (f|g)
-h@@@@(i|j)
-`), '(a@@@@(b|c)|h@@@@(i|j)|((d|e)|(f|g))@@@@((d|e)|(f|g)))');
+h@@(i|j)
+`), '(a@@(b|c)|h@@(i|j)|(d|e|f|g)@@(d|e|f|g))');
 });
+test('add @@ on part without it', t => {
+	t.is(app.parse(`(a@@b|c)`), '(a@@b|c@@c)');
+});
+test('add @@ on part without it complex case', t => {
+	t.is(app.parse(`(a(b|(c|d)@@(e|f)|g@@h|i)|(j|(k@@(l|m)n|o)))p`),
+		'((a((c|d)@@(e|f)|g@@h)|k@@(l|m)n)p|(a(b|i)|j|o)p@@(a(b|i)|j|o)p)');
+});
+test('throw if multiple @@ in the same sequence', t => t.throws(() => app.parse(`a@@(b|c)@@d`)));
+
+test('add no accents variant', t => t.is(app.parse('Ǧ1ǦdiT ici',false,1), '(Ǧ1ǦdiT ici|G1GdiT ici)'));
+test('add optional accents variants', t => t.is(app.parse('Ǧ1ǦdiT ici',false,2), '(Ǧ|G)1(Ǧ|G)diT ici'));
+test('add lowercase variant', t => t.is(app.parse('Ǧ1ǦdiT ici',false,0,1), '(Ǧ1ǦdiT ici|ǧ1ǧdit ici)'));
+test('add optional lowercase variant', t => t.is(app.parse('Ǧ1ǦdiT ici',false,0,2), '(Ǧ|ǧ)1(Ǧ|ǧ)di(T|t) ici'));
+test('add uppercase variants', t => t.is(app.parse('Ǧ1ǦdiT ici',false,0,3), '(Ǧ1ǦdiT ici|Ǧ1ǦdiT Ici|Ǧ1ǧdit Ici|Ǧ1ǦDIT ICI)'));
+//test.skip('add optional capitalized variants', t => t.is(app.parse('Ǧ1ǦdiT ici',false,0,4), '(Ǧ|ǧ)1(Ǧ|ǧ)di(T|t) (I|i)ci'));
+test('add no leetSpeak variants', t => t.is(app.parse('Ǧ1ǦdiT ici',false,0,0,1), 'Ǧ(1|i|l|I|L|t|T)ǦdiT ici'));
+test('add leetSpeak variants', t => t.is(app.parse('Ǧ1ǦdiT ici',false,0,0,2), '(Ǧ1ǦdiT ici|Ǧ1Ǧd1(7|1) 1c1)'));
+test('add every leetSpeak variants', t => t.is(app.parse('Ǧ1ǦdiT ici',false,0,0,3), 'Ǧ(1|i|l|I|L|t|T)Ǧd(i|1|l|I|L|t|T)(T|7|t|y|Y|1|i|l|I|L) (i|1|l|I|L|t|T)c(i|1|l|I|L|t|T)'));
+//test('add all variants', t => t.true(app.parse('Ǧ1ǦdiT ici',true,2,4,3).length>500));
diff --git a/src/dictionary-tree.mjs b/src/dictionary-tree.mjs
index e9d7b10b414bd04bf9d503706746133e69b8f5f8..4778b1d31c40d2d25ab8661022cf1d9dbaf9be51 100644
--- a/src/dictionary-tree.mjs
+++ b/src/dictionary-tree.mjs
@@ -120,7 +120,50 @@ function trivialDedup(tree) {
 	tree.forEach(v => dedupKeys[JSON.stringify(v)] = v); // eslint-disable-line no-return-assign
 	return Object.keys(dedupKeys).map(JSON.parse);
 }
-
+export function splitAround(pattern,treeStruct){
+	function recSplitter(treeStruct){
+		if (isString(treeStruct)) return treeStruct.str.includes(pattern) ? {matching:treeStruct.str} : {notMatching:treeStruct.str};
+		if (isStep(treeStruct)) {
+			let isMatch = 0;
+			let isAlt = false;
+			let serialized = '';
+			let altSerialized = '';
+			treeStruct.step.forEach(subTree=>{
+				const subPart = recSplitter(subTree);
+				if(subPart.matching) {
+					isMatch++;
+					if (subPart.notMatching) isAlt = true;
+					serialized+=subPart.matching;
+					altSerialized+=subPart.notMatching;
+				} else {
+					serialized+=subPart.notMatching;
+					altSerialized+=subPart.notMatching;
+				}
+			});
+			if(isMatch>1) throw new Error('Error: @@ can only appear once in expression (idSec at left, password à right)');
+			if(isMatch && isAlt) return {matching:serialized, notMatching: altSerialized};
+			if(isMatch) return {matching:serialized};
+			return {notMatching: serialized};
+		}
+		if (isAlt(treeStruct)) {
+			const matching = [];
+			const notMatching = [];
+			treeStruct.alt.forEach(subTree=>{
+				const subPart = recSplitter(subTree);
+				if(subPart.matching) matching.push(subPart.matching);
+				if(subPart.notMatching) notMatching.push(subPart.notMatching);
+			})
+			if(matching.length && notMatching.length) return {matching: `(${matching.join('|')})`,notMatching: `(${notMatching.join('|')})`}
+			if(matching.length) return {matching: `(${matching.join('|')})`}
+			if(notMatching.length) return {notMatching: `(${notMatching.join('|')})`}
+		}
+		throw new Error(`Error: how to splitAround ${pattern} with ${JSON.stringify(treeStruct)} RAW: ${treeStruct}`);
+	}
+	const res = recSplitter(treeStruct);
+	if(res.matching) res.matching = serialize(buildTreeStruct(res.matching));
+	if(res.notMatching) res.notMatching = serialize(buildTreeStruct(res.notMatching));
+	return res;
+}
 export function serialize(treeStruct) {
 	if (isString(treeStruct)) return treeStruct.str;
 	if (isStep(treeStruct)) return treeStruct.step.map(serialize).join('');
diff --git a/src/dictionary-tree.test.mjs b/src/dictionary-tree.test.mjs
index e8a5439347edb830c6090d7ce6d8919d5a229f3b..c71dc7e03810b6f223a7f82e705e00af90234e6f 100644
--- a/src/dictionary-tree.test.mjs
+++ b/src/dictionary-tree.test.mjs
@@ -12,10 +12,16 @@ test('(|b) keep empty choice', t => t.is(buildTreeThenSerialize('(|b)'), '(|b)')
 test('(b|b) trivial dedup', t => t.is(buildTreeThenSerialize('(|b||b|)'), '(|b)'));
 test('a(b|c) mix fix and alt', t => t.is(buildTreeThenSerialize('a(b|c)'), 'a(b|c)'));
 test('a(b) flat merge when no alt', t => t.is(buildTreeThenSerialize('a(b)'), 'ab'));
+test('(a(b|c)|(d|e)) flat merge when unneeded depth', t => t.is(buildTreeThenSerialize('(a(b|c)|(d|e))'), '(a(b|c)|d|e)'));
 test('build complexe tree with (|) pattern', t => t.is(buildTreeThenSerialize('(a(|b@@@@c|d|)|(e|f)|g|h@@@@i)'), '(a(|b@@@@c|d)|e|f|g|h@@@@i)'));
 
 test('serialize incorrect tree throw', t => t.throws(() => app.serialize({plop: ['a']})));
 
+test('splitAround incorrect tree throw', t => t.throws(() => app.splitAround('@@',{plop: ['a']})));
+test('splitAround return notMatching case', t => t.deepEqual(app.splitAround('@',app.buildTreeStruct('a(b|c)')),{notMatching:'a(b|c)'}));
+test('splitAround return matching case', t => t.deepEqual(app.splitAround('@',app.buildTreeStruct('a@b')),{matching:'a@b'}));
+test('splitAround return both matching case and not matching one', t => t.deepEqual(app.splitAround('@',app.buildTreeStruct('a@b|c')),{matching:'a@b',notMatching:'c'}));
+
 test('mono altCount', t => t.is(app.altCount(app.buildTreeStruct('ipsum')), 1));
 test('simple altCount', t => t.is(app.altCount(app.buildTreeStruct('(lore|ipsu)m')), 2));
 test('multi altCount', t => t.is(app.altCount(app.buildTreeStruct('(a|b|c)(d|e|f)g(h|i|j|k)')), 36));
diff --git a/src/multi-node-layer.test.mjs b/src/multi-node-layer.test.mjs
index d0f8134a46bf713bcccd5d63aa819ecd37fa86cb..511de0d39f536f8610dc2f6a18fdae79009d92ce 100644
--- a/src/multi-node-layer.test.mjs
+++ b/src/multi-node-layer.test.mjs
@@ -12,10 +12,13 @@ test('pingTracker give time elapsed', async t => {
 	const secondParameter = 11;
 	const toCall = [mockedFunc,firstParameter,secondParameter];
 	const timeout = 1000;
+	await sleep(1); // in some test environnement this fix latency bug.
 	const result = await app.timeTrack(toCall,timeout);
+	await sleep(1); // in some test environnement this fix latency bug.
 	t.is(result.result,firstParameter);
 	t.is(result.params[1],firstParameter);
 	t.regex(result.ms.toString(),/1[0-9]/);
+	await sleep(1); // in some test environnement this fix latency bug.
 });
 test('pingTracker can timeout', async t => {
 	const moreThanTimeout = 15