From eedd1947f4761b57178fbd03049e1c070bf8af36 Mon Sep 17 00:00:00 2001 From: elkrien <78103450+elkrien@users.noreply.github.com> Date: Sat, 19 Mar 2022 19:41:08 +0100 Subject: [PATCH 01/43] add YouTube --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b87d601..02c93c4 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ Catppuccin is available for various apps and in different formats. Here is a lis - [DuckDuckGo](https://github.com/catppuccin/duckduckgo) - [Chrome](https://github.com/catppuccin/chrome) - [Vimium](https://github.com/catppuccin/vimium) +- [YouTube](https://github.com/catppuccin/YouTube) #### Productivity From 1bd40dac2e6495c577933bc09dc97351166c9565 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Tue, 1 Mar 2022 13:54:19 -0500 Subject: [PATCH 02/43] fix: merge conflict --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 02c93c4..104a4d4 100644 --- a/README.md +++ b/README.md @@ -160,6 +160,7 @@ Catppuccin is available for various apps and in different formats. Here is a lis - [Plank](https://github.com/catppuccin/plank) - [Papirus Icon Theme Folders](https://github.com/catppuccin/papirus-folders) - [Mouse Cursors](https://github.com/catppuccin/cursors) +- [Rofi](https://github.com/catppuccin/rofi)   From d7efaffe0ae571df030497b5e6524a2d0bf065c6 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 13 Apr 2022 12:38:59 -0500 Subject: [PATCH 03/43] fix: libreddit conflict --- README.md | 2 + .../node_modules/.bin/node-which | 1 + .../node_modules/.package-lock.json | 195 +++++ .../color-contrast-checker/.eslintrc.js | 29 + .../.github/workflows/npmpublish.yml | 45 ++ .../color-contrast-checker/LICENSE | 202 ++++++ .../color-contrast-checker/README.md | 152 ++++ .../color-contrast-checker/example/index.html | 71 ++ .../color-contrast-checker/package.json | 62 ++ .../src/color-contrast-checker.js | 241 +++++++ .../test/color-contrast-checker.js | 342 +++++++++ .../node_modules/cross-spawn/CHANGELOG.md | 130 ++++ .../node_modules/cross-spawn/LICENSE | 21 + .../node_modules/cross-spawn/README.md | 96 +++ .../node_modules/cross-spawn/index.js | 39 + .../node_modules/cross-spawn/lib/enoent.js | 59 ++ .../node_modules/cross-spawn/lib/parse.js | 91 +++ .../cross-spawn/lib/util/escape.js | 45 ++ .../cross-spawn/lib/util/readShebang.js | 23 + .../cross-spawn/lib/util/resolveCommand.js | 52 ++ .../node_modules/cross-spawn/package.json | 73 ++ .../node_modules/execa/index.d.ts | 586 +++++++++++++++ .../node_modules/execa/index.js | 267 +++++++ .../node_modules/execa/lib/command.js | 41 ++ .../node_modules/execa/lib/error.js | 85 +++ .../node_modules/execa/lib/kill.js | 102 +++ .../node_modules/execa/lib/promise.js | 36 + .../node_modules/execa/lib/stdio.js | 49 ++ .../node_modules/execa/lib/stream.js | 88 +++ .../node_modules/execa/license | 9 + .../node_modules/execa/package.json | 83 +++ .../node_modules/execa/readme.md | 667 ++++++++++++++++++ .../node_modules/get-stream/buffer-stream.js | 52 ++ .../node_modules/get-stream/index.d.ts | 105 +++ .../node_modules/get-stream/index.js | 61 ++ .../node_modules/get-stream/license | 9 + .../node_modules/get-stream/package.json | 47 ++ .../node_modules/get-stream/readme.md | 124 ++++ .../node_modules/human-signals/LICENSE | 201 ++++++ .../node_modules/human-signals/README.md | 164 +++++ .../human-signals/build/src/core.js | 273 +++++++ .../human-signals/build/src/core.js.map | 1 + .../human-signals/build/src/main.d.ts | 52 ++ .../human-signals/build/src/main.js | 71 ++ .../human-signals/build/src/main.js.map | 1 + .../human-signals/build/src/realtime.js | 19 + .../human-signals/build/src/realtime.js.map | 1 + .../human-signals/build/src/signals.js | 35 + .../human-signals/build/src/signals.js.map | 1 + .../node_modules/human-signals/package.json | 57 ++ .../node_modules/is-stream/index.d.ts | 81 +++ .../node_modules/is-stream/index.js | 29 + .../node_modules/is-stream/license | 9 + .../node_modules/is-stream/package.json | 44 ++ .../node_modules/is-stream/readme.md | 60 ++ .../node_modules/isexe/.npmignore | 2 + .../node_modules/isexe/LICENSE | 15 + .../node_modules/isexe/README.md | 51 ++ .../node_modules/isexe/index.js | 57 ++ .../node_modules/isexe/mode.js | 41 ++ .../node_modules/isexe/package.json | 31 + .../node_modules/isexe/test/basic.js | 221 ++++++ .../node_modules/isexe/windows.js | 42 ++ .../node_modules/merge-stream/LICENSE | 21 + .../node_modules/merge-stream/README.md | 78 ++ .../node_modules/merge-stream/index.js | 41 ++ .../node_modules/merge-stream/package.json | 19 + .../node_modules/mimic-fn/index.d.ts | 52 ++ .../node_modules/mimic-fn/index.js | 71 ++ .../node_modules/mimic-fn/license | 9 + .../node_modules/mimic-fn/package.json | 45 ++ .../node_modules/mimic-fn/readme.md | 90 +++ .../node_modules/npm-run-path/index.d.ts | 84 +++ .../node_modules/npm-run-path/index.js | 38 + .../node_modules/npm-run-path/license | 9 + .../node_modules/path-key/index.d.ts | 31 + .../node_modules/path-key/index.js | 12 + .../node_modules/path-key/license | 9 + .../node_modules/path-key/package.json | 41 ++ .../node_modules/path-key/readme.md | 57 ++ .../node_modules/npm-run-path/package.json | 47 ++ .../node_modules/npm-run-path/readme.md | 111 +++ .../node_modules/onetime/index.d.ts | 59 ++ .../node_modules/onetime/index.js | 41 ++ .../node_modules/onetime/license | 9 + .../node_modules/onetime/package.json | 45 ++ .../node_modules/onetime/readme.md | 94 +++ .../node_modules/path-key/index.d.ts | 40 ++ .../node_modules/path-key/index.js | 16 + .../node_modules/path-key/license | 9 + .../node_modules/path-key/package.json | 39 + .../node_modules/path-key/readme.md | 61 ++ .../node_modules/shebang-command/index.js | 19 + .../node_modules/shebang-command/license | 9 + .../node_modules/shebang-command/package.json | 34 + .../node_modules/shebang-command/readme.md | 34 + .../node_modules/shebang-regex/index.d.ts | 22 + .../node_modules/shebang-regex/index.js | 2 + .../node_modules/shebang-regex/license | 9 + .../node_modules/shebang-regex/package.json | 35 + .../node_modules/shebang-regex/readme.md | 33 + .../node_modules/signal-exit/LICENSE.txt | 16 + .../node_modules/signal-exit/README.md | 39 + .../node_modules/signal-exit/index.js | 202 ++++++ .../node_modules/signal-exit/package.json | 38 + .../node_modules/signal-exit/signals.js | 53 ++ .../node_modules/strip-final-newline/index.js | 14 + .../node_modules/strip-final-newline/license | 9 + .../strip-final-newline/package.json | 43 ++ .../strip-final-newline/readme.md | 35 + .../node_modules/which/CHANGELOG.md | 166 +++++ .../node_modules/which/LICENSE | 15 + .../node_modules/which/README.md | 54 ++ .../node_modules/which/bin/node-which | 52 ++ .../node_modules/which/package.json | 43 ++ .../node_modules/which/which.js | 125 ++++ 116 files changed, 8320 insertions(+) create mode 120000 tests/wcag-compliance/node_modules/.bin/node-which create mode 100644 tests/wcag-compliance/node_modules/.package-lock.json create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/README.md create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/package.json create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js create mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/LICENSE create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/README.md create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/index.js create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js create mode 100644 tests/wcag-compliance/node_modules/cross-spawn/package.json create mode 100644 tests/wcag-compliance/node_modules/execa/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/execa/index.js create mode 100644 tests/wcag-compliance/node_modules/execa/lib/command.js create mode 100644 tests/wcag-compliance/node_modules/execa/lib/error.js create mode 100644 tests/wcag-compliance/node_modules/execa/lib/kill.js create mode 100644 tests/wcag-compliance/node_modules/execa/lib/promise.js create mode 100644 tests/wcag-compliance/node_modules/execa/lib/stdio.js create mode 100644 tests/wcag-compliance/node_modules/execa/lib/stream.js create mode 100644 tests/wcag-compliance/node_modules/execa/license create mode 100644 tests/wcag-compliance/node_modules/execa/package.json create mode 100644 tests/wcag-compliance/node_modules/execa/readme.md create mode 100644 tests/wcag-compliance/node_modules/get-stream/buffer-stream.js create mode 100644 tests/wcag-compliance/node_modules/get-stream/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/get-stream/index.js create mode 100644 tests/wcag-compliance/node_modules/get-stream/license create mode 100644 tests/wcag-compliance/node_modules/get-stream/package.json create mode 100644 tests/wcag-compliance/node_modules/get-stream/readme.md create mode 100644 tests/wcag-compliance/node_modules/human-signals/LICENSE create mode 100644 tests/wcag-compliance/node_modules/human-signals/README.md create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/core.js create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/main.js create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/signals.js create mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map create mode 100644 tests/wcag-compliance/node_modules/human-signals/package.json create mode 100644 tests/wcag-compliance/node_modules/is-stream/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/is-stream/index.js create mode 100644 tests/wcag-compliance/node_modules/is-stream/license create mode 100644 tests/wcag-compliance/node_modules/is-stream/package.json create mode 100644 tests/wcag-compliance/node_modules/is-stream/readme.md create mode 100644 tests/wcag-compliance/node_modules/isexe/.npmignore create mode 100644 tests/wcag-compliance/node_modules/isexe/LICENSE create mode 100644 tests/wcag-compliance/node_modules/isexe/README.md create mode 100644 tests/wcag-compliance/node_modules/isexe/index.js create mode 100644 tests/wcag-compliance/node_modules/isexe/mode.js create mode 100644 tests/wcag-compliance/node_modules/isexe/package.json create mode 100644 tests/wcag-compliance/node_modules/isexe/test/basic.js create mode 100644 tests/wcag-compliance/node_modules/isexe/windows.js create mode 100644 tests/wcag-compliance/node_modules/merge-stream/LICENSE create mode 100644 tests/wcag-compliance/node_modules/merge-stream/README.md create mode 100644 tests/wcag-compliance/node_modules/merge-stream/index.js create mode 100644 tests/wcag-compliance/node_modules/merge-stream/package.json create mode 100644 tests/wcag-compliance/node_modules/mimic-fn/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/mimic-fn/index.js create mode 100644 tests/wcag-compliance/node_modules/mimic-fn/license create mode 100644 tests/wcag-compliance/node_modules/mimic-fn/package.json create mode 100644 tests/wcag-compliance/node_modules/mimic-fn/readme.md create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/index.js create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/license create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/package.json create mode 100644 tests/wcag-compliance/node_modules/npm-run-path/readme.md create mode 100644 tests/wcag-compliance/node_modules/onetime/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/onetime/index.js create mode 100644 tests/wcag-compliance/node_modules/onetime/license create mode 100644 tests/wcag-compliance/node_modules/onetime/package.json create mode 100644 tests/wcag-compliance/node_modules/onetime/readme.md create mode 100644 tests/wcag-compliance/node_modules/path-key/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/path-key/index.js create mode 100644 tests/wcag-compliance/node_modules/path-key/license create mode 100644 tests/wcag-compliance/node_modules/path-key/package.json create mode 100644 tests/wcag-compliance/node_modules/path-key/readme.md create mode 100644 tests/wcag-compliance/node_modules/shebang-command/index.js create mode 100644 tests/wcag-compliance/node_modules/shebang-command/license create mode 100644 tests/wcag-compliance/node_modules/shebang-command/package.json create mode 100644 tests/wcag-compliance/node_modules/shebang-command/readme.md create mode 100644 tests/wcag-compliance/node_modules/shebang-regex/index.d.ts create mode 100644 tests/wcag-compliance/node_modules/shebang-regex/index.js create mode 100644 tests/wcag-compliance/node_modules/shebang-regex/license create mode 100644 tests/wcag-compliance/node_modules/shebang-regex/package.json create mode 100644 tests/wcag-compliance/node_modules/shebang-regex/readme.md create mode 100644 tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt create mode 100644 tests/wcag-compliance/node_modules/signal-exit/README.md create mode 100644 tests/wcag-compliance/node_modules/signal-exit/index.js create mode 100644 tests/wcag-compliance/node_modules/signal-exit/package.json create mode 100644 tests/wcag-compliance/node_modules/signal-exit/signals.js create mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/index.js create mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/license create mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/package.json create mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/readme.md create mode 100644 tests/wcag-compliance/node_modules/which/CHANGELOG.md create mode 100644 tests/wcag-compliance/node_modules/which/LICENSE create mode 100644 tests/wcag-compliance/node_modules/which/README.md create mode 100755 tests/wcag-compliance/node_modules/which/bin/node-which create mode 100644 tests/wcag-compliance/node_modules/which/package.json create mode 100644 tests/wcag-compliance/node_modules/which/which.js diff --git a/README.md b/README.md index 104a4d4..ac0f77a 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,8 @@ Catppuccin is available for various apps and in different formats. Here is a lis - [Chrome](https://github.com/catppuccin/chrome) - [Vimium](https://github.com/catppuccin/vimium) - [YouTube](https://github.com/catppuccin/YouTube) +- [MonkeyType](https://github.com/catppuccin/monkeytype) +- [Libreddit](https://github.com/catppuccin/libreddit) #### Productivity diff --git a/tests/wcag-compliance/node_modules/.bin/node-which b/tests/wcag-compliance/node_modules/.bin/node-which new file mode 120000 index 0000000..6f8415e --- /dev/null +++ b/tests/wcag-compliance/node_modules/.bin/node-which @@ -0,0 +1 @@ +../which/bin/node-which \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/.package-lock.json b/tests/wcag-compliance/node_modules/.package-lock.json new file mode 100644 index 0000000..96046f1 --- /dev/null +++ b/tests/wcag-compliance/node_modules/.package-lock.json @@ -0,0 +1,195 @@ +{ + "name": "wcag-compliance", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "node_modules/color-contrast-checker": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", + "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + } + } +} diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js b/tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js new file mode 100644 index 0000000..beb8ffa --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + "env": { + "browser": true, + "node": true, + "mocha": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 6 + }, + "rules": { + "indent": [ + "error", + 4 + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "double" + ], + "semi": [ + "error", + "always" + ] + } +}; \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml b/tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml new file mode 100644 index 0000000..5c98e5b --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml @@ -0,0 +1,45 @@ +name: Node.js Package + +on: + release: + types: [created] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + - run: npm ci + - run: npm test + + publish-npm: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + registry-url: https://registry.npmjs.org/ + - run: npm ci + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.npm_token}} + + publish-gpr: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-node@v1 + with: + node-version: 12 + registry-url: https://npm.pkg.github.com/ + scope: '@Qambar' + - run: npm ci + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE b/tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE new file mode 100644 index 0000000..055302e --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2019 BBC + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/README.md b/tests/wcag-compliance/node_modules/color-contrast-checker/README.md new file mode 100644 index 0000000..a08b648 --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/README.md @@ -0,0 +1,152 @@ +# Color Contast Checker + +An accessibility checker tool for validating the color contrast based on WCAG 2.0 and WCAG 2.1 standard. + +The formula (L1/L2) for contrast is based on [ISO-9241-3] and [ANSI-HFES-100-1988] standards as described here : + +http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef +http://www.w3.org/TR/WCAG20/#contrast-ratiodef +https://www.w3.org/TR/WCAG21/#contrast-minimum + +It also supports shorthand color codes e.g #FFF or #000 etc. + +https://www.w3.org/TR/2001/WD-css3-color-20010305#colorunits + +Installation: +------------ + +``` +npm install color-contrast-checker +``` +or using package.json + +``` +{ + "name": "my-app", + .. + "devDependencies": { + .. + "color-contrast-checker": "2.1.0" + } +} +``` +Then do `npm install` + +Usage: +----- + +To check specific WCAG levels +``` +var ccc = new ColorContrastChecker(); + +var color1 = "#FFFFFF"; +var color2 = "#000000; + +if (ccc.isLevelAA(color1, color2, 14)) { + alert("Valid Level AA"); +} else { + alert("Invalid Contrast"); +} + +``` + +To check custom ratios +``` +var ccc = new ColorContrastChecker(); + +var color1 = "#FFFFFF"; +var color2 = "#000000; +var customRatio = 5.7; + +// No need for font size, now that we are using a custom ratio. +// This is because we are no longer checking against WCAG requirements. +if (ccc.isLevelCustom(color1, color2, customRatio)) { + alert("Above given ratio"); +} else { + alert("Invalid Contrast"); +} + +``` + +Advanced Usage: +-------------- + +You can pass pairs and get results: + + +``` + var pairs = [ + { + 'colorA': '#000000', + 'colorB': '#000000', // All should fail + 'fontSize': 14 + }, + { + 'colorA': '#000000', + 'colorB': '#FFFFFF', //All should pass + 'fontSize': 14 + }, + { + 'colorA': '#000000', + 'colorB': '#848484', //AAA should fail + 'fontSize': 14 + }, + { + 'colorA': '#000000', + 'colorB': '#848484', //All should pass (because of font) + 'fontSize': 19 + }, + { + 'colorA': '#000000', + 'colorB': '#757575', //AA should pass AAA should fail + 'fontSize': 14 + }, + { + 'colorA': '#000000', + 'colorB': '#656565', //All should fail + 'fontSize': 14 + } + ]; + + var results = ccc.checkPairs(pairs); + +``` + +The result will look like this: + +``` +[ + { + 'WCAG_AA' : false, + 'WCAG_AAA': false + }, + { + 'WCAG_AA' : true, + 'WCAG_AAA': true + }, + { + 'WCAG_AA' : true, + 'WCAG_AAA': false + }, + { + 'WCAG_AA' : true, + 'WCAG_AAA': true + }, + { + 'WCAG_AA' : true, + 'WCAG_AAA': false + }, + { + 'WCAG_AA' : false, + 'WCAG_AAA': false + } +] +``` + +## Tests + + `npm test` + +## Contributing + +In lieu of a formal style guide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code. diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html b/tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html new file mode 100644 index 0000000..4218da1 --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html @@ -0,0 +1,71 @@ + + + + Example - Color Contrast Checker + + + +

Color Contrast Checker

+

Try changing the values in the fields below

+ + + +
+ + + +
+ + + +
+ +
+ : + + +
+ : + + + + + + + + \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/package.json b/tests/wcag-compliance/node_modules/color-contrast-checker/package.json new file mode 100644 index 0000000..5d3efd2 --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/package.json @@ -0,0 +1,62 @@ +{ + "name": "color-contrast-checker", + "version": "2.1.0", + "description": "This is an accessibility validator based on WCAG 2.0 standard for checking the color contrast.", + "main": "src/color-contrast-checker.js", + "directories": { + "example": "example" + }, + "scripts": { + "test": "mocha --reporter spec", + "lint": "eslint test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Qambar/color-contrast-checker.git" + }, + "keywords": [ + "wcag", + "wcag-aa", + "color", + "contrast", + "verifier", + "accessibility", + "standard" + ], + "author": { + "name": "Qambar Raza", + "email": "qambar.raza@bbc.co.uk", + "url": "http://www.bbc.co.uk" + }, + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/Qambar/color-contrast-checker/issues" + }, + "homepage": "https://github.com/Qambar/color-contrast-checker#readme", + "gitHead": "45b65d45fc281ba90529183ff412299a7c1379d0", + "_id": "color-contrast-checker@1.2.0", + "_shasum": "a43bd41523775450e6f31ce38e64b44312157325", + "_from": "color-contrast-checker@1.2.0", + "_npmVersion": "2.13.1", + "_nodeVersion": "0.12.0", + "_npmUser": { + "name": "qambar", + "email": "qambar.raza@bbc.co.uk" + }, + "dist": { + "shasum": "a43bd41523775450e6f31ce38e64b44312157325", + "tarball": "http://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-1.2.0.tgz" + }, + "maintainers": [ + { + "name": "qambar", + "email": "qambar.raza@bbc.co.uk" + } + ], + "_resolved": "http://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-1.2.0.tgz", + "devDependencies": { + "chai": "^4.2.0", + "eslint": "^5.12.1", + "mocha": "^5.2.0" + } +} diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js b/tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js new file mode 100644 index 0000000..d4075b4 --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js @@ -0,0 +1,241 @@ +"use strict"; + +/** + * Color Contast Checker + * An accessibility checker tool for validating the color contrast based on WCAG 2.0 standard. + * var ccc = new ColorContrastChecker(); + + * var color1 = "#FFFFFF"; + * var color2 = "#000000; + + * if (ccc.isLevelAA(color1, color2, 14)) { + * alert("Valid Level AA"); + * } else { + * alert("Invalid Contrast"); + * } + */ + +function ColorContrastChecker() {}; + +module.exports = ColorContrastChecker; + +ColorContrastChecker.prototype = { + fontSize: 14, + rgbClass : { + toString: function() { + return ""; + } + }, + isValidSixDigitColorCode: function (hex){ + var regSixDigitColorcode = /^(#)?([0-9a-fA-F]{6})?$/; + return regSixDigitColorcode.test(hex); + }, + isValidThreeDigitColorCode: function (hex){ + var regThreeDigitColorcode = /^(#)?([0-9a-fA-F]{3})?$/; + return regThreeDigitColorcode.test(hex); + }, + isValidColorCode : function (hex){ + return this.isValidSixDigitColorCode(hex) || this.isValidThreeDigitColorCode(hex); + }, + isValidRatio : function (ratio){ + return (typeof ratio === "number"); + }, + convertColorToSixDigit: function (hex) { + return "#" + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3]; + }, + hexToLuminance: function (color) { + if (!this.isValidColorCode(color)) { + throw new Error("Invalid Color :" + color); + } + + if (this.isValidThreeDigitColorCode(color)) { + color = this.convertColorToSixDigit(color); + } + + color = this.getRGBFromHex(color); + + var LRGB = this.calculateLRGB(color); + + return this.calculateLuminance(LRGB); + }, + check: function (colorA, colorB, fontSize, customRatio) { + if (typeof fontSize !== "undefined") { + this.fontSize = fontSize; + } + + if(!colorA || !colorB) { + return false; + } + + var l1 = this.hexToLuminance(colorA); /* higher value */ + var l2 = this.hexToLuminance(colorB); /* lower value */ + var contrastRatio = this.getContrastRatio(l1, l2); + + if (typeof customRatio !== "undefined") { + if (!this.isValidRatio(customRatio)) { + return false; + } + return this.verifyCustomContrastRatio(contrastRatio, customRatio); + } else { + return this.verifyContrastRatio(contrastRatio); + } + }, + checkPairs: function (pairs, customRatio) { + var results = []; + + for (var i in pairs) { + var pair = pairs[i]; + if (typeof pair.fontSize !== "undefined") { + results.push( + this.check( + pair.colorA, + pair.colorB, + pair.fontSize, + customRatio + ) + ); + } else { + results.push( + this.check( + pair.colorA, + pair.colorB, + void 0, + customRatio + ) + ); + } + } + return results; + }, + calculateLuminance: function(lRGB) { + return (0.2126 * lRGB.r) + (0.7152 * lRGB.g) + (0.0722 * lRGB.b); + }, + isLevelAA : function(colorA, colorB, fontSize) { + var result = this.check(colorA, colorB, fontSize); + return result.WCAG_AA; + }, + isLevelAAA : function(colorA, colorB, fontSize) { + var result = this.check(colorA, colorB, fontSize); + return result.WCAG_AAA; + }, + isLevelCustom : function(colorA, colorB, ratio) { + var result = this.check(colorA, colorB, void 0, ratio); + return result.customRatio; + }, + getRGBFromHex : function(color) { + + var rgb = Object.create(this.rgbClass), + rVal, + gVal, + bVal; + + if (typeof color !== "string") { + throw new Error("must use string"); + } + + rVal = parseInt(color.slice(1, 3), 16); + gVal = parseInt(color.slice(3, 5), 16); + bVal = parseInt(color.slice(5, 7), 16); + + rgb.r = rVal; + rgb.g = gVal; + rgb.b = bVal; + + return rgb; + }, + calculateSRGB : function(rgb) { + var sRGB = Object.create(this.rgbClass), + key; + + for (key in rgb) { + if (rgb.hasOwnProperty(key)) { + sRGB[key] = parseFloat((rgb[key] / 255), 10); + } + } + + return sRGB; + }, + calculateLRGB: function (rgb) { + var sRGB = this.calculateSRGB(rgb); + var lRGB = Object.create(this.rgbClass), + key, + val = 0; + + for (key in sRGB) { + if (sRGB.hasOwnProperty(key)) { + val = parseFloat(sRGB[key], 10); + if (val <= 0.03928) { + lRGB[key] = (val / 12.92); + } else { + lRGB[key] = Math.pow(((val + 0.055) / 1.055), 2.4); + } + } + } + + return lRGB; + }, + getContrastRatio : function(lumA, lumB) { + var ratio, + lighter, + darker; + + if (lumA >= lumB) { + lighter = lumA; + darker = lumB; + } else { + lighter = lumB; + darker = lumA; + } + + ratio = (lighter + 0.05) / (darker + 0.05); + + return ratio; + }, + verifyContrastRatio : function(ratio) { + + + var resultsClass = { + toString: function() { + return "< WCAG-AA: " + ((this.WCAG_AA) ? "pass" : "fail") + + " WCAG-AAA: " + ((this.WCAG_AAA) ? "pass" : "fail") + + " >"; + } + }; + var WCAG_REQ_RATIO_AA_LG = 3.0, + WCAG_REQ_RATIO_AA_SM = 4.5, + WCAG_REQ_RATIO_AAA_LG = 4.5, + WCAG_REQ_RATIO_AAA_SM = 7.0, + WCAG_FONT_CUTOFF = 18; + + var results = Object.create(resultsClass), + fontSize = this.fontSize || 14; + + if (fontSize >= WCAG_FONT_CUTOFF) { + results.WCAG_AA = (ratio >= WCAG_REQ_RATIO_AA_LG); + results.WCAG_AAA = (ratio >= WCAG_REQ_RATIO_AAA_LG); + } else { + results.WCAG_AA = (ratio >= WCAG_REQ_RATIO_AA_SM); + results.WCAG_AAA = (ratio >= WCAG_REQ_RATIO_AAA_SM); + } + + return results; + }, + verifyCustomContrastRatio : function(inputRatio, checkRatio) { + + var resultsClass = { + toString: function() { + return "< Custom Ratio: " + ((this.customRatio) ? "pass" : "fail") + + " >"; + } + }; + + var results = Object.create(resultsClass); + + results.customRatio = (inputRatio >= checkRatio); + return results; + } + +}; diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js b/tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js new file mode 100644 index 0000000..aedef22 --- /dev/null +++ b/tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js @@ -0,0 +1,342 @@ +"use strict"; + +var expect = require("chai").expect; +var ColorContrastChecker = require("../src/color-contrast-checker"); +var ccc = new ColorContrastChecker(); + +describe("Three Digit Color Code Lengths", function() { + it("should accept 3 digit color code", function() { + var result = ccc.isValidThreeDigitColorCode("#FFF"); + expect(result).to.be.true; + }); + + it("should reject 2 digit color code", function() { + var result = ccc.isValidThreeDigitColorCode("#FF"); + expect(result).to.be.false; + }); + + it("should reject 4 digit color code", function() { + var result = ccc.isValidThreeDigitColorCode("#FFFF"); + expect(result).to.be.false; + }); + + it("should reject 6 digit color code", function() { + var result = ccc.isValidThreeDigitColorCode("#FFFFFF"); + expect(result).to.be.false; + }); +}); + +describe("Six Digit Color Code Lengths", function() { + it("should accept 6 digit color code", function() { + var result = ccc.isValidSixDigitColorCode("#FFFFFF"); + expect(result).to.be.true; + }); + + it("should reject 5 digit color code", function() { + var result = ccc.isValidSixDigitColorCode("#FFFFF"); + expect(result).to.be.false; + }); + + it("should reject 7 digit color code", function() { + var result = ccc.isValidSixDigitColorCode("#FFFFFFF"); + expect(result).to.be.false; + }); + + it("should reject 3 digit color code", function() { + var result = ccc.isValidSixDigitColorCode("#FFF"); + expect(result).to.be.false; + }); +}); + +describe("Supported Color Code Lengths", function() { + it("should accept 3 digit color code", function() { + var result = ccc.isValidColorCode("#FFF"); + expect(result).to.be.true; + }); + + it("should accept 6 digit color code", function() { + var result = ccc.isValidColorCode("#FFFFFF"); + expect(result).to.be.true; + }); + + it("should reject 7 digit color code", function() { + var result = ccc.isValidColorCode("#FFFFFFF"); + expect(result).to.be.false; + }); +}); + +describe("Supported Custom Ratio Inputs", function() { + it("should accept an integer", function() { + var result = ccc.isValidRatio(1); + expect(result).to.be.true; + }); + + it("should accept a float", function() { + var result = ccc.isValidRatio(3.2); + expect(result).to.be.true; + }); + + it("should reject a string", function() { + var result = ccc.isValidRatio("3.2"); + expect(result).to.be.false; + }); +}); + +describe("Convert Color from 3 digit to 6 digit", function() { + it("should convert 3 digit color to 6 digit", function() { + var result = ccc.convertColorToSixDigit("#FFF"); + expect(result).to.equal("#FFFFFF"); + }); +}); + +describe("Convert Hex to Luminance", function() { + it("should convert 3 digit color luminance value", function() { + var result = ccc.hexToLuminance("#FFF"); + expect(result).to.equal(1); + }); + + it("should convert 6 digit color luminance value", function() { + var result = ccc.hexToLuminance("#FFFFFF"); + expect(result).to.equal(1); + }); + + it("should convert blue color luminance value", function() { + var result = ccc.hexToLuminance("#0000FF"); + expect(result).to.equal(0.0722); + }); + + it("should convert yellow color luminance value", function() { + var result = ccc.hexToLuminance("#ffff00"); + expect(result).to.equal(0.9278); + }); +}); + +describe("Basic Validation for LevelAA", function() { + it("should return true when contrast is valid for three digit color codes", function() { + var result = ccc.isLevelAA("#FFF", "#000", 14); + expect(result).to.be.true; + }); + + it("should return true when contrast is valid", function() { + var result = ccc.isLevelAA("#FFFFFF", "#000000", 14); + expect(result).to.be.true; + }); + + it("should return false when contrast is invalid", function() { + var result = ccc.isLevelAA("#000000", "#000000", 14); + expect(result).to.be.false; + }); +}); + +describe("Basic Validation for LevelAAA", function() { + it("should return true when contrast is valid for three digit color codes", function() { + var result = ccc.isLevelAA("#FFF", "#000", 14); + expect(result).to.be.true; + }); + + it("should return true when contrast is valid", function() { + var result = ccc.isLevelAA("#FFFFFF", "#000000", 14); + expect(result).to.be.true; + }); + + it("should return false when contrast is invalid", function() { + var result = ccc.isLevelAA("#000000", "#000000", 14); + expect(result).to.be.false; + }); +}); + +describe("Basic Validation for Custom Ratio", function() { + it("should return true when contrast is valid for three digit color codes", function() { + var result = ccc.isLevelCustom("#FFF", "#000", 5); + expect(result).to.be.true; + }); + + it("should return true when contrast is valid", function() { + var result = ccc.isLevelCustom("#FFFFFF", "#000000", 5); + expect(result).to.be.true; + }); + + it("should return false when contrast is invalid", function() { + var result = ccc.isLevelCustom("#000000", "#000000", 5); + expect(result).to.be.false; + }); +}); + +describe("Six Digit Pair Validation for LevelAAA", function() { + var pairs = [ + { + "colorA": "#000000", + "colorB": "#000000", // All should fail + "fontSize": 14 + }, + { + "colorA": "#000000", + "colorB": "#FFFFFF", //All should pass + "fontSize": 14 + }, + { + "colorA": "#000000", + "colorB": "#998899", //AAA should fail + "fontSize": 14 + }, + { + "colorA": "#000000", + "colorB": "#998899", //All should pass (because of font) + "fontSize": 19 + }, + { + "colorA": "#000000", + "colorB": "#887788", //AA should pass AAA should fail + "fontSize": 14 + }, + { + "colorA": "#000000", + "colorB": "#656565", //All should fail + "fontSize": 14 + } + ]; + + + var expectedResults = [ + { WCAG_AA: false, WCAG_AAA: false }, + { WCAG_AA: true, WCAG_AAA: true }, + { WCAG_AA: true, WCAG_AAA: false }, + { WCAG_AA: true, WCAG_AAA: true }, + { WCAG_AA: true, WCAG_AAA: false }, + { WCAG_AA: false, WCAG_AAA: false } ]; + + function objectsAreSame(x, y) { + var objectsAreSame = true; + x.forEach((element, index) => { + if (element.WCAG_AA !== y[index].WCAG_AA) { + objectsAreSame = false; + } + if (element.WCAG_AAA !== y[index].WCAG_AAA) { + objectsAreSame = false; + } + }); + return objectsAreSame; + } + + it("should return the expectedResults for checkPairs", function() { + var results = ccc.checkPairs(pairs); + expect(results).to.be.an("array"); + expect(results).to.have.lengthOf(6); + expect(objectsAreSame(results, expectedResults)).to.be.true; + }); +}); + +describe("Three Digit Pair Validation for LevelAAA", function() { + var pairs = [ + { + "colorA": "#000", + "colorB": "#000", // All should fail + "fontSize": 14 + }, + { + "colorA": "#000", + "colorB": "#FFF", //All should pass + "fontSize": 14 + }, + { + "colorA": "#000", + "colorB": "#989", //AAA should fail + "fontSize": 14 + }, + { + "colorA": "#000", + "colorB": "#989", //All should pass (because of font) + "fontSize": 19 + }, + { + "colorA": "#000", + "colorB": "#878", //AA should pass AAA should fail + "fontSize": 14 + }, + { + "colorA": "#000", + "colorB": "#656", //All should fail + "fontSize": 14 + } + ]; + + + var expectedResults = [ + { WCAG_AA: false, WCAG_AAA: false }, + { WCAG_AA: true, WCAG_AAA: true }, + { WCAG_AA: true, WCAG_AAA: false }, + { WCAG_AA: true, WCAG_AAA: true }, + { WCAG_AA: true, WCAG_AAA: false }, + { WCAG_AA: false, WCAG_AAA: false } ]; + + function objectsAreSame(x, y) { + var objectsAreSame = true; + x.forEach((element, index) => { + if (element.WCAG_AA !== y[index].WCAG_AA) { + objectsAreSame = false; + } + if (element.WCAG_AAA !== y[index].WCAG_AAA) { + objectsAreSame = false; + } + }); + return objectsAreSame; + } + it("should return the expectedResults for checkPairs", function() { + var results = ccc.checkPairs(pairs); + expect(results).to.be.an("array"); + expect(results).to.have.lengthOf(6); + expect(objectsAreSame(results, expectedResults)).to.be.true; + }); +}); + +describe("Six Digit Pair Validation for Custom Ratio", function() { + var pairs = [ + { + "colorA": "#000000", + "colorB": "#000000", // This should fail + "fontSize": 14 + }, + { + "colorA": "#000000", + "colorB": "#FFFFFF", // This should pass + "fontSize": 14 + }, + { + "colorA": "#000000", + "colorB": "#998899", // This should pass + "fontSize": 14 + }, + { + "colorA": "#000000", + "colorB": "#656565", // This should fail + "fontSize": 14 + } + ]; + + + var expectedResults = [ + { customRatio: false }, + { customRatio: true }, + { customRatio: true }, + { customRatio: false } ]; + + function objectsAreSame(x, y) { + var objectsAreSame = true; + x.forEach((element, index) => { + if (element.WCAG_AA !== y[index].WCAG_AA) { + objectsAreSame = false; + } + if (element.WCAG_AAA !== y[index].WCAG_AAA) { + objectsAreSame = false; + } + }); + return objectsAreSame; + } + + it("should return the expectedResults for checkPairs", function() { + var results = ccc.checkPairs(pairs, 5.6); + expect(results).to.be.an("array"); + expect(results).to.have.lengthOf(4); + expect(objectsAreSame(results, expectedResults)).to.be.true; + }); +}); diff --git a/tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md b/tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md new file mode 100644 index 0000000..d07c9e5 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md @@ -0,0 +1,130 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +### [7.0.3](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.2...v7.0.3) (2020-05-25) + + +### Bug Fixes + +* detect path key based on correct environment ([#133](https://github.com/moxystudio/node-cross-spawn/issues/133)) ([159e7e9](https://github.com/moxystudio/node-cross-spawn/commit/159e7e9785e57451cba034ae51719f97135074ae)) + +### [7.0.2](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.1...v7.0.2) (2020-04-04) + + +### Bug Fixes + +* fix worker threads in Node >=11.10.0 ([#132](https://github.com/moxystudio/node-cross-spawn/issues/132)) ([6c5b4f0](https://github.com/moxystudio/node-cross-spawn/commit/6c5b4f015814a6c4f6b33230dfd1a860aedc0aaf)) + +### [7.0.1](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.0...v7.0.1) (2019-10-07) + + +### Bug Fixes + +* **core:** support worker threads ([#127](https://github.com/moxystudio/node-cross-spawn/issues/127)) ([cfd49c9](https://github.com/moxystudio/node-cross-spawn/commit/cfd49c9)) + +## [7.0.0](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.5...v7.0.0) (2019-09-03) + + +### ⚠ BREAKING CHANGES + +* drop support for Node.js < 8 + +* drop support for versions below Node.js 8 ([#125](https://github.com/moxystudio/node-cross-spawn/issues/125)) ([16feb53](https://github.com/moxystudio/node-cross-spawn/commit/16feb53)) + + +## [6.0.5](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.4...v6.0.5) (2018-03-02) + + +### Bug Fixes + +* avoid using deprecated Buffer constructor ([#94](https://github.com/moxystudio/node-cross-spawn/issues/94)) ([d5770df](https://github.com/moxystudio/node-cross-spawn/commit/d5770df)), closes [/nodejs.org/api/deprecations.html#deprecations_dep0005](https://github.com//nodejs.org/api/deprecations.html/issues/deprecations_dep0005) + + + + +## [6.0.4](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.3...v6.0.4) (2018-01-31) + + +### Bug Fixes + +* fix paths being incorrectly normalized on unix ([06ee3c6](https://github.com/moxystudio/node-cross-spawn/commit/06ee3c6)), closes [#90](https://github.com/moxystudio/node-cross-spawn/issues/90) + + + + +## [6.0.3](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.2...v6.0.3) (2018-01-23) + + + + +## [6.0.2](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.1...v6.0.2) (2018-01-23) + + + + +## [6.0.1](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.0...v6.0.1) (2018-01-23) + + + + +# [6.0.0](https://github.com/moxystudio/node-cross-spawn/compare/5.1.0...6.0.0) (2018-01-23) + + +### Bug Fixes + +* fix certain arguments not being correctly escaped or causing batch syntax error ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)), closes [#82](https://github.com/moxystudio/node-cross-spawn/issues/82) [#51](https://github.com/moxystudio/node-cross-spawn/issues/51) +* fix commands as posix relatixe paths not working correctly, e.g.: `./my-command` ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) +* fix `options` argument being mutated ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) +* fix commands resolution when PATH was actually Path ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) + + +### Features + +* improve compliance with node's ENOENT errors ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) +* improve detection of node's shell option support ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) + + +### Chores + +* upgrade tooling +* upgrate project to es6 (node v4) + + +### BREAKING CHANGES + +* remove support for older nodejs versions, only `node >= 4` is supported + + + +## [5.1.0](https://github.com/moxystudio/node-cross-spawn/compare/5.0.1...5.1.0) (2017-02-26) + + +### Bug Fixes + +* fix `options.shell` support for NodeJS [v4.8](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V4.md#4.8.0) + + + +## [5.0.1](https://github.com/moxystudio/node-cross-spawn/compare/5.0.0...5.0.1) (2016-11-04) + + +### Bug Fixes + +* fix `options.shell` support for NodeJS v7 + + + +# [5.0.0](https://github.com/moxystudio/node-cross-spawn/compare/4.0.2...5.0.0) (2016-10-30) + + +## Features + +* add support for `options.shell` +* improve parsing of shebangs by using [`shebang-command`](https://github.com/kevva/shebang-command) module + + +## Chores + +* refactor some code to make it more clear +* update README caveats diff --git a/tests/wcag-compliance/node_modules/cross-spawn/LICENSE b/tests/wcag-compliance/node_modules/cross-spawn/LICENSE new file mode 100644 index 0000000..8407b9a --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Made With MOXY Lda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/cross-spawn/README.md b/tests/wcag-compliance/node_modules/cross-spawn/README.md new file mode 100644 index 0000000..c4a4da8 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/README.md @@ -0,0 +1,96 @@ +# cross-spawn + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Build status][appveyor-image]][appveyor-url] [![Coverage Status][codecov-image]][codecov-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] + +[npm-url]:https://npmjs.org/package/cross-spawn +[downloads-image]:https://img.shields.io/npm/dm/cross-spawn.svg +[npm-image]:https://img.shields.io/npm/v/cross-spawn.svg +[travis-url]:https://travis-ci.org/moxystudio/node-cross-spawn +[travis-image]:https://img.shields.io/travis/moxystudio/node-cross-spawn/master.svg +[appveyor-url]:https://ci.appveyor.com/project/satazor/node-cross-spawn +[appveyor-image]:https://img.shields.io/appveyor/ci/satazor/node-cross-spawn/master.svg +[codecov-url]:https://codecov.io/gh/moxystudio/node-cross-spawn +[codecov-image]:https://img.shields.io/codecov/c/github/moxystudio/node-cross-spawn/master.svg +[david-dm-url]:https://david-dm.org/moxystudio/node-cross-spawn +[david-dm-image]:https://img.shields.io/david/moxystudio/node-cross-spawn.svg +[david-dm-dev-url]:https://david-dm.org/moxystudio/node-cross-spawn?type=dev +[david-dm-dev-image]:https://img.shields.io/david/dev/moxystudio/node-cross-spawn.svg + +A cross platform solution to node's spawn and spawnSync. + + +## Installation + +Node.js version 8 and up: +`$ npm install cross-spawn` + +Node.js version 7 and under: +`$ npm install cross-spawn@6` + +## Why + +Node has issues when using spawn on Windows: + +- It ignores [PATHEXT](https://github.com/joyent/node/issues/2318) +- It does not support [shebangs](https://en.wikipedia.org/wiki/Shebang_(Unix)) +- Has problems running commands with [spaces](https://github.com/nodejs/node/issues/7367) +- Has problems running commands with posix relative paths (e.g.: `./my-folder/my-executable`) +- Has an [issue](https://github.com/moxystudio/node-cross-spawn/issues/82) with command shims (files in `node_modules/.bin/`), where arguments with quotes and parenthesis would result in [invalid syntax error](https://github.com/moxystudio/node-cross-spawn/blob/e77b8f22a416db46b6196767bcd35601d7e11d54/test/index.test.js#L149) +- No `options.shell` support on node `` where `` must not contain any arguments. +If you would like to have the shebang support improved, feel free to contribute via a pull-request. + +Remember to always test your code on Windows! + + +## Tests + +`$ npm test` +`$ npm test -- --watch` during development + + +## License + +Released under the [MIT License](https://www.opensource.org/licenses/mit-license.php). diff --git a/tests/wcag-compliance/node_modules/cross-spawn/index.js b/tests/wcag-compliance/node_modules/cross-spawn/index.js new file mode 100644 index 0000000..5509742 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/index.js @@ -0,0 +1,39 @@ +'use strict'; + +const cp = require('child_process'); +const parse = require('./lib/parse'); +const enoent = require('./lib/enoent'); + +function spawn(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); + + // Spawn the child process + const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); + + // Hook into child process "exit" event to emit an error if the command + // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + enoent.hookChildProcess(spawned, parsed); + + return spawned; +} + +function spawnSync(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); + + // Spawn the child process + const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); + + // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); + + return result; +} + +module.exports = spawn; +module.exports.spawn = spawn; +module.exports.sync = spawnSync; + +module.exports._parse = parse; +module.exports._enoent = enoent; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js new file mode 100644 index 0000000..14df9b6 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js @@ -0,0 +1,59 @@ +'use strict'; + +const isWin = process.platform === 'win32'; + +function notFoundError(original, syscall) { + return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { + code: 'ENOENT', + errno: 'ENOENT', + syscall: `${syscall} ${original.command}`, + path: original.command, + spawnargs: original.args, + }); +} + +function hookChildProcess(cp, parsed) { + if (!isWin) { + return; + } + + const originalEmit = cp.emit; + + cp.emit = function (name, arg1) { + // If emitting "exit" event and exit code is 1, we need to check if + // the command exists and emit an "error" instead + // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 + if (name === 'exit') { + const err = verifyENOENT(arg1, parsed, 'spawn'); + + if (err) { + return originalEmit.call(cp, 'error', err); + } + } + + return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params + }; +} + +function verifyENOENT(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawn'); + } + + return null; +} + +function verifyENOENTSync(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawnSync'); + } + + return null; +} + +module.exports = { + hookChildProcess, + verifyENOENT, + verifyENOENTSync, + notFoundError, +}; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js new file mode 100644 index 0000000..0129d74 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js @@ -0,0 +1,91 @@ +'use strict'; + +const path = require('path'); +const resolveCommand = require('./util/resolveCommand'); +const escape = require('./util/escape'); +const readShebang = require('./util/readShebang'); + +const isWin = process.platform === 'win32'; +const isExecutableRegExp = /\.(?:com|exe)$/i; +const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + +function detectShebang(parsed) { + parsed.file = resolveCommand(parsed); + + const shebang = parsed.file && readShebang(parsed.file); + + if (shebang) { + parsed.args.unshift(parsed.file); + parsed.command = shebang; + + return resolveCommand(parsed); + } + + return parsed.file; +} + +function parseNonShell(parsed) { + if (!isWin) { + return parsed; + } + + // Detect & add support for shebangs + const commandFile = detectShebang(parsed); + + // We don't need a shell if the command filename is an executable + const needsShell = !isExecutableRegExp.test(commandFile); + + // If a shell is required, use cmd.exe and take care of escaping everything correctly + // Note that `forceShell` is an hidden option used only in tests + if (parsed.options.forceShell || needsShell) { + // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` + // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument + // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, + // we need to double escape them + const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); + + // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) + // This is necessary otherwise it will always fail with ENOENT in those cases + parsed.command = path.normalize(parsed.command); + + // Escape command & arguments + parsed.command = escape.command(parsed.command); + parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); + + const shellCommand = [parsed.command].concat(parsed.args).join(' '); + + parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; + parsed.command = process.env.comspec || 'cmd.exe'; + parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped + } + + return parsed; +} + +function parse(command, args, options) { + // Normalize arguments, similar to nodejs + if (args && !Array.isArray(args)) { + options = args; + args = null; + } + + args = args ? args.slice(0) : []; // Clone array to avoid changing the original + options = Object.assign({}, options); // Clone object to avoid changing the original + + // Build our parsed object + const parsed = { + command, + args, + options, + file: undefined, + original: { + command, + args, + }, + }; + + // Delegate further parsing to shell or non-shell + return options.shell ? parsed : parseNonShell(parsed); +} + +module.exports = parse; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js new file mode 100644 index 0000000..b0bb84c --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js @@ -0,0 +1,45 @@ +'use strict'; + +// See http://www.robvanderwoude.com/escapechars.php +const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; + +function escapeCommand(arg) { + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + return arg; +} + +function escapeArgument(arg, doubleEscapeMetaChars) { + // Convert to string + arg = `${arg}`; + + // Algorithm below is based on https://qntm.org/cmd + + // Sequence of backslashes followed by a double quote: + // double up all the backslashes and escape the double quote + arg = arg.replace(/(\\*)"/g, '$1$1\\"'); + + // Sequence of backslashes followed by the end of the string + // (which will become a double quote later): + // double up all the backslashes + arg = arg.replace(/(\\*)$/, '$1$1'); + + // All other backslashes occur literally + + // Quote the whole thing: + arg = `"${arg}"`; + + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); + + // Double escape meta chars if necessary + if (doubleEscapeMetaChars) { + arg = arg.replace(metaCharsRegExp, '^$1'); + } + + return arg; +} + +module.exports.command = escapeCommand; +module.exports.argument = escapeArgument; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js new file mode 100644 index 0000000..5e83733 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js @@ -0,0 +1,23 @@ +'use strict'; + +const fs = require('fs'); +const shebangCommand = require('shebang-command'); + +function readShebang(command) { + // Read the first 150 bytes from the file + const size = 150; + const buffer = Buffer.alloc(size); + + let fd; + + try { + fd = fs.openSync(command, 'r'); + fs.readSync(fd, buffer, 0, size, 0); + fs.closeSync(fd); + } catch (e) { /* Empty */ } + + // Attempt to extract shebang (null is returned if not a shebang) + return shebangCommand(buffer.toString()); +} + +module.exports = readShebang; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js new file mode 100644 index 0000000..7972455 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js @@ -0,0 +1,52 @@ +'use strict'; + +const path = require('path'); +const which = require('which'); +const getPathKey = require('path-key'); + +function resolveCommandAttempt(parsed, withoutPathExt) { + const env = parsed.options.env || process.env; + const cwd = process.cwd(); + const hasCustomCwd = parsed.options.cwd != null; + // Worker threads do not have process.chdir() + const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled; + + // If a custom `cwd` was specified, we need to change the process cwd + // because `which` will do stat calls but does not support a custom cwd + if (shouldSwitchCwd) { + try { + process.chdir(parsed.options.cwd); + } catch (err) { + /* Empty */ + } + } + + let resolved; + + try { + resolved = which.sync(parsed.command, { + path: env[getPathKey({ env })], + pathExt: withoutPathExt ? path.delimiter : undefined, + }); + } catch (e) { + /* Empty */ + } finally { + if (shouldSwitchCwd) { + process.chdir(cwd); + } + } + + // If we successfully resolved, ensure that an absolute path is returned + // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it + if (resolved) { + resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); + } + + return resolved; +} + +function resolveCommand(parsed) { + return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +} + +module.exports = resolveCommand; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/package.json b/tests/wcag-compliance/node_modules/cross-spawn/package.json new file mode 100644 index 0000000..232ff97 --- /dev/null +++ b/tests/wcag-compliance/node_modules/cross-spawn/package.json @@ -0,0 +1,73 @@ +{ + "name": "cross-spawn", + "version": "7.0.3", + "description": "Cross platform child_process#spawn and child_process#spawnSync", + "keywords": [ + "spawn", + "spawnSync", + "windows", + "cross-platform", + "path-ext", + "shebang", + "cmd", + "execute" + ], + "author": "André Cruz ", + "homepage": "https://github.com/moxystudio/node-cross-spawn", + "repository": { + "type": "git", + "url": "git@github.com:moxystudio/node-cross-spawn.git" + }, + "license": "MIT", + "main": "index.js", + "files": [ + "lib" + ], + "scripts": { + "lint": "eslint .", + "test": "jest --env node --coverage", + "prerelease": "npm t && npm run lint", + "release": "standard-version", + "postrelease": "git push --follow-tags origin HEAD && npm publish" + }, + "husky": { + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "*.js": [ + "eslint --fix", + "git add" + ] + }, + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "devDependencies": { + "@commitlint/cli": "^8.1.0", + "@commitlint/config-conventional": "^8.1.0", + "babel-core": "^6.26.3", + "babel-jest": "^24.9.0", + "babel-preset-moxy": "^3.1.0", + "eslint": "^5.16.0", + "eslint-config-moxy": "^7.1.0", + "husky": "^3.0.5", + "jest": "^24.9.0", + "lint-staged": "^9.2.5", + "mkdirp": "^0.5.1", + "rimraf": "^3.0.0", + "standard-version": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } +} diff --git a/tests/wcag-compliance/node_modules/execa/index.d.ts b/tests/wcag-compliance/node_modules/execa/index.d.ts new file mode 100644 index 0000000..f9cf418 --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/index.d.ts @@ -0,0 +1,586 @@ +import {Buffer} from 'node:buffer'; +import {ChildProcess} from 'node:child_process'; +import {Stream, Readable as ReadableStream} from 'node:stream'; + +export type StdioOption = + | 'pipe' + | 'ipc' + | 'ignore' + | 'inherit' + | Stream + | number + | undefined; + +export interface CommonOptions { + /** + Kill the spawned process when the parent process exits unless either: + - the spawned process is [`detached`](https://nodejs.org/api/child_process.html#child_process_options_detached) + - the parent process is terminated abruptly, for example, with `SIGKILL` as opposed to `SIGTERM` or a normal exit + + @default true + */ + readonly cleanup?: boolean; + + /** + Prefer locally installed binaries when looking for a binary to execute. + + If you `$ npm install foo`, you can then `execa('foo')`. + + @default false + */ + readonly preferLocal?: boolean; + + /** + Preferred path to find locally installed binaries in (use with `preferLocal`). + + Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. + + @default process.cwd() + */ + readonly localDir?: string | URL; + + /** + Path to the Node.js executable to use in child processes. + + This can be either an absolute path or a path relative to the `cwd` option. + + Requires `preferLocal` to be `true`. + + For example, this can be used together with [`get-node`](https://github.com/ehmicky/get-node) to run a specific Node.js version in a child process. + + @default process.execPath + */ + readonly execPath?: string; + + /** + Buffer the output from the spawned process. When set to `false`, you must read the output of `stdout` and `stderr` (or `all` if the `all` option is `true`). Otherwise the returned promise will not be resolved/rejected. + + If the spawned process fails, `error.stdout`, `error.stderr`, and `error.all` will contain the buffered data. + + @default true + */ + readonly buffer?: boolean; + + /** + Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). + + @default 'pipe' + */ + readonly stdin?: StdioOption; + + /** + Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). + + @default 'pipe' + */ + readonly stdout?: StdioOption; + + /** + Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). + + @default 'pipe' + */ + readonly stderr?: StdioOption; + + /** + Setting this to `false` resolves the promise with the error instead of rejecting it. + + @default true + */ + readonly reject?: boolean; + + /** + Add an `.all` property on the promise and the resolved value. The property contains the output of the process with `stdout` and `stderr` interleaved. + + @default false + */ + readonly all?: boolean; + + /** + Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from the output. + + @default true + */ + readonly stripFinalNewline?: boolean; + + /** + Set to `false` if you don't want to extend the environment variables when providing the `env` property. + + @default true + */ + readonly extendEnv?: boolean; + + /** + Current working directory of the child process. + + Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. + + @default process.cwd() + */ + readonly cwd?: string | URL; + + /** + Environment key-value pairs. Extends automatically from `process.env`. Set `extendEnv` to `false` if you don't want this. + + @default process.env + */ + readonly env?: NodeJS.ProcessEnv; + + /** + Explicitly set the value of `argv[0]` sent to the child process. This will be set to `command` or `file` if not specified. + */ + readonly argv0?: string; + + /** + Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration. + + @default 'pipe' + */ + readonly stdio?: 'pipe' | 'ignore' | 'inherit' | readonly StdioOption[]; + + /** + Specify the kind of serialization used for sending messages between processes when using the `stdio: 'ipc'` option or `execaNode()`: + - `json`: Uses `JSON.stringify()` and `JSON.parse()`. + - `advanced`: Uses [`v8.serialize()`](https://nodejs.org/api/v8.html#v8_v8_serialize_value) + + Requires Node.js `13.2.0` or later. + + [More info.](https://nodejs.org/api/child_process.html#child_process_advanced_serialization) + + @default 'json' + */ + readonly serialization?: 'json' | 'advanced'; + + /** + Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached). + + @default false + */ + readonly detached?: boolean; + + /** + Sets the user identity of the process. + */ + readonly uid?: number; + + /** + Sets the group identity of the process. + */ + readonly gid?: number; + + /** + If `true`, runs `command` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows. + + We recommend against using this option since it is: + - not cross-platform, encouraging shell-specific syntax. + - slower, because of the additional shell interpretation. + - unsafe, potentially allowing command injection. + + @default false + */ + readonly shell?: boolean | string; + + /** + Specify the character encoding used to decode the `stdout` and `stderr` output. If set to `null`, then `stdout` and `stderr` will be a `Buffer` instead of a string. + + @default 'utf8' + */ + readonly encoding?: EncodingType; + + /** + If `timeout` is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than `timeout` milliseconds. + + @default 0 + */ + readonly timeout?: number; + + /** + Largest amount of data in bytes allowed on `stdout` or `stderr`. Default: 100 MB. + + @default 100_000_000 + */ + readonly maxBuffer?: number; + + /** + Signal value to be used when the spawned process will be killed. + + @default 'SIGTERM' + */ + readonly killSignal?: string | number; + + /** + You can abort the spawned process using [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController). + + When `AbortController.abort()` is called, [`.isCanceled`](https://github.com/sindresorhus/execa#iscanceled) becomes `false`. + + *Requires Node.js 16 or later.* + + @example + ```js + import {execa} from 'execa'; + + const abortController = new AbortController(); + const subprocess = execa('node', [], {signal: abortController.signal}); + + setTimeout(() => { + abortController.abort(); + }, 1000); + + try { + await subprocess; + } catch (error) { + console.log(subprocess.killed); // true + console.log(error.isCanceled); // true + } + ``` + */ + readonly signal?: AbortSignal; + + /** + If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`. + + @default false + */ + readonly windowsVerbatimArguments?: boolean; + + /** + On Windows, do not create a new console window. Please note this also prevents `CTRL-C` [from working](https://github.com/nodejs/node/issues/29837) on Windows. + + @default true + */ + readonly windowsHide?: boolean; +} + +export interface Options extends CommonOptions { + /** + Write some input to the `stdin` of your binary. + */ + readonly input?: string | Buffer | ReadableStream; +} + +export interface SyncOptions extends CommonOptions { + /** + Write some input to the `stdin` of your binary. + */ + readonly input?: string | Buffer; +} + +export interface NodeOptions extends Options { + /** + The Node.js executable to use. + + @default process.execPath + */ + readonly nodePath?: string; + + /** + List of [CLI options](https://nodejs.org/api/cli.html#cli_options) passed to the Node.js executable. + + @default process.execArgv + */ + readonly nodeOptions?: string[]; +} + +export interface ExecaReturnBase { + /** + The file and arguments that were run, for logging purposes. + + This is not escaped and should not be executed directly as a process, including using `execa()` or `execaCommand()`. + */ + command: string; + + /** + Same as `command` but escaped. + + This is meant to be copy and pasted into a shell, for debugging purposes. + Since the escaping is fairly basic, this should not be executed directly as a process, including using `execa()` or `execaCommand()`. + */ + escapedCommand: string; + + /** + The numeric exit code of the process that was run. + */ + exitCode: number; + + /** + The output of the process on stdout. + */ + stdout: StdoutStderrType; + + /** + The output of the process on stderr. + */ + stderr: StdoutStderrType; + + /** + Whether the process failed to run. + */ + failed: boolean; + + /** + Whether the process timed out. + */ + timedOut: boolean; + + /** + Whether the process was killed. + */ + killed: boolean; + + /** + The name of the signal that was used to terminate the process. For example, `SIGFPE`. + + If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. + */ + signal?: string; + + /** + A human-friendly description of the signal that was used to terminate the process. For example, `Floating point arithmetic error`. + + If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. It is also `undefined` when the signal is very uncommon which should seldomly happen. + */ + signalDescription?: string; +} + +export interface ExecaSyncReturnValue + extends ExecaReturnBase { +} + +/** +Result of a child process execution. On success this is a plain object. On failure this is also an `Error` instance. + +The child process fails when: +- its exit code is not `0` +- it was killed with a signal +- timing out +- being canceled +- there's not enough memory or there are already too many child processes +*/ +export interface ExecaReturnValue + extends ExecaSyncReturnValue { + /** + The output of the process with `stdout` and `stderr` interleaved. + + This is `undefined` if either: + - the `all` option is `false` (default value) + - `execaSync()` was used + */ + all?: StdoutErrorType; + + /** + Whether the process was canceled. + + You can cancel the spawned process using the [`signal`](https://github.com/sindresorhus/execa#signal-1) option. + */ + isCanceled: boolean; +} + +export interface ExecaSyncError + extends Error, + ExecaReturnBase { + /** + Error message when the child process failed to run. In addition to the underlying error message, it also contains some information related to why the child process errored. + + The child process stderr then stdout are appended to the end, separated with newlines and not interleaved. + */ + message: string; + + /** + This is the same as the `message` property except it does not include the child process stdout/stderr. + */ + shortMessage: string; + + /** + Original error message. This is the same as the `message` property except it includes neither the child process stdout/stderr nor some additional information added by Execa. + + This is `undefined` unless the child process exited due to an `error` event or a timeout. + */ + originalMessage?: string; +} + +export interface ExecaError + extends ExecaSyncError { + /** + The output of the process with `stdout` and `stderr` interleaved. + + This is `undefined` if either: + - the `all` option is `false` (default value) + - `execaSync()` was used + */ + all?: StdoutErrorType; + + /** + Whether the process was canceled. + */ + isCanceled: boolean; +} + +export interface KillOptions { + /** + Milliseconds to wait for the child process to terminate before sending `SIGKILL`. + + Can be disabled with `false`. + + @default 5000 + */ + forceKillAfterTimeout?: number | false; +} + +export interface ExecaChildPromise { + /** + Stream combining/interleaving [`stdout`](https://nodejs.org/api/child_process.html#child_process_subprocess_stdout) and [`stderr`](https://nodejs.org/api/child_process.html#child_process_subprocess_stderr). + + This is `undefined` if either: + - the `all` option is `false` (the default value) + - both `stdout` and `stderr` options are set to [`'inherit'`, `'ipc'`, `Stream` or `integer`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio) + */ + all?: ReadableStream; + + catch( + onRejected?: (reason: ExecaError) => ResultType | PromiseLike + ): Promise | ResultType>; + + /** + Same as the original [`child_process#kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal), except if `signal` is `SIGTERM` (the default value) and the child process is not terminated after 5 seconds, force it by sending `SIGKILL`. + */ + kill(signal?: string, options?: KillOptions): void; + + /** + Similar to [`childProcess.kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal). This is preferred when cancelling the child process execution as the error is more descriptive and [`childProcessResult.isCanceled`](#iscanceled) is set to `true`. + */ + cancel(): void; +} + +export type ExecaChildProcess = ChildProcess & +ExecaChildPromise & +Promise>; + +/** +Execute a file. + +Think of this as a mix of `child_process.execFile` and `child_process.spawn`. + +@param file - The program/script to execute. +@param arguments - Arguments to pass to `file` on execution. +@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties. + +@example +``` +import {execa} from 'execa'; + +const {stdout} = await execa('echo', ['unicorns']); +console.log(stdout); +//=> 'unicorns' + +// Cancelling a spawned process + +const subprocess = execa('node'); + +setTimeout(() => { + subprocess.cancel() +}, 1000); + +try { + await subprocess; +} catch (error) { + console.log(subprocess.killed); // true + console.log(error.isCanceled); // true +} + +// Pipe the child process stdout to the current stdout +execa('echo', ['unicorns']).stdout.pipe(process.stdout); +``` +*/ +export function execa( + file: string, + arguments?: readonly string[], + options?: Options +): ExecaChildProcess; +export function execa( + file: string, + arguments?: readonly string[], + options?: Options +): ExecaChildProcess; +export function execa(file: string, options?: Options): ExecaChildProcess; +export function execa(file: string, options?: Options): ExecaChildProcess; + +/** +Execute a file synchronously. + +This method throws an `Error` if the command fails. + +@param file - The program/script to execute. +@param arguments - Arguments to pass to `file` on execution. +@returns A result `Object` with `stdout` and `stderr` properties. +*/ +export function execaSync( + file: string, + arguments?: readonly string[], + options?: SyncOptions +): ExecaSyncReturnValue; +export function execaSync( + file: string, + arguments?: readonly string[], + options?: SyncOptions +): ExecaSyncReturnValue; +export function execaSync(file: string, options?: SyncOptions): ExecaSyncReturnValue; +export function execaSync( + file: string, + options?: SyncOptions +): ExecaSyncReturnValue; + +/** +Same as `execa()` except both file and arguments are specified in a single `command` string. For example, `execa('echo', ['unicorns'])` is the same as `execaCommand('echo unicorns')`. + +If the file or an argument contains spaces, they must be escaped with backslashes. This matters especially if `command` is not a constant but a variable, for example with `__dirname` or `process.cwd()`. Except for spaces, no escaping/quoting is needed. + +The `shell` option must be used if the `command` uses shell-specific features (for example, `&&` or `||`), as opposed to being a simple `file` followed by its `arguments`. + +@param command - The program/script to execute and its arguments. +@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties. + +@example +``` +import {execaCommand} from 'execa'; + +const {stdout} = await execaCommand('echo unicorns'); +console.log(stdout); +//=> 'unicorns' +``` +*/ +export function execaCommand(command: string, options?: Options): ExecaChildProcess; +export function execaCommand(command: string, options?: Options): ExecaChildProcess; + +/** +Same as `execaCommand()` but synchronous. + +@param command - The program/script to execute and its arguments. +@returns A result `Object` with `stdout` and `stderr` properties. +*/ +export function execaCommandSync(command: string, options?: SyncOptions): ExecaSyncReturnValue; +export function execaCommandSync(command: string, options?: SyncOptions): ExecaSyncReturnValue; + +/** +Execute a Node.js script as a child process. + +Same as `execa('node', [scriptPath, ...arguments], options)` except (like [`child_process#fork()`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)): + - the current Node version and options are used. This can be overridden using the `nodePath` and `nodeArguments` options. + - the `shell` option cannot be used + - an extra channel [`ipc`](https://nodejs.org/api/child_process.html#child_process_options_stdio) is passed to [`stdio`](#stdio) + +@param scriptPath - Node.js script to execute. +@param arguments - Arguments to pass to `scriptPath` on execution. +@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties. +*/ +export function execaNode( + scriptPath: string, + arguments?: readonly string[], + options?: NodeOptions +): ExecaChildProcess; +export function execaNode( + scriptPath: string, + arguments?: readonly string[], + options?: Options +): ExecaChildProcess; +export function execaNode(scriptPath: string, options?: Options): ExecaChildProcess; +export function execaNode(scriptPath: string, options?: Options): ExecaChildProcess; diff --git a/tests/wcag-compliance/node_modules/execa/index.js b/tests/wcag-compliance/node_modules/execa/index.js new file mode 100644 index 0000000..f060590 --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/index.js @@ -0,0 +1,267 @@ +import {Buffer} from 'node:buffer'; +import path from 'node:path'; +import childProcess from 'node:child_process'; +import process from 'node:process'; +import crossSpawn from 'cross-spawn'; +import stripFinalNewline from 'strip-final-newline'; +import {npmRunPathEnv} from 'npm-run-path'; +import onetime from 'onetime'; +import {makeError} from './lib/error.js'; +import {normalizeStdio, normalizeStdioNode} from './lib/stdio.js'; +import {spawnedKill, spawnedCancel, setupTimeout, validateTimeout, setExitHandler} from './lib/kill.js'; +import {handleInput, getSpawnedResult, makeAllStream, validateInputSync} from './lib/stream.js'; +import {mergePromise, getSpawnedPromise} from './lib/promise.js'; +import {joinCommand, parseCommand, getEscapedCommand} from './lib/command.js'; + +const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; + +const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { + const env = extendEnv ? {...process.env, ...envOption} : envOption; + + if (preferLocal) { + return npmRunPathEnv({env, cwd: localDir, execPath}); + } + + return env; +}; + +const handleArguments = (file, args, options = {}) => { + const parsed = crossSpawn._parse(file, args, options); + file = parsed.command; + args = parsed.args; + options = parsed.options; + + options = { + maxBuffer: DEFAULT_MAX_BUFFER, + buffer: true, + stripFinalNewline: true, + extendEnv: true, + preferLocal: false, + localDir: options.cwd || process.cwd(), + execPath: process.execPath, + encoding: 'utf8', + reject: true, + cleanup: true, + all: false, + windowsHide: true, + ...options, + }; + + options.env = getEnv(options); + + options.stdio = normalizeStdio(options); + + if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { + // #116 + args.unshift('/q'); + } + + return {file, args, options, parsed}; +}; + +const handleOutput = (options, value, error) => { + if (typeof value !== 'string' && !Buffer.isBuffer(value)) { + // When `execaSync()` errors, we normalize it to '' to mimic `execa()` + return error === undefined ? undefined : ''; + } + + if (options.stripFinalNewline) { + return stripFinalNewline(value); + } + + return value; +}; + +export function execa(file, args, options) { + const parsed = handleArguments(file, args, options); + const command = joinCommand(file, args); + const escapedCommand = getEscapedCommand(file, args); + + validateTimeout(parsed.options); + + let spawned; + try { + spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); + } catch (error) { + // Ensure the returned error is always both a promise and a child process + const dummySpawned = new childProcess.ChildProcess(); + const errorPromise = Promise.reject(makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + escapedCommand, + parsed, + timedOut: false, + isCanceled: false, + killed: false, + })); + return mergePromise(dummySpawned, errorPromise); + } + + const spawnedPromise = getSpawnedPromise(spawned); + const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); + const processDone = setExitHandler(spawned, parsed.options, timedPromise); + + const context = {isCanceled: false}; + + spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); + spawned.cancel = spawnedCancel.bind(null, spawned, context); + + const handlePromise = async () => { + const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); + const stdout = handleOutput(parsed.options, stdoutResult); + const stderr = handleOutput(parsed.options, stderrResult); + const all = handleOutput(parsed.options, allResult); + + if (error || exitCode !== 0 || signal !== null) { + const returnedError = makeError({ + error, + exitCode, + signal, + stdout, + stderr, + all, + command, + escapedCommand, + parsed, + timedOut, + isCanceled: context.isCanceled || (parsed.options.signal ? parsed.options.signal.aborted : false), + killed: spawned.killed, + }); + + if (!parsed.options.reject) { + return returnedError; + } + + throw returnedError; + } + + return { + command, + escapedCommand, + exitCode: 0, + stdout, + stderr, + all, + failed: false, + timedOut: false, + isCanceled: false, + killed: false, + }; + }; + + const handlePromiseOnce = onetime(handlePromise); + + handleInput(spawned, parsed.options.input); + + spawned.all = makeAllStream(spawned, parsed.options); + + return mergePromise(spawned, handlePromiseOnce); +} + +export function execaSync(file, args, options) { + const parsed = handleArguments(file, args, options); + const command = joinCommand(file, args); + const escapedCommand = getEscapedCommand(file, args); + + validateInputSync(parsed.options); + + let result; + try { + result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); + } catch (error) { + throw makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + escapedCommand, + parsed, + timedOut: false, + isCanceled: false, + killed: false, + }); + } + + const stdout = handleOutput(parsed.options, result.stdout, result.error); + const stderr = handleOutput(parsed.options, result.stderr, result.error); + + if (result.error || result.status !== 0 || result.signal !== null) { + const error = makeError({ + stdout, + stderr, + error: result.error, + signal: result.signal, + exitCode: result.status, + command, + escapedCommand, + parsed, + timedOut: result.error && result.error.code === 'ETIMEDOUT', + isCanceled: false, + killed: result.signal !== null, + }); + + if (!parsed.options.reject) { + return error; + } + + throw error; + } + + return { + command, + escapedCommand, + exitCode: 0, + stdout, + stderr, + failed: false, + timedOut: false, + isCanceled: false, + killed: false, + }; +} + +export function execaCommand(command, options) { + const [file, ...args] = parseCommand(command); + return execa(file, args, options); +} + +export function execaCommandSync(command, options) { + const [file, ...args] = parseCommand(command); + return execaSync(file, args, options); +} + +export function execaNode(scriptPath, args, options = {}) { + if (args && !Array.isArray(args) && typeof args === 'object') { + options = args; + args = []; + } + + const stdio = normalizeStdioNode(options); + const defaultExecArgv = process.execArgv.filter(arg => !arg.startsWith('--inspect')); + + const { + nodePath = process.execPath, + nodeOptions = defaultExecArgv, + } = options; + + return execa( + nodePath, + [ + ...nodeOptions, + scriptPath, + ...(Array.isArray(args) ? args : []), + ], + { + ...options, + stdin: undefined, + stdout: undefined, + stderr: undefined, + stdio, + shell: false, + }, + ); +} diff --git a/tests/wcag-compliance/node_modules/execa/lib/command.js b/tests/wcag-compliance/node_modules/execa/lib/command.js new file mode 100644 index 0000000..be64255 --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/lib/command.js @@ -0,0 +1,41 @@ +const normalizeArgs = (file, args = []) => { + if (!Array.isArray(args)) { + return [file]; + } + + return [file, ...args]; +}; + +const NO_ESCAPE_REGEXP = /^[\w.-]+$/; +const DOUBLE_QUOTES_REGEXP = /"/g; + +const escapeArg = arg => { + if (typeof arg !== 'string' || NO_ESCAPE_REGEXP.test(arg)) { + return arg; + } + + return `"${arg.replace(DOUBLE_QUOTES_REGEXP, '\\"')}"`; +}; + +export const joinCommand = (file, args) => normalizeArgs(file, args).join(' '); + +export const getEscapedCommand = (file, args) => normalizeArgs(file, args).map(arg => escapeArg(arg)).join(' '); + +const SPACES_REGEXP = / +/g; + +// Handle `execaCommand()` +export const parseCommand = command => { + const tokens = []; + for (const token of command.trim().split(SPACES_REGEXP)) { + // Allow spaces to be escaped by a backslash if not meant as a delimiter + const previousToken = tokens[tokens.length - 1]; + if (previousToken && previousToken.endsWith('\\')) { + // Merge previous token with current one + tokens[tokens.length - 1] = `${previousToken.slice(0, -1)} ${token}`; + } else { + tokens.push(token); + } + } + + return tokens; +}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/error.js b/tests/wcag-compliance/node_modules/execa/lib/error.js new file mode 100644 index 0000000..b12c144 --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/lib/error.js @@ -0,0 +1,85 @@ +import {signalsByName} from 'human-signals'; + +const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { + if (timedOut) { + return `timed out after ${timeout} milliseconds`; + } + + if (isCanceled) { + return 'was canceled'; + } + + if (errorCode !== undefined) { + return `failed with ${errorCode}`; + } + + if (signal !== undefined) { + return `was killed with ${signal} (${signalDescription})`; + } + + if (exitCode !== undefined) { + return `failed with exit code ${exitCode}`; + } + + return 'failed'; +}; + +export const makeError = ({ + stdout, + stderr, + all, + error, + signal, + exitCode, + command, + escapedCommand, + timedOut, + isCanceled, + killed, + parsed: {options: {timeout}}, +}) => { + // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. + // We normalize them to `undefined` + exitCode = exitCode === null ? undefined : exitCode; + signal = signal === null ? undefined : signal; + const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; + + const errorCode = error && error.code; + + const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); + const execaMessage = `Command ${prefix}: ${command}`; + const isError = Object.prototype.toString.call(error) === '[object Error]'; + const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage; + const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); + + if (isError) { + error.originalMessage = error.message; + error.message = message; + } else { + error = new Error(message); + } + + error.shortMessage = shortMessage; + error.command = command; + error.escapedCommand = escapedCommand; + error.exitCode = exitCode; + error.signal = signal; + error.signalDescription = signalDescription; + error.stdout = stdout; + error.stderr = stderr; + + if (all !== undefined) { + error.all = all; + } + + if ('bufferedData' in error) { + delete error.bufferedData; + } + + error.failed = true; + error.timedOut = Boolean(timedOut); + error.isCanceled = isCanceled; + error.killed = killed && !timedOut; + + return error; +}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/kill.js b/tests/wcag-compliance/node_modules/execa/lib/kill.js new file mode 100644 index 0000000..efc6b9b --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/lib/kill.js @@ -0,0 +1,102 @@ +import os from 'node:os'; +import onExit from 'signal-exit'; + +const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; + +// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior +export const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { + const killResult = kill(signal); + setKillTimeout(kill, signal, options, killResult); + return killResult; +}; + +const setKillTimeout = (kill, signal, options, killResult) => { + if (!shouldForceKill(signal, options, killResult)) { + return; + } + + const timeout = getForceKillAfterTimeout(options); + const t = setTimeout(() => { + kill('SIGKILL'); + }, timeout); + + // Guarded because there's no `.unref()` when `execa` is used in the renderer + // process in Electron. This cannot be tested since we don't run tests in + // Electron. + // istanbul ignore else + if (t.unref) { + t.unref(); + } +}; + +const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => isSigterm(signal) && forceKillAfterTimeout !== false && killResult; + +const isSigterm = signal => signal === os.constants.signals.SIGTERM + || (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); + +const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { + if (forceKillAfterTimeout === true) { + return DEFAULT_FORCE_KILL_TIMEOUT; + } + + if (!Number.isFinite(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { + throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); + } + + return forceKillAfterTimeout; +}; + +// `childProcess.cancel()` +export const spawnedCancel = (spawned, context) => { + const killResult = spawned.kill(); + + if (killResult) { + context.isCanceled = true; + } +}; + +const timeoutKill = (spawned, signal, reject) => { + spawned.kill(signal); + reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); +}; + +// `timeout` option handling +export const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { + if (timeout === 0 || timeout === undefined) { + return spawnedPromise; + } + + let timeoutId; + const timeoutPromise = new Promise((resolve, reject) => { + timeoutId = setTimeout(() => { + timeoutKill(spawned, killSignal, reject); + }, timeout); + }); + + const safeSpawnedPromise = spawnedPromise.finally(() => { + clearTimeout(timeoutId); + }); + + return Promise.race([timeoutPromise, safeSpawnedPromise]); +}; + +export const validateTimeout = ({timeout}) => { + if (timeout !== undefined && (!Number.isFinite(timeout) || timeout < 0)) { + throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); + } +}; + +// `cleanup` option handling +export const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { + if (!cleanup || detached) { + return timedPromise; + } + + const removeExitHandler = onExit(() => { + spawned.kill(); + }); + + return timedPromise.finally(() => { + removeExitHandler(); + }); +}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/promise.js b/tests/wcag-compliance/node_modules/execa/lib/promise.js new file mode 100644 index 0000000..c655c0e --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/lib/promise.js @@ -0,0 +1,36 @@ +const nativePromisePrototype = (async () => {})().constructor.prototype; +const descriptors = ['then', 'catch', 'finally'].map(property => [ + property, + Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property), +]); + +// The return value is a mixin of `childProcess` and `Promise` +export const mergePromise = (spawned, promise) => { + for (const [property, descriptor] of descriptors) { + // Starting the main `promise` is deferred to avoid consuming streams + const value = typeof promise === 'function' + ? (...args) => Reflect.apply(descriptor.value, promise(), args) + : descriptor.value.bind(promise); + + Reflect.defineProperty(spawned, property, {...descriptor, value}); + } + + return spawned; +}; + +// Use promises instead of `child_process` events +export const getSpawnedPromise = spawned => new Promise((resolve, reject) => { + spawned.on('exit', (exitCode, signal) => { + resolve({exitCode, signal}); + }); + + spawned.on('error', error => { + reject(error); + }); + + if (spawned.stdin) { + spawned.stdin.on('error', error => { + reject(error); + }); + } +}); diff --git a/tests/wcag-compliance/node_modules/execa/lib/stdio.js b/tests/wcag-compliance/node_modules/execa/lib/stdio.js new file mode 100644 index 0000000..e8c1132 --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/lib/stdio.js @@ -0,0 +1,49 @@ +const aliases = ['stdin', 'stdout', 'stderr']; + +const hasAlias = options => aliases.some(alias => options[alias] !== undefined); + +export const normalizeStdio = options => { + if (!options) { + return; + } + + const {stdio} = options; + + if (stdio === undefined) { + return aliases.map(alias => options[alias]); + } + + if (hasAlias(options)) { + throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); + } + + if (typeof stdio === 'string') { + return stdio; + } + + if (!Array.isArray(stdio)) { + throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); + } + + const length = Math.max(stdio.length, aliases.length); + return Array.from({length}, (value, index) => stdio[index]); +}; + +// `ipc` is pushed unless it is already present +export const normalizeStdioNode = options => { + const stdio = normalizeStdio(options); + + if (stdio === 'ipc') { + return 'ipc'; + } + + if (stdio === undefined || typeof stdio === 'string') { + return [stdio, stdio, stdio, 'ipc']; + } + + if (stdio.includes('ipc')) { + return stdio; + } + + return [...stdio, 'ipc']; +}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/stream.js b/tests/wcag-compliance/node_modules/execa/lib/stream.js new file mode 100644 index 0000000..b140bf1 --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/lib/stream.js @@ -0,0 +1,88 @@ +import {isStream} from 'is-stream'; +import getStream from 'get-stream'; +import mergeStream from 'merge-stream'; + +// `input` option +export const handleInput = (spawned, input) => { + // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 + // @todo remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 + if (input === undefined || spawned.stdin === undefined) { + return; + } + + if (isStream(input)) { + input.pipe(spawned.stdin); + } else { + spawned.stdin.end(input); + } +}; + +// `all` interleaves `stdout` and `stderr` +export const makeAllStream = (spawned, {all}) => { + if (!all || (!spawned.stdout && !spawned.stderr)) { + return; + } + + const mixed = mergeStream(); + + if (spawned.stdout) { + mixed.add(spawned.stdout); + } + + if (spawned.stderr) { + mixed.add(spawned.stderr); + } + + return mixed; +}; + +// On failure, `result.stdout|stderr|all` should contain the currently buffered stream +const getBufferedData = async (stream, streamPromise) => { + if (!stream) { + return; + } + + stream.destroy(); + + try { + return await streamPromise; + } catch (error) { + return error.bufferedData; + } +}; + +const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { + if (!stream || !buffer) { + return; + } + + if (encoding) { + return getStream(stream, {encoding, maxBuffer}); + } + + return getStream.buffer(stream, {maxBuffer}); +}; + +// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) +export const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { + const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); + const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); + const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); + + try { + return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); + } catch (error) { + return Promise.all([ + {error, signal: error.signal, timedOut: error.timedOut}, + getBufferedData(stdout, stdoutPromise), + getBufferedData(stderr, stderrPromise), + getBufferedData(all, allPromise), + ]); + } +}; + +export const validateInputSync = ({input}) => { + if (isStream(input)) { + throw new TypeError('The `input` option cannot be a stream in sync mode'); + } +}; diff --git a/tests/wcag-compliance/node_modules/execa/license b/tests/wcag-compliance/node_modules/execa/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/execa/package.json b/tests/wcag-compliance/node_modules/execa/package.json new file mode 100644 index 0000000..90bd07b --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/package.json @@ -0,0 +1,83 @@ +{ + "name": "execa", + "version": "6.1.0", + "description": "Process execution for humans", + "license": "MIT", + "repository": "sindresorhus/execa", + "funding": "https://github.com/sindresorhus/execa?sponsor=1", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "scripts": { + "test": "xo && c8 ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "lib" + ], + "keywords": [ + "exec", + "child", + "process", + "execute", + "fork", + "execfile", + "spawn", + "file", + "shell", + "bin", + "binary", + "binaries", + "npm", + "path", + "local" + ], + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "devDependencies": { + "@types/node": "^17.0.17", + "ava": "^4.0.1", + "c8": "^7.11.0", + "get-node": "^12.0.0", + "is-running": "^2.1.0", + "p-event": "^5.0.1", + "semver": "^7.3.5", + "tempfile": "^4.0.0", + "tsd": "^0.19.1", + "xo": "^0.48.0" + }, + "c8": { + "reporter": [ + "text", + "lcov" + ], + "exclude": [ + "**/fixtures/**", + "**/test.js", + "**/test/**" + ] + }, + "xo": { + "rules": { + "unicorn/no-empty-file": "off", + "@typescript-eslint/ban-types": "off" + } + } +} diff --git a/tests/wcag-compliance/node_modules/execa/readme.md b/tests/wcag-compliance/node_modules/execa/readme.md new file mode 100644 index 0000000..a529f39 --- /dev/null +++ b/tests/wcag-compliance/node_modules/execa/readme.md @@ -0,0 +1,667 @@ + +
+ +[![Coverage Status](https://codecov.io/gh/sindresorhus/execa/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/execa) + +> Process execution for humans + +## Why + +This package improves [`child_process`](https://nodejs.org/api/child_process.html) methods with: + +- Promise interface. +- [Strips the final newline](#stripfinalnewline) from the output so you don't have to do `stdout.trim()`. +- Supports [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) binaries cross-platform. +- [Improved Windows support.](https://github.com/IndigoUnited/node-cross-spawn#why) +- Higher max buffer. 100 MB instead of 200 KB. +- [Executes locally installed binaries by name.](#preferlocal) +- [Cleans up spawned processes when the parent process dies.](#cleanup) +- [Get interleaved output](#all) from `stdout` and `stderr` similar to what is printed on the terminal. [*(Async only)*](#execasyncfile-arguments-options) +- [Can specify file and arguments as a single string without a shell](#execacommandcommand-options) +- More descriptive errors. + +## Install + +```sh +npm install execa +``` + +## Usage + +```js +import {execa} from 'execa'; + +const {stdout} = await execa('echo', ['unicorns']); +console.log(stdout); +//=> 'unicorns' +``` + +### Pipe the child process stdout to the parent + +```js +import {execa} from 'execa'; + +execa('echo', ['unicorns']).stdout.pipe(process.stdout); +``` + +### Handling Errors + +```js +import {execa} from 'execa'; + +// Catching an error +try { + await execa('unknown', ['command']); +} catch (error) { + console.log(error); + /* + { + message: 'Command failed with ENOENT: unknown command spawn unknown ENOENT', + errno: -2, + code: 'ENOENT', + syscall: 'spawn unknown', + path: 'unknown', + spawnargs: ['command'], + originalMessage: 'spawn unknown ENOENT', + shortMessage: 'Command failed with ENOENT: unknown command spawn unknown ENOENT', + command: 'unknown command', + escapedCommand: 'unknown command', + stdout: '', + stderr: '', + all: '', + failed: true, + timedOut: false, + isCanceled: false, + killed: false + } + */ +} +``` + +### Cancelling a spawned process + +```js +import {execa} from 'execa'; + +const abortController = new AbortController(); +const subprocess = execa('node', [], {signal: abortController.signal}); + +setTimeout(() => { + abortController.abort(); +}, 1000); + +try { + await subprocess; +} catch (error) { + console.log(subprocess.killed); // true + console.log(error.isCanceled); // true +} +``` + +### Catching an error with the sync method + +```js +import {execaSync} from 'execa'; + +try { + execaSync('unknown', ['command']); +} catch (error) { + console.log(error); + /* + { + message: 'Command failed with ENOENT: unknown command spawnSync unknown ENOENT', + errno: -2, + code: 'ENOENT', + syscall: 'spawnSync unknown', + path: 'unknown', + spawnargs: ['command'], + originalMessage: 'spawnSync unknown ENOENT', + shortMessage: 'Command failed with ENOENT: unknown command spawnSync unknown ENOENT', + command: 'unknown command', + escapedCommand: 'unknown command', + stdout: '', + stderr: '', + all: '', + failed: true, + timedOut: false, + isCanceled: false, + killed: false + } + */ +} +``` + +### Kill a process + +Using SIGTERM, and after 2 seconds, kill it with SIGKILL. + +```js +const subprocess = execa('node'); + +setTimeout(() => { + subprocess.kill('SIGTERM', { + forceKillAfterTimeout: 2000 + }); +}, 1000); +``` + +## API + +### execa(file, arguments, options?) + +Execute a file. Think of this as a mix of [`child_process.execFile()`](https://nodejs.org/api/child_process.html#child_process_child_process_execfile_file_args_options_callback) and [`child_process.spawn()`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options). + +No escaping/quoting is needed. + +Unless the [`shell`](#shell) option is used, no shell interpreter (Bash, `cmd.exe`, etc.) is used, so shell features such as variables substitution (`echo $PATH`) are not allowed. + +Returns a [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess) which: + - is also a `Promise` resolving or rejecting with a [`childProcessResult`](#childProcessResult). + - exposes the following additional methods and properties. + +#### kill(signal?, options?) + +Same as the original [`child_process#kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal) except: if `signal` is `SIGTERM` (the default value) and the child process is not terminated after 5 seconds, force it by sending `SIGKILL`. + +##### options.forceKillAfterTimeout + +Type: `number | false`\ +Default: `5000` + +Milliseconds to wait for the child process to terminate before sending `SIGKILL`. + +Can be disabled with `false`. + +#### all + +Type: `ReadableStream | undefined` + +Stream combining/interleaving [`stdout`](https://nodejs.org/api/child_process.html#child_process_subprocess_stdout) and [`stderr`](https://nodejs.org/api/child_process.html#child_process_subprocess_stderr). + +This is `undefined` if either: + - the [`all` option](#all-2) is `false` (the default value) + - both [`stdout`](#stdout-1) and [`stderr`](#stderr-1) options are set to [`'inherit'`, `'ipc'`, `Stream` or `integer`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio) + +### execaSync(file, arguments?, options?) + +Execute a file synchronously. + +Returns or throws a [`childProcessResult`](#childProcessResult). + +### execaCommand(command, options?) + +Same as [`execa()`](#execafile-arguments-options) except both file and arguments are specified in a single `command` string. For example, `execa('echo', ['unicorns'])` is the same as `execaCommand('echo unicorns')`. + +If the file or an argument contains spaces, they must be escaped with backslashes. This matters especially if `command` is not a constant but a variable, for example with `__dirname` or `process.cwd()`. Except for spaces, no escaping/quoting is needed. + +The [`shell` option](#shell) must be used if the `command` uses shell-specific features (for example, `&&` or `||`), as opposed to being a simple `file` followed by its `arguments`. + +### execaCommandSync(command, options?) + +Same as [`execaCommand()`](#execacommand-command-options) but synchronous. + +Returns or throws a [`childProcessResult`](#childProcessResult). + +### execaNode(scriptPath, arguments?, options?) + +Execute a Node.js script as a child process. + +Same as `execa('node', [scriptPath, ...arguments], options)` except (like [`child_process#fork()`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)): + - the current Node version and options are used. This can be overridden using the [`nodePath`](#nodepath-for-node-only) and [`nodeOptions`](#nodeoptions-for-node-only) options. + - the [`shell`](#shell) option cannot be used + - an extra channel [`ipc`](https://nodejs.org/api/child_process.html#child_process_options_stdio) is passed to [`stdio`](#stdio) + +### childProcessResult + +Type: `object` + +Result of a child process execution. On success this is a plain object. On failure this is also an `Error` instance. + +The child process [fails](#failed) when: +- its [exit code](#exitcode) is not `0` +- it was [killed](#killed) with a [signal](#signal) +- [timing out](#timedout) +- [being canceled](#iscanceled) +- there's not enough memory or there are already too many child processes + +#### command + +Type: `string` + +The file and arguments that were run, for logging purposes. + +This is not escaped and should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execaCommand()`](#execacommandcommand-options). + +#### escapedCommand + +Type: `string` + +Same as [`command`](#command) but escaped. + +This is meant to be copy and pasted into a shell, for debugging purposes. +Since the escaping is fairly basic, this should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execaCommand()`](#execacommandcommand-options). + +#### exitCode + +Type: `number` + +The numeric exit code of the process that was run. + +#### stdout + +Type: `string | Buffer` + +The output of the process on stdout. + +#### stderr + +Type: `string | Buffer` + +The output of the process on stderr. + +#### all + +Type: `string | Buffer | undefined` + +The output of the process with `stdout` and `stderr` interleaved. + +This is `undefined` if either: + - the [`all` option](#all-2) is `false` (the default value) + - `execaSync()` was used + +#### failed + +Type: `boolean` + +Whether the process failed to run. + +#### timedOut + +Type: `boolean` + +Whether the process timed out. + +#### isCanceled + +Type: `boolean` + +Whether the process was canceled. + +You can cancel the spawned process using the [`signal`](#signal-1) option. + +#### killed + +Type: `boolean` + +Whether the process was killed. + +#### signal + +Type: `string | undefined` + +The name of the signal that was used to terminate the process. For example, `SIGFPE`. + +If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. + +#### signalDescription + +Type: `string | undefined` + +A human-friendly description of the signal that was used to terminate the process. For example, `Floating point arithmetic error`. + +If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. It is also `undefined` when the signal is very uncommon which should seldomly happen. + +#### message + +Type: `string` + +Error message when the child process failed to run. In addition to the [underlying error message](#originalMessage), it also contains some information related to why the child process errored. + +The child process [stderr](#stderr) then [stdout](#stdout) are appended to the end, separated with newlines and not interleaved. + +#### shortMessage + +Type: `string` + +This is the same as the [`message` property](#message) except it does not include the child process stdout/stderr. + +#### originalMessage + +Type: `string | undefined` + +Original error message. This is the same as the `message` property except it includes neither the child process stdout/stderr nor some additional information added by Execa. + +This is `undefined` unless the child process exited due to an `error` event or a timeout. + +### options + +Type: `object` + +#### cleanup + +Type: `boolean`\ +Default: `true` + +Kill the spawned process when the parent process exits unless either: + - the spawned process is [`detached`](https://nodejs.org/api/child_process.html#child_process_options_detached) + - the parent process is terminated abruptly, for example, with `SIGKILL` as opposed to `SIGTERM` or a normal exit + +#### preferLocal + +Type: `boolean`\ +Default: `false` + +Prefer locally installed binaries when looking for a binary to execute.\ +If you `$ npm install foo`, you can then `execa('foo')`. + +#### localDir + +Type: `string | URL`\ +Default: `process.cwd()` + +Preferred path to find locally installed binaries in (use with `preferLocal`). + +Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. + +#### execPath + +Type: `string`\ +Default: `process.execPath` (Current Node.js executable) + +Path to the Node.js executable to use in child processes. + +This can be either an absolute path or a path relative to the [`cwd` option](#cwd). + +Requires [`preferLocal`](#preferlocal) to be `true`. + +For example, this can be used together with [`get-node`](https://github.com/ehmicky/get-node) to run a specific Node.js version in a child process. + +#### buffer + +Type: `boolean`\ +Default: `true` + +Buffer the output from the spawned process. When set to `false`, you must read the output of [`stdout`](#stdout-1) and [`stderr`](#stderr-1) (or [`all`](#all) if the [`all`](#all-2) option is `true`). Otherwise the returned promise will not be resolved/rejected. + +If the spawned process fails, [`error.stdout`](#stdout), [`error.stderr`](#stderr), and [`error.all`](#all) will contain the buffered data. + +#### input + +Type: `string | Buffer | stream.Readable` + +Write some input to the `stdin` of your binary.\ +Streams are not allowed when using the synchronous methods. + +#### stdin + +Type: `string | number | Stream | undefined`\ +Default: `pipe` + +Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). + +#### stdout + +Type: `string | number | Stream | undefined`\ +Default: `pipe` + +Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). + +#### stderr + +Type: `string | number | Stream | undefined`\ +Default: `pipe` + +Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). + +#### all + +Type: `boolean`\ +Default: `false` + +Add an `.all` property on the [promise](#all) and the [resolved value](#all-1). The property contains the output of the process with `stdout` and `stderr` interleaved. + +#### reject + +Type: `boolean`\ +Default: `true` + +Setting this to `false` resolves the promise with the error instead of rejecting it. + +#### stripFinalNewline + +Type: `boolean`\ +Default: `true` + +Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from the output. + +#### extendEnv + +Type: `boolean`\ +Default: `true` + +Set to `false` if you don't want to extend the environment variables when providing the `env` property. + +--- + +Execa also accepts the below options which are the same as the options for [`child_process#spawn()`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options)/[`child_process#exec()`](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) + +#### cwd + +Type: `string | URL`\ +Default: `process.cwd()` + +Current working directory of the child process. + +Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. + +#### env + +Type: `object`\ +Default: `process.env` + +Environment key-value pairs. Extends automatically from `process.env`. Set [`extendEnv`](#extendenv) to `false` if you don't want this. + +#### argv0 + +Type: `string` + +Explicitly set the value of `argv[0]` sent to the child process. This will be set to `file` if not specified. + +#### stdio + +Type: `string | string[]`\ +Default: `pipe` + +Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration. + +#### serialization + +Type: `string`\ +Default: `'json'` + +Specify the kind of serialization used for sending messages between processes when using the [`stdio: 'ipc'`](#stdio) option or [`execaNode()`](#execanodescriptpath-arguments-options): + - `json`: Uses `JSON.stringify()` and `JSON.parse()`. + - `advanced`: Uses [`v8.serialize()`](https://nodejs.org/api/v8.html#v8_v8_serialize_value) + +Requires Node.js `13.2.0` or later. + +[More info.](https://nodejs.org/api/child_process.html#child_process_advanced_serialization) + +#### detached + +Type: `boolean` + +Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached). + +#### uid + +Type: `number` + +Sets the user identity of the process. + +#### gid + +Type: `number` + +Sets the group identity of the process. + +#### shell + +Type: `boolean | string`\ +Default: `false` + +If `true`, runs `file` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows. + +We recommend against using this option since it is: +- not cross-platform, encouraging shell-specific syntax. +- slower, because of the additional shell interpretation. +- unsafe, potentially allowing command injection. + +#### encoding + +Type: `string | null`\ +Default: `utf8` + +Specify the character encoding used to decode the `stdout` and `stderr` output. If set to `null`, then `stdout` and `stderr` will be a `Buffer` instead of a string. + +#### timeout + +Type: `number`\ +Default: `0` + +If timeout is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than timeout milliseconds. + +#### maxBuffer + +Type: `number`\ +Default: `100_000_000` (100 MB) + +Largest amount of data in bytes allowed on `stdout` or `stderr`. + +#### killSignal + +Type: `string | number`\ +Default: `SIGTERM` + +Signal value to be used when the spawned process will be killed. + +#### signal + +Type: [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) + +You can abort the spawned process using [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController). + +When `AbortController.abort()` is called, [`.isCanceled`](#iscanceled) becomes `false`. + +*Requires Node.js 16 or later.* + +#### windowsVerbatimArguments + +Type: `boolean`\ +Default: `false` + +If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`. + +#### windowsHide + +Type: `boolean`\ +Default: `true` + +On Windows, do not create a new console window. Please note this also prevents `CTRL-C` [from working](https://github.com/nodejs/node/issues/29837) on Windows. + +#### nodePath *(For `.node()` only)* + +Type: `string`\ +Default: [`process.execPath`](https://nodejs.org/api/process.html#process_process_execpath) + +Node.js executable used to create the child process. + +#### nodeOptions *(For `.node()` only)* + +Type: `string[]`\ +Default: [`process.execArgv`](https://nodejs.org/api/process.html#process_process_execargv) + +List of [CLI options](https://nodejs.org/api/cli.html#cli_options) passed to the Node.js executable. + +## Tips + +### Retry on error + +Gracefully handle failures by using automatic retries and exponential backoff with the [`p-retry`](https://github.com/sindresorhus/p-retry) package: + +```js +import pRetry from 'p-retry'; + +const run = async () => { + const results = await execa('curl', ['-sSL', 'https://sindresorhus.com/unicorn']); + return results; +}; + +console.log(await pRetry(run, {retries: 5})); +``` + +### Save and pipe output from a child process + +Let's say you want to show the output of a child process in real-time while also saving it to a variable. + +```js +import {execa} from 'execa'; + +const subprocess = execa('echo', ['foo']); +subprocess.stdout.pipe(process.stdout); + +const {stdout} = await subprocess; +console.log('child output:', stdout); +``` + +### Redirect output to a file + +```js +import {execa} from 'execa'; + +const subprocess = execa('echo', ['foo']) +subprocess.stdout.pipe(fs.createWriteStream('stdout.txt')) +``` + +### Redirect input from a file + +```js +import {execa} from 'execa'; + +const subprocess = execa('cat') +fs.createReadStream('stdin.txt').pipe(subprocess.stdin) +``` + +### Execute the current package's binary + +```js +import {getBinPathSync} from 'get-bin-path'; + +const binPath = getBinPathSync(); +const subprocess = execa(binPath); +``` + +`execa` can be combined with [`get-bin-path`](https://github.com/ehmicky/get-bin-path) to test the current package's binary. As opposed to hard-coding the path to the binary, this validates that the `package.json` `bin` field is correctly set up. + +## Related + +- [gulp-execa](https://github.com/ehmicky/gulp-execa) - Gulp plugin for `execa` +- [nvexeca](https://github.com/ehmicky/nvexeca) - Run `execa` using any Node.js version +- [sudo-prompt](https://github.com/jorangreef/sudo-prompt) - Run commands with elevated privileges. + +## Maintainers + +- [Sindre Sorhus](https://github.com/sindresorhus) +- [@ehmicky](https://github.com/ehmicky) + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/get-stream/buffer-stream.js b/tests/wcag-compliance/node_modules/get-stream/buffer-stream.js new file mode 100644 index 0000000..2dd7574 --- /dev/null +++ b/tests/wcag-compliance/node_modules/get-stream/buffer-stream.js @@ -0,0 +1,52 @@ +'use strict'; +const {PassThrough: PassThroughStream} = require('stream'); + +module.exports = options => { + options = {...options}; + + const {array} = options; + let {encoding} = options; + const isBuffer = encoding === 'buffer'; + let objectMode = false; + + if (array) { + objectMode = !(encoding || isBuffer); + } else { + encoding = encoding || 'utf8'; + } + + if (isBuffer) { + encoding = null; + } + + const stream = new PassThroughStream({objectMode}); + + if (encoding) { + stream.setEncoding(encoding); + } + + let length = 0; + const chunks = []; + + stream.on('data', chunk => { + chunks.push(chunk); + + if (objectMode) { + length = chunks.length; + } else { + length += chunk.length; + } + }); + + stream.getBufferedValue = () => { + if (array) { + return chunks; + } + + return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); + }; + + stream.getBufferedLength = () => length; + + return stream; +}; diff --git a/tests/wcag-compliance/node_modules/get-stream/index.d.ts b/tests/wcag-compliance/node_modules/get-stream/index.d.ts new file mode 100644 index 0000000..9485b2b --- /dev/null +++ b/tests/wcag-compliance/node_modules/get-stream/index.d.ts @@ -0,0 +1,105 @@ +/// +import {Stream} from 'stream'; + +declare class MaxBufferErrorClass extends Error { + readonly name: 'MaxBufferError'; + constructor(); +} + +declare namespace getStream { + interface Options { + /** + Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `MaxBufferError` error. + + @default Infinity + */ + readonly maxBuffer?: number; + } + + interface OptionsWithEncoding extends Options { + /** + [Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream. + + @default 'utf8' + */ + readonly encoding?: EncodingType; + } + + type MaxBufferError = MaxBufferErrorClass; +} + +declare const getStream: { + /** + Get the `stream` as a string. + + @returns A promise that resolves when the end event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode. + + @example + ``` + import * as fs from 'fs'; + import getStream = require('get-stream'); + + (async () => { + const stream = fs.createReadStream('unicorn.txt'); + + console.log(await getStream(stream)); + // ,,))))))));, + // __)))))))))))))), + // \|/ -\(((((''''((((((((. + // -*-==//////(('' . `)))))), + // /|\ ))| o ;-. '((((( ,(, + // ( `| / ) ;))))' ,_))^;(~ + // | | | ,))((((_ _____------~~~-. %,;(;(>';'~ + // o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~ + // ; ''''```` `: `:::|\,__,%% );`'; ~ + // | _ ) / `:|`----' `-' + // ______/\/~ | / / + // /~;;.____/;;' / ___--,-( `;;;/ + // / // _;______;'------~~~~~ /;;/\ / + // // | | / ; \;;,\ + // (<_ | ; /',/-----' _> + // \_| ||_ //~;~~~~~~~~~ + // `\_| (,~~ + // \~\ + // ~~ + })(); + ``` + */ + (stream: Stream, options?: getStream.OptionsWithEncoding): Promise; + + /** + Get the `stream` as a buffer. + + It honors the `maxBuffer` option as above, but it refers to byte length rather than string length. + */ + buffer( + stream: Stream, + options?: getStream.Options + ): Promise; + + /** + Get the `stream` as an array of values. + + It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen: + + - When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes). + - When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array. + - When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array. + */ + array( + stream: Stream, + options?: getStream.Options + ): Promise; + array( + stream: Stream, + options: getStream.OptionsWithEncoding<'buffer'> + ): Promise; + array( + stream: Stream, + options: getStream.OptionsWithEncoding + ): Promise; + + MaxBufferError: typeof MaxBufferErrorClass; +}; + +export = getStream; diff --git a/tests/wcag-compliance/node_modules/get-stream/index.js b/tests/wcag-compliance/node_modules/get-stream/index.js new file mode 100644 index 0000000..1c5d028 --- /dev/null +++ b/tests/wcag-compliance/node_modules/get-stream/index.js @@ -0,0 +1,61 @@ +'use strict'; +const {constants: BufferConstants} = require('buffer'); +const stream = require('stream'); +const {promisify} = require('util'); +const bufferStream = require('./buffer-stream'); + +const streamPipelinePromisified = promisify(stream.pipeline); + +class MaxBufferError extends Error { + constructor() { + super('maxBuffer exceeded'); + this.name = 'MaxBufferError'; + } +} + +async function getStream(inputStream, options) { + if (!inputStream) { + throw new Error('Expected a stream'); + } + + options = { + maxBuffer: Infinity, + ...options + }; + + const {maxBuffer} = options; + const stream = bufferStream(options); + + await new Promise((resolve, reject) => { + const rejectPromise = error => { + // Don't retrieve an oversized buffer. + if (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) { + error.bufferedData = stream.getBufferedValue(); + } + + reject(error); + }; + + (async () => { + try { + await streamPipelinePromisified(inputStream, stream); + resolve(); + } catch (error) { + rejectPromise(error); + } + })(); + + stream.on('data', () => { + if (stream.getBufferedLength() > maxBuffer) { + rejectPromise(new MaxBufferError()); + } + }); + }); + + return stream.getBufferedValue(); +} + +module.exports = getStream; +module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); +module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); +module.exports.MaxBufferError = MaxBufferError; diff --git a/tests/wcag-compliance/node_modules/get-stream/license b/tests/wcag-compliance/node_modules/get-stream/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/get-stream/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/get-stream/package.json b/tests/wcag-compliance/node_modules/get-stream/package.json new file mode 100644 index 0000000..bd47a75 --- /dev/null +++ b/tests/wcag-compliance/node_modules/get-stream/package.json @@ -0,0 +1,47 @@ +{ + "name": "get-stream", + "version": "6.0.1", + "description": "Get a stream as a string, buffer, or array", + "license": "MIT", + "repository": "sindresorhus/get-stream", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "buffer-stream.js" + ], + "keywords": [ + "get", + "stream", + "promise", + "concat", + "string", + "text", + "buffer", + "read", + "data", + "consume", + "readable", + "readablestream", + "array", + "object" + ], + "devDependencies": { + "@types/node": "^14.0.27", + "ava": "^2.4.0", + "into-stream": "^5.0.0", + "tsd": "^0.13.1", + "xo": "^0.24.0" + } +} diff --git a/tests/wcag-compliance/node_modules/get-stream/readme.md b/tests/wcag-compliance/node_modules/get-stream/readme.md new file mode 100644 index 0000000..70b01fd --- /dev/null +++ b/tests/wcag-compliance/node_modules/get-stream/readme.md @@ -0,0 +1,124 @@ +# get-stream + +> Get a stream as a string, buffer, or array + +## Install + +``` +$ npm install get-stream +``` + +## Usage + +```js +const fs = require('fs'); +const getStream = require('get-stream'); + +(async () => { + const stream = fs.createReadStream('unicorn.txt'); + + console.log(await getStream(stream)); + /* + ,,))))))));, + __)))))))))))))), + \|/ -\(((((''''((((((((. + -*-==//////(('' . `)))))), + /|\ ))| o ;-. '((((( ,(, + ( `| / ) ;))))' ,_))^;(~ + | | | ,))((((_ _____------~~~-. %,;(;(>';'~ + o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~ + ; ''''```` `: `:::|\,__,%% );`'; ~ + | _ ) / `:|`----' `-' + ______/\/~ | / / + /~;;.____/;;' / ___--,-( `;;;/ + / // _;______;'------~~~~~ /;;/\ / + // | | / ; \;;,\ + (<_ | ; /',/-----' _> + \_| ||_ //~;~~~~~~~~~ + `\_| (,~~ + \~\ + ~~ + */ +})(); +``` + +## API + +The methods returns a promise that resolves when the `end` event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode. + +### getStream(stream, options?) + +Get the `stream` as a string. + +#### options + +Type: `object` + +##### encoding + +Type: `string`\ +Default: `'utf8'` + +[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream. + +##### maxBuffer + +Type: `number`\ +Default: `Infinity` + +Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `getStream.MaxBufferError` error. + +### getStream.buffer(stream, options?) + +Get the `stream` as a buffer. + +It honors the `maxBuffer` option as above, but it refers to byte length rather than string length. + +### getStream.array(stream, options?) + +Get the `stream` as an array of values. + +It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen: + +- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes). + +- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array. + +- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array. + +## Errors + +If the input stream emits an `error` event, the promise will be rejected with the error. The buffered data will be attached to the `bufferedData` property of the error. + +```js +(async () => { + try { + await getStream(streamThatErrorsAtTheEnd('unicorn')); + } catch (error) { + console.log(error.bufferedData); + //=> 'unicorn' + } +})() +``` + +## FAQ + +### How is this different from [`concat-stream`](https://github.com/maxogden/concat-stream)? + +This module accepts a stream instead of being one and returns a promise instead of using a callback. The API is simpler and it only supports returning a string, buffer, or array. It doesn't have a fragile type inference. You explicitly choose what you want. And it doesn't depend on the huge `readable-stream` package. + +## Related + +- [get-stdin](https://github.com/sindresorhus/get-stdin) - Get stdin as a string or buffer + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/human-signals/LICENSE b/tests/wcag-compliance/node_modules/human-signals/LICENSE new file mode 100644 index 0000000..365f976 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2021 ehmicky + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/tests/wcag-compliance/node_modules/human-signals/README.md b/tests/wcag-compliance/node_modules/human-signals/README.md new file mode 100644 index 0000000..08a2ac1 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/README.md @@ -0,0 +1,164 @@ +[![Codecov](https://img.shields.io/codecov/c/github/ehmicky/human-signals.svg?label=tested&logo=codecov)](https://codecov.io/gh/ehmicky/human-signals) +[![Build](https://github.com/ehmicky/human-signals/workflows/Build/badge.svg)](https://github.com/ehmicky/human-signals/actions) +[![Node](https://img.shields.io/node/v/human-signals.svg?logo=node.js)](https://www.npmjs.com/package/human-signals) +[![Twitter](https://img.shields.io/badge/%E2%80%8B-twitter-4cc61e.svg?logo=twitter)](https://twitter.com/intent/follow?screen_name=ehmicky) +[![Medium](https://img.shields.io/badge/%E2%80%8B-medium-4cc61e.svg?logo=medium)](https://medium.com/@ehmicky) + +Human-friendly process signals. + +This is a map of known process signals with some information about each signal. + +Unlike +[`os.constants.signals`](https://nodejs.org/api/os.html#os_signal_constants) +this includes: + +- human-friendly [descriptions](#description) +- [default actions](#action), including whether they [can be prevented](#forced) +- whether the signal is [supported](#supported) by the current OS + +# Example + +```js +import { signalsByName, signalsByNumber } from 'human-signals' + +console.log(signalsByName.SIGINT) +// { +// name: 'SIGINT', +// number: 2, +// description: 'User interruption with CTRL-C', +// supported: true, +// action: 'terminate', +// forced: false, +// standard: 'ansi' +// } + +console.log(signalsByNumber[8]) +// { +// name: 'SIGFPE', +// number: 8, +// description: 'Floating point arithmetic error', +// supported: true, +// action: 'core', +// forced: false, +// standard: 'ansi' +// } +``` + +# Install + +```bash +npm install human-signals +``` + +This package is an ES module and must be loaded using +[an `import` or `import()` statement](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c), +not `require()`. + +# Usage + +## signalsByName + +_Type_: `object` + +Object whose keys are signal [names](#name) and values are +[signal objects](#signal). + +## signalsByNumber + +_Type_: `object` + +Object whose keys are signal [numbers](#number) and values are +[signal objects](#signal). + +## signal + +_Type_: `object` + +Signal object with the following properties. + +### name + +_Type_: `string` + +Standard name of the signal, for example `'SIGINT'`. + +### number + +_Type_: `number` + +Code number of the signal, for example `2`. While most `number` are +cross-platform, some are different between different OS. + +### description + +_Type_: `string` + +Human-friendly description for the signal, for example +`'User interruption with CTRL-C'`. + +### supported + +_Type_: `boolean` + +Whether the current OS can handle this signal in Node.js using +[`process.on(name, handler)`](https://nodejs.org/api/process.html#process_signal_events). + +The list of supported signals +[is OS-specific](https://github.com/ehmicky/cross-platform-node-guide/blob/main/docs/6_networking_ipc/signals.md#cross-platform-signals). + +### action + +_Type_: `string`\ +_Enum_: `'terminate'`, `'core'`, `'ignore'`, `'pause'`, `'unpause'` + +What is the default action for this signal when it is not handled. + +### forced + +_Type_: `boolean` + +Whether the signal's default action cannot be prevented. This is `true` for +`SIGTERM`, `SIGKILL` and `SIGSTOP`. + +### standard + +_Type_: `string`\ +_Enum_: `'ansi'`, `'posix'`, `'bsd'`, `'systemv'`, `'other'` + +Which standard defined that signal. + +# Support + +For any question, _don't hesitate_ to [submit an issue on GitHub](../../issues). + +Everyone is welcome regardless of personal background. We enforce a +[Code of conduct](CODE_OF_CONDUCT.md) in order to promote a positive and +inclusive environment. + +# Contributing + +This project was made with ❤️. The simplest way to give back is by starring and +sharing it online. + +If the documentation is unclear or has a typo, please click on the page's `Edit` +button (pencil icon) and suggest a correction. + +If you would like to help us fix a bug or add a new feature, please check our +[guidelines](CONTRIBUTING.md). Pull requests are welcome! + +Thanks go to our wonderful contributors: + + + + + + + + + +

ehmicky

💻 🎨 🤔 📖

electrovir

💻
+ + + + + diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/core.js b/tests/wcag-compliance/node_modules/human-signals/build/src/core.js new file mode 100644 index 0000000..c3a9773 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/core.js @@ -0,0 +1,273 @@ + + +export const SIGNALS=[ +{ +name:"SIGHUP", +number:1, +action:"terminate", +description:"Terminal closed", +standard:"posix"}, + +{ +name:"SIGINT", +number:2, +action:"terminate", +description:"User interruption with CTRL-C", +standard:"ansi"}, + +{ +name:"SIGQUIT", +number:3, +action:"core", +description:"User interruption with CTRL-\\", +standard:"posix"}, + +{ +name:"SIGILL", +number:4, +action:"core", +description:"Invalid machine instruction", +standard:"ansi"}, + +{ +name:"SIGTRAP", +number:5, +action:"core", +description:"Debugger breakpoint", +standard:"posix"}, + +{ +name:"SIGABRT", +number:6, +action:"core", +description:"Aborted", +standard:"ansi"}, + +{ +name:"SIGIOT", +number:6, +action:"core", +description:"Aborted", +standard:"bsd"}, + +{ +name:"SIGBUS", +number:7, +action:"core", +description: +"Bus error due to misaligned, non-existing address or paging error", +standard:"bsd"}, + +{ +name:"SIGEMT", +number:7, +action:"terminate", +description:"Command should be emulated but is not implemented", +standard:"other"}, + +{ +name:"SIGFPE", +number:8, +action:"core", +description:"Floating point arithmetic error", +standard:"ansi"}, + +{ +name:"SIGKILL", +number:9, +action:"terminate", +description:"Forced termination", +standard:"posix", +forced:true}, + +{ +name:"SIGUSR1", +number:10, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, + +{ +name:"SIGSEGV", +number:11, +action:"core", +description:"Segmentation fault", +standard:"ansi"}, + +{ +name:"SIGUSR2", +number:12, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, + +{ +name:"SIGPIPE", +number:13, +action:"terminate", +description:"Broken pipe or socket", +standard:"posix"}, + +{ +name:"SIGALRM", +number:14, +action:"terminate", +description:"Timeout or timer", +standard:"posix"}, + +{ +name:"SIGTERM", +number:15, +action:"terminate", +description:"Termination", +standard:"ansi"}, + +{ +name:"SIGSTKFLT", +number:16, +action:"terminate", +description:"Stack is empty or overflowed", +standard:"other"}, + +{ +name:"SIGCHLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"posix"}, + +{ +name:"SIGCLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"other"}, + +{ +name:"SIGCONT", +number:18, +action:"unpause", +description:"Unpaused", +standard:"posix", +forced:true}, + +{ +name:"SIGSTOP", +number:19, +action:"pause", +description:"Paused", +standard:"posix", +forced:true}, + +{ +name:"SIGTSTP", +number:20, +action:"pause", +description:"Paused using CTRL-Z or \"suspend\"", +standard:"posix"}, + +{ +name:"SIGTTIN", +number:21, +action:"pause", +description:"Background process cannot read terminal input", +standard:"posix"}, + +{ +name:"SIGBREAK", +number:21, +action:"terminate", +description:"User interruption with CTRL-BREAK", +standard:"other"}, + +{ +name:"SIGTTOU", +number:22, +action:"pause", +description:"Background process cannot write to terminal output", +standard:"posix"}, + +{ +name:"SIGURG", +number:23, +action:"ignore", +description:"Socket received out-of-band data", +standard:"bsd"}, + +{ +name:"SIGXCPU", +number:24, +action:"core", +description:"Process timed out", +standard:"bsd"}, + +{ +name:"SIGXFSZ", +number:25, +action:"core", +description:"File too big", +standard:"bsd"}, + +{ +name:"SIGVTALRM", +number:26, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, + +{ +name:"SIGPROF", +number:27, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, + +{ +name:"SIGWINCH", +number:28, +action:"ignore", +description:"Terminal window size changed", +standard:"bsd"}, + +{ +name:"SIGIO", +number:29, +action:"terminate", +description:"I/O is available", +standard:"other"}, + +{ +name:"SIGPOLL", +number:29, +action:"terminate", +description:"Watched event", +standard:"other"}, + +{ +name:"SIGINFO", +number:29, +action:"ignore", +description:"Request for process information", +standard:"other"}, + +{ +name:"SIGPWR", +number:30, +action:"terminate", +description:"Device running out of power", +standard:"systemv"}, + +{ +name:"SIGSYS", +number:31, +action:"core", +description:"Invalid system call", +standard:"other"}, + +{ +name:"SIGUNUSED", +number:31, +action:"terminate", +description:"Invalid system call", +standard:"other"}]; +//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map new file mode 100644 index 0000000..e3545c9 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/core.js"],"names":["SIGNALS","name","number","action","description","standard","forced"],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// List of known process signals with information about them\nexport const SIGNALS = [\n {\n name: 'SIGHUP',\n number: 1,\n action: 'terminate',\n description: 'Terminal closed',\n standard: 'posix',\n },\n {\n name: 'SIGINT',\n number: 2,\n action: 'terminate',\n description: 'User interruption with CTRL-C',\n standard: 'ansi',\n },\n {\n name: 'SIGQUIT',\n number: 3,\n action: 'core',\n description: 'User interruption with CTRL-\\\\',\n standard: 'posix',\n },\n {\n name: 'SIGILL',\n number: 4,\n action: 'core',\n description: 'Invalid machine instruction',\n standard: 'ansi',\n },\n {\n name: 'SIGTRAP',\n number: 5,\n action: 'core',\n description: 'Debugger breakpoint',\n standard: 'posix',\n },\n {\n name: 'SIGABRT',\n number: 6,\n action: 'core',\n description: 'Aborted',\n standard: 'ansi',\n },\n {\n name: 'SIGIOT',\n number: 6,\n action: 'core',\n description: 'Aborted',\n standard: 'bsd',\n },\n {\n name: 'SIGBUS',\n number: 7,\n action: 'core',\n description:\n 'Bus error due to misaligned, non-existing address or paging error',\n standard: 'bsd',\n },\n {\n name: 'SIGEMT',\n number: 7,\n action: 'terminate',\n description: 'Command should be emulated but is not implemented',\n standard: 'other',\n },\n {\n name: 'SIGFPE',\n number: 8,\n action: 'core',\n description: 'Floating point arithmetic error',\n standard: 'ansi',\n },\n {\n name: 'SIGKILL',\n number: 9,\n action: 'terminate',\n description: 'Forced termination',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGUSR1',\n number: 10,\n action: 'terminate',\n description: 'Application-specific signal',\n standard: 'posix',\n },\n {\n name: 'SIGSEGV',\n number: 11,\n action: 'core',\n description: 'Segmentation fault',\n standard: 'ansi',\n },\n {\n name: 'SIGUSR2',\n number: 12,\n action: 'terminate',\n description: 'Application-specific signal',\n standard: 'posix',\n },\n {\n name: 'SIGPIPE',\n number: 13,\n action: 'terminate',\n description: 'Broken pipe or socket',\n standard: 'posix',\n },\n {\n name: 'SIGALRM',\n number: 14,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'posix',\n },\n {\n name: 'SIGTERM',\n number: 15,\n action: 'terminate',\n description: 'Termination',\n standard: 'ansi',\n },\n {\n name: 'SIGSTKFLT',\n number: 16,\n action: 'terminate',\n description: 'Stack is empty or overflowed',\n standard: 'other',\n },\n {\n name: 'SIGCHLD',\n number: 17,\n action: 'ignore',\n description: 'Child process terminated, paused or unpaused',\n standard: 'posix',\n },\n {\n name: 'SIGCLD',\n number: 17,\n action: 'ignore',\n description: 'Child process terminated, paused or unpaused',\n standard: 'other',\n },\n {\n name: 'SIGCONT',\n number: 18,\n action: 'unpause',\n description: 'Unpaused',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGSTOP',\n number: 19,\n action: 'pause',\n description: 'Paused',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGTSTP',\n number: 20,\n action: 'pause',\n description: 'Paused using CTRL-Z or \"suspend\"',\n standard: 'posix',\n },\n {\n name: 'SIGTTIN',\n number: 21,\n action: 'pause',\n description: 'Background process cannot read terminal input',\n standard: 'posix',\n },\n {\n name: 'SIGBREAK',\n number: 21,\n action: 'terminate',\n description: 'User interruption with CTRL-BREAK',\n standard: 'other',\n },\n {\n name: 'SIGTTOU',\n number: 22,\n action: 'pause',\n description: 'Background process cannot write to terminal output',\n standard: 'posix',\n },\n {\n name: 'SIGURG',\n number: 23,\n action: 'ignore',\n description: 'Socket received out-of-band data',\n standard: 'bsd',\n },\n {\n name: 'SIGXCPU',\n number: 24,\n action: 'core',\n description: 'Process timed out',\n standard: 'bsd',\n },\n {\n name: 'SIGXFSZ',\n number: 25,\n action: 'core',\n description: 'File too big',\n standard: 'bsd',\n },\n {\n name: 'SIGVTALRM',\n number: 26,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'bsd',\n },\n {\n name: 'SIGPROF',\n number: 27,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'bsd',\n },\n {\n name: 'SIGWINCH',\n number: 28,\n action: 'ignore',\n description: 'Terminal window size changed',\n standard: 'bsd',\n },\n {\n name: 'SIGIO',\n number: 29,\n action: 'terminate',\n description: 'I/O is available',\n standard: 'other',\n },\n {\n name: 'SIGPOLL',\n number: 29,\n action: 'terminate',\n description: 'Watched event',\n standard: 'other',\n },\n {\n name: 'SIGINFO',\n number: 29,\n action: 'ignore',\n description: 'Request for process information',\n standard: 'other',\n },\n {\n name: 'SIGPWR',\n number: 30,\n action: 'terminate',\n description: 'Device running out of power',\n standard: 'systemv',\n },\n {\n name: 'SIGSYS',\n number: 31,\n action: 'core',\n description: 'Invalid system call',\n standard: 'other',\n },\n {\n name: 'SIGUNUSED',\n number: 31,\n action: 'terminate',\n description: 'Invalid system call',\n standard: 'other',\n },\n]\n/* eslint-enable max-lines */\n"],"file":"src/core.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts b/tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts new file mode 100644 index 0000000..2dc5ea7 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts @@ -0,0 +1,52 @@ +/** + * Object whose keys are signal names and values are signal objects. + */ +export declare const signalsByName: { [signalName: string]: Signal } +/** + * Object whose keys are signal numbers and values are signal objects. + */ +export declare const signalsByNumber: { [signalNumber: string]: Signal } + +export declare type SignalAction = + | 'terminate' + | 'core' + | 'ignore' + | 'pause' + | 'unpause' +export declare type SignalStandard = + | 'ansi' + | 'posix' + | 'bsd' + | 'systemv' + | 'other' + +export declare type Signal = { + /** + * Standard name of the signal, for example 'SIGINT'. + */ + name: string + /** + * Code number of the signal, for example 2. While most number are cross-platform, some are different between different OS. + */ + number: number + /** + * Human-friendly description for the signal, for example 'User interruption with CTRL-C'. + */ + description: string + /** + * Whether the current OS can handle this signal in Node.js using process.on(name, handler). The list of supported signals is OS-specific. + */ + supported: boolean + /** + * What is the default action for this signal when it is not handled. + */ + action: SignalAction + /** + * Whether the signal's default action cannot be prevented. This is true for SIGTERM, SIGKILL and SIGSTOP. + */ + forced: boolean + /** + * Which standard defined that signal. + */ + standard: SignalStandard +} diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/main.js b/tests/wcag-compliance/node_modules/human-signals/build/src/main.js new file mode 100644 index 0000000..b85e70f --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/main.js @@ -0,0 +1,71 @@ +import{constants}from"os"; + +import{SIGRTMAX}from"./realtime.js"; +import{getSignals}from"./signals.js"; + + + +const getSignalsByName=function(){ +const signals=getSignals(); +return signals.reduce(getSignalByName,{}); +}; + +const getSignalByName=function( +signalByNameMemo, +{name,number,description,supported,action,forced,standard}) +{ +return{ +...signalByNameMemo, +[name]:{name,number,description,supported,action,forced,standard}}; + +}; + +export const signalsByName=getSignalsByName(); + + + + +const getSignalsByNumber=function(){ +const signals=getSignals(); +const length=SIGRTMAX+1; +const signalsA=Array.from({length},(value,number)=> +getSignalByNumber(number,signals)); + +return Object.assign({},...signalsA); +}; + +const getSignalByNumber=function(number,signals){ +const signal=findSignalByNumber(number,signals); + +if(signal===undefined){ +return{}; +} + +const{name,description,supported,action,forced,standard}=signal; +return{ +[number]:{ +name, +number, +description, +supported, +action, +forced, +standard}}; + + +}; + + + +const findSignalByNumber=function(number,signals){ +const signal=signals.find(({name})=>constants.signals[name]===number); + +if(signal!==undefined){ +return signal; +} + +return signals.find((signalA)=>signalA.number===number); +}; + +export const signalsByNumber=getSignalsByNumber(); +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map new file mode 100644 index 0000000..f9e5aac --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/main.js"],"names":["constants","SIGRTMAX","getSignals","getSignalsByName","signals","reduce","getSignalByName","signalByNameMemo","name","number","description","supported","action","forced","standard","signalsByName","getSignalsByNumber","length","signalsA","Array","from","value","getSignalByNumber","Object","assign","signal","findSignalByNumber","undefined","find","signalA","signalsByNumber"],"mappings":"AAAA,OAASA,SAAT,KAA0B,IAA1B;;AAEA,OAASC,QAAT,KAAyB,eAAzB;AACA,OAASC,UAAT,KAA2B,cAA3B;;;;AAIA,KAAMC,CAAAA,gBAAgB,CAAG,UAAY;AACnC,KAAMC,CAAAA,OAAO,CAAGF,UAAU,EAA1B;AACA,MAAOE,CAAAA,OAAO,CAACC,MAAR,CAAeC,eAAf,CAAgC,EAAhC,CAAP;AACD,CAHD;;AAKA,KAAMA,CAAAA,eAAe,CAAG;AACtBC,gBADsB;AAEtB,CAAEC,IAAF,CAAQC,MAAR,CAAgBC,WAAhB,CAA6BC,SAA7B,CAAwCC,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAFsB;AAGtB;AACA,MAAO;AACL,GAAGP,gBADE;AAEL,CAACC,IAAD,EAAQ,CAAEA,IAAF,CAAQC,MAAR,CAAgBC,WAAhB,CAA6BC,SAA7B,CAAwCC,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAFH,CAAP;;AAID,CARD;;AAUA,MAAO,MAAMC,CAAAA,aAAa,CAAGZ,gBAAgB,EAAtC;;;;;AAKP,KAAMa,CAAAA,kBAAkB,CAAG,UAAY;AACrC,KAAMZ,CAAAA,OAAO,CAAGF,UAAU,EAA1B;AACA,KAAMe,CAAAA,MAAM,CAAGhB,QAAQ,CAAG,CAA1B;AACA,KAAMiB,CAAAA,QAAQ,CAAGC,KAAK,CAACC,IAAN,CAAW,CAAEH,MAAF,CAAX,CAAuB,CAACI,KAAD,CAAQZ,MAAR;AACtCa,iBAAiB,CAACb,MAAD,CAASL,OAAT,CADF,CAAjB;;AAGA,MAAOmB,CAAAA,MAAM,CAACC,MAAP,CAAc,EAAd,CAAkB,GAAGN,QAArB,CAAP;AACD,CAPD;;AASA,KAAMI,CAAAA,iBAAiB,CAAG,SAAUb,MAAV,CAAkBL,OAAlB,CAA2B;AACnD,KAAMqB,CAAAA,MAAM,CAAGC,kBAAkB,CAACjB,MAAD,CAASL,OAAT,CAAjC;;AAEA,GAAIqB,MAAM,GAAKE,SAAf,CAA0B;AACxB,MAAO,EAAP;AACD;;AAED,KAAM,CAAEnB,IAAF,CAAQE,WAAR,CAAqBC,SAArB,CAAgCC,MAAhC,CAAwCC,MAAxC,CAAgDC,QAAhD,EAA6DW,MAAnE;AACA,MAAO;AACL,CAAChB,MAAD,EAAU;AACRD,IADQ;AAERC,MAFQ;AAGRC,WAHQ;AAIRC,SAJQ;AAKRC,MALQ;AAMRC,MANQ;AAORC,QAPQ,CADL,CAAP;;;AAWD,CAnBD;;;;AAuBA,KAAMY,CAAAA,kBAAkB,CAAG,SAAUjB,MAAV,CAAkBL,OAAlB,CAA2B;AACpD,KAAMqB,CAAAA,MAAM,CAAGrB,OAAO,CAACwB,IAAR,CAAa,CAAC,CAAEpB,IAAF,CAAD,GAAcR,SAAS,CAACI,OAAV,CAAkBI,IAAlB,IAA4BC,MAAvD,CAAf;;AAEA,GAAIgB,MAAM,GAAKE,SAAf,CAA0B;AACxB,MAAOF,CAAAA,MAAP;AACD;;AAED,MAAOrB,CAAAA,OAAO,CAACwB,IAAR,CAAa,CAACC,OAAD,GAAaA,OAAO,CAACpB,MAAR,GAAmBA,MAA7C,CAAP;AACD,CARD;;AAUA,MAAO,MAAMqB,CAAAA,eAAe,CAAGd,kBAAkB,EAA1C","sourcesContent":["import { constants } from 'os'\n\nimport { SIGRTMAX } from './realtime.js'\nimport { getSignals } from './signals.js'\n\n// Retrieve `signalsByName`, an object mapping signal name to signal properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByName = function () {\n const signals = getSignals()\n return signals.reduce(getSignalByName, {})\n}\n\nconst getSignalByName = function (\n signalByNameMemo,\n { name, number, description, supported, action, forced, standard },\n) {\n return {\n ...signalByNameMemo,\n [name]: { name, number, description, supported, action, forced, standard },\n }\n}\n\nexport const signalsByName = getSignalsByName()\n\n// Retrieve `signalsByNumber`, an object mapping signal number to signal\n// properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByNumber = function () {\n const signals = getSignals()\n const length = SIGRTMAX + 1\n const signalsA = Array.from({ length }, (value, number) =>\n getSignalByNumber(number, signals),\n )\n return Object.assign({}, ...signalsA)\n}\n\nconst getSignalByNumber = function (number, signals) {\n const signal = findSignalByNumber(number, signals)\n\n if (signal === undefined) {\n return {}\n }\n\n const { name, description, supported, action, forced, standard } = signal\n return {\n [number]: {\n name,\n number,\n description,\n supported,\n action,\n forced,\n standard,\n },\n }\n}\n\n// Several signals might end up sharing the same number because of OS-specific\n// numbers, in which case those prevail.\nconst findSignalByNumber = function (number, signals) {\n const signal = signals.find(({ name }) => constants.signals[name] === number)\n\n if (signal !== undefined) {\n return signal\n }\n\n return signals.find((signalA) => signalA.number === number)\n}\n\nexport const signalsByNumber = getSignalsByNumber()\n"],"file":"src/main.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js b/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js new file mode 100644 index 0000000..16a6627 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js @@ -0,0 +1,19 @@ + +export const getRealtimeSignals=function(){ +const length=SIGRTMAX-SIGRTMIN+1; +return Array.from({length},getRealtimeSignal); +}; + +const getRealtimeSignal=function(value,index){ +return{ +name:`SIGRT${index+1}`, +number:SIGRTMIN+index, +action:"terminate", +description:"Application-specific signal (realtime)", +standard:"posix"}; + +}; + +const SIGRTMIN=34; +export const SIGRTMAX=64; +//# sourceMappingURL=realtime.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map new file mode 100644 index 0000000..2a08148 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/realtime.js"],"names":["getRealtimeSignals","length","SIGRTMAX","SIGRTMIN","Array","from","getRealtimeSignal","value","index","name","number","action","description","standard"],"mappings":";AACA,MAAO,MAAMA,CAAAA,kBAAkB,CAAG,UAAY;AAC5C,KAAMC,CAAAA,MAAM,CAAGC,QAAQ,CAAGC,QAAX,CAAsB,CAArC;AACA,MAAOC,CAAAA,KAAK,CAACC,IAAN,CAAW,CAAEJ,MAAF,CAAX,CAAuBK,iBAAvB,CAAP;AACD,CAHM;;AAKP,KAAMA,CAAAA,iBAAiB,CAAG,SAAUC,KAAV,CAAiBC,KAAjB,CAAwB;AAChD,MAAO;AACLC,IAAI,CAAG,QAAOD,KAAK,CAAG,CAAE,EADnB;AAELE,MAAM,CAAEP,QAAQ,CAAGK,KAFd;AAGLG,MAAM,CAAE,WAHH;AAILC,WAAW,CAAE,wCAJR;AAKLC,QAAQ,CAAE,OALL,CAAP;;AAOD,CARD;;AAUA,KAAMV,CAAAA,QAAQ,CAAG,EAAjB;AACA,MAAO,MAAMD,CAAAA,QAAQ,CAAG,EAAjB","sourcesContent":["// List of realtime signals with information about them\nexport const getRealtimeSignals = function () {\n const length = SIGRTMAX - SIGRTMIN + 1\n return Array.from({ length }, getRealtimeSignal)\n}\n\nconst getRealtimeSignal = function (value, index) {\n return {\n name: `SIGRT${index + 1}`,\n number: SIGRTMIN + index,\n action: 'terminate',\n description: 'Application-specific signal (realtime)',\n standard: 'posix',\n }\n}\n\nconst SIGRTMIN = 34\nexport const SIGRTMAX = 64\n"],"file":"src/realtime.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js b/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js new file mode 100644 index 0000000..644a041 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js @@ -0,0 +1,35 @@ +import{constants}from"os"; + +import{SIGNALS}from"./core.js"; +import{getRealtimeSignals}from"./realtime.js"; + + + +export const getSignals=function(){ +const realtimeSignals=getRealtimeSignals(); +const signals=[...SIGNALS,...realtimeSignals].map(normalizeSignal); +return signals; +}; + + + + + + + +const normalizeSignal=function({ +name, +number:defaultNumber, +description, +action, +forced=false, +standard}) +{ +const{ +signals:{[name]:constantSignal}}= +constants; +const supported=constantSignal!==undefined; +const number=supported?constantSignal:defaultNumber; +return{name,number,description,supported,action,forced,standard}; +}; +//# sourceMappingURL=signals.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map new file mode 100644 index 0000000..0094f87 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../src/signals.js"],"names":["constants","SIGNALS","getRealtimeSignals","getSignals","realtimeSignals","signals","map","normalizeSignal","name","number","defaultNumber","description","action","forced","standard","constantSignal","supported","undefined"],"mappings":"AAAA,OAASA,SAAT,KAA0B,IAA1B;;AAEA,OAASC,OAAT,KAAwB,WAAxB;AACA,OAASC,kBAAT,KAAmC,eAAnC;;;;AAIA,MAAO,MAAMC,CAAAA,UAAU,CAAG,UAAY;AACpC,KAAMC,CAAAA,eAAe,CAAGF,kBAAkB,EAA1C;AACA,KAAMG,CAAAA,OAAO,CAAG,CAAC,GAAGJ,OAAJ,CAAa,GAAGG,eAAhB,EAAiCE,GAAjC,CAAqCC,eAArC,CAAhB;AACA,MAAOF,CAAAA,OAAP;AACD,CAJM;;;;;;;;AAYP,KAAME,CAAAA,eAAe,CAAG,SAAU;AAChCC,IADgC;AAEhCC,MAAM,CAAEC,aAFwB;AAGhCC,WAHgC;AAIhCC,MAJgC;AAKhCC,MAAM,CAAG,KALuB;AAMhCC,QANgC,CAAV;AAOrB;AACD,KAAM;AACJT,OAAO,CAAE,CAAE,CAACG,IAAD,EAAQO,cAAV,CADL;AAEFf,SAFJ;AAGA,KAAMgB,CAAAA,SAAS,CAAGD,cAAc,GAAKE,SAArC;AACA,KAAMR,CAAAA,MAAM,CAAGO,SAAS,CAAGD,cAAH,CAAoBL,aAA5C;AACA,MAAO,CAAEF,IAAF,CAAQC,MAAR,CAAgBE,WAAhB,CAA6BK,SAA7B,CAAwCJ,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAAP;AACD,CAdD","sourcesContent":["import { constants } from 'os'\n\nimport { SIGNALS } from './core.js'\nimport { getRealtimeSignals } from './realtime.js'\n\n// Retrieve list of know signals (including realtime) with information about\n// them\nexport const getSignals = function () {\n const realtimeSignals = getRealtimeSignals()\n const signals = [...SIGNALS, ...realtimeSignals].map(normalizeSignal)\n return signals\n}\n\n// Normalize signal:\n// - `number`: signal numbers are OS-specific. This is taken into account by\n// `os.constants.signals`. However we provide a default `number` since some\n// signals are not defined for some OS.\n// - `forced`: set default to `false`\n// - `supported`: set value\nconst normalizeSignal = function ({\n name,\n number: defaultNumber,\n description,\n action,\n forced = false,\n standard,\n}) {\n const {\n signals: { [name]: constantSignal },\n } = constants\n const supported = constantSignal !== undefined\n const number = supported ? constantSignal : defaultNumber\n return { name, number, description, supported, action, forced, standard }\n}\n"],"file":"src/signals.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/package.json b/tests/wcag-compliance/node_modules/human-signals/package.json new file mode 100644 index 0000000..ac51860 --- /dev/null +++ b/tests/wcag-compliance/node_modules/human-signals/package.json @@ -0,0 +1,57 @@ +{ + "name": "human-signals", + "version": "3.0.1", + "type": "module", + "exports": "./build/src/main.js", + "main": "./build/src/main.js", + "files": [ + "build/src/**/*.{js,ts,map,json,sh,md}", + "examples/**/*.{js,ts,map,json,sh,md}" + ], + "scripts": { + "test": "gulp test" + }, + "description": "Human-friendly process signals", + "keywords": [ + "signal", + "signals", + "handlers", + "error-handling", + "errors", + "interrupts", + "sigterm", + "sigint", + "irq", + "process", + "exit", + "exit-code", + "status", + "operating-system", + "es6", + "javascript", + "linux", + "macos", + "windows", + "nodejs" + ], + "license": "Apache-2.0", + "homepage": "https://git.io/JeluP", + "repository": "ehmicky/human-signals", + "bugs": { + "url": "https://github.com/ehmicky/human-signals/issues" + }, + "author": "ehmicky (https://github.com/ehmicky)", + "directories": { + "lib": "src", + "test": "test" + }, + "types": "build/src/main.d.ts", + "devDependencies": { + "@ehmicky/dev-tasks": "^1.0.34", + "ajv": "^6.12.6", + "test-each": "^3.0.1" + }, + "engines": { + "node": ">=12.20.0" + } +} diff --git a/tests/wcag-compliance/node_modules/is-stream/index.d.ts b/tests/wcag-compliance/node_modules/is-stream/index.d.ts new file mode 100644 index 0000000..df994e0 --- /dev/null +++ b/tests/wcag-compliance/node_modules/is-stream/index.d.ts @@ -0,0 +1,81 @@ +import { + Stream, + Writable as WritableStream, + Readable as ReadableStream, + Duplex as DuplexStream, + Transform as TransformStream, +} from 'node:stream'; + +/** +@returns Whether `stream` is a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). + +@example +``` +import fs from 'node:fs'; +import {isStream} from 'is-stream'; + +isStream(fs.createReadStream('unicorn.png')); +//=> true + +isStream({}); +//=> false +``` +*/ +export function isStream(stream: unknown): stream is Stream; + +/** +@returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). + +@example +``` +import fs from 'node:fs'; +import {isWritableStream} from 'is-stream'; + +isWritableStream(fs.createWriteStrem('unicorn.txt')); +//=> true +``` +*/ +export function isWritableStream(stream: unknown): stream is WritableStream; + +/** +@returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). + +@example +``` +import fs from 'node:fs'; +import {isReadableStream} from 'is-stream'; + +isReadableStream(fs.createReadStream('unicorn.png')); +//=> true +``` +*/ +export function isReadableStream(stream: unknown): stream is ReadableStream; + +/** +@returns Whether `stream` is a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). + +@example +``` +import {Duplex as DuplexStream} from 'node:stream'; +import {isDuplexStream} from 'is-stream'; + +isDuplexStream(new DuplexStream()); +//=> true +``` +*/ +export function isDuplexStream(stream: unknown): stream is DuplexStream; + +/** +@returns Whether `stream` is a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). + +@example +``` +import fs from 'node:fs'; +import StringifyStream from 'streaming-json-stringify'; +import {isTransformStream} from 'is-stream'; + +isTransformStream(StringifyStream()); +//=> true +``` +*/ +export function isTransformStream(stream: unknown): stream is TransformStream; diff --git a/tests/wcag-compliance/node_modules/is-stream/index.js b/tests/wcag-compliance/node_modules/is-stream/index.js new file mode 100644 index 0000000..887e601 --- /dev/null +++ b/tests/wcag-compliance/node_modules/is-stream/index.js @@ -0,0 +1,29 @@ +export function isStream(stream) { + return stream !== null + && typeof stream === 'object' + && typeof stream.pipe === 'function'; +} + +export function isWritableStream(stream) { + return isStream(stream) + && stream.writable !== false + && typeof stream._write === 'function' + && typeof stream._writableState === 'object'; +} + +export function isReadableStream(stream) { + return isStream(stream) + && stream.readable !== false + && typeof stream._read === 'function' + && typeof stream._readableState === 'object'; +} + +export function isDuplexStream(stream) { + return isWritableStream(stream) + && isReadableStream(stream); +} + +export function isTransformStream(stream) { + return isDuplexStream(stream) + && typeof stream._transform === 'function'; +} diff --git a/tests/wcag-compliance/node_modules/is-stream/license b/tests/wcag-compliance/node_modules/is-stream/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/is-stream/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/is-stream/package.json b/tests/wcag-compliance/node_modules/is-stream/package.json new file mode 100644 index 0000000..47d5761 --- /dev/null +++ b/tests/wcag-compliance/node_modules/is-stream/package.json @@ -0,0 +1,44 @@ +{ + "name": "is-stream", + "version": "3.0.0", + "description": "Check if something is a Node.js stream", + "license": "MIT", + "repository": "sindresorhus/is-stream", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "stream", + "type", + "streams", + "writable", + "readable", + "duplex", + "transform", + "check", + "detect", + "is" + ], + "devDependencies": { + "@types/node": "^16.4.13", + "ava": "^3.15.0", + "tempy": "^1.0.1", + "tsd": "^0.17.0", + "xo": "^0.44.0" + } +} diff --git a/tests/wcag-compliance/node_modules/is-stream/readme.md b/tests/wcag-compliance/node_modules/is-stream/readme.md new file mode 100644 index 0000000..c6f8c1b --- /dev/null +++ b/tests/wcag-compliance/node_modules/is-stream/readme.md @@ -0,0 +1,60 @@ +# is-stream + +> Check if something is a [Node.js stream](https://nodejs.org/api/stream.html) + +## Install + +``` +$ npm install is-stream +``` + +## Usage + +```js +import fs from 'node:fs'; +import {isStream} from 'is-stream'; + +isStream(fs.createReadStream('unicorn.png')); +//=> true + +isStream({}); +//=> false +``` + +## API + +### isStream(stream) + +Returns a `boolean` for whether it's a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). + +#### isWritableStream(stream) + +Returns a `boolean` for whether it's a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). + +#### isReadableStream(stream) + +Returns a `boolean` for whether it's a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). + +#### isDuplexStream(stream) + +Returns a `boolean` for whether it's a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). + +#### isTransformStream(stream) + +Returns a `boolean` for whether it's a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). + +## Related + +- [is-file-stream](https://github.com/jamestalmage/is-file-stream) - Detect if a stream is a file stream + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/isexe/.npmignore b/tests/wcag-compliance/node_modules/isexe/.npmignore new file mode 100644 index 0000000..c1cb757 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/.npmignore @@ -0,0 +1,2 @@ +.nyc_output/ +coverage/ diff --git a/tests/wcag-compliance/node_modules/isexe/LICENSE b/tests/wcag-compliance/node_modules/isexe/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/isexe/README.md b/tests/wcag-compliance/node_modules/isexe/README.md new file mode 100644 index 0000000..35769e8 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/README.md @@ -0,0 +1,51 @@ +# isexe + +Minimal module to check if a file is executable, and a normal file. + +Uses `fs.stat` and tests against the `PATHEXT` environment variable on +Windows. + +## USAGE + +```javascript +var isexe = require('isexe') +isexe('some-file-name', function (err, isExe) { + if (err) { + console.error('probably file does not exist or something', err) + } else if (isExe) { + console.error('this thing can be run') + } else { + console.error('cannot be run') + } +}) + +// same thing but synchronous, throws errors +var isExe = isexe.sync('some-file-name') + +// treat errors as just "not executable" +isexe('maybe-missing-file', { ignoreErrors: true }, callback) +var isExe = isexe.sync('maybe-missing-file', { ignoreErrors: true }) +``` + +## API + +### `isexe(path, [options], [callback])` + +Check if the path is executable. If no callback provided, and a +global `Promise` object is available, then a Promise will be returned. + +Will raise whatever errors may be raised by `fs.stat`, unless +`options.ignoreErrors` is set to true. + +### `isexe.sync(path, [options])` + +Same as `isexe` but returns the value and throws any errors raised. + +### Options + +* `ignoreErrors` Treat all errors as "no, this is not executable", but + don't raise them. +* `uid` Number to use as the user id +* `gid` Number to use as the group id +* `pathExt` List of path extensions to use instead of `PATHEXT` + environment variable on Windows. diff --git a/tests/wcag-compliance/node_modules/isexe/index.js b/tests/wcag-compliance/node_modules/isexe/index.js new file mode 100644 index 0000000..553fb32 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/index.js @@ -0,0 +1,57 @@ +var fs = require('fs') +var core +if (process.platform === 'win32' || global.TESTING_WINDOWS) { + core = require('./windows.js') +} else { + core = require('./mode.js') +} + +module.exports = isexe +isexe.sync = sync + +function isexe (path, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + + if (!cb) { + if (typeof Promise !== 'function') { + throw new TypeError('callback not provided') + } + + return new Promise(function (resolve, reject) { + isexe(path, options || {}, function (er, is) { + if (er) { + reject(er) + } else { + resolve(is) + } + }) + }) + } + + core(path, options || {}, function (er, is) { + // ignore EACCES because that just means we aren't allowed to run it + if (er) { + if (er.code === 'EACCES' || options && options.ignoreErrors) { + er = null + is = false + } + } + cb(er, is) + }) +} + +function sync (path, options) { + // my kingdom for a filtered catch + try { + return core.sync(path, options || {}) + } catch (er) { + if (options && options.ignoreErrors || er.code === 'EACCES') { + return false + } else { + throw er + } + } +} diff --git a/tests/wcag-compliance/node_modules/isexe/mode.js b/tests/wcag-compliance/node_modules/isexe/mode.js new file mode 100644 index 0000000..1995ea4 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/mode.js @@ -0,0 +1,41 @@ +module.exports = isexe +isexe.sync = sync + +var fs = require('fs') + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), options) +} + +function checkStat (stat, options) { + return stat.isFile() && checkMode(stat, options) +} + +function checkMode (stat, options) { + var mod = stat.mode + var uid = stat.uid + var gid = stat.gid + + var myUid = options.uid !== undefined ? + options.uid : process.getuid && process.getuid() + var myGid = options.gid !== undefined ? + options.gid : process.getgid && process.getgid() + + var u = parseInt('100', 8) + var g = parseInt('010', 8) + var o = parseInt('001', 8) + var ug = u | g + + var ret = (mod & o) || + (mod & g) && gid === myGid || + (mod & u) && uid === myUid || + (mod & ug) && myUid === 0 + + return ret +} diff --git a/tests/wcag-compliance/node_modules/isexe/package.json b/tests/wcag-compliance/node_modules/isexe/package.json new file mode 100644 index 0000000..e452689 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/package.json @@ -0,0 +1,31 @@ +{ + "name": "isexe", + "version": "2.0.0", + "description": "Minimal module to check if a file is executable.", + "main": "index.js", + "directories": { + "test": "test" + }, + "devDependencies": { + "mkdirp": "^0.5.1", + "rimraf": "^2.5.0", + "tap": "^10.3.0" + }, + "scripts": { + "test": "tap test/*.js --100", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --all; git push origin --tags" + }, + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "repository": { + "type": "git", + "url": "git+https://github.com/isaacs/isexe.git" + }, + "keywords": [], + "bugs": { + "url": "https://github.com/isaacs/isexe/issues" + }, + "homepage": "https://github.com/isaacs/isexe#readme" +} diff --git a/tests/wcag-compliance/node_modules/isexe/test/basic.js b/tests/wcag-compliance/node_modules/isexe/test/basic.js new file mode 100644 index 0000000..d926df6 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/test/basic.js @@ -0,0 +1,221 @@ +var t = require('tap') +var fs = require('fs') +var path = require('path') +var fixture = path.resolve(__dirname, 'fixtures') +var meow = fixture + '/meow.cat' +var mine = fixture + '/mine.cat' +var ours = fixture + '/ours.cat' +var fail = fixture + '/fail.false' +var noent = fixture + '/enoent.exe' +var mkdirp = require('mkdirp') +var rimraf = require('rimraf') + +var isWindows = process.platform === 'win32' +var hasAccess = typeof fs.access === 'function' +var winSkip = isWindows && 'windows' +var accessSkip = !hasAccess && 'no fs.access function' +var hasPromise = typeof Promise === 'function' +var promiseSkip = !hasPromise && 'no global Promise' + +function reset () { + delete require.cache[require.resolve('../')] + return require('../') +} + +t.test('setup fixtures', function (t) { + rimraf.sync(fixture) + mkdirp.sync(fixture) + fs.writeFileSync(meow, '#!/usr/bin/env cat\nmeow\n') + fs.chmodSync(meow, parseInt('0755', 8)) + fs.writeFileSync(fail, '#!/usr/bin/env false\n') + fs.chmodSync(fail, parseInt('0644', 8)) + fs.writeFileSync(mine, '#!/usr/bin/env cat\nmine\n') + fs.chmodSync(mine, parseInt('0744', 8)) + fs.writeFileSync(ours, '#!/usr/bin/env cat\nours\n') + fs.chmodSync(ours, parseInt('0754', 8)) + t.end() +}) + +t.test('promise', { skip: promiseSkip }, function (t) { + var isexe = reset() + t.test('meow async', function (t) { + isexe(meow).then(function (is) { + t.ok(is) + t.end() + }) + }) + t.test('fail async', function (t) { + isexe(fail).then(function (is) { + t.notOk(is) + t.end() + }) + }) + t.test('noent async', function (t) { + isexe(noent).catch(function (er) { + t.ok(er) + t.end() + }) + }) + t.test('noent ignore async', function (t) { + isexe(noent, { ignoreErrors: true }).then(function (is) { + t.notOk(is) + t.end() + }) + }) + t.end() +}) + +t.test('no promise', function (t) { + global.Promise = null + var isexe = reset() + t.throws('try to meow a promise', function () { + isexe(meow) + }) + t.end() +}) + +t.test('access', { skip: accessSkip || winSkip }, function (t) { + runTest(t) +}) + +t.test('mode', { skip: winSkip }, function (t) { + delete fs.access + delete fs.accessSync + var isexe = reset() + t.ok(isexe.sync(ours, { uid: 0, gid: 0 })) + t.ok(isexe.sync(mine, { uid: 0, gid: 0 })) + runTest(t) +}) + +t.test('windows', function (t) { + global.TESTING_WINDOWS = true + var pathExt = '.EXE;.CAT;.CMD;.COM' + t.test('pathExt option', function (t) { + runTest(t, { pathExt: '.EXE;.CAT;.CMD;.COM' }) + }) + t.test('pathExt env', function (t) { + process.env.PATHEXT = pathExt + runTest(t) + }) + t.test('no pathExt', function (t) { + // with a pathExt of '', any filename is fine. + // so the "fail" one would still pass. + runTest(t, { pathExt: '', skipFail: true }) + }) + t.test('pathext with empty entry', function (t) { + // with a pathExt of '', any filename is fine. + // so the "fail" one would still pass. + runTest(t, { pathExt: ';' + pathExt, skipFail: true }) + }) + t.end() +}) + +t.test('cleanup', function (t) { + rimraf.sync(fixture) + t.end() +}) + +function runTest (t, options) { + var isexe = reset() + + var optionsIgnore = Object.create(options || {}) + optionsIgnore.ignoreErrors = true + + if (!options || !options.skipFail) { + t.notOk(isexe.sync(fail, options)) + } + t.notOk(isexe.sync(noent, optionsIgnore)) + if (!options) { + t.ok(isexe.sync(meow)) + } else { + t.ok(isexe.sync(meow, options)) + } + + t.ok(isexe.sync(mine, options)) + t.ok(isexe.sync(ours, options)) + t.throws(function () { + isexe.sync(noent, options) + }) + + t.test('meow async', function (t) { + if (!options) { + isexe(meow, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + } else { + isexe(meow, options, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + } + }) + + t.test('mine async', function (t) { + isexe(mine, options, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + }) + + t.test('ours async', function (t) { + isexe(ours, options, function (er, is) { + if (er) { + throw er + } + t.ok(is) + t.end() + }) + }) + + if (!options || !options.skipFail) { + t.test('fail async', function (t) { + isexe(fail, options, function (er, is) { + if (er) { + throw er + } + t.notOk(is) + t.end() + }) + }) + } + + t.test('noent async', function (t) { + isexe(noent, options, function (er, is) { + t.ok(er) + t.notOk(is) + t.end() + }) + }) + + t.test('noent ignore async', function (t) { + isexe(noent, optionsIgnore, function (er, is) { + if (er) { + throw er + } + t.notOk(is) + t.end() + }) + }) + + t.test('directory is not executable', function (t) { + isexe(__dirname, options, function (er, is) { + if (er) { + throw er + } + t.notOk(is) + t.end() + }) + }) + + t.end() +} diff --git a/tests/wcag-compliance/node_modules/isexe/windows.js b/tests/wcag-compliance/node_modules/isexe/windows.js new file mode 100644 index 0000000..3499673 --- /dev/null +++ b/tests/wcag-compliance/node_modules/isexe/windows.js @@ -0,0 +1,42 @@ +module.exports = isexe +isexe.sync = sync + +var fs = require('fs') + +function checkPathExt (path, options) { + var pathext = options.pathExt !== undefined ? + options.pathExt : process.env.PATHEXT + + if (!pathext) { + return true + } + + pathext = pathext.split(';') + if (pathext.indexOf('') !== -1) { + return true + } + for (var i = 0; i < pathext.length; i++) { + var p = pathext[i].toLowerCase() + if (p && path.substr(-p.length).toLowerCase() === p) { + return true + } + } + return false +} + +function checkStat (stat, path, options) { + if (!stat.isSymbolicLink() && !stat.isFile()) { + return false + } + return checkPathExt(path, options) +} + +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, path, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), path, options) +} diff --git a/tests/wcag-compliance/node_modules/merge-stream/LICENSE b/tests/wcag-compliance/node_modules/merge-stream/LICENSE new file mode 100644 index 0000000..94a4c0a --- /dev/null +++ b/tests/wcag-compliance/node_modules/merge-stream/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Stephen Sugden (stephensugden.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/merge-stream/README.md b/tests/wcag-compliance/node_modules/merge-stream/README.md new file mode 100644 index 0000000..0d54841 --- /dev/null +++ b/tests/wcag-compliance/node_modules/merge-stream/README.md @@ -0,0 +1,78 @@ +# merge-stream + +Merge (interleave) a bunch of streams. + +[![build status](https://secure.travis-ci.org/grncdr/merge-stream.svg?branch=master)](http://travis-ci.org/grncdr/merge-stream) + +## Synopsis + +```javascript +var stream1 = new Stream(); +var stream2 = new Stream(); + +var merged = mergeStream(stream1, stream2); + +var stream3 = new Stream(); +merged.add(stream3); +merged.isEmpty(); +//=> false +``` + +## Description + +This is adapted from [event-stream](https://github.com/dominictarr/event-stream) separated into a new module, using Streams3. + +## API + +### `mergeStream` + +Type: `function` + +Merges an arbitrary number of streams. Returns a merged stream. + +#### `merged.add` + +A method to dynamically add more sources to the stream. The argument supplied to `add` can be either a source or an array of sources. + +#### `merged.isEmpty` + +A method that tells you if the merged stream is empty. + +When a stream is "empty" (aka. no sources were added), it could not be returned to a gulp task. + +So, we could do something like this: + +```js +stream = require('merge-stream')(); +// Something like a loop to add some streams to the merge stream +// stream.add(streamA); +// stream.add(streamB); +return stream.isEmpty() ? null : stream; +``` + +## Gulp example + +An example use case for **merge-stream** is to combine parts of a task in a project's **gulpfile.js** like this: + +```js +const gulp = require('gulp'); +const htmlValidator = require('gulp-w3c-html-validator'); +const jsHint = require('gulp-jshint'); +const mergeStream = require('merge-stream'); + +function lint() { + return mergeStream( + gulp.src('src/*.html') + .pipe(htmlValidator()) + .pipe(htmlValidator.reporter()), + gulp.src('src/*.js') + .pipe(jsHint()) + .pipe(jsHint.reporter()) + ); +} +gulp.task('lint', lint); +``` + +## License + +MIT diff --git a/tests/wcag-compliance/node_modules/merge-stream/index.js b/tests/wcag-compliance/node_modules/merge-stream/index.js new file mode 100644 index 0000000..b1a9e1a --- /dev/null +++ b/tests/wcag-compliance/node_modules/merge-stream/index.js @@ -0,0 +1,41 @@ +'use strict'; + +const { PassThrough } = require('stream'); + +module.exports = function (/*streams...*/) { + var sources = [] + var output = new PassThrough({objectMode: true}) + + output.setMaxListeners(0) + + output.add = add + output.isEmpty = isEmpty + + output.on('unpipe', remove) + + Array.prototype.slice.call(arguments).forEach(add) + + return output + + function add (source) { + if (Array.isArray(source)) { + source.forEach(add) + return this + } + + sources.push(source); + source.once('end', remove.bind(null, source)) + source.once('error', output.emit.bind(output, 'error')) + source.pipe(output, {end: false}) + return this + } + + function isEmpty () { + return sources.length == 0; + } + + function remove (source) { + sources = sources.filter(function (it) { return it !== source }) + if (!sources.length && output.readable) { output.end() } + } +} diff --git a/tests/wcag-compliance/node_modules/merge-stream/package.json b/tests/wcag-compliance/node_modules/merge-stream/package.json new file mode 100644 index 0000000..1a4c54c --- /dev/null +++ b/tests/wcag-compliance/node_modules/merge-stream/package.json @@ -0,0 +1,19 @@ +{ + "name": "merge-stream", + "version": "2.0.0", + "description": "Create a stream that emits events from multiple other streams", + "files": [ + "index.js" + ], + "scripts": { + "test": "istanbul cover test.js && istanbul check-cover --statements 100 --branches 100" + }, + "repository": "grncdr/merge-stream", + "author": "Stephen Sugden ", + "license": "MIT", + "dependencies": {}, + "devDependencies": { + "from2": "^2.0.3", + "istanbul": "^0.4.5" + } +} diff --git a/tests/wcag-compliance/node_modules/mimic-fn/index.d.ts b/tests/wcag-compliance/node_modules/mimic-fn/index.d.ts new file mode 100644 index 0000000..2a72e0a --- /dev/null +++ b/tests/wcag-compliance/node_modules/mimic-fn/index.d.ts @@ -0,0 +1,52 @@ +export interface Options { + /** + Skip modifying [non-configurable properties](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor#Description) instead of throwing an error. + + @default false + */ + readonly ignoreNonConfigurable?: boolean; +} + +/** +Modifies the `to` function to mimic the `from` function. Returns the `to` function. + +`name`, `displayName`, and any other properties of `from` are copied. The `length` property is not copied. Prototype, class, and inherited properties are copied. + +`to.toString()` will return the same as `from.toString()` but prepended with a `Wrapped with to()` comment. + +@param to - Mimicking function. +@param from - Function to mimic. +@returns The modified `to` function. + +@example +``` +import mimicFunction from 'mimic-fn'; + +function foo() {} +foo.unicorn = '🦄'; + +function wrapper() { + return foo(); +} + +console.log(wrapper.name); +//=> 'wrapper' + +mimicFunction(wrapper, foo); + +console.log(wrapper.name); +//=> 'foo' + +console.log(wrapper.unicorn); +//=> '🦄' +``` +*/ +export default function mimicFunction< + ArgumentsType extends unknown[], + ReturnType, + FunctionType extends (...arguments: ArgumentsType) => ReturnType +>( + to: (...arguments: ArgumentsType) => ReturnType, + from: FunctionType, + options?: Options, +): FunctionType; diff --git a/tests/wcag-compliance/node_modules/mimic-fn/index.js b/tests/wcag-compliance/node_modules/mimic-fn/index.js new file mode 100644 index 0000000..bc9ef7d --- /dev/null +++ b/tests/wcag-compliance/node_modules/mimic-fn/index.js @@ -0,0 +1,71 @@ +const copyProperty = (to, from, property, ignoreNonConfigurable) => { + // `Function#length` should reflect the parameters of `to` not `from` since we keep its body. + // `Function#prototype` is non-writable and non-configurable so can never be modified. + if (property === 'length' || property === 'prototype') { + return; + } + + // `Function#arguments` and `Function#caller` should not be copied. They were reported to be present in `Reflect.ownKeys` for some devices in React Native (#41), so we explicitly ignore them here. + if (property === 'arguments' || property === 'caller') { + return; + } + + const toDescriptor = Object.getOwnPropertyDescriptor(to, property); + const fromDescriptor = Object.getOwnPropertyDescriptor(from, property); + + if (!canCopyProperty(toDescriptor, fromDescriptor) && ignoreNonConfigurable) { + return; + } + + Object.defineProperty(to, property, fromDescriptor); +}; + +// `Object.defineProperty()` throws if the property exists, is not configurable and either: +// - one its descriptors is changed +// - it is non-writable and its value is changed +const canCopyProperty = function (toDescriptor, fromDescriptor) { + return toDescriptor === undefined || toDescriptor.configurable || ( + toDescriptor.writable === fromDescriptor.writable && + toDescriptor.enumerable === fromDescriptor.enumerable && + toDescriptor.configurable === fromDescriptor.configurable && + (toDescriptor.writable || toDescriptor.value === fromDescriptor.value) + ); +}; + +const changePrototype = (to, from) => { + const fromPrototype = Object.getPrototypeOf(from); + if (fromPrototype === Object.getPrototypeOf(to)) { + return; + } + + Object.setPrototypeOf(to, fromPrototype); +}; + +const wrappedToString = (withName, fromBody) => `/* Wrapped ${withName}*/\n${fromBody}`; + +const toStringDescriptor = Object.getOwnPropertyDescriptor(Function.prototype, 'toString'); +const toStringName = Object.getOwnPropertyDescriptor(Function.prototype.toString, 'name'); + +// We call `from.toString()` early (not lazily) to ensure `from` can be garbage collected. +// We use `bind()` instead of a closure for the same reason. +// Calling `from.toString()` early also allows caching it in case `to.toString()` is called several times. +const changeToString = (to, from, name) => { + const withName = name === '' ? '' : `with ${name.trim()}() `; + const newToString = wrappedToString.bind(null, withName, from.toString()); + // Ensure `to.toString.toString` is non-enumerable and has the same `same` + Object.defineProperty(newToString, 'name', toStringName); + Object.defineProperty(to, 'toString', {...toStringDescriptor, value: newToString}); +}; + +export default function mimicFunction(to, from, {ignoreNonConfigurable = false} = {}) { + const {name} = to; + + for (const property of Reflect.ownKeys(from)) { + copyProperty(to, from, property, ignoreNonConfigurable); + } + + changePrototype(to, from); + changeToString(to, from, name); + + return to; +} diff --git a/tests/wcag-compliance/node_modules/mimic-fn/license b/tests/wcag-compliance/node_modules/mimic-fn/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/mimic-fn/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/mimic-fn/package.json b/tests/wcag-compliance/node_modules/mimic-fn/package.json new file mode 100644 index 0000000..d010cdd --- /dev/null +++ b/tests/wcag-compliance/node_modules/mimic-fn/package.json @@ -0,0 +1,45 @@ +{ + "name": "mimic-fn", + "version": "4.0.0", + "description": "Make a function mimic another one", + "license": "MIT", + "repository": "sindresorhus/mimic-fn", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "engines": { + "node": ">=12" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "function", + "mimic", + "imitate", + "rename", + "copy", + "inherit", + "properties", + "name", + "func", + "fn", + "set", + "infer", + "change" + ], + "devDependencies": { + "ava": "^3.15.0", + "tsd": "^0.14.0", + "xo": "^0.38.2" + } +} diff --git a/tests/wcag-compliance/node_modules/mimic-fn/readme.md b/tests/wcag-compliance/node_modules/mimic-fn/readme.md new file mode 100644 index 0000000..9f571ce --- /dev/null +++ b/tests/wcag-compliance/node_modules/mimic-fn/readme.md @@ -0,0 +1,90 @@ +mimic-fn +
+ +> Make a function mimic another one + +Useful when you wrap a function in another function and like to preserve the original name and other properties. + +## Install + +``` +$ npm install mimic-fn +``` + +## Usage + +```js +import mimicFunction from 'mimic-fn'; + +function foo() {} +foo.unicorn = '🦄'; + +function wrapper() { + return foo(); +} + +console.log(wrapper.name); +//=> 'wrapper' + +mimicFunction(wrapper, foo); + +console.log(wrapper.name); +//=> 'foo' + +console.log(wrapper.unicorn); +//=> '🦄' + +console.log(String(wrapper)); +//=> '/* Wrapped with wrapper() */\nfunction foo() {}' +``` + + +## API + +### mimicFunction(to, from, options?) + +Modifies the `to` function to mimic the `from` function. Returns the `to` function. + +`name`, `displayName`, and any other properties of `from` are copied. The `length` property is not copied. Prototype, class, and inherited properties are copied. + +`to.toString()` will return the same as `from.toString()` but prepended with a `Wrapped with to()` comment. + +#### to + +Type: `Function` + +Mimicking function. + +#### from + +Type: `Function` + +Function to mimic. + +#### options + +Type: `object` + +##### ignoreNonConfigurable + +Type: `boolean`\ +Default: `false` + +Skip modifying [non-configurable properties](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor#Description) instead of throwing an error. + +## Related + +- [rename-fn](https://github.com/sindresorhus/rename-fn) - Rename a function +- [keep-func-props](https://github.com/ehmicky/keep-func-props) - Wrap a function without changing its name and other properties + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/npm-run-path/index.d.ts b/tests/wcag-compliance/node_modules/npm-run-path/index.d.ts new file mode 100644 index 0000000..fad851b --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/index.d.ts @@ -0,0 +1,84 @@ +export interface RunPathOptions { + /** + Working directory. + + @default process.cwd() + */ + readonly cwd?: string | URL; + + /** + PATH to be appended. Default: [`PATH`](https://github.com/sindresorhus/path-key). + + Set it to an empty string to exclude the default PATH. + */ + readonly path?: string; + + /** + Path to the Node.js executable to use in child processes if that is different from the current one. Its directory is pushed to the front of PATH. + + This can be either an absolute path or a path relative to the `cwd` option. + + @default process.execPath + */ + readonly execPath?: string; +} + +export type ProcessEnv = Record; + +export interface EnvOptions { + /** + The working directory. + + @default process.cwd() + */ + readonly cwd?: string | URL; + + /** + Accepts an object of environment variables, like `process.env`, and modifies the PATH using the correct [PATH key](https://github.com/sindresorhus/path-key). Use this if you're modifying the PATH for use in the `child_process` options. + */ + readonly env?: ProcessEnv; + + /** + The path to the current Node.js executable. Its directory is pushed to the front of PATH. + + This can be either an absolute path or a path relative to the `cwd` option. + + @default process.execPath + */ + readonly execPath?: string; +} + +/** +Get your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) prepended with locally installed binaries. + +@returns The augmented path string. + +@example +``` +import childProcess from 'node:child_process'; +import {npmRunPath} from 'npm-run-path'; + +console.log(process.env.PATH); +//=> '/usr/local/bin' + +console.log(npmRunPath()); +//=> '/Users/sindresorhus/dev/foo/node_modules/.bin:/Users/sindresorhus/dev/node_modules/.bin:/Users/sindresorhus/node_modules/.bin:/Users/node_modules/.bin:/node_modules/.bin:/usr/local/bin' +``` +*/ +export function npmRunPath(options?: RunPathOptions): string; + +/** +@returns The augmented [`process.env`](https://nodejs.org/api/process.html#process_process_env) object. + +@example +``` +import childProcess from 'node:child_process'; +import {npmRunPathEnv} from 'npm-run-path'; + +// `foo` is a locally installed binary +childProcess.execFileSync('foo', { + env: npmRunPathEnv() +}); +``` +*/ +export function npmRunPathEnv(options?: EnvOptions): ProcessEnv; diff --git a/tests/wcag-compliance/node_modules/npm-run-path/index.js b/tests/wcag-compliance/node_modules/npm-run-path/index.js new file mode 100644 index 0000000..77dfae2 --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/index.js @@ -0,0 +1,38 @@ +import process from 'node:process'; +import path from 'node:path'; +import url from 'node:url'; +import pathKey from 'path-key'; + +export function npmRunPath(options = {}) { + const { + cwd = process.cwd(), + path: path_ = process.env[pathKey()], + execPath = process.execPath, + } = options; + + let previous; + const cwdString = cwd instanceof URL ? url.fileURLToPath(cwd) : cwd; + let cwdPath = path.resolve(cwdString); + const result = []; + + while (previous !== cwdPath) { + result.push(path.join(cwdPath, 'node_modules/.bin')); + previous = cwdPath; + cwdPath = path.resolve(cwdPath, '..'); + } + + // Ensure the running `node` binary is used. + result.push(path.resolve(cwdString, execPath, '..')); + + return [...result, path_].join(path.delimiter); +} + +export function npmRunPathEnv({env = process.env, ...options} = {}) { + env = {...env}; + + const path = pathKey({env}); + options.path = env[path]; + env[path] = npmRunPath(options); + + return env; +} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/license b/tests/wcag-compliance/node_modules/npm-run-path/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts new file mode 100644 index 0000000..f411d62 --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts @@ -0,0 +1,31 @@ +export interface Options { + /** + Use a custom environment variables object. + + Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env). + */ + readonly env?: Record; + + /** + Get the PATH key for a specific platform. + + Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform). + */ + readonly platform?: NodeJS.Platform; +} + +/** +Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform. + +@example +``` +import pathKey from 'path-key'; + +const key = pathKey(); +//=> 'PATH' + +const PATH = process.env[key]; +//=> '/usr/local/bin:/usr/bin:/bin' +``` +*/ +export default function pathKey(options?: Options): string; diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js new file mode 100644 index 0000000..2c02914 --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js @@ -0,0 +1,12 @@ +export default function pathKey(options = {}) { + const { + env = process.env, + platform = process.platform + } = options; + + if (platform !== 'win32') { + return 'PATH'; + } + + return Object.keys(env).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path'; +} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json new file mode 100644 index 0000000..609070d --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json @@ -0,0 +1,41 @@ +{ + "name": "path-key", + "version": "4.0.0", + "description": "Get the PATH environment variable key cross-platform", + "license": "MIT", + "repository": "sindresorhus/path-key", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "engines": { + "node": ">=12" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "path", + "key", + "environment", + "env", + "variable", + "get", + "cross-platform", + "windows" + ], + "devDependencies": { + "@types/node": "^14.14.37", + "ava": "^3.15.0", + "tsd": "^0.14.0", + "xo": "^0.38.2" + } +} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md new file mode 100644 index 0000000..aa22506 --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md @@ -0,0 +1,57 @@ +# path-key + +> Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform + +It's usually `PATH` but on Windows it can be any casing like `Path`... + +## Install + +``` +$ npm install path-key +``` + +## Usage + +```js +import pathKey from 'path-key'; + +const key = pathKey(); +//=> 'PATH' + +const PATH = process.env[key]; +//=> '/usr/local/bin:/usr/bin:/bin' +``` + +## API + +### pathKey(options?) + +#### options + +Type: `object` + +##### env + +Type: `object`\ +Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env) + +Use a custom environment variables object. + +#### platform + +Type: `string`\ +Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform) + +Get the PATH key for a specific platform. + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/npm-run-path/package.json b/tests/wcag-compliance/node_modules/npm-run-path/package.json new file mode 100644 index 0000000..139b345 --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/package.json @@ -0,0 +1,47 @@ +{ + "name": "npm-run-path", + "version": "5.1.0", + "description": "Get your PATH prepended with locally installed binaries", + "license": "MIT", + "repository": "sindresorhus/npm-run-path", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "npm", + "run", + "path", + "package", + "bin", + "binary", + "binaries", + "script", + "cli", + "command-line", + "execute", + "executable" + ], + "dependencies": { + "path-key": "^4.0.0" + }, + "devDependencies": { + "ava": "^3.15.0", + "tsd": "^0.17.0", + "xo": "^0.45.0" + } +} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/readme.md b/tests/wcag-compliance/node_modules/npm-run-path/readme.md new file mode 100644 index 0000000..f2ab84b --- /dev/null +++ b/tests/wcag-compliance/node_modules/npm-run-path/readme.md @@ -0,0 +1,111 @@ +# npm-run-path + +> Get your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) prepended with locally installed binaries + +In [npm run scripts](https://docs.npmjs.com/cli/run-script) you can execute locally installed binaries by name. This enables the same outside npm. + +## Install + +```sh +npm install npm-run-path +``` + +## Usage + +```js +import childProcess from 'node:child_process'; +import {npmRunPath, npmRunPathEnv} from 'npm-run-path'; + +console.log(process.env.PATH); +//=> '/usr/local/bin' + +console.log(npmRunPath()); +//=> '/Users/sindresorhus/dev/foo/node_modules/.bin:/Users/sindresorhus/dev/node_modules/.bin:/Users/sindresorhus/node_modules/.bin:/Users/node_modules/.bin:/node_modules/.bin:/usr/local/bin' + +// `foo` is a locally installed binary +childProcess.execFileSync('foo', { + env: npmRunPathEnv() +}); +``` + +## API + +### npmRunPath(options?) + +Returns the augmented PATH string. + +#### options + +Type: `object` + +##### cwd + +Type: `string | URL`\ +Default: `process.cwd()` + +The working directory. + +##### path + +Type: `string`\ +Default: [`PATH`](https://github.com/sindresorhus/path-key) + +The PATH to be appended. + +Set it to an empty string to exclude the default PATH. + +##### execPath + +Type: `string`\ +Default: `process.execPath` + +The path to the current Node.js executable. Its directory is pushed to the front of PATH. + +This can be either an absolute path or a path relative to the [`cwd` option](#cwd). + +### npmRunPathEnv(options?) + +Returns the augmented [`process.env`](https://nodejs.org/api/process.html#process_process_env) object. + +#### options + +Type: `object` + +##### cwd + +Type: `string | URL`\ +Default: `process.cwd()` + +The working directory. + +##### env + +Type: `object` + +Accepts an object of environment variables, like `process.env`, and modifies the PATH using the correct [PATH key](https://github.com/sindresorhus/path-key). Use this if you're modifying the PATH for use in the `child_process` options. + +##### execPath + +Type: `string`\ +Default: `process.execPath` + +The path to the Node.js executable to use in child processes if that is different from the current one. Its directory is pushed to the front of PATH. + +This can be either an absolute path or a path relative to the [`cwd` option](#cwd). + +## Related + +- [npm-run-path-cli](https://github.com/sindresorhus/npm-run-path-cli) - CLI for this module +- [execa](https://github.com/sindresorhus/execa) - Execute a locally installed binary + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/onetime/index.d.ts b/tests/wcag-compliance/node_modules/onetime/index.d.ts new file mode 100644 index 0000000..3c80803 --- /dev/null +++ b/tests/wcag-compliance/node_modules/onetime/index.d.ts @@ -0,0 +1,59 @@ +export interface Options { + /** + Throw an error when called more than once. + + @default false + */ + readonly throw?: boolean; +} + +declare const onetime: { + /** + Ensure a function is only called once. When called multiple times it will return the return value from the first call. + + @param fn - Function that should only be called once. + @returns A function that only calls `fn` once. + + @example + ``` + import onetime from 'onetime'; + + let index = 0; + + const foo = onetime(() => ++index); + + foo(); //=> 1 + foo(); //=> 1 + foo(); //=> 1 + + onetime.callCount(foo); //=> 3 + ``` + */ + ( + fn: (...arguments: ArgumentsType) => ReturnType, + options?: Options + ): (...arguments: ArgumentsType) => ReturnType; + + /** + Get the number of times `fn` has been called. + + @param fn - Function to get call count from. + @returns A number representing how many times `fn` has been called. + + @example + ``` + import onetime from 'onetime'; + + const foo = onetime(() => {}); + foo(); + foo(); + foo(); + + console.log(onetime.callCount(foo)); + //=> 3 + ``` + */ + callCount(fn: (...arguments: any[]) => unknown): number; +}; + +export default onetime; diff --git a/tests/wcag-compliance/node_modules/onetime/index.js b/tests/wcag-compliance/node_modules/onetime/index.js new file mode 100644 index 0000000..eae4f33 --- /dev/null +++ b/tests/wcag-compliance/node_modules/onetime/index.js @@ -0,0 +1,41 @@ +import mimicFunction from 'mimic-fn'; + +const calledFunctions = new WeakMap(); + +const onetime = (function_, options = {}) => { + if (typeof function_ !== 'function') { + throw new TypeError('Expected a function'); + } + + let returnValue; + let callCount = 0; + const functionName = function_.displayName || function_.name || ''; + + const onetime = function (...arguments_) { + calledFunctions.set(onetime, ++callCount); + + if (callCount === 1) { + returnValue = function_.apply(this, arguments_); + function_ = null; + } else if (options.throw === true) { + throw new Error(`Function \`${functionName}\` can only be called once`); + } + + return returnValue; + }; + + mimicFunction(onetime, function_); + calledFunctions.set(onetime, callCount); + + return onetime; +}; + +onetime.callCount = function_ => { + if (!calledFunctions.has(function_)) { + throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`); + } + + return calledFunctions.get(function_); +}; + +export default onetime; diff --git a/tests/wcag-compliance/node_modules/onetime/license b/tests/wcag-compliance/node_modules/onetime/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/onetime/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/onetime/package.json b/tests/wcag-compliance/node_modules/onetime/package.json new file mode 100644 index 0000000..475a1e3 --- /dev/null +++ b/tests/wcag-compliance/node_modules/onetime/package.json @@ -0,0 +1,45 @@ +{ + "name": "onetime", + "version": "6.0.0", + "description": "Ensure a function is only called once", + "license": "MIT", + "repository": "sindresorhus/onetime", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "engines": { + "node": ">=12" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "once", + "function", + "one", + "onetime", + "func", + "fn", + "single", + "call", + "called", + "prevent" + ], + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "devDependencies": { + "ava": "^3.15.0", + "tsd": "^0.14.0", + "xo": "^0.38.2" + } +} diff --git a/tests/wcag-compliance/node_modules/onetime/readme.md b/tests/wcag-compliance/node_modules/onetime/readme.md new file mode 100644 index 0000000..e2b26fb --- /dev/null +++ b/tests/wcag-compliance/node_modules/onetime/readme.md @@ -0,0 +1,94 @@ +# onetime + +> Ensure a function is only called once + +When called multiple times it will return the return value from the first call. + +*Unlike the module [once](https://github.com/isaacs/once), this one isn't naughty and extending `Function.prototype`.* + +## Install + +``` +$ npm install onetime +``` + +## Usage + +```js +import onetime from 'onetime'; + +let index = 0; + +const foo = onetime(() => ++index); + +foo(); //=> 1 +foo(); //=> 1 +foo(); //=> 1 + +onetime.callCount(foo); //=> 3 +``` + +```js +import onetime from 'onetime'; + +const foo = onetime(() => {}, {throw: true}); + +foo(); + +foo(); +//=> Error: Function `foo` can only be called once +``` + +## API + +### onetime(fn, options?) + +Returns a function that only calls `fn` once. + +#### fn + +Type: `Function` + +Function that should only be called once. + +#### options + +Type: `object` + +##### throw + +Type: `boolean`\ +Default: `false` + +Throw an error when called more than once. + +### onetime.callCount(fn) + +Returns a number representing how many times `fn` has been called. + +Note: It throws an error if you pass in a function that is not wrapped by `onetime`. + +```js +import onetime from 'onetime'; + +const foo = onetime(() => {}); + +foo(); +foo(); +foo(); + +console.log(onetime.callCount(foo)); +//=> 3 +``` + +#### fn + +Type: `Function` + +Function to get call count from. + +## onetime for enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of onetime and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-onetime?utm_source=npm-onetime&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/tests/wcag-compliance/node_modules/path-key/index.d.ts b/tests/wcag-compliance/node_modules/path-key/index.d.ts new file mode 100644 index 0000000..7c575d1 --- /dev/null +++ b/tests/wcag-compliance/node_modules/path-key/index.d.ts @@ -0,0 +1,40 @@ +/// + +declare namespace pathKey { + interface Options { + /** + Use a custom environment variables object. Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env). + */ + readonly env?: {[key: string]: string | undefined}; + + /** + Get the PATH key for a specific platform. Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform). + */ + readonly platform?: NodeJS.Platform; + } +} + +declare const pathKey: { + /** + Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform. + + @example + ``` + import pathKey = require('path-key'); + + const key = pathKey(); + //=> 'PATH' + + const PATH = process.env[key]; + //=> '/usr/local/bin:/usr/bin:/bin' + ``` + */ + (options?: pathKey.Options): string; + + // TODO: Remove this for the next major release, refactor the whole definition to: + // declare function pathKey(options?: pathKey.Options): string; + // export = pathKey; + default: typeof pathKey; +}; + +export = pathKey; diff --git a/tests/wcag-compliance/node_modules/path-key/index.js b/tests/wcag-compliance/node_modules/path-key/index.js new file mode 100644 index 0000000..0cf6415 --- /dev/null +++ b/tests/wcag-compliance/node_modules/path-key/index.js @@ -0,0 +1,16 @@ +'use strict'; + +const pathKey = (options = {}) => { + const environment = options.env || process.env; + const platform = options.platform || process.platform; + + if (platform !== 'win32') { + return 'PATH'; + } + + return Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path'; +}; + +module.exports = pathKey; +// TODO: Remove this for the next major release +module.exports.default = pathKey; diff --git a/tests/wcag-compliance/node_modules/path-key/license b/tests/wcag-compliance/node_modules/path-key/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/tests/wcag-compliance/node_modules/path-key/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/path-key/package.json b/tests/wcag-compliance/node_modules/path-key/package.json new file mode 100644 index 0000000..c8cbd38 --- /dev/null +++ b/tests/wcag-compliance/node_modules/path-key/package.json @@ -0,0 +1,39 @@ +{ + "name": "path-key", + "version": "3.1.1", + "description": "Get the PATH environment variable key cross-platform", + "license": "MIT", + "repository": "sindresorhus/path-key", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "path", + "key", + "environment", + "env", + "variable", + "var", + "get", + "cross-platform", + "windows" + ], + "devDependencies": { + "@types/node": "^11.13.0", + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/tests/wcag-compliance/node_modules/path-key/readme.md b/tests/wcag-compliance/node_modules/path-key/readme.md new file mode 100644 index 0000000..a9052d7 --- /dev/null +++ b/tests/wcag-compliance/node_modules/path-key/readme.md @@ -0,0 +1,61 @@ +# path-key [![Build Status](https://travis-ci.org/sindresorhus/path-key.svg?branch=master)](https://travis-ci.org/sindresorhus/path-key) + +> Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform + +It's usually `PATH`, but on Windows it can be any casing like `Path`... + + +## Install + +``` +$ npm install path-key +``` + + +## Usage + +```js +const pathKey = require('path-key'); + +const key = pathKey(); +//=> 'PATH' + +const PATH = process.env[key]; +//=> '/usr/local/bin:/usr/bin:/bin' +``` + + +## API + +### pathKey(options?) + +#### options + +Type: `object` + +##### env + +Type: `object`
+Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env) + +Use a custom environment variables object. + +#### platform + +Type: `string`
+Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform) + +Get the PATH key for a specific platform. + + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/shebang-command/index.js b/tests/wcag-compliance/node_modules/shebang-command/index.js new file mode 100644 index 0000000..f35db30 --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-command/index.js @@ -0,0 +1,19 @@ +'use strict'; +const shebangRegex = require('shebang-regex'); + +module.exports = (string = '') => { + const match = string.match(shebangRegex); + + if (!match) { + return null; + } + + const [path, argument] = match[0].replace(/#! ?/, '').split(' '); + const binary = path.split('/').pop(); + + if (binary === 'env') { + return argument; + } + + return argument ? `${binary} ${argument}` : binary; +}; diff --git a/tests/wcag-compliance/node_modules/shebang-command/license b/tests/wcag-compliance/node_modules/shebang-command/license new file mode 100644 index 0000000..db6bc32 --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-command/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Kevin Mårtensson (github.com/kevva) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/shebang-command/package.json b/tests/wcag-compliance/node_modules/shebang-command/package.json new file mode 100644 index 0000000..18e3c04 --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-command/package.json @@ -0,0 +1,34 @@ +{ + "name": "shebang-command", + "version": "2.0.0", + "description": "Get the command from a shebang", + "license": "MIT", + "repository": "kevva/shebang-command", + "author": { + "name": "Kevin Mårtensson", + "email": "kevinmartensson@gmail.com", + "url": "github.com/kevva" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "cmd", + "command", + "parse", + "shebang" + ], + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "devDependencies": { + "ava": "^2.3.0", + "xo": "^0.24.0" + } +} diff --git a/tests/wcag-compliance/node_modules/shebang-command/readme.md b/tests/wcag-compliance/node_modules/shebang-command/readme.md new file mode 100644 index 0000000..84feb44 --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-command/readme.md @@ -0,0 +1,34 @@ +# shebang-command [![Build Status](https://travis-ci.org/kevva/shebang-command.svg?branch=master)](https://travis-ci.org/kevva/shebang-command) + +> Get the command from a shebang + + +## Install + +``` +$ npm install shebang-command +``` + + +## Usage + +```js +const shebangCommand = require('shebang-command'); + +shebangCommand('#!/usr/bin/env node'); +//=> 'node' + +shebangCommand('#!/bin/bash'); +//=> 'bash' +``` + + +## API + +### shebangCommand(string) + +#### string + +Type: `string` + +String containing a shebang. diff --git a/tests/wcag-compliance/node_modules/shebang-regex/index.d.ts b/tests/wcag-compliance/node_modules/shebang-regex/index.d.ts new file mode 100644 index 0000000..61d034b --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-regex/index.d.ts @@ -0,0 +1,22 @@ +/** +Regular expression for matching a [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) line. + +@example +``` +import shebangRegex = require('shebang-regex'); + +const string = '#!/usr/bin/env node\nconsole.log("unicorns");'; + +shebangRegex.test(string); +//=> true + +shebangRegex.exec(string)[0]; +//=> '#!/usr/bin/env node' + +shebangRegex.exec(string)[1]; +//=> '/usr/bin/env node' +``` +*/ +declare const shebangRegex: RegExp; + +export = shebangRegex; diff --git a/tests/wcag-compliance/node_modules/shebang-regex/index.js b/tests/wcag-compliance/node_modules/shebang-regex/index.js new file mode 100644 index 0000000..63fc4a0 --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-regex/index.js @@ -0,0 +1,2 @@ +'use strict'; +module.exports = /^#!(.*)/; diff --git a/tests/wcag-compliance/node_modules/shebang-regex/license b/tests/wcag-compliance/node_modules/shebang-regex/license new file mode 100644 index 0000000..e7af2f7 --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-regex/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/shebang-regex/package.json b/tests/wcag-compliance/node_modules/shebang-regex/package.json new file mode 100644 index 0000000..00ab30f --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-regex/package.json @@ -0,0 +1,35 @@ +{ + "name": "shebang-regex", + "version": "3.0.0", + "description": "Regular expression for matching a shebang line", + "license": "MIT", + "repository": "sindresorhus/shebang-regex", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "regex", + "regexp", + "shebang", + "match", + "test", + "line" + ], + "devDependencies": { + "ava": "^1.4.1", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/tests/wcag-compliance/node_modules/shebang-regex/readme.md b/tests/wcag-compliance/node_modules/shebang-regex/readme.md new file mode 100644 index 0000000..5ecf863 --- /dev/null +++ b/tests/wcag-compliance/node_modules/shebang-regex/readme.md @@ -0,0 +1,33 @@ +# shebang-regex [![Build Status](https://travis-ci.org/sindresorhus/shebang-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/shebang-regex) + +> Regular expression for matching a [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) line + + +## Install + +``` +$ npm install shebang-regex +``` + + +## Usage + +```js +const shebangRegex = require('shebang-regex'); + +const string = '#!/usr/bin/env node\nconsole.log("unicorns");'; + +shebangRegex.test(string); +//=> true + +shebangRegex.exec(string)[0]; +//=> '#!/usr/bin/env node' + +shebangRegex.exec(string)[1]; +//=> '/usr/bin/env node' +``` + + +## License + +MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt b/tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt new file mode 100644 index 0000000..eead04a --- /dev/null +++ b/tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) 2015, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/signal-exit/README.md b/tests/wcag-compliance/node_modules/signal-exit/README.md new file mode 100644 index 0000000..f9c7c00 --- /dev/null +++ b/tests/wcag-compliance/node_modules/signal-exit/README.md @@ -0,0 +1,39 @@ +# signal-exit + +[![Build Status](https://travis-ci.org/tapjs/signal-exit.png)](https://travis-ci.org/tapjs/signal-exit) +[![Coverage](https://coveralls.io/repos/tapjs/signal-exit/badge.svg?branch=master)](https://coveralls.io/r/tapjs/signal-exit?branch=master) +[![NPM version](https://img.shields.io/npm/v/signal-exit.svg)](https://www.npmjs.com/package/signal-exit) +[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) + +When you want to fire an event no matter how a process exits: + +* reaching the end of execution. +* explicitly having `process.exit(code)` called. +* having `process.kill(pid, sig)` called. +* receiving a fatal signal from outside the process + +Use `signal-exit`. + +```js +var onExit = require('signal-exit') + +onExit(function (code, signal) { + console.log('process exited!') +}) +``` + +## API + +`var remove = onExit(function (code, signal) {}, options)` + +The return value of the function is a function that will remove the +handler. + +Note that the function *only* fires for signals if the signal would +cause the process to exit. That is, there are no other listeners, and +it is a fatal signal. + +## Options + +* `alwaysLast`: Run this handler after any other signal or exit + handlers. This causes `process.emit` to be monkeypatched. diff --git a/tests/wcag-compliance/node_modules/signal-exit/index.js b/tests/wcag-compliance/node_modules/signal-exit/index.js new file mode 100644 index 0000000..93703f3 --- /dev/null +++ b/tests/wcag-compliance/node_modules/signal-exit/index.js @@ -0,0 +1,202 @@ +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +// grab a reference to node's real process object right away +var process = global.process + +const processOk = function (process) { + return process && + typeof process === 'object' && + typeof process.removeListener === 'function' && + typeof process.emit === 'function' && + typeof process.reallyExit === 'function' && + typeof process.listeners === 'function' && + typeof process.kill === 'function' && + typeof process.pid === 'number' && + typeof process.on === 'function' +} + +// some kind of non-node environment, just no-op +/* istanbul ignore if */ +if (!processOk(process)) { + module.exports = function () { + return function () {} + } +} else { + var assert = require('assert') + var signals = require('./signals.js') + var isWin = /^win/i.test(process.platform) + + var EE = require('events') + /* istanbul ignore if */ + if (typeof EE !== 'function') { + EE = EE.EventEmitter + } + + var emitter + if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ + } else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} + } + + // Because this emitter is a global, we have to check to see if a + // previous version of this library failed to enable infinite listeners. + // I know what you're about to say. But literally everything about + // signal-exit is a compromise with evil. Get used to it. + if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true + } + + module.exports = function (cb, opts) { + /* istanbul ignore if */ + if (!processOk(global.process)) { + return function () {} + } + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + + if (loaded === false) { + load() + } + + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' + } + + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() + } + } + emitter.on(ev, cb) + + return remove + } + + var unload = function unload () { + if (!loaded || !processOk(global.process)) { + return + } + loaded = false + + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 + } + module.exports.unload = unload + + var emit = function emit (event, code, signal) { + /* istanbul ignore if */ + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) + } + + // { : , ... } + var sigListeners = {} + signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + /* istanbul ignore if */ + if (!processOk(global.process)) { + return + } + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + if (isWin && sig === 'SIGHUP') { + // "SIGHUP" throws an `ENOSYS` error on Windows, + // so use a supported signal instead + sig = 'SIGINT' + } + /* istanbul ignore next */ + process.kill(process.pid, sig) + } + } + }) + + module.exports.signals = function () { + return signals + } + + var loaded = false + + var load = function load () { + if (loaded || !processOk(global.process)) { + return + } + loaded = true + + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 + + signals = signals.filter(function (sig) { + try { + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false + } + }) + + process.emit = processEmit + process.reallyExit = processReallyExit + } + module.exports.load = load + + var originalProcessReallyExit = process.reallyExit + var processReallyExit = function processReallyExit (code) { + /* istanbul ignore if */ + if (!processOk(global.process)) { + return + } + process.exitCode = code || /* istanbul ignore next */ 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) + } + + var originalProcessEmit = process.emit + var processEmit = function processEmit (ev, arg) { + if (ev === 'exit' && processOk(global.process)) { + /* istanbul ignore else */ + if (arg !== undefined) { + process.exitCode = arg + } + var ret = originalProcessEmit.apply(this, arguments) + /* istanbul ignore next */ + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } + } +} diff --git a/tests/wcag-compliance/node_modules/signal-exit/package.json b/tests/wcag-compliance/node_modules/signal-exit/package.json new file mode 100644 index 0000000..e1a0031 --- /dev/null +++ b/tests/wcag-compliance/node_modules/signal-exit/package.json @@ -0,0 +1,38 @@ +{ + "name": "signal-exit", + "version": "3.0.7", + "description": "when you want to fire an event no matter how a process exits.", + "main": "index.js", + "scripts": { + "test": "tap", + "snap": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags" + }, + "files": [ + "index.js", + "signals.js" + ], + "repository": { + "type": "git", + "url": "https://github.com/tapjs/signal-exit.git" + }, + "keywords": [ + "signal", + "exit" + ], + "author": "Ben Coe ", + "license": "ISC", + "bugs": { + "url": "https://github.com/tapjs/signal-exit/issues" + }, + "homepage": "https://github.com/tapjs/signal-exit", + "devDependencies": { + "chai": "^3.5.0", + "coveralls": "^3.1.1", + "nyc": "^15.1.0", + "standard-version": "^9.3.1", + "tap": "^15.1.1" + } +} diff --git a/tests/wcag-compliance/node_modules/signal-exit/signals.js b/tests/wcag-compliance/node_modules/signal-exit/signals.js new file mode 100644 index 0000000..3bd67a8 --- /dev/null +++ b/tests/wcag-compliance/node_modules/signal-exit/signals.js @@ -0,0 +1,53 @@ +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] + +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} + +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/index.js b/tests/wcag-compliance/node_modules/strip-final-newline/index.js new file mode 100644 index 0000000..034b56f --- /dev/null +++ b/tests/wcag-compliance/node_modules/strip-final-newline/index.js @@ -0,0 +1,14 @@ +export default function stripFinalNewline(input) { + const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); + const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); + + if (input[input.length - 1] === LF) { + input = input.slice(0, -1); + } + + if (input[input.length - 1] === CR) { + input = input.slice(0, -1); + } + + return input; +} diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/license b/tests/wcag-compliance/node_modules/strip-final-newline/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/tests/wcag-compliance/node_modules/strip-final-newline/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/package.json b/tests/wcag-compliance/node_modules/strip-final-newline/package.json new file mode 100644 index 0000000..cc1a014 --- /dev/null +++ b/tests/wcag-compliance/node_modules/strip-final-newline/package.json @@ -0,0 +1,43 @@ +{ + "name": "strip-final-newline", + "version": "3.0.0", + "description": "Strip the final newline character from a string/buffer", + "license": "MIT", + "repository": "sindresorhus/strip-final-newline", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "type": "module", + "exports": "./index.js", + "engines": { + "node": ">=12" + }, + "scripts": { + "test": "xo && ava" + }, + "files": [ + "index.js" + ], + "keywords": [ + "strip", + "trim", + "remove", + "delete", + "final", + "last", + "end", + "file", + "newline", + "linebreak", + "character", + "string", + "buffer" + ], + "devDependencies": { + "ava": "^3.15.0", + "xo": "^0.39.1" + } +} diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/readme.md b/tests/wcag-compliance/node_modules/strip-final-newline/readme.md new file mode 100644 index 0000000..8d9090b --- /dev/null +++ b/tests/wcag-compliance/node_modules/strip-final-newline/readme.md @@ -0,0 +1,35 @@ +# strip-final-newline + +> Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from a string/buffer + +Can be useful when parsing the output of, for example, `ChildProcess#execFile`, as [binaries usually output a newline at the end](https://stackoverflow.com/questions/729692/why-should-text-files-end-with-a-newline). Normally, you would use `stdout.trim()`, but that would also remove newlines at the start and whitespace. + +## Install + +``` +$ npm install strip-final-newline +``` + +## Usage + +```js +import stripFinalNewline from 'strip-final-newline'; + +stripFinalNewline('foo\nbar\n\n'); +//=> 'foo\nbar\n' + +stripFinalNewline(Buffer.from('foo\nbar\n\n')).toString(); +//=> 'foo\nbar\n' +``` + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/tests/wcag-compliance/node_modules/which/CHANGELOG.md b/tests/wcag-compliance/node_modules/which/CHANGELOG.md new file mode 100644 index 0000000..7fb1f20 --- /dev/null +++ b/tests/wcag-compliance/node_modules/which/CHANGELOG.md @@ -0,0 +1,166 @@ +# Changes + + +## 2.0.2 + +* Rename bin to `node-which` + +## 2.0.1 + +* generate changelog and publish on version bump +* enforce 100% test coverage +* Promise interface + +## 2.0.0 + +* Parallel tests, modern JavaScript, and drop support for node < 8 + +## 1.3.1 + +* update deps +* update travis + +## v1.3.0 + +* Add nothrow option to which.sync +* update tap + +## v1.2.14 + +* appveyor: drop node 5 and 0.x +* travis-ci: add node 6, drop 0.x + +## v1.2.13 + +* test: Pass missing option to pass on windows +* update tap +* update isexe to 2.0.0 +* neveragain.tech pledge request + +## v1.2.12 + +* Removed unused require + +## v1.2.11 + +* Prevent changelog script from being included in package + +## v1.2.10 + +* Use env.PATH only, not env.Path + +## v1.2.9 + +* fix for paths starting with ../ +* Remove unused `is-absolute` module + +## v1.2.8 + +* bullet items in changelog that contain (but don't start with) # + +## v1.2.7 + +* strip 'update changelog' changelog entries out of changelog + +## v1.2.6 + +* make the changelog bulleted + +## v1.2.5 + +* make a changelog, and keep it up to date +* don't include tests in package +* Properly handle relative-path executables +* appveyor +* Attach error code to Not Found error +* Make tests pass on Windows + +## v1.2.4 + +* Fix typo + +## v1.2.3 + +* update isexe, fix regression in pathExt handling + +## v1.2.2 + +* update deps, use isexe module, test windows + +## v1.2.1 + +* Sometimes windows PATH entries are quoted +* Fixed a bug in the check for group and user mode bits. This bug was introduced during refactoring for supporting strict mode. +* doc cli + +## v1.2.0 + +* Add support for opt.all and -as cli flags +* test the bin +* update travis +* Allow checking for multiple programs in bin/which +* tap 2 + +## v1.1.2 + +* travis +* Refactored and fixed undefined error on Windows +* Support strict mode + +## v1.1.1 + +* test +g exes against secondary groups, if available +* Use windows exe semantics on cygwin & msys +* cwd should be first in path on win32, not last +* Handle lower-case 'env.Path' on Windows +* Update docs +* use single-quotes + +## v1.1.0 + +* Add tests, depend on is-absolute + +## v1.0.9 + +* which.js: root is allowed to execute files owned by anyone + +## v1.0.8 + +* don't use graceful-fs + +## v1.0.7 + +* add license to package.json + +## v1.0.6 + +* isc license + +## 1.0.5 + +* Awful typo + +## 1.0.4 + +* Test for path absoluteness properly +* win: Allow '' as a pathext if cmd has a . in it + +## 1.0.3 + +* Remove references to execPath +* Make `which.sync()` work on Windows by honoring the PATHEXT variable. +* Make `isExe()` always return true on Windows. +* MIT + +## 1.0.2 + +* Only files can be exes + +## 1.0.1 + +* Respect the PATHEXT env for win32 support +* should 0755 the bin +* binary +* guts +* package +* 1st diff --git a/tests/wcag-compliance/node_modules/which/LICENSE b/tests/wcag-compliance/node_modules/which/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/tests/wcag-compliance/node_modules/which/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/which/README.md b/tests/wcag-compliance/node_modules/which/README.md new file mode 100644 index 0000000..cd83350 --- /dev/null +++ b/tests/wcag-compliance/node_modules/which/README.md @@ -0,0 +1,54 @@ +# which + +Like the unix `which` utility. + +Finds the first instance of a specified executable in the PATH +environment variable. Does not cache the results, so `hash -r` is not +needed when the PATH changes. + +## USAGE + +```javascript +var which = require('which') + +// async usage +which('node', function (er, resolvedPath) { + // er is returned if no "node" is found on the PATH + // if it is found, then the absolute path to the exec is returned +}) + +// or promise +which('node').then(resolvedPath => { ... }).catch(er => { ... not found ... }) + +// sync usage +// throws if not found +var resolved = which.sync('node') + +// if nothrow option is used, returns null if not found +resolved = which.sync('node', {nothrow: true}) + +// Pass options to override the PATH and PATHEXT environment vars. +which('node', { path: someOtherPath }, function (er, resolved) { + if (er) + throw er + console.log('found at %j', resolved) +}) +``` + +## CLI USAGE + +Same as the BSD `which(1)` binary. + +``` +usage: which [-as] program ... +``` + +## OPTIONS + +You may pass an options object as the second argument. + +- `path`: Use instead of the `PATH` environment variable. +- `pathExt`: Use instead of the `PATHEXT` environment variable. +- `all`: Return all matches, instead of just the first one. Note that + this means the function returns an array of strings instead of a + single string. diff --git a/tests/wcag-compliance/node_modules/which/bin/node-which b/tests/wcag-compliance/node_modules/which/bin/node-which new file mode 100755 index 0000000..7cee372 --- /dev/null +++ b/tests/wcag-compliance/node_modules/which/bin/node-which @@ -0,0 +1,52 @@ +#!/usr/bin/env node +var which = require("../") +if (process.argv.length < 3) + usage() + +function usage () { + console.error('usage: which [-as] program ...') + process.exit(1) +} + +var all = false +var silent = false +var dashdash = false +var args = process.argv.slice(2).filter(function (arg) { + if (dashdash || !/^-/.test(arg)) + return true + + if (arg === '--') { + dashdash = true + return false + } + + var flags = arg.substr(1).split('') + for (var f = 0; f < flags.length; f++) { + var flag = flags[f] + switch (flag) { + case 's': + silent = true + break + case 'a': + all = true + break + default: + console.error('which: illegal option -- ' + flag) + usage() + } + } + return false +}) + +process.exit(args.reduce(function (pv, current) { + try { + var f = which.sync(current, { all: all }) + if (all) + f = f.join('\n') + if (!silent) + console.log(f) + return pv; + } catch (e) { + return 1; + } +}, 0)) diff --git a/tests/wcag-compliance/node_modules/which/package.json b/tests/wcag-compliance/node_modules/which/package.json new file mode 100644 index 0000000..97ad7fb --- /dev/null +++ b/tests/wcag-compliance/node_modules/which/package.json @@ -0,0 +1,43 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me)", + "name": "which", + "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", + "version": "2.0.2", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-which.git" + }, + "main": "which.js", + "bin": { + "node-which": "./bin/node-which" + }, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "devDependencies": { + "mkdirp": "^0.5.0", + "rimraf": "^2.6.2", + "tap": "^14.6.9" + }, + "scripts": { + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "prepublish": "npm run changelog", + "prechangelog": "bash gen-changelog.sh", + "changelog": "git add CHANGELOG.md", + "postchangelog": "git commit -m 'update changelog - '${npm_package_version}", + "postpublish": "git push origin --follow-tags" + }, + "files": [ + "which.js", + "bin/node-which" + ], + "tap": { + "check-coverage": true + }, + "engines": { + "node": ">= 8" + } +} diff --git a/tests/wcag-compliance/node_modules/which/which.js b/tests/wcag-compliance/node_modules/which/which.js new file mode 100644 index 0000000..82afffd --- /dev/null +++ b/tests/wcag-compliance/node_modules/which/which.js @@ -0,0 +1,125 @@ +const isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys' + +const path = require('path') +const COLON = isWindows ? ';' : ':' +const isexe = require('isexe') + +const getNotFoundError = (cmd) => + Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) + +const getPathInfo = (cmd, opt) => { + const colon = opt.colon || COLON + + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] + : ( + [ + // windows always checks the cwd first + ...(isWindows ? [process.cwd()] : []), + ...(opt.path || process.env.PATH || + /* istanbul ignore next: very unusual */ '').split(colon), + ] + ) + const pathExtExe = isWindows + ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' + : '' + const pathExt = isWindows ? pathExtExe.split(colon) : [''] + + if (isWindows) { + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift('') + } + + return { + pathEnv, + pathExt, + pathExtExe, + } +} + +const which = (cmd, opt, cb) => { + if (typeof opt === 'function') { + cb = opt + opt = {} + } + if (!opt) + opt = {} + + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] + + const step = i => new Promise((resolve, reject) => { + if (i === pathEnv.length) + return opt.all && found.length ? resolve(found) + : reject(getNotFoundError(cmd)) + + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw + + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd + + resolve(subStep(p, i, 0)) + }) + + const subStep = (p, i, ii) => new Promise((resolve, reject) => { + if (ii === pathExt.length) + return resolve(step(i + 1)) + const ext = pathExt[ii] + isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { + if (!er && is) { + if (opt.all) + found.push(p + ext) + else + return resolve(p + ext) + } + return resolve(subStep(p, i, ii + 1)) + }) + }) + + return cb ? step(0).then(res => cb(null, res), cb) : step(0) +} + +const whichSync = (cmd, opt) => { + opt = opt || {} + + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] + + for (let i = 0; i < pathEnv.length; i ++) { + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw + + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd + + for (let j = 0; j < pathExt.length; j ++) { + const cur = p + pathExt[j] + try { + const is = isexe.sync(cur, { pathExt: pathExtExe }) + if (is) { + if (opt.all) + found.push(cur) + else + return cur + } + } catch (ex) {} + } + } + + if (opt.all && found.length) + return found + + if (opt.nothrow) + return null + + throw getNotFoundError(cmd) +} + +module.exports = which +which.sync = whichSync From 86248b77f11b9e16f69d85ea2c4eefbdfc559c1b Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 23 Mar 2022 20:28:15 -0500 Subject: [PATCH 04/43] updated samples --- samples/coffee/0.coffee | 71 ++++++++++++++++++++++ samples/css/0.css | 32 ++++++++++ samples/javascript/0.js | 28 +++++++++ samples/{javascript.js => javascript/1.js} | 0 samples/json.json | 24 ++++++++ samples/rust.rs | 10 +++ 6 files changed, 165 insertions(+) create mode 100644 samples/coffee/0.coffee create mode 100644 samples/css/0.css create mode 100644 samples/javascript/0.js rename samples/{javascript.js => javascript/1.js} (100%) create mode 100644 samples/json.json diff --git a/samples/coffee/0.coffee b/samples/coffee/0.coffee new file mode 100644 index 0000000..ff3fb9c --- /dev/null +++ b/samples/coffee/0.coffee @@ -0,0 +1,71 @@ +document.addEventListener("DOMContentLoaded", () => + document.querySelectorAll("pre.msh .js-copy").forEach((copy) => + copy.addEventListener("click", (e) => + e.preventDefault() + + content = copy.nextElementSibling + range = document.createRange() + range.selectNode(content) + + window.getSelection().addRange(range) + + try + successful = document.execCommand("copy") + copy.innerHTML = "Copied!" + + setTimeout => + copy.innerHTML = "Copy" + , 1500 + + msg = successful ? "successful" : "unsuccessful" + console.log({ msg }) + + catch error + console.log("Oops, unable to copy...") + + window.getSelection().removeAllRanges() + ) + ) + + document.querySelectorAll("pre.msh code[data-language='html'] span.line").forEach((line) => + content = line.innerHTML + content = content.replaceAll(/(<(\/?))(.+?(?=>))(>)/g, "$1$3$4") + + line.innerHTML = content + pink = line.querySelector(".c2") + + if pink != null + content = pink.innerHTML.split(" ") + content = content.map((part, index) => + if index > 0 + if part.includes("=") + part = part.replaceAll(/(.+?)(".*)/g, "$1$2") + else + part = part.replaceAll(/(.*\S)/g, "$1") + part + ).join(" ") + pink.innerHTML = content + return + ) + + document.querySelectorAll("pre.msh code[data-language='css'] span.line").forEach((line) => + content = line.innerHTML + + if line.dataset.indent + content = content.split(/:/g).map((part, index) => + if index == 0 + part.replace(/(.*)/g, "$1") + else + part = part.replaceAll(/(\S.+?(?=\s|;))/g, "$1") + part = part.replaceAll(/(".+?(?=,|\s|;))/g, "$1") + part = part.replaceAll(/(url\(.+?(?=\s|;))/g, "$1") + part.replaceAll(/\((.+?(?=\)))/g, "($1") + ).join(":") + else + content = content.replaceAll(/(.+?(?=,|\s|{}))/g, "$1") + content = content.replaceAll(/((\.|:).+?(?=\s))/g, "$1") + + line.innerHTML = content + return + ) +) diff --git a/samples/css/0.css b/samples/css/0.css new file mode 100644 index 0000000..a12e179 --- /dev/null +++ b/samples/css/0.css @@ -0,0 +1,32 @@ +@import url(https://fonts.googleapis.com/css?family=Roboto:400); +@import url("chrome://communicator/skin/"); +@import 'custom.css' screen and (max-width: 768px); + +@font-face { + font-family: 'Galada-Regular'; + src: url('Galada-Regular.ttf'); + font-style: normal; + font-weight: 400; +} + +/* Applies to the entire body of the HTML document (except where overridden by more specific +selectors). */ +body { + margin: 25px; + background-color: rgb(240,240,240); + font-family: arial, sans-serif; + font-size: 14px; +} + +/* Applies to all

...

elements. */ +h1 { + font-size: 35px; + font-weight: normal; + margin-top: 5px; +} + +/* Applies to all elements with <... class="someclass"> specified. */ +.someclass { color: red; } + +/* Applies to the element with <... id="someid"> specified. */ +#someid { color: green; } diff --git a/samples/javascript/0.js b/samples/javascript/0.js new file mode 100644 index 0000000..6c89381 --- /dev/null +++ b/samples/javascript/0.js @@ -0,0 +1,28 @@ +const Generator = require("yeoman-generator") +const chalk = require('chalk') +const yosay = require("yosay") + +module.exports = class extends Generator { + prompting() { + // have yeoman greet the user + this.log(chalk.red("Let\'s do this")) + + const prompts = [{ + message: 'Enter the excercise title', + worker: true, + action: null, + age: 123 + }]; + + return this.prompt(prompts).then(props => { + // you can access them later + this.props = props + }) + } +} + +function exclamate(message) { + return message + "!" +} + +console.log(exclamate("lol")) diff --git a/samples/javascript.js b/samples/javascript/1.js similarity index 100% rename from samples/javascript.js rename to samples/javascript/1.js diff --git a/samples/json.json b/samples/json.json new file mode 100644 index 0000000..a396764 --- /dev/null +++ b/samples/json.json @@ -0,0 +1,24 @@ +{ + "name": "Catppuccin", + "version": "1.0.0", + "description": "JSON sample", + "main": "readme.md", + "scripts": { + "gulp": "gulp" + }, + "devDependencies": { + "gulp": "^4.0.2", + "browser-sync": "^2.27.5", + "gulp-sass": "^5.0.0", + "gulp-uglify-es": "^2.0.0", + "sass": "^1.35.1" + }, + "repository": { + "type": "git", + "url": "https://github.com/catppuccin/catppuccin" + }, + "keywords": ["gulp", "pugjs", "sass", "coffeescript", "template"], + "author": "John Doe", + "license": "MIT", + "homepage": "https://github.com/catppuccin" +} diff --git a/samples/rust.rs b/samples/rust.rs index c8349fa..531316e 100644 --- a/samples/rust.rs +++ b/samples/rust.rs @@ -35,3 +35,13 @@ pub fn every_nth(str: &gsf, n: usize) -> String { } return parsed_str; } + +fn main(){ + let arr:[i32;4] = [10,20,30,40]; + println!("array is {:?}",arr); + println!("array size is :{}",arr.len()); + + for index in 0..4 { + println!("index is: {} & value is : {}",index,arr[index]); + } +} From 4285b456a5aff24db8d095e5030b71538c02ab19 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 13 Apr 2022 12:20:03 -0500 Subject: [PATCH 05/43] feat: added palettes generator script, some rust samples and wcag-compliace tests --- .gitignore | 1 + resources/palettes_gen.sh | 263 +++++++ samples/header.h | 131 ++++ samples/{rust.rs => rust/0.rs} | 2 - samples/rust/1.rs | 961 ++++++++++++++++++++++++ tests/wcag-compliance/package-lock.json | 326 ++++++++ tests/wcag-compliance/package.json | 32 + tests/wcag-compliance/src/index.js | 110 +++ tests/wcag-compliance/test.json | 3 + 9 files changed, 1827 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100755 resources/palettes_gen.sh create mode 100644 samples/header.h rename samples/{rust.rs => rust/0.rs} (95%) create mode 100644 samples/rust/1.rs create mode 100644 tests/wcag-compliance/package-lock.json create mode 100644 tests/wcag-compliance/package.json create mode 100644 tests/wcag-compliance/src/index.js create mode 100644 tests/wcag-compliance/test.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/resources/palettes_gen.sh b/resources/palettes_gen.sh new file mode 100755 index 0000000..0b0f6cb --- /dev/null +++ b/resources/palettes_gen.sh @@ -0,0 +1,263 @@ +#!/bin/bash + +# ---- sys +NC=" \033[0m" +coerce=false +lowercase=false +file="" +prefix="" +original_palette="storm" +verbosity=0 + +script_help=$( + cat < [arg] + +Flags: + -f, --file specify file (mandatory) + -v, --verbose increase verbosity by 1 + -o, --original-palette the palette used in the based file (given by --file) + -l, --lowercase replaces with lowercased hex codes + -c, --coerce force the creation of new palette files (useful when those files already exist) + -p, --prefix specify which prefix to use for the hex codes. Surround it with double quotes if needed. + -h, --help see this message +EOF +) + +palette_names=( + storm + dusk + dawn +) + +declare -A dusk=( + [white]='C6D0F5' + [peach]='FAB387' + [gray2]='ADB5D8' + [black0]='101019' + [black1]='181825' + [gray1]='959BBA' + [blue]='90C1FB' + [green]='A6E3A1' + [sapphire]='74C7EC' + [black3]='323044' + [black4]='4B4B62' + [black5]='63657F' + [teal]='94E2D5' + [gray0]='7C809D' + [rosewater]='F5E0DC' + [maroon]='EBA0AC' + [lavender]='C9CBFF' + [yellow]='F9E2AF' + [flamingo]='F2CDCD' + [sky]='89DCEB' + [mauve]='CBA6F7' + [black2]='1E1E2E' + [pink]='F5C2E7' + [red]='F38BA8' +) + +declare -A storm=( + [white]='C5CFF5' + [sapphire]='34C3DC' + [pink]='F5BFE7' + [rosewater]='F5DFDA' + [black2]='24273A' + [flamingo]='F2CBCB' + [red]='F67E98' + [maroon]='F1949B' + [peach]='FEA571' + [black1]='1F2233' + [sky]='89DCFD' + [gray1]='8289AA' + [lavender]='C2CBFE' + [black3]='2B3045' + [green]='A1DF8E' + [black4]='3E435E' + [yellow]='F1D8A4' + [gray2]='A6AFD2' + [blue]='83ABF9' + [black0]='1A1B26' + [gray0]='5F6587' + [teal]='85E0D1' + [black5]='4F5473' + [mauve]='C59FF6' +) + +declare -A dawn=( + [black4]='CCC9D1' + [peach]='FE6811' + [black3]='E6E3E5' + [pink]='EC83D0' + [black0]='D3D0D2' + [black1]='EDEDED' + [blue]='1D65F5' + [lavender]='7287FD' + [mauve]='8F46EF' + [black5]='B5B1BF' + [maroon]='E63B4A' + [rosewater]='E5AC9F' + [green]='509E31' + [gray1]='86819C' + [black2]='FBF8F4' + [white]='575279' + [gray2]='6E6A8B' + [sky]='04A5E5' + [sapphire]='209FB5' + [red]='D20F39' + [teal]='289886' + [gray0]='9D99AE' + [flamingo]='DF7F7F' + [yellow]='E49320' +) + +function prompt() { + local type=${1} # error, success, warning, info + local message=${2} + local modifiers=${3} + + if [[ $1 == "-i" || $1 == "--info" ]]; then + type="" + fi + + case ${type} in + "-e" | "--error") + printf "\033[0;31m${modifiers}ERROR: %s${NC}\n" "${message}" + ;; + "-s" | "--success") + printf "\033[0;32m${modifiers}SUCCESS: %s${NC}\n" "${message}" + ;; + "-w" | "--warning") + printf "\033[0;33m${modifiers}WARNING: %s${NC}\n" "${message}" + ;; + *) + printf "\033[0;34m${modifiers}INFO: %s${NC}\n" "${message}" + ;; + esac +} + +function verbose_print() { + # $1 = message + # $2 = modifiers + if [[ $verbosity -gt 0 ]]; then + printf "\033[3;29m${2}%s${NC}\n" "${1}" + fi +} + +function generate_palettes() { + capitalization_char='\U' # uppercase + [[ $lowercase == true ]] && { + capitalization_char='\L' # lowercase + } + + new_array=() + for val in "${palette_names[@]}"; do + [[ "$val" != "$original_palette" ]] && new_array+=("$val") + done + palette_names=("${new_array[@]}") + unset new_array + + for palette in "${palette_names[@]}"; do + printf " GENERATING: \033[3;32m%s${NC}\n" "$palette" + + local dest_file="${palette}.${file##*.}" + prompt -w "creating $dest_file..." "\t• " + + if [[ -f $dest_file ]]; then + if [[ ! $coerce == true ]]; then + prompt -e "file '$dest_file' already exists. Use --coerce to force it's replacement" "\t• " + exit 1 + fi + fi + + cp "$file" "$dest_file" + prompt -i "replacing colors..." "\t• " + + for clr in "${!storm[@]}"; do + local curr_color=$(eval "echo \${${original_palette}[$clr]}") + local dest_color=$(eval "echo \${${palette}[${clr}]}") + verbose_print "modifying ${clr}" "\t + " + sed -i "s/${curr_color}/${prefix}${capitalization_char}${dest_color}/gI" "$dest_file" + done + done +} + +function detect_original_palette() { + prompt -w "detecting palette..." + original_palette="" + for palette in "${palette_names[@]}"; do + for clr in "${!storm[@]}"; do + if grep -q $(eval "echo \${${palette}[${clr}]}") "$file"; then + original_palette=$palette + break 2 + fi + done + done + + if [[ $original_palette == "" ]]; then + prompt -e "couldn't detect the original palette" + exit 1 + else + prompt -s "detected '$original_palette'" + fi +} + +main() { + if [[ ! "$#" -gt 0 ]]; then + prompt -e "you must provide at least the file you want to generate the missing palettes from" + else + local help_used=false + while [ "$1" != "" ]; do + case $1 in + -v | --verbose) + verbosity=$((verbosity + 1)) + ;; + -f | --file) + file=$2 + shift + ;; + -o | --original-palette) + origianl_palette=$2 + shift + ;; + -l | --lowercase) + lowercase=true + ;; + -c | --coerce) + coerce=true + ;; + -p | --prefix) + prefix=$2 + shift + ;; + -h | --help) + help_used=true + echo "$script_help" + ;; + *) + echo "ERROR: command ($1) not recognized" + ;; + esac + shift + done + + if [[ $help_used != "true" ]]; then + if [[ $file != "" ]]; then + [[ -f $file ]] && { + prompt "updating colors..." + if [[ original_palette != "storm" || original_palette != "dusk" || original_palette != "dawn" ]]; then + detect_original_palette + fi + generate_palettes + } || prompt -e "file ${1} does not exist" + else + prompt -e "please profive a file to use a base using the --file flag" + fi + fi + fi +} + +main "$@" diff --git a/samples/header.h b/samples/header.h new file mode 100644 index 0000000..43777dd --- /dev/null +++ b/samples/header.h @@ -0,0 +1,131 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int snap = 32; /* snap pixel */ +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 1; /* 0 means bottom bar */ +static const char *fonts[] = { "monospace:size=10" }; +static const char dmenufont[] = "monospace:size=10"; +static const char col_gray1[] = "#5F6587"; +static const char col_gray2[] = "#8289AA"; +static const char col_gray3[] = "#A6AFD2"; +static const char col_gray4[] = "#C5CFF5"; +static const char col_teal[] = "#78DCCC"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_teal, col_teal }, +}; + +/* tagging */ +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, +}; +static const int ruleperiod = 5; /* number of seconds before rules are ignored */ + +/* layout(s) */ +static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const int nmaster = 1; /* number of clients in master area */ +static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + +static const LayoutMonitorRule lm_rules[] = { + /* >=w, >=h, req'd layout, new nmaster, new mfact */ + { 3000, 0, 0, 2, 0.66 }, +}; + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, + { "TTT", bstack }, + { "===", bstackhoriz }, +}; + +/* key definitions */ +#define MODKEY Mod1Mask +#define TAGKEYS(KEY,TAG) \ + { KeyPress, MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { KeyPress, MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { KeyPress, MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { KeyPress, MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_teal, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; + +#include "movestack.c" +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY|ShiftMask, XK_j, movestack, {.i = +1 } }, + { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY|ShiftMask, XK_x, killunsel, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_u, setlayout, {.v = &layouts[3]} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[4]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY|ControlMask, XK_comma, tagallmon, {.i = -1 } }, + { MODKEY|ControlMask, XK_period, tagallmon, {.i = +1 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { KeyPress, MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; diff --git a/samples/rust.rs b/samples/rust/0.rs similarity index 95% rename from samples/rust.rs rename to samples/rust/0.rs index 531316e..1bd9226 100644 --- a/samples/rust.rs +++ b/samples/rust/0.rs @@ -1,5 +1,3 @@ -// Simple program made by a simple programmer - #![warn(rust_2018_idioms)] #![allow(elided_lifetimes_in_paths)] diff --git a/samples/rust/1.rs b/samples/rust/1.rs new file mode 100644 index 0000000..ff4fa8c --- /dev/null +++ b/samples/rust/1.rs @@ -0,0 +1,961 @@ +use crate::context::DrawContext; +use crate::controller::Controller; +use crate::font::FontCache; +use crate::scene::*; +use crate::wayland::*; +use crate::*; +use smithay_client_toolkit::reexports::calloop::{EventLoop, LoopHandle, RegistrationToken}; +use smithay_client_toolkit::seat::keyboard::ModifiersState; +use smithay_client_toolkit::shm::AutoMemPool; +use smithay_client_toolkit::WaylandSource; + +use std::cell::RefCell; +use std::ops::{Deref, DerefMut}; +use std::rc::Rc; + +use smithay_client_toolkit::reexports::client::{ + global_filter, + protocol::wl_buffer::WlBuffer, + protocol::wl_callback, + protocol::wl_compositor::WlCompositor, + protocol::wl_output::{self, WlOutput}, + protocol::wl_pointer::{self, WlPointer}, + protocol::wl_region::WlRegion, + protocol::wl_seat::{self, Capability, WlSeat}, + protocol::wl_shm::WlShm, + protocol::wl_surface::WlSurface, + Attached, Display, GlobalError, GlobalManager, Interface, Main, Proxy, +}; +use smithay_client_toolkit::reexports::protocols::wlr::unstable::layer_shell::v1::client::{ + zwlr_layer_shell_v1::ZwlrLayerShellV1, zwlr_layer_surface_v1, + zwlr_layer_surface_v1::ZwlrLayerSurfaceV1, +}; + +pub struct Application +where + C: Controller + Clone + 'static, +{ + display: Display, + globals: Rc>, + global_manager: GlobalManager, + pub inner: Vec>, + token: RegistrationToken, +} + +struct Context { + pending_cb: bool, + time: Option, + render_node: Option, + font_cache: FontCache, +} + +pub struct CoreApplication +where + C: Controller + Clone, +{ + pub controller: C, + ctx: Context, + globals: Rc>, + mempool: AutoMemPool, + widget: Box>, + surface: Option, +} + +pub struct InnerApplication +where + C: Controller + Clone, +{ + core: CoreApplication, + cb: Box, Event)>, +} + +impl Surface { + fn new( + surface: Main, + shell: Shell, + region: Main, + previous: Option, + ) -> Self { + Surface { + alive: true, + surface, + shell, + region, + previous: if let Some(surface) = previous { + Some(Box::new(surface)) + } else { + None + }, + buffer: None, + } + } + fn commit(&mut self) { + self.surface.commit(); + std::mem::drop(&mut self.previous); + self.previous = None; + } + fn destroy(&mut self) { + self.alive = false; + self.surface.destroy(); + self.region.destroy(); + self.shell.destroy(); + if let Some(buffer) = self.buffer.as_ref() { + buffer.destroy(); + } + self.buffer = None; + } + fn destroy_previous(&mut self) { + if let Some(surface) = self.previous.as_mut() { + surface.destroy(); + } + self.previous = None; + } + fn set_size(&self, width: u32, height: u32) { + self.shell.set_size(width, height); + } + fn damage(&self, report: &[Region]) { + self.surface.attach(self.buffer.as_ref(), 0, 0); + for d in report { + self.surface + .damage(d.x as i32, d.y as i32, d.width as i32, d.height as i32); + } + } + fn attach_buffer(&mut self, buffer: WlBuffer) { + self.buffer = Some(buffer); + } +} + +impl Globals { + fn new() -> Self { + Self { + outputs: Vec::new(), + seats: Vec::new(), + shm: None, + compositor: None, + shell: None, + } + } + pub fn create_shell_surface_from( + &self, + geometry: &dyn Widget, + config: ShellConfig, + previous: Option, + ) -> Option + where + M: 'static, + C: Controller + Clone + 'static, + { + if self.compositor.is_some() { + match config { + ShellConfig::LayerShell(config) => { + if let Some(layer_shell) = self.shell.as_ref() { + let region = self.compositor.as_ref().unwrap().create_region(); + let wl_surface = self.compositor.as_ref().unwrap().create_surface(); + let layer_surface = layer_shell.get_layer_surface( + &wl_surface, + config.output.as_ref(), + config.layer, + config.namespace.clone(), + ); + if let Some(anchor) = &config.anchor { + layer_surface.set_anchor(*anchor); + } + wl_surface.quick_assign(|_, _, _| {}); + layer_surface.set_exclusive_zone(config.exclusive); + layer_surface.set_keyboard_interactivity(config.interactivity); + layer_surface.set_size(geometry.width() as u32, geometry.height() as u32); + layer_surface.set_margin( + config.margin[0], + config.margin[1], + config.margin[2], + config.margin[3], + ); + wl_surface.commit(); + assign_surface::(&layer_surface); + return Some(Surface::new( + wl_surface, + Shell::LayerShell { + surface: layer_surface, + config, + }, + region, + previous, + )); + } + } + } + } + None + } + pub fn create_mempool(&self) -> AutoMemPool { + let attached = Attached::from(self.shm.clone().unwrap()); + AutoMemPool::new(attached).unwrap() + } + pub fn get_outputs(&self) -> Vec { + self.outputs.clone() + } + pub fn get_seats(&self) -> &[Seat] { + &self.seats + } +} + +impl Output { + fn new(output: Main) -> Self { + Output { + width: 0, + height: 0, + scale: 1, + name: String::new(), + output, + } + } +} + +impl Application +where + M: 'static, + C: Controller + Clone + 'static, +{ + pub fn new(pointer: bool) -> (Self, EventLoop<'static, Self>) { + let display = Display::connect_to_env().unwrap(); + let event_queue = display.create_event_queue(); + let attached_display = (*display).clone().attach(event_queue.token()); + + let display_handle = display.clone(); + + let globals = Globals::new(); + + let global_manager = GlobalManager::new_with_cb( + &attached_display, + global_filter!( + [ + ZwlrLayerShellV1, + 1, + |layer_shell: Main, mut application: DispatchData| { + if let Some(application) = application.get::>() { + if let Ok(mut globals) = application.globals.try_borrow_mut() { + globals.shell = Some(layer_shell); + } + } + } + ], + [ + WlShm, + 1, + |shm: Main, mut application: DispatchData| { + shm.quick_assign(|_, _, _| {}); + if let Some(application) = application.get::>() { + if let Ok(mut globals) = application.globals.try_borrow_mut() { + globals.shm = Some(shm); + } + } + } + ], + [ + WlCompositor, + 4, + |compositor: Main, mut application: DispatchData| { + if let Some(application) = application.get::>() { + if let Ok(mut globals) = application.globals.try_borrow_mut() { + globals.compositor = Some(compositor); + } + } + } + ], + [WlSeat, 7, move |seat: Main, _: DispatchData| { + seat.quick_assign(move |wl_seat, event, mut application| match event { + wl_seat::Event::Capabilities { capabilities } => { + if let Some(application) = application.get::>() { + if pointer + && capabilities & Capability::Pointer == Capability::Pointer + { + let pointer = wl_seat.get_pointer(); + assign_pointer::(&pointer); + } + if let Ok(mut globals) = application.globals.try_borrow_mut() { + let mut found = None; + for seat in &mut globals.seats { + if wl_seat.eq(&seat.seat) { + found = Some(()); + seat.capabilities = capabilities; + } + } + if found.is_none() { + globals.seats.push(Seat { + capabilities, + seat: wl_seat, + }); + } + } + } + } + _ => {} + }); + }], + [ + WlOutput, + 3, + |output: Main, _application: DispatchData| { + output.quick_assign(move |wl_output, event, mut application| match event { + wl_output::Event::Geometry { + x: _, + y: _, + physical_width: _, + physical_height: _, + subpixel: _, + make, + model: _, + transform: _, + } => { + if let Some(application) = application.get::>() { + if let Ok(mut globals) = application.globals.try_borrow_mut() { + let mut found = None; + for output in &mut globals.outputs { + if wl_output.eq(&output.output) { + found = Some(()); + output.name = make.clone(); + } + } + if found.is_none() { + let mut output = Output::new(wl_output); + output.name = make; + globals.outputs.push(output); + } + } + } + } + wl_output::Event::Mode { + flags: _, + width, + height, + refresh: _, + } => { + if let Some(application) = application.get::>() { + if let Ok(mut globals) = application.globals.try_borrow_mut() { + let mut found = None; + for output in &mut globals.outputs { + if wl_output.eq(&output.output) { + found = Some(()); + output.width = width; + output.height = height; + } + } + if found.is_none() { + let mut output = Output::new(wl_output); + output.width = width; + output.height = height; + globals.outputs.push(output); + } + } + } + } + wl_output::Event::Scale { factor } => { + if let Some(application) = application.get::>() { + if let Ok(mut globals) = application.globals.try_borrow_mut() { + let mut found = None; + for output in &mut globals.outputs { + if wl_output.eq(&output.output) { + found = Some(()); + output.scale = factor; + } + } + if found.is_none() { + let mut output = Output::new(wl_output); + output.scale = factor; + globals.outputs.push(output); + } + } + } + } + wl_output::Event::Done => {} + _ => {} + }); + } + ] + ), + ); + + let event_loop = EventLoop::try_new().expect("Failed to initialize the event loop!"); + let token = WaylandSource::new(event_queue) + .quick_insert(event_loop.handle()) + .unwrap(); + + let (mut application, mut event_loop) = ( + Application { + display, + globals: Rc::new(RefCell::new(globals)), + global_manager, + inner: Vec::new(), + token, + }, + event_loop, + ); + + for _ in 0..2 { + display_handle.flush().unwrap(); + event_loop.dispatch(None, &mut application).unwrap(); + } + + (application, event_loop) + } + fn get_index(&self, surface: &WlSurface) -> usize { + for i in 0..self.inner.len() { + if self.inner[i].eq(surface) { + return i; + } + } + 0 + } + fn get_application(&mut self, surface: &WlSurface) -> Option<&mut InnerApplication> { + for inner in &mut self.inner { + if inner.eq(surface) { + return Some(inner); + } + } + None + } + pub fn get_global(&self) -> Result, GlobalError> + where + I: Interface + AsRef> + From>, + { + self.global_manager.instantiate_range::(0, 1 << 8) + } + pub fn create_empty_inner_application( + &mut self, + controller: C, + widget: impl Widget + 'static, + handle: LoopHandle<'_, Data>, + cb: impl FnMut(&mut CoreApplication, Event) + 'static, + ) { + let inner_application = + InnerApplication::empty(controller, widget, self.globals.clone(), cb); + self.inner.push(inner_application); + handle.update(&self.token).unwrap(); + } + pub fn create_inner_application_from( + &mut self, + controller: C, + config: ShellConfig, + widget: impl Widget + 'static, + handle: LoopHandle<'_, Data>, + cb: impl FnMut(&mut CoreApplication, Event) + 'static, + ) { + let inner_application = + InnerApplication::new(controller, widget, config, self.globals.clone(), cb); + self.inner.push(inner_application); + handle.update(&self.token).unwrap(); + } + pub fn create_inner_application( + &mut self, + controller: C, + widget: impl Widget + 'static, + handle: LoopHandle<'_, Data>, + cb: impl FnMut(&mut CoreApplication, Event) + 'static, + ) { + let inner_application = + InnerApplication::normal(controller, widget, self.globals.clone(), cb); + self.inner.push(inner_application); + handle.update(&self.token).unwrap(); + } + pub fn run(mut self, event_loop: &mut EventLoop<'static, Self>) { + loop { + self.display.flush().unwrap(); + event_loop.dispatch(None, &mut self).unwrap(); + } + } +} + +impl Deref for InnerApplication +where + C: Controller + Clone + 'static, +{ + type Target = CoreApplication; + fn deref(&self) -> &Self::Target { + &self.core + } +} + +impl DerefMut for InnerApplication +where + C: Controller + Clone + 'static, +{ + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.core + } +} + +impl CoreApplication +where + M: 'static, + C: Controller + Clone + 'static, +{ + pub fn poll(&mut self, ev: Event) -> C { + let mut ctl = self.controller.clone(); + let mut sync_ctx = SyncContext::new(&mut ctl, &mut self.ctx.font_cache); + self.widget.sync(&mut sync_ctx, ev); + ctl + } + pub fn sync(&mut self, ev: Event) -> bool { + let mut sync_ctx = SyncContext::new(&mut self.controller, &mut self.ctx.font_cache); + let mut damage = self.widget.sync(&mut sync_ctx, ev); + while let Ok(msg) = sync_ctx.sync() { + damage = damage.max(self.widget.sync(&mut sync_ctx, Event::Message(&msg))); + } + if damage == Damage::Frame { + if self.ctx.time.is_none() { + self.ctx.time = Some(0); + } + } + damage.is_some() && !self.ctx.pending_cb + } + pub fn destroy(&mut self) { + if let Some(surface) = self.surface.as_mut() { + surface.destroy(); + } + } + pub fn get_layer_surface(&self) -> ZwlrLayerSurfaceV1 { + match &self.surface.as_ref().unwrap().shell { + Shell::LayerShell { config: _, surface } => surface.detach(), + } + } + pub fn is_hidden(&self) -> bool { + if let Some(surface) = self.surface.as_ref() { + return !surface.alive; + } else { + true + } + } + pub fn replace_surface(&mut self) { + if let Some(surface) = self.surface.as_mut() { + surface.destroy(); + surface.alive = true; + match &surface.shell { + Shell::LayerShell { config, surface: _ } => { + self.surface = self.globals.borrow().create_shell_surface_from::( + self.widget.deref(), + ShellConfig::LayerShell(config.clone()), + Some(surface.clone()), + ); + } + } + } else { + self.surface = self.globals.borrow().create_shell_surface_from::( + self.widget.deref(), + ShellConfig::LayerShell(LayerShellConfig::default()), + None, + ); + } + } + pub fn replace_surface_by(&mut self, config: ShellConfig) { + if let Some(surface) = self.surface.as_mut() { + surface.destroy(); + surface.alive = true; + self.surface = self.globals.borrow().create_shell_surface_from::( + self.widget.deref(), + config, + Some(surface.clone()), + ); + } else { + self.surface = self.globals.borrow().create_shell_surface_from::( + self.widget.deref(), + config, + None, + ); + } + } +} + +impl Geometry for InnerApplication +where + C: Controller + Clone + 'static, +{ + fn width(&self) -> f32 { + self.widget.width() + } + fn height(&self) -> f32 { + self.widget.height() + } + fn set_size(&mut self, width: f32, height: f32) -> Result<(), (f32, f32)> { + if let Some(surface) = self.surface.as_ref() { + surface.set_size(width as u32, height as u32); + surface.surface.commit(); + } + Ok(()) + } +} + +impl InnerApplication +where + M: 'static, + C: Controller + Clone + 'static, +{ + pub fn empty( + controller: C, + widget: impl Widget + 'static, + globals: Rc>, + cb: impl FnMut(&mut CoreApplication, Event) + 'static, + ) -> Self { + let mempool = globals.borrow().create_mempool(); + let mut default = InnerApplication { + core: CoreApplication { + controller, + ctx: Context { + pending_cb: false, + time: None, + font_cache: FontCache::new(), + render_node: None, + }, + surface: None, + widget: Box::new(widget), + mempool, + globals, + }, + cb: Box::new(cb), + }; + default.sync(Event::Prepare); + default + } + pub fn normal( + controller: C, + widget: impl Widget + 'static, + globals: Rc>, + cb: impl FnMut(&mut CoreApplication, Event) + 'static, + ) -> Self { + let mempool = globals.borrow().create_mempool(); + let mut default = InnerApplication { + core: CoreApplication { + controller, + ctx: Context { + pending_cb: false, + time: None, + font_cache: FontCache::new(), + render_node: None, + }, + surface: None, + widget: Box::new(widget), + mempool, + globals, + }, + cb: Box::new(cb), + }; + default.sync(Event::Prepare); + default.replace_surface(); + default + } + pub fn new( + controller: C, + widget: impl Widget + 'static, + config: ShellConfig, + globals: Rc>, + cb: impl FnMut(&mut CoreApplication, Event) + 'static, + ) -> Self { + let mempool = globals.borrow().create_mempool(); + let mut new = InnerApplication { + core: CoreApplication { + controller, + ctx: Context { + pending_cb: false, + time: None, + font_cache: FontCache::new(), + render_node: None, + }, + surface: None, + widget: Box::new(widget), + mempool, + globals, + }, + cb: Box::new(cb), + }; + new.sync(Event::Prepare); + new.replace_surface_by(config); + new + } + fn eq(&self, wl_surface: &WlSurface) -> bool { + if let Some(surface) = &self.surface { + return surface.surface.detach().eq(wl_surface); + } + false + } + pub fn roundtrip(&mut self, ev: Event) -> Result { + let width = self.width(); + let height = self.height(); + + // Sending the event to the widget tree + if self.sync(ev) || ev.is_frame() { + // Calling the application´s closure + (self.cb)(&mut self.core, ev); + + if !self.is_hidden() { + let current_width = self.width(); + let current_height = self.height(); + + // Resizing the surface in case the widget changed size + if ev.is_frame() { + self.ctx.render_node = None; + } else if width != current_width || height != current_height { + let _ = self.set_size(current_width, current_height); + return Err(()); + } + + // Creating the render node + let render_node = self.core.widget.create_node(0., 0.); + + self.ctx.pending_cb = true; + + return Ok(render_node); + } + } else { + // Calling the application´s closure + (self.cb)(&mut self.core, ev); + } + + Err(()) + } + fn render(&mut self, time: u32, recent_node: RenderNode) { + let width = recent_node.width(); + let height = recent_node.height(); + if Some(time).ne(&self.core.ctx.time) || time == 0 { + if let Ok((buffer, wl_buffer)) = + Buffer::new(&mut self.core.mempool, width as i32, height as i32) + { + let mut v = Vec::new(); + let mut ctx = + DrawContext::new(buffer.backend, &mut self.core.ctx.font_cache, &mut v); + if let Some(render_node) = self.core.ctx.render_node.as_mut() { + if let Err(region) = render_node.draw_merge( + recent_node, + &mut ctx, + &Instruction::empty(0., 0., width, height), + None, + ) { + ctx.damage_region(&Background::Transparent, region, false); + } + } else { + ctx.damage_region( + &Background::Transparent, + Region::new(0., 0., width, height), + false, + ); + recent_node.render(&mut ctx, None); + self.core.ctx.render_node = Some(recent_node); + } + self.core.ctx.pending_cb = false; + if let Some(surface) = self.core.surface.as_mut() { + surface.attach_buffer(wl_buffer); + surface.damage(&v); + surface.commit(); + if let Some(_) = self.core.ctx.time { + self.core.ctx.time = Some(time); + frame_callback::(time, surface.surface.clone()); + } + } + } + } + } + pub fn callback(&mut self, ev: Event) { + if self.ctx.time.is_none() || ev.is_cb() { + if let Ok(render_node) = self.roundtrip(ev) { + if let Some(surface) = self.surface.as_ref() { + draw_callback::(&surface.surface, render_node); + } + } + } else { + let width = self.width(); + let height = self.height(); + + self.sync(ev); + + let current_width = self.width(); + let current_height = self.height(); + + // Resizing the surface in case the widget changed size + if width != current_width || height != current_height { + let _ = self.set_size(current_width, current_height); + } + } + } +} + +fn frame_callback(time: u32, surface: Main) +where + M: 'static, + C: Controller + Clone + 'static, +{ + let h = surface.detach(); + surface + .frame() + .quick_assign(move |_, event, mut application| match event { + wl_callback::Event::Done { callback_data } => { + let timeout = (callback_data - time).min(50); + if let Some(application) = application.get::>() { + if let Some(inner_application) = application.get_application(&h) { + inner_application.ctx.time = None; + inner_application.callback(Event::Callback(timeout)); + } + } + } + _ => {} + }); + surface.commit(); +} + +fn draw_callback(surface: &Main, mut recent_node: RenderNode) +where + M: 'static, + C: Controller + Clone + 'static, +{ + let h = surface.detach(); + surface + .frame() + .quick_assign(move |_, event, mut application| match event { + wl_callback::Event::Done { callback_data } => { + if let Some(application) = application.get::>() { + let inner_application = application.get_application(&h).unwrap(); + inner_application.render(callback_data, std::mem::take(&mut recent_node)); + } + } + _ => {} + }); + surface.commit(); +} + +impl From for Modifiers { + fn from(modifer_state: ModifiersState) -> Modifiers { + Modifiers { + ctrl: modifer_state.ctrl, + alt: modifer_state.alt, + shift: modifer_state.shift, + caps_lock: modifer_state.caps_lock, + logo: modifer_state.logo, + num_lock: modifer_state.num_lock, + } + } +} + +fn assign_pointer(pointer: &Main) +where + M: 'static, + C: Controller + Clone + 'static, +{ + let mut index = 0; + let mut input = Pointer::Enter; + let (mut x, mut y) = (0., 0.); + pointer.quick_assign(move |_, event, mut inner| match event { + wl_pointer::Event::Leave { serial: _, surface } => { + input = Pointer::Leave; + if let Some(application) = inner.get::>() { + if let Some(inner_application) = application.get_application(&surface) { + inner_application.callback(Event::Pointer(x as f32, y as f32, input)); + } + } + } + wl_pointer::Event::Button { + serial: _, + time, + button, + state, + } => { + input = Pointer::MouseClick { + time, + button: MouseButton::new(button), + pressed: state == wl_pointer::ButtonState::Pressed, + }; + } + wl_pointer::Event::Frame => { + if let Some(application) = inner.get::>() { + let inner_application = application.inner.get_mut(index).unwrap(); + inner_application.callback(Event::Pointer(x as f32, y as f32, input)); + } + } + wl_pointer::Event::Axis { + time: _, + axis, + value, + } => { + input = Pointer::Scroll { + orientation: match axis { + wl_pointer::Axis::VerticalScroll => Orientation::Vertical, + wl_pointer::Axis::HorizontalScroll => Orientation::Horizontal, + _ => Orientation::Vertical, + }, + value: value as f32, + } + } + wl_pointer::Event::Enter { + serial: _, + surface, + surface_x, + surface_y, + } => { + if let Some(application) = inner.get::>() { + x = surface_x; + y = surface_y; + index = application.get_index(&surface); + } + } + wl_pointer::Event::Motion { + time: _, + surface_x, + surface_y, + } => { + x = surface_x; + y = surface_y; + input = Pointer::Hover; + } + _ => {} + }); +} + +fn assign_surface(shell: &Main) +where + M: 'static, + C: Controller + Clone + 'static, +{ + shell.quick_assign(move |shell, event, mut inner| match event { + zwlr_layer_surface_v1::Event::Configure { + serial, + width, + height, + } => { + shell.ack_configure(serial); + println!("\nCONFIGURE - {} : {} X {}\n", serial, width, height); + if let Some(application) = inner.get::>() { + for inner_application in &mut application.inner { + if let Some(app_surface) = inner_application.surface.as_mut() { + match &app_surface.shell { + Shell::LayerShell { config: _, surface } => { + if shell.eq(surface) { + app_surface.destroy_previous(); + let _ = inner_application + .widget + .set_size(width as f32, height as f32); + if inner_application.ctx.pending_cb { + if let Ok(render_node) = + inner_application.roundtrip(Event::Frame) + { + draw_callback::( + &inner_application + .surface + .as_ref() + .unwrap() + .surface, + render_node, + ); + } + } else { + if let Ok(render_node) = + inner_application.roundtrip(Event::Frame) + { + inner_application.render(0, render_node); + } + } + } + } + } + } + } + } + } + _ => unreachable!(), + }); +} diff --git a/tests/wcag-compliance/package-lock.json b/tests/wcag-compliance/package-lock.json new file mode 100644 index 0000000..e0fc0c6 --- /dev/null +++ b/tests/wcag-compliance/package-lock.json @@ -0,0 +1,326 @@ +{ + "name": "wcag-compliance", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "wcag-compliance", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "color-contrast-checker": "^2.1.0", + "execa": "^6.1.0" + } + }, + "node_modules/color-contrast-checker": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", + "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + } + }, + "dependencies": { + "color-contrast-checker": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", + "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "human-signals": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==" + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" + } + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } +} diff --git a/tests/wcag-compliance/package.json b/tests/wcag-compliance/package.json new file mode 100644 index 0000000..a77038f --- /dev/null +++ b/tests/wcag-compliance/package.json @@ -0,0 +1,32 @@ +{ + "name": "wcag-compliance", + "version": "0.1.0", + "description": "An accessibility checker tool for validating the color contrast of Catppuccin's palettes based on WCAG 2.0 and WCAG 2.1 standards", + "main": "./src/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/catppuccin/catppuccin.git" + }, + "keywords": [ + "wcag", + "wcag-aa", + "color", + "contrast", + "verifier", + "accessibility", + "standard" + ], + "author": "Pocco81", + "license": "MIT", + "bugs": { + "url": "https://github.com/catppuccin/catppuccin/issues" + }, + "homepage": "https://github.com/catppuccin/catppuccin#readme", + "dependencies": { + "color-contrast-checker": "^2.1.0", + "execa": "^6.1.0" + } +} diff --git a/tests/wcag-compliance/src/index.js b/tests/wcag-compliance/src/index.js new file mode 100644 index 0000000..1d5ac3c --- /dev/null +++ b/tests/wcag-compliance/src/index.js @@ -0,0 +1,110 @@ +// import { platform } from 'os'; + +const os = require('os') +const execa = require("execa") +const ColorContrastChecker = require('color-contrast-checker') + +const {stdout} = execa('echo', ['unicorns']); +console.log(stdout); + + +function get_git_root() { + try { + let cmd = '' + + if (platform() === 'win32') { + cmd = `git rev-parse --show-toplevel ` + } else { + cmd = `(git rev-parse --show-toplevel )` + } + + const { stdout } = execa.shellSync(cmd) + + return stdout + } catch (e) { + return '' + } +} + +// console.log(execa.shellSync("echo 'hello'")) + +// /* File System Object */ +// var fs = require('fs'); +// +// pr + +/* Read File */ +// fs.readFile(get_git_root() + "palettes.json", bar) + +function bar (err, data) + { + /* If an error exists, show it, otherwise show the file */ + err ? Function("error","throw error")(err) : console.log(JSON.stringify(data) ); + }; + +// const fs = require("fs") +// + +// var ccc = new ColorContrastChecker(); +// var palettes = fs.readFileSync('../../palettes.json', 'utf8'); +// var palettes = fs.readFile('test.json', 'utf8'); + +// fs.readFile("../../../palettes.json", function(text){ +// palettes = text.split("\n") +// }); + +// for (var key in palettes) { +// console.log(key) +// if (ccc.isLevelAA(background, rainbow[key], 14)) { +// console.log(" •" + key + ": ✅"); +// } else { +// console.log(" •" + key + ": ❌"); +// } +// } + +// const background = "#1E1D2F" +// var rainbow = { +// rosewater: "#F5E0DC", +// flamingo: "#F2CDCD", +// mauve: "#DDB6F2", +// pink: "#F5C2E7", +// red: "#F28FAD", +// maroon: "#E8A2AF", +// peach: "#F8BD96", +// yellow: "#FAE3B0", +// green: "#ABE9B3", +// blue: "#96CDFB", +// sky: "#89DCEB", +// teal: "#B5E8E0", +// lavender: "#C9CBFF", +// white: "#D9E0EE", +// gray2: "#C3BAC6", +// gray1: "#988BA2", +// gray0: "#6E6C7E", +// black4: "#575268", +// black3: "#302D41", +// black2: "#1E1D2F", +// black1: "#1A1823", +// black0: "#131020", +// } +// +// console.log("\t---- WCAG conformance level AA on Catppuccin ----\n") +// +// for (var key in rainbow) { +// if (ccc.isLevelAA(background, rainbow[key], 14)) { +// console.log(" •" + key + ": ✅"); +// } else { +// console.log(" •" + key + ": ❌"); +// } +// } + +// var color1 = "#FFFFFF"; +// var color2 = "#000000"; +// +// if (ccc.isLevelAA(color1, color2, 14)) { +// console.log("Valid Level AA"); +// } else { +// console.log("Invalid Contrast"); +// } +// +// console.log("Hello world!") diff --git a/tests/wcag-compliance/test.json b/tests/wcag-compliance/test.json new file mode 100644 index 0000000..df68a9c --- /dev/null +++ b/tests/wcag-compliance/test.json @@ -0,0 +1,3 @@ +{ + "hello": "world" +} From a1ee8620aa1788e7afaea93a2531129bc77c13c6 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 13 Apr 2022 12:28:01 -0500 Subject: [PATCH 06/43] fix: prompt on palettes_gen.sh --- resources/palettes_gen.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/palettes_gen.sh b/resources/palettes_gen.sh index 0b0f6cb..6276277 100755 --- a/resources/palettes_gen.sh +++ b/resources/palettes_gen.sh @@ -119,10 +119,6 @@ function prompt() { local message=${2} local modifiers=${3} - if [[ $1 == "-i" || $1 == "--info" ]]; then - type="" - fi - case ${type} in "-e" | "--error") printf "\033[0;31m${modifiers}ERROR: %s${NC}\n" "${message}" @@ -134,7 +130,11 @@ function prompt() { printf "\033[0;33m${modifiers}WARNING: %s${NC}\n" "${message}" ;; *) - printf "\033[0;34m${modifiers}INFO: %s${NC}\n" "${message}" + if [[ $1 == "-i" || $1 == "--info" ]]; then + type="${message}" + message=${modifiers} + fi + printf "\033[0;34m${message}INFO: %s${NC}\n" "${type}" ;; esac } From 19cc4418473a3435e34725a2acf924a5b13edaf3 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 13 Apr 2022 12:42:41 -0500 Subject: [PATCH 07/43] fix: palette detection --- resources/palettes_gen.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/palettes_gen.sh b/resources/palettes_gen.sh index 6276277..2acaefe 100755 --- a/resources/palettes_gen.sh +++ b/resources/palettes_gen.sh @@ -6,7 +6,7 @@ coerce=false lowercase=false file="" prefix="" -original_palette="storm" +original_palette="" verbosity=0 script_help=$( @@ -220,7 +220,7 @@ main() { shift ;; -o | --original-palette) - origianl_palette=$2 + original_palette=$2 shift ;; -l | --lowercase) @@ -248,7 +248,7 @@ main() { if [[ $file != "" ]]; then [[ -f $file ]] && { prompt "updating colors..." - if [[ original_palette != "storm" || original_palette != "dusk" || original_palette != "dawn" ]]; then + if [[ $original_palette != "storm" && $original_palette != "dusk" && $original_palette != "dawn" ]]; then detect_original_palette fi generate_palettes From 3725ce76f38addb2c381e03ff4ddfab57575860a Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 13 Apr 2022 16:36:05 -0500 Subject: [PATCH 08/43] fix: casing and some colors on dawn --- resources/palettes_gen.sh | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/resources/palettes_gen.sh b/resources/palettes_gen.sh index 2acaefe..a4d527a 100755 --- a/resources/palettes_gen.sh +++ b/resources/palettes_gen.sh @@ -89,28 +89,28 @@ declare -A storm=( declare -A dawn=( [black4]='CCC9D1' - [peach]='FE6811' + [peach]='FE640B' [black3]='E6E3E5' [pink]='EC83D0' [black0]='D3D0D2' [black1]='EDEDED' [blue]='1D65F5' [lavender]='7287FD' - [mauve]='8F46EF' + [mauve]='822FEE' [black5]='B5B1BF' [maroon]='E63B4A' - [rosewater]='E5AC9F' - [green]='509E31' + [rosewater]='DC907F' + [green]='40A02B' [gray1]='86819C' [black2]='FBF8F4' [white]='575279' [gray2]='6E6A8B' [sky]='04A5E5' [sapphire]='209FB5' - [red]='D20F39' - [teal]='289886' + [red]='BB0D33' + [teal]='179299' [gray0]='9D99AE' - [flamingo]='DF7F7F' + [flamingo]='DD7878' [yellow]='E49320' ) @@ -147,11 +147,14 @@ function verbose_print() { fi } -function generate_palettes() { +function make_capitalization_char() { capitalization_char='\U' # uppercase [[ $lowercase == true ]] && { capitalization_char='\L' # lowercase } +} + +function generate_palettes() { new_array=() for val in "${palette_names[@]}"; do @@ -190,7 +193,7 @@ function detect_original_palette() { original_palette="" for palette in "${palette_names[@]}"; do for clr in "${!storm[@]}"; do - if grep -q $(eval "echo \${${palette}[${clr}]}") "$file"; then + if grep --ignore-case -q $(eval "echo \${${palette}[${clr}]}") "$file"; then original_palette=$palette break 2 fi @@ -248,6 +251,7 @@ main() { if [[ $file != "" ]]; then [[ -f $file ]] && { prompt "updating colors..." + make_capitalization_char if [[ $original_palette != "storm" && $original_palette != "dusk" && $original_palette != "dawn" ]]; then detect_original_palette fi From 56afd8465f96b41381d4457a31f3fe310b6ba761 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Sat, 21 May 2022 15:58:47 -0500 Subject: [PATCH 09/43] feat: wcag-compliance tests --- tests/wcag-compliance/.npmrc | 1 + tests/wcag-compliance/README.md | 17 + tests/wcag-compliance/index.js | 104 +++ .../node_modules/.bin/node-which | 1 - .../node_modules/.package-lock.json | 199 +----- .../node_modules/cross-spawn/CHANGELOG.md | 130 ---- .../node_modules/cross-spawn/LICENSE | 21 - .../node_modules/cross-spawn/README.md | 96 --- .../node_modules/cross-spawn/index.js | 39 - .../node_modules/cross-spawn/lib/enoent.js | 59 -- .../node_modules/cross-spawn/lib/parse.js | 91 --- .../cross-spawn/lib/util/escape.js | 45 -- .../cross-spawn/lib/util/readShebang.js | 23 - .../cross-spawn/lib/util/resolveCommand.js | 52 -- .../node_modules/cross-spawn/package.json | 73 -- .../node_modules/execa/index.d.ts | 586 --------------- .../node_modules/execa/index.js | 267 ------- .../node_modules/execa/lib/command.js | 41 -- .../node_modules/execa/lib/error.js | 85 --- .../node_modules/execa/lib/kill.js | 102 --- .../node_modules/execa/lib/promise.js | 36 - .../node_modules/execa/lib/stdio.js | 49 -- .../node_modules/execa/lib/stream.js | 88 --- .../node_modules/execa/license | 9 - .../node_modules/execa/package.json | 83 --- .../node_modules/execa/readme.md | 667 ------------------ .../node_modules/get-stream/buffer-stream.js | 52 -- .../node_modules/get-stream/index.d.ts | 105 --- .../node_modules/get-stream/index.js | 61 -- .../node_modules/get-stream/license | 9 - .../node_modules/get-stream/package.json | 47 -- .../node_modules/get-stream/readme.md | 124 ---- .../node_modules/human-signals/LICENSE | 201 ------ .../node_modules/human-signals/README.md | 164 ----- .../human-signals/build/src/core.js | 273 ------- .../human-signals/build/src/core.js.map | 1 - .../human-signals/build/src/main.d.ts | 52 -- .../human-signals/build/src/main.js | 71 -- .../human-signals/build/src/main.js.map | 1 - .../human-signals/build/src/realtime.js | 19 - .../human-signals/build/src/realtime.js.map | 1 - .../human-signals/build/src/signals.js | 35 - .../human-signals/build/src/signals.js.map | 1 - .../node_modules/human-signals/package.json | 57 -- .../node_modules/is-stream/index.d.ts | 81 --- .../node_modules/is-stream/index.js | 29 - .../node_modules/is-stream/license | 9 - .../node_modules/is-stream/package.json | 44 -- .../node_modules/is-stream/readme.md | 60 -- .../node_modules/isexe/.npmignore | 2 - .../node_modules/isexe/LICENSE | 15 - .../node_modules/isexe/README.md | 51 -- .../node_modules/isexe/index.js | 57 -- .../node_modules/isexe/mode.js | 41 -- .../node_modules/isexe/package.json | 31 - .../node_modules/isexe/test/basic.js | 221 ------ .../node_modules/isexe/windows.js | 42 -- .../node_modules/merge-stream/LICENSE | 21 - .../node_modules/merge-stream/README.md | 78 -- .../node_modules/merge-stream/index.js | 41 -- .../node_modules/merge-stream/package.json | 19 - .../node_modules/mimic-fn/index.d.ts | 52 -- .../node_modules/mimic-fn/index.js | 71 -- .../node_modules/mimic-fn/license | 9 - .../node_modules/mimic-fn/package.json | 45 -- .../node_modules/mimic-fn/readme.md | 90 --- .../node_modules/npm-run-path/index.d.ts | 84 --- .../node_modules/npm-run-path/index.js | 38 - .../node_modules/npm-run-path/license | 9 - .../node_modules/path-key/index.d.ts | 31 - .../node_modules/path-key/index.js | 12 - .../node_modules/path-key/license | 9 - .../node_modules/path-key/package.json | 41 -- .../node_modules/path-key/readme.md | 57 -- .../node_modules/npm-run-path/package.json | 47 -- .../node_modules/npm-run-path/readme.md | 111 --- .../node_modules/onetime/index.d.ts | 59 -- .../node_modules/onetime/index.js | 41 -- .../node_modules/onetime/license | 9 - .../node_modules/onetime/package.json | 45 -- .../node_modules/onetime/readme.md | 94 --- .../node_modules/path-key/index.d.ts | 40 -- .../node_modules/path-key/index.js | 16 - .../node_modules/path-key/license | 9 - .../node_modules/path-key/package.json | 39 - .../node_modules/path-key/readme.md | 61 -- .../node_modules/shebang-command/index.js | 19 - .../node_modules/shebang-command/license | 9 - .../node_modules/shebang-command/package.json | 34 - .../node_modules/shebang-command/readme.md | 34 - .../node_modules/shebang-regex/index.d.ts | 22 - .../node_modules/shebang-regex/index.js | 2 - .../node_modules/shebang-regex/license | 9 - .../node_modules/shebang-regex/package.json | 35 - .../node_modules/shebang-regex/readme.md | 33 - .../node_modules/signal-exit/LICENSE.txt | 16 - .../node_modules/signal-exit/README.md | 39 - .../node_modules/signal-exit/index.js | 202 ------ .../node_modules/signal-exit/package.json | 38 - .../node_modules/signal-exit/signals.js | 53 -- .../node_modules/strip-final-newline/index.js | 14 - .../node_modules/strip-final-newline/license | 9 - .../strip-final-newline/package.json | 43 -- .../strip-final-newline/readme.md | 35 - .../node_modules/which/CHANGELOG.md | 166 ----- .../node_modules/which/LICENSE | 15 - .../node_modules/which/README.md | 54 -- .../node_modules/which/bin/node-which | 52 -- .../node_modules/which/package.json | 43 -- .../node_modules/which/which.js | 125 ---- tests/wcag-compliance/package-lock.json | 326 --------- tests/wcag-compliance/package.json | 31 +- tests/wcag-compliance/src/index.js | 110 --- tests/wcag-compliance/test.json | 3 - 114 files changed, 154 insertions(+), 7616 deletions(-) create mode 100644 tests/wcag-compliance/.npmrc create mode 100644 tests/wcag-compliance/README.md create mode 100644 tests/wcag-compliance/index.js delete mode 120000 tests/wcag-compliance/node_modules/.bin/node-which delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/LICENSE delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/README.md delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/index.js delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js delete mode 100644 tests/wcag-compliance/node_modules/cross-spawn/package.json delete mode 100644 tests/wcag-compliance/node_modules/execa/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/execa/index.js delete mode 100644 tests/wcag-compliance/node_modules/execa/lib/command.js delete mode 100644 tests/wcag-compliance/node_modules/execa/lib/error.js delete mode 100644 tests/wcag-compliance/node_modules/execa/lib/kill.js delete mode 100644 tests/wcag-compliance/node_modules/execa/lib/promise.js delete mode 100644 tests/wcag-compliance/node_modules/execa/lib/stdio.js delete mode 100644 tests/wcag-compliance/node_modules/execa/lib/stream.js delete mode 100644 tests/wcag-compliance/node_modules/execa/license delete mode 100644 tests/wcag-compliance/node_modules/execa/package.json delete mode 100644 tests/wcag-compliance/node_modules/execa/readme.md delete mode 100644 tests/wcag-compliance/node_modules/get-stream/buffer-stream.js delete mode 100644 tests/wcag-compliance/node_modules/get-stream/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/get-stream/index.js delete mode 100644 tests/wcag-compliance/node_modules/get-stream/license delete mode 100644 tests/wcag-compliance/node_modules/get-stream/package.json delete mode 100644 tests/wcag-compliance/node_modules/get-stream/readme.md delete mode 100644 tests/wcag-compliance/node_modules/human-signals/LICENSE delete mode 100644 tests/wcag-compliance/node_modules/human-signals/README.md delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/core.js delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/main.js delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/signals.js delete mode 100644 tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map delete mode 100644 tests/wcag-compliance/node_modules/human-signals/package.json delete mode 100644 tests/wcag-compliance/node_modules/is-stream/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/is-stream/index.js delete mode 100644 tests/wcag-compliance/node_modules/is-stream/license delete mode 100644 tests/wcag-compliance/node_modules/is-stream/package.json delete mode 100644 tests/wcag-compliance/node_modules/is-stream/readme.md delete mode 100644 tests/wcag-compliance/node_modules/isexe/.npmignore delete mode 100644 tests/wcag-compliance/node_modules/isexe/LICENSE delete mode 100644 tests/wcag-compliance/node_modules/isexe/README.md delete mode 100644 tests/wcag-compliance/node_modules/isexe/index.js delete mode 100644 tests/wcag-compliance/node_modules/isexe/mode.js delete mode 100644 tests/wcag-compliance/node_modules/isexe/package.json delete mode 100644 tests/wcag-compliance/node_modules/isexe/test/basic.js delete mode 100644 tests/wcag-compliance/node_modules/isexe/windows.js delete mode 100644 tests/wcag-compliance/node_modules/merge-stream/LICENSE delete mode 100644 tests/wcag-compliance/node_modules/merge-stream/README.md delete mode 100644 tests/wcag-compliance/node_modules/merge-stream/index.js delete mode 100644 tests/wcag-compliance/node_modules/merge-stream/package.json delete mode 100644 tests/wcag-compliance/node_modules/mimic-fn/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/mimic-fn/index.js delete mode 100644 tests/wcag-compliance/node_modules/mimic-fn/license delete mode 100644 tests/wcag-compliance/node_modules/mimic-fn/package.json delete mode 100644 tests/wcag-compliance/node_modules/mimic-fn/readme.md delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/index.js delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/license delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/package.json delete mode 100644 tests/wcag-compliance/node_modules/npm-run-path/readme.md delete mode 100644 tests/wcag-compliance/node_modules/onetime/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/onetime/index.js delete mode 100644 tests/wcag-compliance/node_modules/onetime/license delete mode 100644 tests/wcag-compliance/node_modules/onetime/package.json delete mode 100644 tests/wcag-compliance/node_modules/onetime/readme.md delete mode 100644 tests/wcag-compliance/node_modules/path-key/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/path-key/index.js delete mode 100644 tests/wcag-compliance/node_modules/path-key/license delete mode 100644 tests/wcag-compliance/node_modules/path-key/package.json delete mode 100644 tests/wcag-compliance/node_modules/path-key/readme.md delete mode 100644 tests/wcag-compliance/node_modules/shebang-command/index.js delete mode 100644 tests/wcag-compliance/node_modules/shebang-command/license delete mode 100644 tests/wcag-compliance/node_modules/shebang-command/package.json delete mode 100644 tests/wcag-compliance/node_modules/shebang-command/readme.md delete mode 100644 tests/wcag-compliance/node_modules/shebang-regex/index.d.ts delete mode 100644 tests/wcag-compliance/node_modules/shebang-regex/index.js delete mode 100644 tests/wcag-compliance/node_modules/shebang-regex/license delete mode 100644 tests/wcag-compliance/node_modules/shebang-regex/package.json delete mode 100644 tests/wcag-compliance/node_modules/shebang-regex/readme.md delete mode 100644 tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt delete mode 100644 tests/wcag-compliance/node_modules/signal-exit/README.md delete mode 100644 tests/wcag-compliance/node_modules/signal-exit/index.js delete mode 100644 tests/wcag-compliance/node_modules/signal-exit/package.json delete mode 100644 tests/wcag-compliance/node_modules/signal-exit/signals.js delete mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/index.js delete mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/license delete mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/package.json delete mode 100644 tests/wcag-compliance/node_modules/strip-final-newline/readme.md delete mode 100644 tests/wcag-compliance/node_modules/which/CHANGELOG.md delete mode 100644 tests/wcag-compliance/node_modules/which/LICENSE delete mode 100644 tests/wcag-compliance/node_modules/which/README.md delete mode 100755 tests/wcag-compliance/node_modules/which/bin/node-which delete mode 100644 tests/wcag-compliance/node_modules/which/package.json delete mode 100644 tests/wcag-compliance/node_modules/which/which.js delete mode 100644 tests/wcag-compliance/package-lock.json delete mode 100644 tests/wcag-compliance/src/index.js delete mode 100644 tests/wcag-compliance/test.json diff --git a/tests/wcag-compliance/.npmrc b/tests/wcag-compliance/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/tests/wcag-compliance/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/tests/wcag-compliance/README.md b/tests/wcag-compliance/README.md new file mode 100644 index 0000000..9e1eb48 --- /dev/null +++ b/tests/wcag-compliance/README.md @@ -0,0 +1,17 @@ +### 📄 Doc + +This program tests how compliant Catppuccin's variants are with WCAG standards. The test looks like this: ever color is put on top of the `base` color of the palette with a font size of 15; colors from `subtext0` up are expected to be acceptable. In the case of the dark palettes, they should meet Level AA requirements. As for the light palette, however, they must meet a contrast ratio greater than `2.314159265359`. + +#### Dev + +```sh +# clone this repo +npm install # fetch all dependencies +``` + +#### Testing + +```sh +npm start + +``` diff --git a/tests/wcag-compliance/index.js b/tests/wcag-compliance/index.js new file mode 100644 index 0000000..39f62c9 --- /dev/null +++ b/tests/wcag-compliance/index.js @@ -0,0 +1,104 @@ +import {variants, labels} from '@catppuccin/palette' +import ColorContrastChecker from "color-contrast-checker" +import chalk from "chalk" +var ccc = new ColorContrastChecker(); + +const FONT_SIZE = 15 +const LATTE_CONTRAST_RATIO = 2.314159265359 + + +function write(msg) { + process.stdout.write(msg) +} + +function get_tabs(str) { + if (str.length > 6) { + return '\t' + } + return '\t\t' +} + +function get_rgb(c) { + return parseInt(c, 16) || c +} + +function gets_rgb(c) { + return get_rgb(c) / 255 <= 0.03928 + ? get_rgb(c) / 255 / 12.92 + : Math.pow((get_rgb(c) / 255 + 0.055) / 1.055, 2.4) +} + +function get_luminance(hexColor) { + return ( + 0.2126 * gets_rgb(hexColor.substr(1, 2)) + + 0.7152 * gets_rgb(hexColor.substr(3, 2)) + + 0.0722 * gets_rgb(hexColor.substr(-2)) + ) +} + +function get_contrast(f, b) { + const L1 = get_luminance(f) + const L2 = get_luminance(b) + return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05) +} + +function get_text_color(bg_color, preferred_white, preffered_black) { + let white = preferred_white ? preferred_white : '#ffffff' + let black = preffered_black ? preffered_black : '#000000' + const whiteContrast = get_contrast(bg_color, white) + const blackContrast = get_contrast(bg_color, black) + + return whiteContrast > blackContrast ? white : black +} + +function print_color(text, background, preferred_white, preffered_black) { + write( + chalk.bgHex(background)( + chalk.hex( + get_text_color(background, preferred_white, preffered_black) + )(text) + ) + ) +} + +function good_contrast(base, label_color, custom_ratio) { + + let good_contrast_ratio = ccc.isLevelAA(base, label_color, FONT_SIZE) + + if (custom_ratio) { + good_contrast_ratio = ccc.isLevelCustom(base, label_color, custom_ratio) + } + + if (good_contrast_ratio) { + return "✅" + } else { + return "❌" + } +} + +function get_symbol_space(str) { + if (str.length < 8) { + return '\t' + ' '.repeat(2) + } else if (str.length == 8) { + return ' ' + } + return ' ' +} + +write(chalk.hex('#fff')('|Latte|\t\t|Frappe|\t|Macchiato|\t|Moccha|\n\n')) +for (let label in labels) { + for (let palette in variants) { + let label_color = variants[palette][label]["hex"] + let base = variants[palette]["base"]["hex"] + var symbol_space = get_symbol_space(label) + let good_contrast_ratio = good_contrast(base, label_color) + + if (palette == "latte") { + good_contrast_ratio = good_contrast(base, label_color, LATTE_CONTRAST_RATIO) + } + + print_color(label, base, label_color, label_color) + write(symbol_space + good_contrast_ratio + "\t") + } + console.log('') +} diff --git a/tests/wcag-compliance/node_modules/.bin/node-which b/tests/wcag-compliance/node_modules/.bin/node-which deleted file mode 120000 index 6f8415e..0000000 --- a/tests/wcag-compliance/node_modules/.bin/node-which +++ /dev/null @@ -1 +0,0 @@ -../which/bin/node-which \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/.package-lock.json b/tests/wcag-compliance/node_modules/.package-lock.json index 96046f1..e5b9b5f 100644 --- a/tests/wcag-compliance/node_modules/.package-lock.json +++ b/tests/wcag-compliance/node_modules/.package-lock.json @@ -1,195 +1,30 @@ { - "name": "wcag-compliance", - "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { - "node_modules/color-contrast-checker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", - "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } + "node_modules/@catppuccin/palette": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@catppuccin/palette/-/palette-0.1.2.tgz", + "integrity": "sha512-5Gt/goIgHAKjQtMqYhMJeoUWXj5d0HNai3gOPRzDVuz6V4ptTbnSxRyyooOY5OnYn/p0YLEtED/K0JvJPan9Aw==", + "dev": true }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, + "node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } + "node_modules/color-contrast-checker": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", + "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==", + "dev": true } } } diff --git a/tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md b/tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md deleted file mode 100644 index d07c9e5..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/CHANGELOG.md +++ /dev/null @@ -1,130 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. - -### [7.0.3](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.2...v7.0.3) (2020-05-25) - - -### Bug Fixes - -* detect path key based on correct environment ([#133](https://github.com/moxystudio/node-cross-spawn/issues/133)) ([159e7e9](https://github.com/moxystudio/node-cross-spawn/commit/159e7e9785e57451cba034ae51719f97135074ae)) - -### [7.0.2](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.1...v7.0.2) (2020-04-04) - - -### Bug Fixes - -* fix worker threads in Node >=11.10.0 ([#132](https://github.com/moxystudio/node-cross-spawn/issues/132)) ([6c5b4f0](https://github.com/moxystudio/node-cross-spawn/commit/6c5b4f015814a6c4f6b33230dfd1a860aedc0aaf)) - -### [7.0.1](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.0...v7.0.1) (2019-10-07) - - -### Bug Fixes - -* **core:** support worker threads ([#127](https://github.com/moxystudio/node-cross-spawn/issues/127)) ([cfd49c9](https://github.com/moxystudio/node-cross-spawn/commit/cfd49c9)) - -## [7.0.0](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.5...v7.0.0) (2019-09-03) - - -### ⚠ BREAKING CHANGES - -* drop support for Node.js < 8 - -* drop support for versions below Node.js 8 ([#125](https://github.com/moxystudio/node-cross-spawn/issues/125)) ([16feb53](https://github.com/moxystudio/node-cross-spawn/commit/16feb53)) - - -## [6.0.5](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.4...v6.0.5) (2018-03-02) - - -### Bug Fixes - -* avoid using deprecated Buffer constructor ([#94](https://github.com/moxystudio/node-cross-spawn/issues/94)) ([d5770df](https://github.com/moxystudio/node-cross-spawn/commit/d5770df)), closes [/nodejs.org/api/deprecations.html#deprecations_dep0005](https://github.com//nodejs.org/api/deprecations.html/issues/deprecations_dep0005) - - - - -## [6.0.4](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.3...v6.0.4) (2018-01-31) - - -### Bug Fixes - -* fix paths being incorrectly normalized on unix ([06ee3c6](https://github.com/moxystudio/node-cross-spawn/commit/06ee3c6)), closes [#90](https://github.com/moxystudio/node-cross-spawn/issues/90) - - - - -## [6.0.3](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.2...v6.0.3) (2018-01-23) - - - - -## [6.0.2](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.1...v6.0.2) (2018-01-23) - - - - -## [6.0.1](https://github.com/moxystudio/node-cross-spawn/compare/v6.0.0...v6.0.1) (2018-01-23) - - - - -# [6.0.0](https://github.com/moxystudio/node-cross-spawn/compare/5.1.0...6.0.0) (2018-01-23) - - -### Bug Fixes - -* fix certain arguments not being correctly escaped or causing batch syntax error ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)), closes [#82](https://github.com/moxystudio/node-cross-spawn/issues/82) [#51](https://github.com/moxystudio/node-cross-spawn/issues/51) -* fix commands as posix relatixe paths not working correctly, e.g.: `./my-command` ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) -* fix `options` argument being mutated ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) -* fix commands resolution when PATH was actually Path ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) - - -### Features - -* improve compliance with node's ENOENT errors ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) -* improve detection of node's shell option support ([900cf10](https://github.com/moxystudio/node-cross-spawn/commit/900cf10)) - - -### Chores - -* upgrade tooling -* upgrate project to es6 (node v4) - - -### BREAKING CHANGES - -* remove support for older nodejs versions, only `node >= 4` is supported - - - -## [5.1.0](https://github.com/moxystudio/node-cross-spawn/compare/5.0.1...5.1.0) (2017-02-26) - - -### Bug Fixes - -* fix `options.shell` support for NodeJS [v4.8](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V4.md#4.8.0) - - - -## [5.0.1](https://github.com/moxystudio/node-cross-spawn/compare/5.0.0...5.0.1) (2016-11-04) - - -### Bug Fixes - -* fix `options.shell` support for NodeJS v7 - - - -# [5.0.0](https://github.com/moxystudio/node-cross-spawn/compare/4.0.2...5.0.0) (2016-10-30) - - -## Features - -* add support for `options.shell` -* improve parsing of shebangs by using [`shebang-command`](https://github.com/kevva/shebang-command) module - - -## Chores - -* refactor some code to make it more clear -* update README caveats diff --git a/tests/wcag-compliance/node_modules/cross-spawn/LICENSE b/tests/wcag-compliance/node_modules/cross-spawn/LICENSE deleted file mode 100644 index 8407b9a..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Made With MOXY Lda - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/cross-spawn/README.md b/tests/wcag-compliance/node_modules/cross-spawn/README.md deleted file mode 100644 index c4a4da8..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# cross-spawn - -[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Build status][appveyor-image]][appveyor-url] [![Coverage Status][codecov-image]][codecov-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] - -[npm-url]:https://npmjs.org/package/cross-spawn -[downloads-image]:https://img.shields.io/npm/dm/cross-spawn.svg -[npm-image]:https://img.shields.io/npm/v/cross-spawn.svg -[travis-url]:https://travis-ci.org/moxystudio/node-cross-spawn -[travis-image]:https://img.shields.io/travis/moxystudio/node-cross-spawn/master.svg -[appveyor-url]:https://ci.appveyor.com/project/satazor/node-cross-spawn -[appveyor-image]:https://img.shields.io/appveyor/ci/satazor/node-cross-spawn/master.svg -[codecov-url]:https://codecov.io/gh/moxystudio/node-cross-spawn -[codecov-image]:https://img.shields.io/codecov/c/github/moxystudio/node-cross-spawn/master.svg -[david-dm-url]:https://david-dm.org/moxystudio/node-cross-spawn -[david-dm-image]:https://img.shields.io/david/moxystudio/node-cross-spawn.svg -[david-dm-dev-url]:https://david-dm.org/moxystudio/node-cross-spawn?type=dev -[david-dm-dev-image]:https://img.shields.io/david/dev/moxystudio/node-cross-spawn.svg - -A cross platform solution to node's spawn and spawnSync. - - -## Installation - -Node.js version 8 and up: -`$ npm install cross-spawn` - -Node.js version 7 and under: -`$ npm install cross-spawn@6` - -## Why - -Node has issues when using spawn on Windows: - -- It ignores [PATHEXT](https://github.com/joyent/node/issues/2318) -- It does not support [shebangs](https://en.wikipedia.org/wiki/Shebang_(Unix)) -- Has problems running commands with [spaces](https://github.com/nodejs/node/issues/7367) -- Has problems running commands with posix relative paths (e.g.: `./my-folder/my-executable`) -- Has an [issue](https://github.com/moxystudio/node-cross-spawn/issues/82) with command shims (files in `node_modules/.bin/`), where arguments with quotes and parenthesis would result in [invalid syntax error](https://github.com/moxystudio/node-cross-spawn/blob/e77b8f22a416db46b6196767bcd35601d7e11d54/test/index.test.js#L149) -- No `options.shell` support on node `` where `` must not contain any arguments. -If you would like to have the shebang support improved, feel free to contribute via a pull-request. - -Remember to always test your code on Windows! - - -## Tests - -`$ npm test` -`$ npm test -- --watch` during development - - -## License - -Released under the [MIT License](https://www.opensource.org/licenses/mit-license.php). diff --git a/tests/wcag-compliance/node_modules/cross-spawn/index.js b/tests/wcag-compliance/node_modules/cross-spawn/index.js deleted file mode 100644 index 5509742..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/index.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -const cp = require('child_process'); -const parse = require('./lib/parse'); -const enoent = require('./lib/enoent'); - -function spawn(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); - - // Hook into child process "exit" event to emit an error if the command - // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - enoent.hookChildProcess(spawned, parsed); - - return spawned; -} - -function spawnSync(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); - - // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); - - return result; -} - -module.exports = spawn; -module.exports.spawn = spawn; -module.exports.sync = spawnSync; - -module.exports._parse = parse; -module.exports._enoent = enoent; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js deleted file mode 100644 index 14df9b6..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/lib/enoent.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; - -const isWin = process.platform === 'win32'; - -function notFoundError(original, syscall) { - return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { - code: 'ENOENT', - errno: 'ENOENT', - syscall: `${syscall} ${original.command}`, - path: original.command, - spawnargs: original.args, - }); -} - -function hookChildProcess(cp, parsed) { - if (!isWin) { - return; - } - - const originalEmit = cp.emit; - - cp.emit = function (name, arg1) { - // If emitting "exit" event and exit code is 1, we need to check if - // the command exists and emit an "error" instead - // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 - if (name === 'exit') { - const err = verifyENOENT(arg1, parsed, 'spawn'); - - if (err) { - return originalEmit.call(cp, 'error', err); - } - } - - return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params - }; -} - -function verifyENOENT(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawn'); - } - - return null; -} - -function verifyENOENTSync(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawnSync'); - } - - return null; -} - -module.exports = { - hookChildProcess, - verifyENOENT, - verifyENOENTSync, - notFoundError, -}; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js deleted file mode 100644 index 0129d74..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/lib/parse.js +++ /dev/null @@ -1,91 +0,0 @@ -'use strict'; - -const path = require('path'); -const resolveCommand = require('./util/resolveCommand'); -const escape = require('./util/escape'); -const readShebang = require('./util/readShebang'); - -const isWin = process.platform === 'win32'; -const isExecutableRegExp = /\.(?:com|exe)$/i; -const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; - -function detectShebang(parsed) { - parsed.file = resolveCommand(parsed); - - const shebang = parsed.file && readShebang(parsed.file); - - if (shebang) { - parsed.args.unshift(parsed.file); - parsed.command = shebang; - - return resolveCommand(parsed); - } - - return parsed.file; -} - -function parseNonShell(parsed) { - if (!isWin) { - return parsed; - } - - // Detect & add support for shebangs - const commandFile = detectShebang(parsed); - - // We don't need a shell if the command filename is an executable - const needsShell = !isExecutableRegExp.test(commandFile); - - // If a shell is required, use cmd.exe and take care of escaping everything correctly - // Note that `forceShell` is an hidden option used only in tests - if (parsed.options.forceShell || needsShell) { - // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` - // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument - // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, - // we need to double escape them - const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); - - // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) - // This is necessary otherwise it will always fail with ENOENT in those cases - parsed.command = path.normalize(parsed.command); - - // Escape command & arguments - parsed.command = escape.command(parsed.command); - parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); - - const shellCommand = [parsed.command].concat(parsed.args).join(' '); - - parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; - parsed.command = process.env.comspec || 'cmd.exe'; - parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped - } - - return parsed; -} - -function parse(command, args, options) { - // Normalize arguments, similar to nodejs - if (args && !Array.isArray(args)) { - options = args; - args = null; - } - - args = args ? args.slice(0) : []; // Clone array to avoid changing the original - options = Object.assign({}, options); // Clone object to avoid changing the original - - // Build our parsed object - const parsed = { - command, - args, - options, - file: undefined, - original: { - command, - args, - }, - }; - - // Delegate further parsing to shell or non-shell - return options.shell ? parsed : parseNonShell(parsed); -} - -module.exports = parse; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js deleted file mode 100644 index b0bb84c..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/escape.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -// See http://www.robvanderwoude.com/escapechars.php -const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; - -function escapeCommand(arg) { - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - - return arg; -} - -function escapeArgument(arg, doubleEscapeMetaChars) { - // Convert to string - arg = `${arg}`; - - // Algorithm below is based on https://qntm.org/cmd - - // Sequence of backslashes followed by a double quote: - // double up all the backslashes and escape the double quote - arg = arg.replace(/(\\*)"/g, '$1$1\\"'); - - // Sequence of backslashes followed by the end of the string - // (which will become a double quote later): - // double up all the backslashes - arg = arg.replace(/(\\*)$/, '$1$1'); - - // All other backslashes occur literally - - // Quote the whole thing: - arg = `"${arg}"`; - - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - - // Double escape meta chars if necessary - if (doubleEscapeMetaChars) { - arg = arg.replace(metaCharsRegExp, '^$1'); - } - - return arg; -} - -module.exports.command = escapeCommand; -module.exports.argument = escapeArgument; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js deleted file mode 100644 index 5e83733..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/readShebang.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const shebangCommand = require('shebang-command'); - -function readShebang(command) { - // Read the first 150 bytes from the file - const size = 150; - const buffer = Buffer.alloc(size); - - let fd; - - try { - fd = fs.openSync(command, 'r'); - fs.readSync(fd, buffer, 0, size, 0); - fs.closeSync(fd); - } catch (e) { /* Empty */ } - - // Attempt to extract shebang (null is returned if not a shebang) - return shebangCommand(buffer.toString()); -} - -module.exports = readShebang; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js b/tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js deleted file mode 100644 index 7972455..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/lib/util/resolveCommand.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -const path = require('path'); -const which = require('which'); -const getPathKey = require('path-key'); - -function resolveCommandAttempt(parsed, withoutPathExt) { - const env = parsed.options.env || process.env; - const cwd = process.cwd(); - const hasCustomCwd = parsed.options.cwd != null; - // Worker threads do not have process.chdir() - const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled; - - // If a custom `cwd` was specified, we need to change the process cwd - // because `which` will do stat calls but does not support a custom cwd - if (shouldSwitchCwd) { - try { - process.chdir(parsed.options.cwd); - } catch (err) { - /* Empty */ - } - } - - let resolved; - - try { - resolved = which.sync(parsed.command, { - path: env[getPathKey({ env })], - pathExt: withoutPathExt ? path.delimiter : undefined, - }); - } catch (e) { - /* Empty */ - } finally { - if (shouldSwitchCwd) { - process.chdir(cwd); - } - } - - // If we successfully resolved, ensure that an absolute path is returned - // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it - if (resolved) { - resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); - } - - return resolved; -} - -function resolveCommand(parsed) { - return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); -} - -module.exports = resolveCommand; diff --git a/tests/wcag-compliance/node_modules/cross-spawn/package.json b/tests/wcag-compliance/node_modules/cross-spawn/package.json deleted file mode 100644 index 232ff97..0000000 --- a/tests/wcag-compliance/node_modules/cross-spawn/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "cross-spawn", - "version": "7.0.3", - "description": "Cross platform child_process#spawn and child_process#spawnSync", - "keywords": [ - "spawn", - "spawnSync", - "windows", - "cross-platform", - "path-ext", - "shebang", - "cmd", - "execute" - ], - "author": "André Cruz ", - "homepage": "https://github.com/moxystudio/node-cross-spawn", - "repository": { - "type": "git", - "url": "git@github.com:moxystudio/node-cross-spawn.git" - }, - "license": "MIT", - "main": "index.js", - "files": [ - "lib" - ], - "scripts": { - "lint": "eslint .", - "test": "jest --env node --coverage", - "prerelease": "npm t && npm run lint", - "release": "standard-version", - "postrelease": "git push --follow-tags origin HEAD && npm publish" - }, - "husky": { - "hooks": { - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", - "pre-commit": "lint-staged" - } - }, - "lint-staged": { - "*.js": [ - "eslint --fix", - "git add" - ] - }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] - }, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "devDependencies": { - "@commitlint/cli": "^8.1.0", - "@commitlint/config-conventional": "^8.1.0", - "babel-core": "^6.26.3", - "babel-jest": "^24.9.0", - "babel-preset-moxy": "^3.1.0", - "eslint": "^5.16.0", - "eslint-config-moxy": "^7.1.0", - "husky": "^3.0.5", - "jest": "^24.9.0", - "lint-staged": "^9.2.5", - "mkdirp": "^0.5.1", - "rimraf": "^3.0.0", - "standard-version": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } -} diff --git a/tests/wcag-compliance/node_modules/execa/index.d.ts b/tests/wcag-compliance/node_modules/execa/index.d.ts deleted file mode 100644 index f9cf418..0000000 --- a/tests/wcag-compliance/node_modules/execa/index.d.ts +++ /dev/null @@ -1,586 +0,0 @@ -import {Buffer} from 'node:buffer'; -import {ChildProcess} from 'node:child_process'; -import {Stream, Readable as ReadableStream} from 'node:stream'; - -export type StdioOption = - | 'pipe' - | 'ipc' - | 'ignore' - | 'inherit' - | Stream - | number - | undefined; - -export interface CommonOptions { - /** - Kill the spawned process when the parent process exits unless either: - - the spawned process is [`detached`](https://nodejs.org/api/child_process.html#child_process_options_detached) - - the parent process is terminated abruptly, for example, with `SIGKILL` as opposed to `SIGTERM` or a normal exit - - @default true - */ - readonly cleanup?: boolean; - - /** - Prefer locally installed binaries when looking for a binary to execute. - - If you `$ npm install foo`, you can then `execa('foo')`. - - @default false - */ - readonly preferLocal?: boolean; - - /** - Preferred path to find locally installed binaries in (use with `preferLocal`). - - Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. - - @default process.cwd() - */ - readonly localDir?: string | URL; - - /** - Path to the Node.js executable to use in child processes. - - This can be either an absolute path or a path relative to the `cwd` option. - - Requires `preferLocal` to be `true`. - - For example, this can be used together with [`get-node`](https://github.com/ehmicky/get-node) to run a specific Node.js version in a child process. - - @default process.execPath - */ - readonly execPath?: string; - - /** - Buffer the output from the spawned process. When set to `false`, you must read the output of `stdout` and `stderr` (or `all` if the `all` option is `true`). Otherwise the returned promise will not be resolved/rejected. - - If the spawned process fails, `error.stdout`, `error.stderr`, and `error.all` will contain the buffered data. - - @default true - */ - readonly buffer?: boolean; - - /** - Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). - - @default 'pipe' - */ - readonly stdin?: StdioOption; - - /** - Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). - - @default 'pipe' - */ - readonly stdout?: StdioOption; - - /** - Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). - - @default 'pipe' - */ - readonly stderr?: StdioOption; - - /** - Setting this to `false` resolves the promise with the error instead of rejecting it. - - @default true - */ - readonly reject?: boolean; - - /** - Add an `.all` property on the promise and the resolved value. The property contains the output of the process with `stdout` and `stderr` interleaved. - - @default false - */ - readonly all?: boolean; - - /** - Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from the output. - - @default true - */ - readonly stripFinalNewline?: boolean; - - /** - Set to `false` if you don't want to extend the environment variables when providing the `env` property. - - @default true - */ - readonly extendEnv?: boolean; - - /** - Current working directory of the child process. - - Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. - - @default process.cwd() - */ - readonly cwd?: string | URL; - - /** - Environment key-value pairs. Extends automatically from `process.env`. Set `extendEnv` to `false` if you don't want this. - - @default process.env - */ - readonly env?: NodeJS.ProcessEnv; - - /** - Explicitly set the value of `argv[0]` sent to the child process. This will be set to `command` or `file` if not specified. - */ - readonly argv0?: string; - - /** - Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration. - - @default 'pipe' - */ - readonly stdio?: 'pipe' | 'ignore' | 'inherit' | readonly StdioOption[]; - - /** - Specify the kind of serialization used for sending messages between processes when using the `stdio: 'ipc'` option or `execaNode()`: - - `json`: Uses `JSON.stringify()` and `JSON.parse()`. - - `advanced`: Uses [`v8.serialize()`](https://nodejs.org/api/v8.html#v8_v8_serialize_value) - - Requires Node.js `13.2.0` or later. - - [More info.](https://nodejs.org/api/child_process.html#child_process_advanced_serialization) - - @default 'json' - */ - readonly serialization?: 'json' | 'advanced'; - - /** - Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached). - - @default false - */ - readonly detached?: boolean; - - /** - Sets the user identity of the process. - */ - readonly uid?: number; - - /** - Sets the group identity of the process. - */ - readonly gid?: number; - - /** - If `true`, runs `command` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows. - - We recommend against using this option since it is: - - not cross-platform, encouraging shell-specific syntax. - - slower, because of the additional shell interpretation. - - unsafe, potentially allowing command injection. - - @default false - */ - readonly shell?: boolean | string; - - /** - Specify the character encoding used to decode the `stdout` and `stderr` output. If set to `null`, then `stdout` and `stderr` will be a `Buffer` instead of a string. - - @default 'utf8' - */ - readonly encoding?: EncodingType; - - /** - If `timeout` is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than `timeout` milliseconds. - - @default 0 - */ - readonly timeout?: number; - - /** - Largest amount of data in bytes allowed on `stdout` or `stderr`. Default: 100 MB. - - @default 100_000_000 - */ - readonly maxBuffer?: number; - - /** - Signal value to be used when the spawned process will be killed. - - @default 'SIGTERM' - */ - readonly killSignal?: string | number; - - /** - You can abort the spawned process using [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController). - - When `AbortController.abort()` is called, [`.isCanceled`](https://github.com/sindresorhus/execa#iscanceled) becomes `false`. - - *Requires Node.js 16 or later.* - - @example - ```js - import {execa} from 'execa'; - - const abortController = new AbortController(); - const subprocess = execa('node', [], {signal: abortController.signal}); - - setTimeout(() => { - abortController.abort(); - }, 1000); - - try { - await subprocess; - } catch (error) { - console.log(subprocess.killed); // true - console.log(error.isCanceled); // true - } - ``` - */ - readonly signal?: AbortSignal; - - /** - If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`. - - @default false - */ - readonly windowsVerbatimArguments?: boolean; - - /** - On Windows, do not create a new console window. Please note this also prevents `CTRL-C` [from working](https://github.com/nodejs/node/issues/29837) on Windows. - - @default true - */ - readonly windowsHide?: boolean; -} - -export interface Options extends CommonOptions { - /** - Write some input to the `stdin` of your binary. - */ - readonly input?: string | Buffer | ReadableStream; -} - -export interface SyncOptions extends CommonOptions { - /** - Write some input to the `stdin` of your binary. - */ - readonly input?: string | Buffer; -} - -export interface NodeOptions extends Options { - /** - The Node.js executable to use. - - @default process.execPath - */ - readonly nodePath?: string; - - /** - List of [CLI options](https://nodejs.org/api/cli.html#cli_options) passed to the Node.js executable. - - @default process.execArgv - */ - readonly nodeOptions?: string[]; -} - -export interface ExecaReturnBase { - /** - The file and arguments that were run, for logging purposes. - - This is not escaped and should not be executed directly as a process, including using `execa()` or `execaCommand()`. - */ - command: string; - - /** - Same as `command` but escaped. - - This is meant to be copy and pasted into a shell, for debugging purposes. - Since the escaping is fairly basic, this should not be executed directly as a process, including using `execa()` or `execaCommand()`. - */ - escapedCommand: string; - - /** - The numeric exit code of the process that was run. - */ - exitCode: number; - - /** - The output of the process on stdout. - */ - stdout: StdoutStderrType; - - /** - The output of the process on stderr. - */ - stderr: StdoutStderrType; - - /** - Whether the process failed to run. - */ - failed: boolean; - - /** - Whether the process timed out. - */ - timedOut: boolean; - - /** - Whether the process was killed. - */ - killed: boolean; - - /** - The name of the signal that was used to terminate the process. For example, `SIGFPE`. - - If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. - */ - signal?: string; - - /** - A human-friendly description of the signal that was used to terminate the process. For example, `Floating point arithmetic error`. - - If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. It is also `undefined` when the signal is very uncommon which should seldomly happen. - */ - signalDescription?: string; -} - -export interface ExecaSyncReturnValue - extends ExecaReturnBase { -} - -/** -Result of a child process execution. On success this is a plain object. On failure this is also an `Error` instance. - -The child process fails when: -- its exit code is not `0` -- it was killed with a signal -- timing out -- being canceled -- there's not enough memory or there are already too many child processes -*/ -export interface ExecaReturnValue - extends ExecaSyncReturnValue { - /** - The output of the process with `stdout` and `stderr` interleaved. - - This is `undefined` if either: - - the `all` option is `false` (default value) - - `execaSync()` was used - */ - all?: StdoutErrorType; - - /** - Whether the process was canceled. - - You can cancel the spawned process using the [`signal`](https://github.com/sindresorhus/execa#signal-1) option. - */ - isCanceled: boolean; -} - -export interface ExecaSyncError - extends Error, - ExecaReturnBase { - /** - Error message when the child process failed to run. In addition to the underlying error message, it also contains some information related to why the child process errored. - - The child process stderr then stdout are appended to the end, separated with newlines and not interleaved. - */ - message: string; - - /** - This is the same as the `message` property except it does not include the child process stdout/stderr. - */ - shortMessage: string; - - /** - Original error message. This is the same as the `message` property except it includes neither the child process stdout/stderr nor some additional information added by Execa. - - This is `undefined` unless the child process exited due to an `error` event or a timeout. - */ - originalMessage?: string; -} - -export interface ExecaError - extends ExecaSyncError { - /** - The output of the process with `stdout` and `stderr` interleaved. - - This is `undefined` if either: - - the `all` option is `false` (default value) - - `execaSync()` was used - */ - all?: StdoutErrorType; - - /** - Whether the process was canceled. - */ - isCanceled: boolean; -} - -export interface KillOptions { - /** - Milliseconds to wait for the child process to terminate before sending `SIGKILL`. - - Can be disabled with `false`. - - @default 5000 - */ - forceKillAfterTimeout?: number | false; -} - -export interface ExecaChildPromise { - /** - Stream combining/interleaving [`stdout`](https://nodejs.org/api/child_process.html#child_process_subprocess_stdout) and [`stderr`](https://nodejs.org/api/child_process.html#child_process_subprocess_stderr). - - This is `undefined` if either: - - the `all` option is `false` (the default value) - - both `stdout` and `stderr` options are set to [`'inherit'`, `'ipc'`, `Stream` or `integer`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio) - */ - all?: ReadableStream; - - catch( - onRejected?: (reason: ExecaError) => ResultType | PromiseLike - ): Promise | ResultType>; - - /** - Same as the original [`child_process#kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal), except if `signal` is `SIGTERM` (the default value) and the child process is not terminated after 5 seconds, force it by sending `SIGKILL`. - */ - kill(signal?: string, options?: KillOptions): void; - - /** - Similar to [`childProcess.kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal). This is preferred when cancelling the child process execution as the error is more descriptive and [`childProcessResult.isCanceled`](#iscanceled) is set to `true`. - */ - cancel(): void; -} - -export type ExecaChildProcess = ChildProcess & -ExecaChildPromise & -Promise>; - -/** -Execute a file. - -Think of this as a mix of `child_process.execFile` and `child_process.spawn`. - -@param file - The program/script to execute. -@param arguments - Arguments to pass to `file` on execution. -@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties. - -@example -``` -import {execa} from 'execa'; - -const {stdout} = await execa('echo', ['unicorns']); -console.log(stdout); -//=> 'unicorns' - -// Cancelling a spawned process - -const subprocess = execa('node'); - -setTimeout(() => { - subprocess.cancel() -}, 1000); - -try { - await subprocess; -} catch (error) { - console.log(subprocess.killed); // true - console.log(error.isCanceled); // true -} - -// Pipe the child process stdout to the current stdout -execa('echo', ['unicorns']).stdout.pipe(process.stdout); -``` -*/ -export function execa( - file: string, - arguments?: readonly string[], - options?: Options -): ExecaChildProcess; -export function execa( - file: string, - arguments?: readonly string[], - options?: Options -): ExecaChildProcess; -export function execa(file: string, options?: Options): ExecaChildProcess; -export function execa(file: string, options?: Options): ExecaChildProcess; - -/** -Execute a file synchronously. - -This method throws an `Error` if the command fails. - -@param file - The program/script to execute. -@param arguments - Arguments to pass to `file` on execution. -@returns A result `Object` with `stdout` and `stderr` properties. -*/ -export function execaSync( - file: string, - arguments?: readonly string[], - options?: SyncOptions -): ExecaSyncReturnValue; -export function execaSync( - file: string, - arguments?: readonly string[], - options?: SyncOptions -): ExecaSyncReturnValue; -export function execaSync(file: string, options?: SyncOptions): ExecaSyncReturnValue; -export function execaSync( - file: string, - options?: SyncOptions -): ExecaSyncReturnValue; - -/** -Same as `execa()` except both file and arguments are specified in a single `command` string. For example, `execa('echo', ['unicorns'])` is the same as `execaCommand('echo unicorns')`. - -If the file or an argument contains spaces, they must be escaped with backslashes. This matters especially if `command` is not a constant but a variable, for example with `__dirname` or `process.cwd()`. Except for spaces, no escaping/quoting is needed. - -The `shell` option must be used if the `command` uses shell-specific features (for example, `&&` or `||`), as opposed to being a simple `file` followed by its `arguments`. - -@param command - The program/script to execute and its arguments. -@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties. - -@example -``` -import {execaCommand} from 'execa'; - -const {stdout} = await execaCommand('echo unicorns'); -console.log(stdout); -//=> 'unicorns' -``` -*/ -export function execaCommand(command: string, options?: Options): ExecaChildProcess; -export function execaCommand(command: string, options?: Options): ExecaChildProcess; - -/** -Same as `execaCommand()` but synchronous. - -@param command - The program/script to execute and its arguments. -@returns A result `Object` with `stdout` and `stderr` properties. -*/ -export function execaCommandSync(command: string, options?: SyncOptions): ExecaSyncReturnValue; -export function execaCommandSync(command: string, options?: SyncOptions): ExecaSyncReturnValue; - -/** -Execute a Node.js script as a child process. - -Same as `execa('node', [scriptPath, ...arguments], options)` except (like [`child_process#fork()`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)): - - the current Node version and options are used. This can be overridden using the `nodePath` and `nodeArguments` options. - - the `shell` option cannot be used - - an extra channel [`ipc`](https://nodejs.org/api/child_process.html#child_process_options_stdio) is passed to [`stdio`](#stdio) - -@param scriptPath - Node.js script to execute. -@param arguments - Arguments to pass to `scriptPath` on execution. -@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties. -*/ -export function execaNode( - scriptPath: string, - arguments?: readonly string[], - options?: NodeOptions -): ExecaChildProcess; -export function execaNode( - scriptPath: string, - arguments?: readonly string[], - options?: Options -): ExecaChildProcess; -export function execaNode(scriptPath: string, options?: Options): ExecaChildProcess; -export function execaNode(scriptPath: string, options?: Options): ExecaChildProcess; diff --git a/tests/wcag-compliance/node_modules/execa/index.js b/tests/wcag-compliance/node_modules/execa/index.js deleted file mode 100644 index f060590..0000000 --- a/tests/wcag-compliance/node_modules/execa/index.js +++ /dev/null @@ -1,267 +0,0 @@ -import {Buffer} from 'node:buffer'; -import path from 'node:path'; -import childProcess from 'node:child_process'; -import process from 'node:process'; -import crossSpawn from 'cross-spawn'; -import stripFinalNewline from 'strip-final-newline'; -import {npmRunPathEnv} from 'npm-run-path'; -import onetime from 'onetime'; -import {makeError} from './lib/error.js'; -import {normalizeStdio, normalizeStdioNode} from './lib/stdio.js'; -import {spawnedKill, spawnedCancel, setupTimeout, validateTimeout, setExitHandler} from './lib/kill.js'; -import {handleInput, getSpawnedResult, makeAllStream, validateInputSync} from './lib/stream.js'; -import {mergePromise, getSpawnedPromise} from './lib/promise.js'; -import {joinCommand, parseCommand, getEscapedCommand} from './lib/command.js'; - -const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; - -const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { - const env = extendEnv ? {...process.env, ...envOption} : envOption; - - if (preferLocal) { - return npmRunPathEnv({env, cwd: localDir, execPath}); - } - - return env; -}; - -const handleArguments = (file, args, options = {}) => { - const parsed = crossSpawn._parse(file, args, options); - file = parsed.command; - args = parsed.args; - options = parsed.options; - - options = { - maxBuffer: DEFAULT_MAX_BUFFER, - buffer: true, - stripFinalNewline: true, - extendEnv: true, - preferLocal: false, - localDir: options.cwd || process.cwd(), - execPath: process.execPath, - encoding: 'utf8', - reject: true, - cleanup: true, - all: false, - windowsHide: true, - ...options, - }; - - options.env = getEnv(options); - - options.stdio = normalizeStdio(options); - - if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { - // #116 - args.unshift('/q'); - } - - return {file, args, options, parsed}; -}; - -const handleOutput = (options, value, error) => { - if (typeof value !== 'string' && !Buffer.isBuffer(value)) { - // When `execaSync()` errors, we normalize it to '' to mimic `execa()` - return error === undefined ? undefined : ''; - } - - if (options.stripFinalNewline) { - return stripFinalNewline(value); - } - - return value; -}; - -export function execa(file, args, options) { - const parsed = handleArguments(file, args, options); - const command = joinCommand(file, args); - const escapedCommand = getEscapedCommand(file, args); - - validateTimeout(parsed.options); - - let spawned; - try { - spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); - } catch (error) { - // Ensure the returned error is always both a promise and a child process - const dummySpawned = new childProcess.ChildProcess(); - const errorPromise = Promise.reject(makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - escapedCommand, - parsed, - timedOut: false, - isCanceled: false, - killed: false, - })); - return mergePromise(dummySpawned, errorPromise); - } - - const spawnedPromise = getSpawnedPromise(spawned); - const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); - const processDone = setExitHandler(spawned, parsed.options, timedPromise); - - const context = {isCanceled: false}; - - spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); - spawned.cancel = spawnedCancel.bind(null, spawned, context); - - const handlePromise = async () => { - const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); - const stdout = handleOutput(parsed.options, stdoutResult); - const stderr = handleOutput(parsed.options, stderrResult); - const all = handleOutput(parsed.options, allResult); - - if (error || exitCode !== 0 || signal !== null) { - const returnedError = makeError({ - error, - exitCode, - signal, - stdout, - stderr, - all, - command, - escapedCommand, - parsed, - timedOut, - isCanceled: context.isCanceled || (parsed.options.signal ? parsed.options.signal.aborted : false), - killed: spawned.killed, - }); - - if (!parsed.options.reject) { - return returnedError; - } - - throw returnedError; - } - - return { - command, - escapedCommand, - exitCode: 0, - stdout, - stderr, - all, - failed: false, - timedOut: false, - isCanceled: false, - killed: false, - }; - }; - - const handlePromiseOnce = onetime(handlePromise); - - handleInput(spawned, parsed.options.input); - - spawned.all = makeAllStream(spawned, parsed.options); - - return mergePromise(spawned, handlePromiseOnce); -} - -export function execaSync(file, args, options) { - const parsed = handleArguments(file, args, options); - const command = joinCommand(file, args); - const escapedCommand = getEscapedCommand(file, args); - - validateInputSync(parsed.options); - - let result; - try { - result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); - } catch (error) { - throw makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - escapedCommand, - parsed, - timedOut: false, - isCanceled: false, - killed: false, - }); - } - - const stdout = handleOutput(parsed.options, result.stdout, result.error); - const stderr = handleOutput(parsed.options, result.stderr, result.error); - - if (result.error || result.status !== 0 || result.signal !== null) { - const error = makeError({ - stdout, - stderr, - error: result.error, - signal: result.signal, - exitCode: result.status, - command, - escapedCommand, - parsed, - timedOut: result.error && result.error.code === 'ETIMEDOUT', - isCanceled: false, - killed: result.signal !== null, - }); - - if (!parsed.options.reject) { - return error; - } - - throw error; - } - - return { - command, - escapedCommand, - exitCode: 0, - stdout, - stderr, - failed: false, - timedOut: false, - isCanceled: false, - killed: false, - }; -} - -export function execaCommand(command, options) { - const [file, ...args] = parseCommand(command); - return execa(file, args, options); -} - -export function execaCommandSync(command, options) { - const [file, ...args] = parseCommand(command); - return execaSync(file, args, options); -} - -export function execaNode(scriptPath, args, options = {}) { - if (args && !Array.isArray(args) && typeof args === 'object') { - options = args; - args = []; - } - - const stdio = normalizeStdioNode(options); - const defaultExecArgv = process.execArgv.filter(arg => !arg.startsWith('--inspect')); - - const { - nodePath = process.execPath, - nodeOptions = defaultExecArgv, - } = options; - - return execa( - nodePath, - [ - ...nodeOptions, - scriptPath, - ...(Array.isArray(args) ? args : []), - ], - { - ...options, - stdin: undefined, - stdout: undefined, - stderr: undefined, - stdio, - shell: false, - }, - ); -} diff --git a/tests/wcag-compliance/node_modules/execa/lib/command.js b/tests/wcag-compliance/node_modules/execa/lib/command.js deleted file mode 100644 index be64255..0000000 --- a/tests/wcag-compliance/node_modules/execa/lib/command.js +++ /dev/null @@ -1,41 +0,0 @@ -const normalizeArgs = (file, args = []) => { - if (!Array.isArray(args)) { - return [file]; - } - - return [file, ...args]; -}; - -const NO_ESCAPE_REGEXP = /^[\w.-]+$/; -const DOUBLE_QUOTES_REGEXP = /"/g; - -const escapeArg = arg => { - if (typeof arg !== 'string' || NO_ESCAPE_REGEXP.test(arg)) { - return arg; - } - - return `"${arg.replace(DOUBLE_QUOTES_REGEXP, '\\"')}"`; -}; - -export const joinCommand = (file, args) => normalizeArgs(file, args).join(' '); - -export const getEscapedCommand = (file, args) => normalizeArgs(file, args).map(arg => escapeArg(arg)).join(' '); - -const SPACES_REGEXP = / +/g; - -// Handle `execaCommand()` -export const parseCommand = command => { - const tokens = []; - for (const token of command.trim().split(SPACES_REGEXP)) { - // Allow spaces to be escaped by a backslash if not meant as a delimiter - const previousToken = tokens[tokens.length - 1]; - if (previousToken && previousToken.endsWith('\\')) { - // Merge previous token with current one - tokens[tokens.length - 1] = `${previousToken.slice(0, -1)} ${token}`; - } else { - tokens.push(token); - } - } - - return tokens; -}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/error.js b/tests/wcag-compliance/node_modules/execa/lib/error.js deleted file mode 100644 index b12c144..0000000 --- a/tests/wcag-compliance/node_modules/execa/lib/error.js +++ /dev/null @@ -1,85 +0,0 @@ -import {signalsByName} from 'human-signals'; - -const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { - if (timedOut) { - return `timed out after ${timeout} milliseconds`; - } - - if (isCanceled) { - return 'was canceled'; - } - - if (errorCode !== undefined) { - return `failed with ${errorCode}`; - } - - if (signal !== undefined) { - return `was killed with ${signal} (${signalDescription})`; - } - - if (exitCode !== undefined) { - return `failed with exit code ${exitCode}`; - } - - return 'failed'; -}; - -export const makeError = ({ - stdout, - stderr, - all, - error, - signal, - exitCode, - command, - escapedCommand, - timedOut, - isCanceled, - killed, - parsed: {options: {timeout}}, -}) => { - // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. - // We normalize them to `undefined` - exitCode = exitCode === null ? undefined : exitCode; - signal = signal === null ? undefined : signal; - const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; - - const errorCode = error && error.code; - - const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); - const execaMessage = `Command ${prefix}: ${command}`; - const isError = Object.prototype.toString.call(error) === '[object Error]'; - const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage; - const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); - - if (isError) { - error.originalMessage = error.message; - error.message = message; - } else { - error = new Error(message); - } - - error.shortMessage = shortMessage; - error.command = command; - error.escapedCommand = escapedCommand; - error.exitCode = exitCode; - error.signal = signal; - error.signalDescription = signalDescription; - error.stdout = stdout; - error.stderr = stderr; - - if (all !== undefined) { - error.all = all; - } - - if ('bufferedData' in error) { - delete error.bufferedData; - } - - error.failed = true; - error.timedOut = Boolean(timedOut); - error.isCanceled = isCanceled; - error.killed = killed && !timedOut; - - return error; -}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/kill.js b/tests/wcag-compliance/node_modules/execa/lib/kill.js deleted file mode 100644 index efc6b9b..0000000 --- a/tests/wcag-compliance/node_modules/execa/lib/kill.js +++ /dev/null @@ -1,102 +0,0 @@ -import os from 'node:os'; -import onExit from 'signal-exit'; - -const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; - -// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior -export const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { - const killResult = kill(signal); - setKillTimeout(kill, signal, options, killResult); - return killResult; -}; - -const setKillTimeout = (kill, signal, options, killResult) => { - if (!shouldForceKill(signal, options, killResult)) { - return; - } - - const timeout = getForceKillAfterTimeout(options); - const t = setTimeout(() => { - kill('SIGKILL'); - }, timeout); - - // Guarded because there's no `.unref()` when `execa` is used in the renderer - // process in Electron. This cannot be tested since we don't run tests in - // Electron. - // istanbul ignore else - if (t.unref) { - t.unref(); - } -}; - -const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => isSigterm(signal) && forceKillAfterTimeout !== false && killResult; - -const isSigterm = signal => signal === os.constants.signals.SIGTERM - || (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); - -const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { - if (forceKillAfterTimeout === true) { - return DEFAULT_FORCE_KILL_TIMEOUT; - } - - if (!Number.isFinite(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { - throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); - } - - return forceKillAfterTimeout; -}; - -// `childProcess.cancel()` -export const spawnedCancel = (spawned, context) => { - const killResult = spawned.kill(); - - if (killResult) { - context.isCanceled = true; - } -}; - -const timeoutKill = (spawned, signal, reject) => { - spawned.kill(signal); - reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); -}; - -// `timeout` option handling -export const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { - if (timeout === 0 || timeout === undefined) { - return spawnedPromise; - } - - let timeoutId; - const timeoutPromise = new Promise((resolve, reject) => { - timeoutId = setTimeout(() => { - timeoutKill(spawned, killSignal, reject); - }, timeout); - }); - - const safeSpawnedPromise = spawnedPromise.finally(() => { - clearTimeout(timeoutId); - }); - - return Promise.race([timeoutPromise, safeSpawnedPromise]); -}; - -export const validateTimeout = ({timeout}) => { - if (timeout !== undefined && (!Number.isFinite(timeout) || timeout < 0)) { - throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); - } -}; - -// `cleanup` option handling -export const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { - if (!cleanup || detached) { - return timedPromise; - } - - const removeExitHandler = onExit(() => { - spawned.kill(); - }); - - return timedPromise.finally(() => { - removeExitHandler(); - }); -}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/promise.js b/tests/wcag-compliance/node_modules/execa/lib/promise.js deleted file mode 100644 index c655c0e..0000000 --- a/tests/wcag-compliance/node_modules/execa/lib/promise.js +++ /dev/null @@ -1,36 +0,0 @@ -const nativePromisePrototype = (async () => {})().constructor.prototype; -const descriptors = ['then', 'catch', 'finally'].map(property => [ - property, - Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property), -]); - -// The return value is a mixin of `childProcess` and `Promise` -export const mergePromise = (spawned, promise) => { - for (const [property, descriptor] of descriptors) { - // Starting the main `promise` is deferred to avoid consuming streams - const value = typeof promise === 'function' - ? (...args) => Reflect.apply(descriptor.value, promise(), args) - : descriptor.value.bind(promise); - - Reflect.defineProperty(spawned, property, {...descriptor, value}); - } - - return spawned; -}; - -// Use promises instead of `child_process` events -export const getSpawnedPromise = spawned => new Promise((resolve, reject) => { - spawned.on('exit', (exitCode, signal) => { - resolve({exitCode, signal}); - }); - - spawned.on('error', error => { - reject(error); - }); - - if (spawned.stdin) { - spawned.stdin.on('error', error => { - reject(error); - }); - } -}); diff --git a/tests/wcag-compliance/node_modules/execa/lib/stdio.js b/tests/wcag-compliance/node_modules/execa/lib/stdio.js deleted file mode 100644 index e8c1132..0000000 --- a/tests/wcag-compliance/node_modules/execa/lib/stdio.js +++ /dev/null @@ -1,49 +0,0 @@ -const aliases = ['stdin', 'stdout', 'stderr']; - -const hasAlias = options => aliases.some(alias => options[alias] !== undefined); - -export const normalizeStdio = options => { - if (!options) { - return; - } - - const {stdio} = options; - - if (stdio === undefined) { - return aliases.map(alias => options[alias]); - } - - if (hasAlias(options)) { - throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); - } - - if (typeof stdio === 'string') { - return stdio; - } - - if (!Array.isArray(stdio)) { - throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); - } - - const length = Math.max(stdio.length, aliases.length); - return Array.from({length}, (value, index) => stdio[index]); -}; - -// `ipc` is pushed unless it is already present -export const normalizeStdioNode = options => { - const stdio = normalizeStdio(options); - - if (stdio === 'ipc') { - return 'ipc'; - } - - if (stdio === undefined || typeof stdio === 'string') { - return [stdio, stdio, stdio, 'ipc']; - } - - if (stdio.includes('ipc')) { - return stdio; - } - - return [...stdio, 'ipc']; -}; diff --git a/tests/wcag-compliance/node_modules/execa/lib/stream.js b/tests/wcag-compliance/node_modules/execa/lib/stream.js deleted file mode 100644 index b140bf1..0000000 --- a/tests/wcag-compliance/node_modules/execa/lib/stream.js +++ /dev/null @@ -1,88 +0,0 @@ -import {isStream} from 'is-stream'; -import getStream from 'get-stream'; -import mergeStream from 'merge-stream'; - -// `input` option -export const handleInput = (spawned, input) => { - // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 - // @todo remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 - if (input === undefined || spawned.stdin === undefined) { - return; - } - - if (isStream(input)) { - input.pipe(spawned.stdin); - } else { - spawned.stdin.end(input); - } -}; - -// `all` interleaves `stdout` and `stderr` -export const makeAllStream = (spawned, {all}) => { - if (!all || (!spawned.stdout && !spawned.stderr)) { - return; - } - - const mixed = mergeStream(); - - if (spawned.stdout) { - mixed.add(spawned.stdout); - } - - if (spawned.stderr) { - mixed.add(spawned.stderr); - } - - return mixed; -}; - -// On failure, `result.stdout|stderr|all` should contain the currently buffered stream -const getBufferedData = async (stream, streamPromise) => { - if (!stream) { - return; - } - - stream.destroy(); - - try { - return await streamPromise; - } catch (error) { - return error.bufferedData; - } -}; - -const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { - if (!stream || !buffer) { - return; - } - - if (encoding) { - return getStream(stream, {encoding, maxBuffer}); - } - - return getStream.buffer(stream, {maxBuffer}); -}; - -// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) -export const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { - const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); - const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); - const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); - - try { - return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); - } catch (error) { - return Promise.all([ - {error, signal: error.signal, timedOut: error.timedOut}, - getBufferedData(stdout, stdoutPromise), - getBufferedData(stderr, stderrPromise), - getBufferedData(all, allPromise), - ]); - } -}; - -export const validateInputSync = ({input}) => { - if (isStream(input)) { - throw new TypeError('The `input` option cannot be a stream in sync mode'); - } -}; diff --git a/tests/wcag-compliance/node_modules/execa/license b/tests/wcag-compliance/node_modules/execa/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/execa/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/execa/package.json b/tests/wcag-compliance/node_modules/execa/package.json deleted file mode 100644 index 90bd07b..0000000 --- a/tests/wcag-compliance/node_modules/execa/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "execa", - "version": "6.1.0", - "description": "Process execution for humans", - "license": "MIT", - "repository": "sindresorhus/execa", - "funding": "https://github.com/sindresorhus/execa?sponsor=1", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "scripts": { - "test": "xo && c8 ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts", - "lib" - ], - "keywords": [ - "exec", - "child", - "process", - "execute", - "fork", - "execfile", - "spawn", - "file", - "shell", - "bin", - "binary", - "binaries", - "npm", - "path", - "local" - ], - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "devDependencies": { - "@types/node": "^17.0.17", - "ava": "^4.0.1", - "c8": "^7.11.0", - "get-node": "^12.0.0", - "is-running": "^2.1.0", - "p-event": "^5.0.1", - "semver": "^7.3.5", - "tempfile": "^4.0.0", - "tsd": "^0.19.1", - "xo": "^0.48.0" - }, - "c8": { - "reporter": [ - "text", - "lcov" - ], - "exclude": [ - "**/fixtures/**", - "**/test.js", - "**/test/**" - ] - }, - "xo": { - "rules": { - "unicorn/no-empty-file": "off", - "@typescript-eslint/ban-types": "off" - } - } -} diff --git a/tests/wcag-compliance/node_modules/execa/readme.md b/tests/wcag-compliance/node_modules/execa/readme.md deleted file mode 100644 index a529f39..0000000 --- a/tests/wcag-compliance/node_modules/execa/readme.md +++ /dev/null @@ -1,667 +0,0 @@ - -
- -[![Coverage Status](https://codecov.io/gh/sindresorhus/execa/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/execa) - -> Process execution for humans - -## Why - -This package improves [`child_process`](https://nodejs.org/api/child_process.html) methods with: - -- Promise interface. -- [Strips the final newline](#stripfinalnewline) from the output so you don't have to do `stdout.trim()`. -- Supports [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) binaries cross-platform. -- [Improved Windows support.](https://github.com/IndigoUnited/node-cross-spawn#why) -- Higher max buffer. 100 MB instead of 200 KB. -- [Executes locally installed binaries by name.](#preferlocal) -- [Cleans up spawned processes when the parent process dies.](#cleanup) -- [Get interleaved output](#all) from `stdout` and `stderr` similar to what is printed on the terminal. [*(Async only)*](#execasyncfile-arguments-options) -- [Can specify file and arguments as a single string without a shell](#execacommandcommand-options) -- More descriptive errors. - -## Install - -```sh -npm install execa -``` - -## Usage - -```js -import {execa} from 'execa'; - -const {stdout} = await execa('echo', ['unicorns']); -console.log(stdout); -//=> 'unicorns' -``` - -### Pipe the child process stdout to the parent - -```js -import {execa} from 'execa'; - -execa('echo', ['unicorns']).stdout.pipe(process.stdout); -``` - -### Handling Errors - -```js -import {execa} from 'execa'; - -// Catching an error -try { - await execa('unknown', ['command']); -} catch (error) { - console.log(error); - /* - { - message: 'Command failed with ENOENT: unknown command spawn unknown ENOENT', - errno: -2, - code: 'ENOENT', - syscall: 'spawn unknown', - path: 'unknown', - spawnargs: ['command'], - originalMessage: 'spawn unknown ENOENT', - shortMessage: 'Command failed with ENOENT: unknown command spawn unknown ENOENT', - command: 'unknown command', - escapedCommand: 'unknown command', - stdout: '', - stderr: '', - all: '', - failed: true, - timedOut: false, - isCanceled: false, - killed: false - } - */ -} -``` - -### Cancelling a spawned process - -```js -import {execa} from 'execa'; - -const abortController = new AbortController(); -const subprocess = execa('node', [], {signal: abortController.signal}); - -setTimeout(() => { - abortController.abort(); -}, 1000); - -try { - await subprocess; -} catch (error) { - console.log(subprocess.killed); // true - console.log(error.isCanceled); // true -} -``` - -### Catching an error with the sync method - -```js -import {execaSync} from 'execa'; - -try { - execaSync('unknown', ['command']); -} catch (error) { - console.log(error); - /* - { - message: 'Command failed with ENOENT: unknown command spawnSync unknown ENOENT', - errno: -2, - code: 'ENOENT', - syscall: 'spawnSync unknown', - path: 'unknown', - spawnargs: ['command'], - originalMessage: 'spawnSync unknown ENOENT', - shortMessage: 'Command failed with ENOENT: unknown command spawnSync unknown ENOENT', - command: 'unknown command', - escapedCommand: 'unknown command', - stdout: '', - stderr: '', - all: '', - failed: true, - timedOut: false, - isCanceled: false, - killed: false - } - */ -} -``` - -### Kill a process - -Using SIGTERM, and after 2 seconds, kill it with SIGKILL. - -```js -const subprocess = execa('node'); - -setTimeout(() => { - subprocess.kill('SIGTERM', { - forceKillAfterTimeout: 2000 - }); -}, 1000); -``` - -## API - -### execa(file, arguments, options?) - -Execute a file. Think of this as a mix of [`child_process.execFile()`](https://nodejs.org/api/child_process.html#child_process_child_process_execfile_file_args_options_callback) and [`child_process.spawn()`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options). - -No escaping/quoting is needed. - -Unless the [`shell`](#shell) option is used, no shell interpreter (Bash, `cmd.exe`, etc.) is used, so shell features such as variables substitution (`echo $PATH`) are not allowed. - -Returns a [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess) which: - - is also a `Promise` resolving or rejecting with a [`childProcessResult`](#childProcessResult). - - exposes the following additional methods and properties. - -#### kill(signal?, options?) - -Same as the original [`child_process#kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal) except: if `signal` is `SIGTERM` (the default value) and the child process is not terminated after 5 seconds, force it by sending `SIGKILL`. - -##### options.forceKillAfterTimeout - -Type: `number | false`\ -Default: `5000` - -Milliseconds to wait for the child process to terminate before sending `SIGKILL`. - -Can be disabled with `false`. - -#### all - -Type: `ReadableStream | undefined` - -Stream combining/interleaving [`stdout`](https://nodejs.org/api/child_process.html#child_process_subprocess_stdout) and [`stderr`](https://nodejs.org/api/child_process.html#child_process_subprocess_stderr). - -This is `undefined` if either: - - the [`all` option](#all-2) is `false` (the default value) - - both [`stdout`](#stdout-1) and [`stderr`](#stderr-1) options are set to [`'inherit'`, `'ipc'`, `Stream` or `integer`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio) - -### execaSync(file, arguments?, options?) - -Execute a file synchronously. - -Returns or throws a [`childProcessResult`](#childProcessResult). - -### execaCommand(command, options?) - -Same as [`execa()`](#execafile-arguments-options) except both file and arguments are specified in a single `command` string. For example, `execa('echo', ['unicorns'])` is the same as `execaCommand('echo unicorns')`. - -If the file or an argument contains spaces, they must be escaped with backslashes. This matters especially if `command` is not a constant but a variable, for example with `__dirname` or `process.cwd()`. Except for spaces, no escaping/quoting is needed. - -The [`shell` option](#shell) must be used if the `command` uses shell-specific features (for example, `&&` or `||`), as opposed to being a simple `file` followed by its `arguments`. - -### execaCommandSync(command, options?) - -Same as [`execaCommand()`](#execacommand-command-options) but synchronous. - -Returns or throws a [`childProcessResult`](#childProcessResult). - -### execaNode(scriptPath, arguments?, options?) - -Execute a Node.js script as a child process. - -Same as `execa('node', [scriptPath, ...arguments], options)` except (like [`child_process#fork()`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)): - - the current Node version and options are used. This can be overridden using the [`nodePath`](#nodepath-for-node-only) and [`nodeOptions`](#nodeoptions-for-node-only) options. - - the [`shell`](#shell) option cannot be used - - an extra channel [`ipc`](https://nodejs.org/api/child_process.html#child_process_options_stdio) is passed to [`stdio`](#stdio) - -### childProcessResult - -Type: `object` - -Result of a child process execution. On success this is a plain object. On failure this is also an `Error` instance. - -The child process [fails](#failed) when: -- its [exit code](#exitcode) is not `0` -- it was [killed](#killed) with a [signal](#signal) -- [timing out](#timedout) -- [being canceled](#iscanceled) -- there's not enough memory or there are already too many child processes - -#### command - -Type: `string` - -The file and arguments that were run, for logging purposes. - -This is not escaped and should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execaCommand()`](#execacommandcommand-options). - -#### escapedCommand - -Type: `string` - -Same as [`command`](#command) but escaped. - -This is meant to be copy and pasted into a shell, for debugging purposes. -Since the escaping is fairly basic, this should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execaCommand()`](#execacommandcommand-options). - -#### exitCode - -Type: `number` - -The numeric exit code of the process that was run. - -#### stdout - -Type: `string | Buffer` - -The output of the process on stdout. - -#### stderr - -Type: `string | Buffer` - -The output of the process on stderr. - -#### all - -Type: `string | Buffer | undefined` - -The output of the process with `stdout` and `stderr` interleaved. - -This is `undefined` if either: - - the [`all` option](#all-2) is `false` (the default value) - - `execaSync()` was used - -#### failed - -Type: `boolean` - -Whether the process failed to run. - -#### timedOut - -Type: `boolean` - -Whether the process timed out. - -#### isCanceled - -Type: `boolean` - -Whether the process was canceled. - -You can cancel the spawned process using the [`signal`](#signal-1) option. - -#### killed - -Type: `boolean` - -Whether the process was killed. - -#### signal - -Type: `string | undefined` - -The name of the signal that was used to terminate the process. For example, `SIGFPE`. - -If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. - -#### signalDescription - -Type: `string | undefined` - -A human-friendly description of the signal that was used to terminate the process. For example, `Floating point arithmetic error`. - -If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. It is also `undefined` when the signal is very uncommon which should seldomly happen. - -#### message - -Type: `string` - -Error message when the child process failed to run. In addition to the [underlying error message](#originalMessage), it also contains some information related to why the child process errored. - -The child process [stderr](#stderr) then [stdout](#stdout) are appended to the end, separated with newlines and not interleaved. - -#### shortMessage - -Type: `string` - -This is the same as the [`message` property](#message) except it does not include the child process stdout/stderr. - -#### originalMessage - -Type: `string | undefined` - -Original error message. This is the same as the `message` property except it includes neither the child process stdout/stderr nor some additional information added by Execa. - -This is `undefined` unless the child process exited due to an `error` event or a timeout. - -### options - -Type: `object` - -#### cleanup - -Type: `boolean`\ -Default: `true` - -Kill the spawned process when the parent process exits unless either: - - the spawned process is [`detached`](https://nodejs.org/api/child_process.html#child_process_options_detached) - - the parent process is terminated abruptly, for example, with `SIGKILL` as opposed to `SIGTERM` or a normal exit - -#### preferLocal - -Type: `boolean`\ -Default: `false` - -Prefer locally installed binaries when looking for a binary to execute.\ -If you `$ npm install foo`, you can then `execa('foo')`. - -#### localDir - -Type: `string | URL`\ -Default: `process.cwd()` - -Preferred path to find locally installed binaries in (use with `preferLocal`). - -Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. - -#### execPath - -Type: `string`\ -Default: `process.execPath` (Current Node.js executable) - -Path to the Node.js executable to use in child processes. - -This can be either an absolute path or a path relative to the [`cwd` option](#cwd). - -Requires [`preferLocal`](#preferlocal) to be `true`. - -For example, this can be used together with [`get-node`](https://github.com/ehmicky/get-node) to run a specific Node.js version in a child process. - -#### buffer - -Type: `boolean`\ -Default: `true` - -Buffer the output from the spawned process. When set to `false`, you must read the output of [`stdout`](#stdout-1) and [`stderr`](#stderr-1) (or [`all`](#all) if the [`all`](#all-2) option is `true`). Otherwise the returned promise will not be resolved/rejected. - -If the spawned process fails, [`error.stdout`](#stdout), [`error.stderr`](#stderr), and [`error.all`](#all) will contain the buffered data. - -#### input - -Type: `string | Buffer | stream.Readable` - -Write some input to the `stdin` of your binary.\ -Streams are not allowed when using the synchronous methods. - -#### stdin - -Type: `string | number | Stream | undefined`\ -Default: `pipe` - -Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). - -#### stdout - -Type: `string | number | Stream | undefined`\ -Default: `pipe` - -Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). - -#### stderr - -Type: `string | number | Stream | undefined`\ -Default: `pipe` - -Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio). - -#### all - -Type: `boolean`\ -Default: `false` - -Add an `.all` property on the [promise](#all) and the [resolved value](#all-1). The property contains the output of the process with `stdout` and `stderr` interleaved. - -#### reject - -Type: `boolean`\ -Default: `true` - -Setting this to `false` resolves the promise with the error instead of rejecting it. - -#### stripFinalNewline - -Type: `boolean`\ -Default: `true` - -Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from the output. - -#### extendEnv - -Type: `boolean`\ -Default: `true` - -Set to `false` if you don't want to extend the environment variables when providing the `env` property. - ---- - -Execa also accepts the below options which are the same as the options for [`child_process#spawn()`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options)/[`child_process#exec()`](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) - -#### cwd - -Type: `string | URL`\ -Default: `process.cwd()` - -Current working directory of the child process. - -Using a `URL` is only supported in Node.js `14.18.0`, `16.14.0` or above. - -#### env - -Type: `object`\ -Default: `process.env` - -Environment key-value pairs. Extends automatically from `process.env`. Set [`extendEnv`](#extendenv) to `false` if you don't want this. - -#### argv0 - -Type: `string` - -Explicitly set the value of `argv[0]` sent to the child process. This will be set to `file` if not specified. - -#### stdio - -Type: `string | string[]`\ -Default: `pipe` - -Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration. - -#### serialization - -Type: `string`\ -Default: `'json'` - -Specify the kind of serialization used for sending messages between processes when using the [`stdio: 'ipc'`](#stdio) option or [`execaNode()`](#execanodescriptpath-arguments-options): - - `json`: Uses `JSON.stringify()` and `JSON.parse()`. - - `advanced`: Uses [`v8.serialize()`](https://nodejs.org/api/v8.html#v8_v8_serialize_value) - -Requires Node.js `13.2.0` or later. - -[More info.](https://nodejs.org/api/child_process.html#child_process_advanced_serialization) - -#### detached - -Type: `boolean` - -Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached). - -#### uid - -Type: `number` - -Sets the user identity of the process. - -#### gid - -Type: `number` - -Sets the group identity of the process. - -#### shell - -Type: `boolean | string`\ -Default: `false` - -If `true`, runs `file` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows. - -We recommend against using this option since it is: -- not cross-platform, encouraging shell-specific syntax. -- slower, because of the additional shell interpretation. -- unsafe, potentially allowing command injection. - -#### encoding - -Type: `string | null`\ -Default: `utf8` - -Specify the character encoding used to decode the `stdout` and `stderr` output. If set to `null`, then `stdout` and `stderr` will be a `Buffer` instead of a string. - -#### timeout - -Type: `number`\ -Default: `0` - -If timeout is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than timeout milliseconds. - -#### maxBuffer - -Type: `number`\ -Default: `100_000_000` (100 MB) - -Largest amount of data in bytes allowed on `stdout` or `stderr`. - -#### killSignal - -Type: `string | number`\ -Default: `SIGTERM` - -Signal value to be used when the spawned process will be killed. - -#### signal - -Type: [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) - -You can abort the spawned process using [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController). - -When `AbortController.abort()` is called, [`.isCanceled`](#iscanceled) becomes `false`. - -*Requires Node.js 16 or later.* - -#### windowsVerbatimArguments - -Type: `boolean`\ -Default: `false` - -If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`. - -#### windowsHide - -Type: `boolean`\ -Default: `true` - -On Windows, do not create a new console window. Please note this also prevents `CTRL-C` [from working](https://github.com/nodejs/node/issues/29837) on Windows. - -#### nodePath *(For `.node()` only)* - -Type: `string`\ -Default: [`process.execPath`](https://nodejs.org/api/process.html#process_process_execpath) - -Node.js executable used to create the child process. - -#### nodeOptions *(For `.node()` only)* - -Type: `string[]`\ -Default: [`process.execArgv`](https://nodejs.org/api/process.html#process_process_execargv) - -List of [CLI options](https://nodejs.org/api/cli.html#cli_options) passed to the Node.js executable. - -## Tips - -### Retry on error - -Gracefully handle failures by using automatic retries and exponential backoff with the [`p-retry`](https://github.com/sindresorhus/p-retry) package: - -```js -import pRetry from 'p-retry'; - -const run = async () => { - const results = await execa('curl', ['-sSL', 'https://sindresorhus.com/unicorn']); - return results; -}; - -console.log(await pRetry(run, {retries: 5})); -``` - -### Save and pipe output from a child process - -Let's say you want to show the output of a child process in real-time while also saving it to a variable. - -```js -import {execa} from 'execa'; - -const subprocess = execa('echo', ['foo']); -subprocess.stdout.pipe(process.stdout); - -const {stdout} = await subprocess; -console.log('child output:', stdout); -``` - -### Redirect output to a file - -```js -import {execa} from 'execa'; - -const subprocess = execa('echo', ['foo']) -subprocess.stdout.pipe(fs.createWriteStream('stdout.txt')) -``` - -### Redirect input from a file - -```js -import {execa} from 'execa'; - -const subprocess = execa('cat') -fs.createReadStream('stdin.txt').pipe(subprocess.stdin) -``` - -### Execute the current package's binary - -```js -import {getBinPathSync} from 'get-bin-path'; - -const binPath = getBinPathSync(); -const subprocess = execa(binPath); -``` - -`execa` can be combined with [`get-bin-path`](https://github.com/ehmicky/get-bin-path) to test the current package's binary. As opposed to hard-coding the path to the binary, this validates that the `package.json` `bin` field is correctly set up. - -## Related - -- [gulp-execa](https://github.com/ehmicky/gulp-execa) - Gulp plugin for `execa` -- [nvexeca](https://github.com/ehmicky/nvexeca) - Run `execa` using any Node.js version -- [sudo-prompt](https://github.com/jorangreef/sudo-prompt) - Run commands with elevated privileges. - -## Maintainers - -- [Sindre Sorhus](https://github.com/sindresorhus) -- [@ehmicky](https://github.com/ehmicky) - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/get-stream/buffer-stream.js b/tests/wcag-compliance/node_modules/get-stream/buffer-stream.js deleted file mode 100644 index 2dd7574..0000000 --- a/tests/wcag-compliance/node_modules/get-stream/buffer-stream.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; -const {PassThrough: PassThroughStream} = require('stream'); - -module.exports = options => { - options = {...options}; - - const {array} = options; - let {encoding} = options; - const isBuffer = encoding === 'buffer'; - let objectMode = false; - - if (array) { - objectMode = !(encoding || isBuffer); - } else { - encoding = encoding || 'utf8'; - } - - if (isBuffer) { - encoding = null; - } - - const stream = new PassThroughStream({objectMode}); - - if (encoding) { - stream.setEncoding(encoding); - } - - let length = 0; - const chunks = []; - - stream.on('data', chunk => { - chunks.push(chunk); - - if (objectMode) { - length = chunks.length; - } else { - length += chunk.length; - } - }); - - stream.getBufferedValue = () => { - if (array) { - return chunks; - } - - return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); - }; - - stream.getBufferedLength = () => length; - - return stream; -}; diff --git a/tests/wcag-compliance/node_modules/get-stream/index.d.ts b/tests/wcag-compliance/node_modules/get-stream/index.d.ts deleted file mode 100644 index 9485b2b..0000000 --- a/tests/wcag-compliance/node_modules/get-stream/index.d.ts +++ /dev/null @@ -1,105 +0,0 @@ -/// -import {Stream} from 'stream'; - -declare class MaxBufferErrorClass extends Error { - readonly name: 'MaxBufferError'; - constructor(); -} - -declare namespace getStream { - interface Options { - /** - Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `MaxBufferError` error. - - @default Infinity - */ - readonly maxBuffer?: number; - } - - interface OptionsWithEncoding extends Options { - /** - [Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream. - - @default 'utf8' - */ - readonly encoding?: EncodingType; - } - - type MaxBufferError = MaxBufferErrorClass; -} - -declare const getStream: { - /** - Get the `stream` as a string. - - @returns A promise that resolves when the end event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode. - - @example - ``` - import * as fs from 'fs'; - import getStream = require('get-stream'); - - (async () => { - const stream = fs.createReadStream('unicorn.txt'); - - console.log(await getStream(stream)); - // ,,))))))));, - // __)))))))))))))), - // \|/ -\(((((''''((((((((. - // -*-==//////(('' . `)))))), - // /|\ ))| o ;-. '((((( ,(, - // ( `| / ) ;))))' ,_))^;(~ - // | | | ,))((((_ _____------~~~-. %,;(;(>';'~ - // o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~ - // ; ''''```` `: `:::|\,__,%% );`'; ~ - // | _ ) / `:|`----' `-' - // ______/\/~ | / / - // /~;;.____/;;' / ___--,-( `;;;/ - // / // _;______;'------~~~~~ /;;/\ / - // // | | / ; \;;,\ - // (<_ | ; /',/-----' _> - // \_| ||_ //~;~~~~~~~~~ - // `\_| (,~~ - // \~\ - // ~~ - })(); - ``` - */ - (stream: Stream, options?: getStream.OptionsWithEncoding): Promise; - - /** - Get the `stream` as a buffer. - - It honors the `maxBuffer` option as above, but it refers to byte length rather than string length. - */ - buffer( - stream: Stream, - options?: getStream.Options - ): Promise; - - /** - Get the `stream` as an array of values. - - It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen: - - - When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes). - - When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array. - - When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array. - */ - array( - stream: Stream, - options?: getStream.Options - ): Promise; - array( - stream: Stream, - options: getStream.OptionsWithEncoding<'buffer'> - ): Promise; - array( - stream: Stream, - options: getStream.OptionsWithEncoding - ): Promise; - - MaxBufferError: typeof MaxBufferErrorClass; -}; - -export = getStream; diff --git a/tests/wcag-compliance/node_modules/get-stream/index.js b/tests/wcag-compliance/node_modules/get-stream/index.js deleted file mode 100644 index 1c5d028..0000000 --- a/tests/wcag-compliance/node_modules/get-stream/index.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; -const {constants: BufferConstants} = require('buffer'); -const stream = require('stream'); -const {promisify} = require('util'); -const bufferStream = require('./buffer-stream'); - -const streamPipelinePromisified = promisify(stream.pipeline); - -class MaxBufferError extends Error { - constructor() { - super('maxBuffer exceeded'); - this.name = 'MaxBufferError'; - } -} - -async function getStream(inputStream, options) { - if (!inputStream) { - throw new Error('Expected a stream'); - } - - options = { - maxBuffer: Infinity, - ...options - }; - - const {maxBuffer} = options; - const stream = bufferStream(options); - - await new Promise((resolve, reject) => { - const rejectPromise = error => { - // Don't retrieve an oversized buffer. - if (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) { - error.bufferedData = stream.getBufferedValue(); - } - - reject(error); - }; - - (async () => { - try { - await streamPipelinePromisified(inputStream, stream); - resolve(); - } catch (error) { - rejectPromise(error); - } - })(); - - stream.on('data', () => { - if (stream.getBufferedLength() > maxBuffer) { - rejectPromise(new MaxBufferError()); - } - }); - }); - - return stream.getBufferedValue(); -} - -module.exports = getStream; -module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); -module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); -module.exports.MaxBufferError = MaxBufferError; diff --git a/tests/wcag-compliance/node_modules/get-stream/license b/tests/wcag-compliance/node_modules/get-stream/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/get-stream/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/get-stream/package.json b/tests/wcag-compliance/node_modules/get-stream/package.json deleted file mode 100644 index bd47a75..0000000 --- a/tests/wcag-compliance/node_modules/get-stream/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "get-stream", - "version": "6.0.1", - "description": "Get a stream as a string, buffer, or array", - "license": "MIT", - "repository": "sindresorhus/get-stream", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "engines": { - "node": ">=10" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts", - "buffer-stream.js" - ], - "keywords": [ - "get", - "stream", - "promise", - "concat", - "string", - "text", - "buffer", - "read", - "data", - "consume", - "readable", - "readablestream", - "array", - "object" - ], - "devDependencies": { - "@types/node": "^14.0.27", - "ava": "^2.4.0", - "into-stream": "^5.0.0", - "tsd": "^0.13.1", - "xo": "^0.24.0" - } -} diff --git a/tests/wcag-compliance/node_modules/get-stream/readme.md b/tests/wcag-compliance/node_modules/get-stream/readme.md deleted file mode 100644 index 70b01fd..0000000 --- a/tests/wcag-compliance/node_modules/get-stream/readme.md +++ /dev/null @@ -1,124 +0,0 @@ -# get-stream - -> Get a stream as a string, buffer, or array - -## Install - -``` -$ npm install get-stream -``` - -## Usage - -```js -const fs = require('fs'); -const getStream = require('get-stream'); - -(async () => { - const stream = fs.createReadStream('unicorn.txt'); - - console.log(await getStream(stream)); - /* - ,,))))))));, - __)))))))))))))), - \|/ -\(((((''''((((((((. - -*-==//////(('' . `)))))), - /|\ ))| o ;-. '((((( ,(, - ( `| / ) ;))))' ,_))^;(~ - | | | ,))((((_ _____------~~~-. %,;(;(>';'~ - o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~ - ; ''''```` `: `:::|\,__,%% );`'; ~ - | _ ) / `:|`----' `-' - ______/\/~ | / / - /~;;.____/;;' / ___--,-( `;;;/ - / // _;______;'------~~~~~ /;;/\ / - // | | / ; \;;,\ - (<_ | ; /',/-----' _> - \_| ||_ //~;~~~~~~~~~ - `\_| (,~~ - \~\ - ~~ - */ -})(); -``` - -## API - -The methods returns a promise that resolves when the `end` event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode. - -### getStream(stream, options?) - -Get the `stream` as a string. - -#### options - -Type: `object` - -##### encoding - -Type: `string`\ -Default: `'utf8'` - -[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream. - -##### maxBuffer - -Type: `number`\ -Default: `Infinity` - -Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `getStream.MaxBufferError` error. - -### getStream.buffer(stream, options?) - -Get the `stream` as a buffer. - -It honors the `maxBuffer` option as above, but it refers to byte length rather than string length. - -### getStream.array(stream, options?) - -Get the `stream` as an array of values. - -It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen: - -- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes). - -- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array. - -- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array. - -## Errors - -If the input stream emits an `error` event, the promise will be rejected with the error. The buffered data will be attached to the `bufferedData` property of the error. - -```js -(async () => { - try { - await getStream(streamThatErrorsAtTheEnd('unicorn')); - } catch (error) { - console.log(error.bufferedData); - //=> 'unicorn' - } -})() -``` - -## FAQ - -### How is this different from [`concat-stream`](https://github.com/maxogden/concat-stream)? - -This module accepts a stream instead of being one and returns a promise instead of using a callback. The API is simpler and it only supports returning a string, buffer, or array. It doesn't have a fragile type inference. You explicitly choose what you want. And it doesn't depend on the huge `readable-stream` package. - -## Related - -- [get-stdin](https://github.com/sindresorhus/get-stdin) - Get stdin as a string or buffer - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/human-signals/LICENSE b/tests/wcag-compliance/node_modules/human-signals/LICENSE deleted file mode 100644 index 365f976..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2021 ehmicky - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/tests/wcag-compliance/node_modules/human-signals/README.md b/tests/wcag-compliance/node_modules/human-signals/README.md deleted file mode 100644 index 08a2ac1..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/README.md +++ /dev/null @@ -1,164 +0,0 @@ -[![Codecov](https://img.shields.io/codecov/c/github/ehmicky/human-signals.svg?label=tested&logo=codecov)](https://codecov.io/gh/ehmicky/human-signals) -[![Build](https://github.com/ehmicky/human-signals/workflows/Build/badge.svg)](https://github.com/ehmicky/human-signals/actions) -[![Node](https://img.shields.io/node/v/human-signals.svg?logo=node.js)](https://www.npmjs.com/package/human-signals) -[![Twitter](https://img.shields.io/badge/%E2%80%8B-twitter-4cc61e.svg?logo=twitter)](https://twitter.com/intent/follow?screen_name=ehmicky) -[![Medium](https://img.shields.io/badge/%E2%80%8B-medium-4cc61e.svg?logo=medium)](https://medium.com/@ehmicky) - -Human-friendly process signals. - -This is a map of known process signals with some information about each signal. - -Unlike -[`os.constants.signals`](https://nodejs.org/api/os.html#os_signal_constants) -this includes: - -- human-friendly [descriptions](#description) -- [default actions](#action), including whether they [can be prevented](#forced) -- whether the signal is [supported](#supported) by the current OS - -# Example - -```js -import { signalsByName, signalsByNumber } from 'human-signals' - -console.log(signalsByName.SIGINT) -// { -// name: 'SIGINT', -// number: 2, -// description: 'User interruption with CTRL-C', -// supported: true, -// action: 'terminate', -// forced: false, -// standard: 'ansi' -// } - -console.log(signalsByNumber[8]) -// { -// name: 'SIGFPE', -// number: 8, -// description: 'Floating point arithmetic error', -// supported: true, -// action: 'core', -// forced: false, -// standard: 'ansi' -// } -``` - -# Install - -```bash -npm install human-signals -``` - -This package is an ES module and must be loaded using -[an `import` or `import()` statement](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c), -not `require()`. - -# Usage - -## signalsByName - -_Type_: `object` - -Object whose keys are signal [names](#name) and values are -[signal objects](#signal). - -## signalsByNumber - -_Type_: `object` - -Object whose keys are signal [numbers](#number) and values are -[signal objects](#signal). - -## signal - -_Type_: `object` - -Signal object with the following properties. - -### name - -_Type_: `string` - -Standard name of the signal, for example `'SIGINT'`. - -### number - -_Type_: `number` - -Code number of the signal, for example `2`. While most `number` are -cross-platform, some are different between different OS. - -### description - -_Type_: `string` - -Human-friendly description for the signal, for example -`'User interruption with CTRL-C'`. - -### supported - -_Type_: `boolean` - -Whether the current OS can handle this signal in Node.js using -[`process.on(name, handler)`](https://nodejs.org/api/process.html#process_signal_events). - -The list of supported signals -[is OS-specific](https://github.com/ehmicky/cross-platform-node-guide/blob/main/docs/6_networking_ipc/signals.md#cross-platform-signals). - -### action - -_Type_: `string`\ -_Enum_: `'terminate'`, `'core'`, `'ignore'`, `'pause'`, `'unpause'` - -What is the default action for this signal when it is not handled. - -### forced - -_Type_: `boolean` - -Whether the signal's default action cannot be prevented. This is `true` for -`SIGTERM`, `SIGKILL` and `SIGSTOP`. - -### standard - -_Type_: `string`\ -_Enum_: `'ansi'`, `'posix'`, `'bsd'`, `'systemv'`, `'other'` - -Which standard defined that signal. - -# Support - -For any question, _don't hesitate_ to [submit an issue on GitHub](../../issues). - -Everyone is welcome regardless of personal background. We enforce a -[Code of conduct](CODE_OF_CONDUCT.md) in order to promote a positive and -inclusive environment. - -# Contributing - -This project was made with ❤️. The simplest way to give back is by starring and -sharing it online. - -If the documentation is unclear or has a typo, please click on the page's `Edit` -button (pencil icon) and suggest a correction. - -If you would like to help us fix a bug or add a new feature, please check our -[guidelines](CONTRIBUTING.md). Pull requests are welcome! - -Thanks go to our wonderful contributors: - - - - - - - - - -

ehmicky

💻 🎨 🤔 📖

electrovir

💻
- - - - - diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/core.js b/tests/wcag-compliance/node_modules/human-signals/build/src/core.js deleted file mode 100644 index c3a9773..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/core.js +++ /dev/null @@ -1,273 +0,0 @@ - - -export const SIGNALS=[ -{ -name:"SIGHUP", -number:1, -action:"terminate", -description:"Terminal closed", -standard:"posix"}, - -{ -name:"SIGINT", -number:2, -action:"terminate", -description:"User interruption with CTRL-C", -standard:"ansi"}, - -{ -name:"SIGQUIT", -number:3, -action:"core", -description:"User interruption with CTRL-\\", -standard:"posix"}, - -{ -name:"SIGILL", -number:4, -action:"core", -description:"Invalid machine instruction", -standard:"ansi"}, - -{ -name:"SIGTRAP", -number:5, -action:"core", -description:"Debugger breakpoint", -standard:"posix"}, - -{ -name:"SIGABRT", -number:6, -action:"core", -description:"Aborted", -standard:"ansi"}, - -{ -name:"SIGIOT", -number:6, -action:"core", -description:"Aborted", -standard:"bsd"}, - -{ -name:"SIGBUS", -number:7, -action:"core", -description: -"Bus error due to misaligned, non-existing address or paging error", -standard:"bsd"}, - -{ -name:"SIGEMT", -number:7, -action:"terminate", -description:"Command should be emulated but is not implemented", -standard:"other"}, - -{ -name:"SIGFPE", -number:8, -action:"core", -description:"Floating point arithmetic error", -standard:"ansi"}, - -{ -name:"SIGKILL", -number:9, -action:"terminate", -description:"Forced termination", -standard:"posix", -forced:true}, - -{ -name:"SIGUSR1", -number:10, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, - -{ -name:"SIGSEGV", -number:11, -action:"core", -description:"Segmentation fault", -standard:"ansi"}, - -{ -name:"SIGUSR2", -number:12, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, - -{ -name:"SIGPIPE", -number:13, -action:"terminate", -description:"Broken pipe or socket", -standard:"posix"}, - -{ -name:"SIGALRM", -number:14, -action:"terminate", -description:"Timeout or timer", -standard:"posix"}, - -{ -name:"SIGTERM", -number:15, -action:"terminate", -description:"Termination", -standard:"ansi"}, - -{ -name:"SIGSTKFLT", -number:16, -action:"terminate", -description:"Stack is empty or overflowed", -standard:"other"}, - -{ -name:"SIGCHLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"posix"}, - -{ -name:"SIGCLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"other"}, - -{ -name:"SIGCONT", -number:18, -action:"unpause", -description:"Unpaused", -standard:"posix", -forced:true}, - -{ -name:"SIGSTOP", -number:19, -action:"pause", -description:"Paused", -standard:"posix", -forced:true}, - -{ -name:"SIGTSTP", -number:20, -action:"pause", -description:"Paused using CTRL-Z or \"suspend\"", -standard:"posix"}, - -{ -name:"SIGTTIN", -number:21, -action:"pause", -description:"Background process cannot read terminal input", -standard:"posix"}, - -{ -name:"SIGBREAK", -number:21, -action:"terminate", -description:"User interruption with CTRL-BREAK", -standard:"other"}, - -{ -name:"SIGTTOU", -number:22, -action:"pause", -description:"Background process cannot write to terminal output", -standard:"posix"}, - -{ -name:"SIGURG", -number:23, -action:"ignore", -description:"Socket received out-of-band data", -standard:"bsd"}, - -{ -name:"SIGXCPU", -number:24, -action:"core", -description:"Process timed out", -standard:"bsd"}, - -{ -name:"SIGXFSZ", -number:25, -action:"core", -description:"File too big", -standard:"bsd"}, - -{ -name:"SIGVTALRM", -number:26, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, - -{ -name:"SIGPROF", -number:27, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, - -{ -name:"SIGWINCH", -number:28, -action:"ignore", -description:"Terminal window size changed", -standard:"bsd"}, - -{ -name:"SIGIO", -number:29, -action:"terminate", -description:"I/O is available", -standard:"other"}, - -{ -name:"SIGPOLL", -number:29, -action:"terminate", -description:"Watched event", -standard:"other"}, - -{ -name:"SIGINFO", -number:29, -action:"ignore", -description:"Request for process information", -standard:"other"}, - -{ -name:"SIGPWR", -number:30, -action:"terminate", -description:"Device running out of power", -standard:"systemv"}, - -{ -name:"SIGSYS", -number:31, -action:"core", -description:"Invalid system call", -standard:"other"}, - -{ -name:"SIGUNUSED", -number:31, -action:"terminate", -description:"Invalid system call", -standard:"other"}]; -//# sourceMappingURL=core.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map deleted file mode 100644 index e3545c9..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/core.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/core.js"],"names":["SIGNALS","name","number","action","description","standard","forced"],"mappings":"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","sourcesContent":["/* eslint-disable max-lines */\n// List of known process signals with information about them\nexport const SIGNALS = [\n {\n name: 'SIGHUP',\n number: 1,\n action: 'terminate',\n description: 'Terminal closed',\n standard: 'posix',\n },\n {\n name: 'SIGINT',\n number: 2,\n action: 'terminate',\n description: 'User interruption with CTRL-C',\n standard: 'ansi',\n },\n {\n name: 'SIGQUIT',\n number: 3,\n action: 'core',\n description: 'User interruption with CTRL-\\\\',\n standard: 'posix',\n },\n {\n name: 'SIGILL',\n number: 4,\n action: 'core',\n description: 'Invalid machine instruction',\n standard: 'ansi',\n },\n {\n name: 'SIGTRAP',\n number: 5,\n action: 'core',\n description: 'Debugger breakpoint',\n standard: 'posix',\n },\n {\n name: 'SIGABRT',\n number: 6,\n action: 'core',\n description: 'Aborted',\n standard: 'ansi',\n },\n {\n name: 'SIGIOT',\n number: 6,\n action: 'core',\n description: 'Aborted',\n standard: 'bsd',\n },\n {\n name: 'SIGBUS',\n number: 7,\n action: 'core',\n description:\n 'Bus error due to misaligned, non-existing address or paging error',\n standard: 'bsd',\n },\n {\n name: 'SIGEMT',\n number: 7,\n action: 'terminate',\n description: 'Command should be emulated but is not implemented',\n standard: 'other',\n },\n {\n name: 'SIGFPE',\n number: 8,\n action: 'core',\n description: 'Floating point arithmetic error',\n standard: 'ansi',\n },\n {\n name: 'SIGKILL',\n number: 9,\n action: 'terminate',\n description: 'Forced termination',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGUSR1',\n number: 10,\n action: 'terminate',\n description: 'Application-specific signal',\n standard: 'posix',\n },\n {\n name: 'SIGSEGV',\n number: 11,\n action: 'core',\n description: 'Segmentation fault',\n standard: 'ansi',\n },\n {\n name: 'SIGUSR2',\n number: 12,\n action: 'terminate',\n description: 'Application-specific signal',\n standard: 'posix',\n },\n {\n name: 'SIGPIPE',\n number: 13,\n action: 'terminate',\n description: 'Broken pipe or socket',\n standard: 'posix',\n },\n {\n name: 'SIGALRM',\n number: 14,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'posix',\n },\n {\n name: 'SIGTERM',\n number: 15,\n action: 'terminate',\n description: 'Termination',\n standard: 'ansi',\n },\n {\n name: 'SIGSTKFLT',\n number: 16,\n action: 'terminate',\n description: 'Stack is empty or overflowed',\n standard: 'other',\n },\n {\n name: 'SIGCHLD',\n number: 17,\n action: 'ignore',\n description: 'Child process terminated, paused or unpaused',\n standard: 'posix',\n },\n {\n name: 'SIGCLD',\n number: 17,\n action: 'ignore',\n description: 'Child process terminated, paused or unpaused',\n standard: 'other',\n },\n {\n name: 'SIGCONT',\n number: 18,\n action: 'unpause',\n description: 'Unpaused',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGSTOP',\n number: 19,\n action: 'pause',\n description: 'Paused',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGTSTP',\n number: 20,\n action: 'pause',\n description: 'Paused using CTRL-Z or \"suspend\"',\n standard: 'posix',\n },\n {\n name: 'SIGTTIN',\n number: 21,\n action: 'pause',\n description: 'Background process cannot read terminal input',\n standard: 'posix',\n },\n {\n name: 'SIGBREAK',\n number: 21,\n action: 'terminate',\n description: 'User interruption with CTRL-BREAK',\n standard: 'other',\n },\n {\n name: 'SIGTTOU',\n number: 22,\n action: 'pause',\n description: 'Background process cannot write to terminal output',\n standard: 'posix',\n },\n {\n name: 'SIGURG',\n number: 23,\n action: 'ignore',\n description: 'Socket received out-of-band data',\n standard: 'bsd',\n },\n {\n name: 'SIGXCPU',\n number: 24,\n action: 'core',\n description: 'Process timed out',\n standard: 'bsd',\n },\n {\n name: 'SIGXFSZ',\n number: 25,\n action: 'core',\n description: 'File too big',\n standard: 'bsd',\n },\n {\n name: 'SIGVTALRM',\n number: 26,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'bsd',\n },\n {\n name: 'SIGPROF',\n number: 27,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'bsd',\n },\n {\n name: 'SIGWINCH',\n number: 28,\n action: 'ignore',\n description: 'Terminal window size changed',\n standard: 'bsd',\n },\n {\n name: 'SIGIO',\n number: 29,\n action: 'terminate',\n description: 'I/O is available',\n standard: 'other',\n },\n {\n name: 'SIGPOLL',\n number: 29,\n action: 'terminate',\n description: 'Watched event',\n standard: 'other',\n },\n {\n name: 'SIGINFO',\n number: 29,\n action: 'ignore',\n description: 'Request for process information',\n standard: 'other',\n },\n {\n name: 'SIGPWR',\n number: 30,\n action: 'terminate',\n description: 'Device running out of power',\n standard: 'systemv',\n },\n {\n name: 'SIGSYS',\n number: 31,\n action: 'core',\n description: 'Invalid system call',\n standard: 'other',\n },\n {\n name: 'SIGUNUSED',\n number: 31,\n action: 'terminate',\n description: 'Invalid system call',\n standard: 'other',\n },\n]\n/* eslint-enable max-lines */\n"],"file":"src/core.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts b/tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts deleted file mode 100644 index 2dc5ea7..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/main.d.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Object whose keys are signal names and values are signal objects. - */ -export declare const signalsByName: { [signalName: string]: Signal } -/** - * Object whose keys are signal numbers and values are signal objects. - */ -export declare const signalsByNumber: { [signalNumber: string]: Signal } - -export declare type SignalAction = - | 'terminate' - | 'core' - | 'ignore' - | 'pause' - | 'unpause' -export declare type SignalStandard = - | 'ansi' - | 'posix' - | 'bsd' - | 'systemv' - | 'other' - -export declare type Signal = { - /** - * Standard name of the signal, for example 'SIGINT'. - */ - name: string - /** - * Code number of the signal, for example 2. While most number are cross-platform, some are different between different OS. - */ - number: number - /** - * Human-friendly description for the signal, for example 'User interruption with CTRL-C'. - */ - description: string - /** - * Whether the current OS can handle this signal in Node.js using process.on(name, handler). The list of supported signals is OS-specific. - */ - supported: boolean - /** - * What is the default action for this signal when it is not handled. - */ - action: SignalAction - /** - * Whether the signal's default action cannot be prevented. This is true for SIGTERM, SIGKILL and SIGSTOP. - */ - forced: boolean - /** - * Which standard defined that signal. - */ - standard: SignalStandard -} diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/main.js b/tests/wcag-compliance/node_modules/human-signals/build/src/main.js deleted file mode 100644 index b85e70f..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/main.js +++ /dev/null @@ -1,71 +0,0 @@ -import{constants}from"os"; - -import{SIGRTMAX}from"./realtime.js"; -import{getSignals}from"./signals.js"; - - - -const getSignalsByName=function(){ -const signals=getSignals(); -return signals.reduce(getSignalByName,{}); -}; - -const getSignalByName=function( -signalByNameMemo, -{name,number,description,supported,action,forced,standard}) -{ -return{ -...signalByNameMemo, -[name]:{name,number,description,supported,action,forced,standard}}; - -}; - -export const signalsByName=getSignalsByName(); - - - - -const getSignalsByNumber=function(){ -const signals=getSignals(); -const length=SIGRTMAX+1; -const signalsA=Array.from({length},(value,number)=> -getSignalByNumber(number,signals)); - -return Object.assign({},...signalsA); -}; - -const getSignalByNumber=function(number,signals){ -const signal=findSignalByNumber(number,signals); - -if(signal===undefined){ -return{}; -} - -const{name,description,supported,action,forced,standard}=signal; -return{ -[number]:{ -name, -number, -description, -supported, -action, -forced, -standard}}; - - -}; - - - -const findSignalByNumber=function(number,signals){ -const signal=signals.find(({name})=>constants.signals[name]===number); - -if(signal!==undefined){ -return signal; -} - -return signals.find((signalA)=>signalA.number===number); -}; - -export const signalsByNumber=getSignalsByNumber(); -//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map deleted file mode 100644 index f9e5aac..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/main.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/main.js"],"names":["constants","SIGRTMAX","getSignals","getSignalsByName","signals","reduce","getSignalByName","signalByNameMemo","name","number","description","supported","action","forced","standard","signalsByName","getSignalsByNumber","length","signalsA","Array","from","value","getSignalByNumber","Object","assign","signal","findSignalByNumber","undefined","find","signalA","signalsByNumber"],"mappings":"AAAA,OAASA,SAAT,KAA0B,IAA1B;;AAEA,OAASC,QAAT,KAAyB,eAAzB;AACA,OAASC,UAAT,KAA2B,cAA3B;;;;AAIA,KAAMC,CAAAA,gBAAgB,CAAG,UAAY;AACnC,KAAMC,CAAAA,OAAO,CAAGF,UAAU,EAA1B;AACA,MAAOE,CAAAA,OAAO,CAACC,MAAR,CAAeC,eAAf,CAAgC,EAAhC,CAAP;AACD,CAHD;;AAKA,KAAMA,CAAAA,eAAe,CAAG;AACtBC,gBADsB;AAEtB,CAAEC,IAAF,CAAQC,MAAR,CAAgBC,WAAhB,CAA6BC,SAA7B,CAAwCC,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAFsB;AAGtB;AACA,MAAO;AACL,GAAGP,gBADE;AAEL,CAACC,IAAD,EAAQ,CAAEA,IAAF,CAAQC,MAAR,CAAgBC,WAAhB,CAA6BC,SAA7B,CAAwCC,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAFH,CAAP;;AAID,CARD;;AAUA,MAAO,MAAMC,CAAAA,aAAa,CAAGZ,gBAAgB,EAAtC;;;;;AAKP,KAAMa,CAAAA,kBAAkB,CAAG,UAAY;AACrC,KAAMZ,CAAAA,OAAO,CAAGF,UAAU,EAA1B;AACA,KAAMe,CAAAA,MAAM,CAAGhB,QAAQ,CAAG,CAA1B;AACA,KAAMiB,CAAAA,QAAQ,CAAGC,KAAK,CAACC,IAAN,CAAW,CAAEH,MAAF,CAAX,CAAuB,CAACI,KAAD,CAAQZ,MAAR;AACtCa,iBAAiB,CAACb,MAAD,CAASL,OAAT,CADF,CAAjB;;AAGA,MAAOmB,CAAAA,MAAM,CAACC,MAAP,CAAc,EAAd,CAAkB,GAAGN,QAArB,CAAP;AACD,CAPD;;AASA,KAAMI,CAAAA,iBAAiB,CAAG,SAAUb,MAAV,CAAkBL,OAAlB,CAA2B;AACnD,KAAMqB,CAAAA,MAAM,CAAGC,kBAAkB,CAACjB,MAAD,CAASL,OAAT,CAAjC;;AAEA,GAAIqB,MAAM,GAAKE,SAAf,CAA0B;AACxB,MAAO,EAAP;AACD;;AAED,KAAM,CAAEnB,IAAF,CAAQE,WAAR,CAAqBC,SAArB,CAAgCC,MAAhC,CAAwCC,MAAxC,CAAgDC,QAAhD,EAA6DW,MAAnE;AACA,MAAO;AACL,CAAChB,MAAD,EAAU;AACRD,IADQ;AAERC,MAFQ;AAGRC,WAHQ;AAIRC,SAJQ;AAKRC,MALQ;AAMRC,MANQ;AAORC,QAPQ,CADL,CAAP;;;AAWD,CAnBD;;;;AAuBA,KAAMY,CAAAA,kBAAkB,CAAG,SAAUjB,MAAV,CAAkBL,OAAlB,CAA2B;AACpD,KAAMqB,CAAAA,MAAM,CAAGrB,OAAO,CAACwB,IAAR,CAAa,CAAC,CAAEpB,IAAF,CAAD,GAAcR,SAAS,CAACI,OAAV,CAAkBI,IAAlB,IAA4BC,MAAvD,CAAf;;AAEA,GAAIgB,MAAM,GAAKE,SAAf,CAA0B;AACxB,MAAOF,CAAAA,MAAP;AACD;;AAED,MAAOrB,CAAAA,OAAO,CAACwB,IAAR,CAAa,CAACC,OAAD,GAAaA,OAAO,CAACpB,MAAR,GAAmBA,MAA7C,CAAP;AACD,CARD;;AAUA,MAAO,MAAMqB,CAAAA,eAAe,CAAGd,kBAAkB,EAA1C","sourcesContent":["import { constants } from 'os'\n\nimport { SIGRTMAX } from './realtime.js'\nimport { getSignals } from './signals.js'\n\n// Retrieve `signalsByName`, an object mapping signal name to signal properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByName = function () {\n const signals = getSignals()\n return signals.reduce(getSignalByName, {})\n}\n\nconst getSignalByName = function (\n signalByNameMemo,\n { name, number, description, supported, action, forced, standard },\n) {\n return {\n ...signalByNameMemo,\n [name]: { name, number, description, supported, action, forced, standard },\n }\n}\n\nexport const signalsByName = getSignalsByName()\n\n// Retrieve `signalsByNumber`, an object mapping signal number to signal\n// properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByNumber = function () {\n const signals = getSignals()\n const length = SIGRTMAX + 1\n const signalsA = Array.from({ length }, (value, number) =>\n getSignalByNumber(number, signals),\n )\n return Object.assign({}, ...signalsA)\n}\n\nconst getSignalByNumber = function (number, signals) {\n const signal = findSignalByNumber(number, signals)\n\n if (signal === undefined) {\n return {}\n }\n\n const { name, description, supported, action, forced, standard } = signal\n return {\n [number]: {\n name,\n number,\n description,\n supported,\n action,\n forced,\n standard,\n },\n }\n}\n\n// Several signals might end up sharing the same number because of OS-specific\n// numbers, in which case those prevail.\nconst findSignalByNumber = function (number, signals) {\n const signal = signals.find(({ name }) => constants.signals[name] === number)\n\n if (signal !== undefined) {\n return signal\n }\n\n return signals.find((signalA) => signalA.number === number)\n}\n\nexport const signalsByNumber = getSignalsByNumber()\n"],"file":"src/main.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js b/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js deleted file mode 100644 index 16a6627..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js +++ /dev/null @@ -1,19 +0,0 @@ - -export const getRealtimeSignals=function(){ -const length=SIGRTMAX-SIGRTMIN+1; -return Array.from({length},getRealtimeSignal); -}; - -const getRealtimeSignal=function(value,index){ -return{ -name:`SIGRT${index+1}`, -number:SIGRTMIN+index, -action:"terminate", -description:"Application-specific signal (realtime)", -standard:"posix"}; - -}; - -const SIGRTMIN=34; -export const SIGRTMAX=64; -//# sourceMappingURL=realtime.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map deleted file mode 100644 index 2a08148..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/realtime.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/realtime.js"],"names":["getRealtimeSignals","length","SIGRTMAX","SIGRTMIN","Array","from","getRealtimeSignal","value","index","name","number","action","description","standard"],"mappings":";AACA,MAAO,MAAMA,CAAAA,kBAAkB,CAAG,UAAY;AAC5C,KAAMC,CAAAA,MAAM,CAAGC,QAAQ,CAAGC,QAAX,CAAsB,CAArC;AACA,MAAOC,CAAAA,KAAK,CAACC,IAAN,CAAW,CAAEJ,MAAF,CAAX,CAAuBK,iBAAvB,CAAP;AACD,CAHM;;AAKP,KAAMA,CAAAA,iBAAiB,CAAG,SAAUC,KAAV,CAAiBC,KAAjB,CAAwB;AAChD,MAAO;AACLC,IAAI,CAAG,QAAOD,KAAK,CAAG,CAAE,EADnB;AAELE,MAAM,CAAEP,QAAQ,CAAGK,KAFd;AAGLG,MAAM,CAAE,WAHH;AAILC,WAAW,CAAE,wCAJR;AAKLC,QAAQ,CAAE,OALL,CAAP;;AAOD,CARD;;AAUA,KAAMV,CAAAA,QAAQ,CAAG,EAAjB;AACA,MAAO,MAAMD,CAAAA,QAAQ,CAAG,EAAjB","sourcesContent":["// List of realtime signals with information about them\nexport const getRealtimeSignals = function () {\n const length = SIGRTMAX - SIGRTMIN + 1\n return Array.from({ length }, getRealtimeSignal)\n}\n\nconst getRealtimeSignal = function (value, index) {\n return {\n name: `SIGRT${index + 1}`,\n number: SIGRTMIN + index,\n action: 'terminate',\n description: 'Application-specific signal (realtime)',\n standard: 'posix',\n }\n}\n\nconst SIGRTMIN = 34\nexport const SIGRTMAX = 64\n"],"file":"src/realtime.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js b/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js deleted file mode 100644 index 644a041..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js +++ /dev/null @@ -1,35 +0,0 @@ -import{constants}from"os"; - -import{SIGNALS}from"./core.js"; -import{getRealtimeSignals}from"./realtime.js"; - - - -export const getSignals=function(){ -const realtimeSignals=getRealtimeSignals(); -const signals=[...SIGNALS,...realtimeSignals].map(normalizeSignal); -return signals; -}; - - - - - - - -const normalizeSignal=function({ -name, -number:defaultNumber, -description, -action, -forced=false, -standard}) -{ -const{ -signals:{[name]:constantSignal}}= -constants; -const supported=constantSignal!==undefined; -const number=supported?constantSignal:defaultNumber; -return{name,number,description,supported,action,forced,standard}; -}; -//# sourceMappingURL=signals.js.map \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map b/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map deleted file mode 100644 index 0094f87..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/build/src/signals.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../../src/signals.js"],"names":["constants","SIGNALS","getRealtimeSignals","getSignals","realtimeSignals","signals","map","normalizeSignal","name","number","defaultNumber","description","action","forced","standard","constantSignal","supported","undefined"],"mappings":"AAAA,OAASA,SAAT,KAA0B,IAA1B;;AAEA,OAASC,OAAT,KAAwB,WAAxB;AACA,OAASC,kBAAT,KAAmC,eAAnC;;;;AAIA,MAAO,MAAMC,CAAAA,UAAU,CAAG,UAAY;AACpC,KAAMC,CAAAA,eAAe,CAAGF,kBAAkB,EAA1C;AACA,KAAMG,CAAAA,OAAO,CAAG,CAAC,GAAGJ,OAAJ,CAAa,GAAGG,eAAhB,EAAiCE,GAAjC,CAAqCC,eAArC,CAAhB;AACA,MAAOF,CAAAA,OAAP;AACD,CAJM;;;;;;;;AAYP,KAAME,CAAAA,eAAe,CAAG,SAAU;AAChCC,IADgC;AAEhCC,MAAM,CAAEC,aAFwB;AAGhCC,WAHgC;AAIhCC,MAJgC;AAKhCC,MAAM,CAAG,KALuB;AAMhCC,QANgC,CAAV;AAOrB;AACD,KAAM;AACJT,OAAO,CAAE,CAAE,CAACG,IAAD,EAAQO,cAAV,CADL;AAEFf,SAFJ;AAGA,KAAMgB,CAAAA,SAAS,CAAGD,cAAc,GAAKE,SAArC;AACA,KAAMR,CAAAA,MAAM,CAAGO,SAAS,CAAGD,cAAH,CAAoBL,aAA5C;AACA,MAAO,CAAEF,IAAF,CAAQC,MAAR,CAAgBE,WAAhB,CAA6BK,SAA7B,CAAwCJ,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAAP;AACD,CAdD","sourcesContent":["import { constants } from 'os'\n\nimport { SIGNALS } from './core.js'\nimport { getRealtimeSignals } from './realtime.js'\n\n// Retrieve list of know signals (including realtime) with information about\n// them\nexport const getSignals = function () {\n const realtimeSignals = getRealtimeSignals()\n const signals = [...SIGNALS, ...realtimeSignals].map(normalizeSignal)\n return signals\n}\n\n// Normalize signal:\n// - `number`: signal numbers are OS-specific. This is taken into account by\n// `os.constants.signals`. However we provide a default `number` since some\n// signals are not defined for some OS.\n// - `forced`: set default to `false`\n// - `supported`: set value\nconst normalizeSignal = function ({\n name,\n number: defaultNumber,\n description,\n action,\n forced = false,\n standard,\n}) {\n const {\n signals: { [name]: constantSignal },\n } = constants\n const supported = constantSignal !== undefined\n const number = supported ? constantSignal : defaultNumber\n return { name, number, description, supported, action, forced, standard }\n}\n"],"file":"src/signals.js"} \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/human-signals/package.json b/tests/wcag-compliance/node_modules/human-signals/package.json deleted file mode 100644 index ac51860..0000000 --- a/tests/wcag-compliance/node_modules/human-signals/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "human-signals", - "version": "3.0.1", - "type": "module", - "exports": "./build/src/main.js", - "main": "./build/src/main.js", - "files": [ - "build/src/**/*.{js,ts,map,json,sh,md}", - "examples/**/*.{js,ts,map,json,sh,md}" - ], - "scripts": { - "test": "gulp test" - }, - "description": "Human-friendly process signals", - "keywords": [ - "signal", - "signals", - "handlers", - "error-handling", - "errors", - "interrupts", - "sigterm", - "sigint", - "irq", - "process", - "exit", - "exit-code", - "status", - "operating-system", - "es6", - "javascript", - "linux", - "macos", - "windows", - "nodejs" - ], - "license": "Apache-2.0", - "homepage": "https://git.io/JeluP", - "repository": "ehmicky/human-signals", - "bugs": { - "url": "https://github.com/ehmicky/human-signals/issues" - }, - "author": "ehmicky (https://github.com/ehmicky)", - "directories": { - "lib": "src", - "test": "test" - }, - "types": "build/src/main.d.ts", - "devDependencies": { - "@ehmicky/dev-tasks": "^1.0.34", - "ajv": "^6.12.6", - "test-each": "^3.0.1" - }, - "engines": { - "node": ">=12.20.0" - } -} diff --git a/tests/wcag-compliance/node_modules/is-stream/index.d.ts b/tests/wcag-compliance/node_modules/is-stream/index.d.ts deleted file mode 100644 index df994e0..0000000 --- a/tests/wcag-compliance/node_modules/is-stream/index.d.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { - Stream, - Writable as WritableStream, - Readable as ReadableStream, - Duplex as DuplexStream, - Transform as TransformStream, -} from 'node:stream'; - -/** -@returns Whether `stream` is a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). - -@example -``` -import fs from 'node:fs'; -import {isStream} from 'is-stream'; - -isStream(fs.createReadStream('unicorn.png')); -//=> true - -isStream({}); -//=> false -``` -*/ -export function isStream(stream: unknown): stream is Stream; - -/** -@returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). - -@example -``` -import fs from 'node:fs'; -import {isWritableStream} from 'is-stream'; - -isWritableStream(fs.createWriteStrem('unicorn.txt')); -//=> true -``` -*/ -export function isWritableStream(stream: unknown): stream is WritableStream; - -/** -@returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). - -@example -``` -import fs from 'node:fs'; -import {isReadableStream} from 'is-stream'; - -isReadableStream(fs.createReadStream('unicorn.png')); -//=> true -``` -*/ -export function isReadableStream(stream: unknown): stream is ReadableStream; - -/** -@returns Whether `stream` is a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). - -@example -``` -import {Duplex as DuplexStream} from 'node:stream'; -import {isDuplexStream} from 'is-stream'; - -isDuplexStream(new DuplexStream()); -//=> true -``` -*/ -export function isDuplexStream(stream: unknown): stream is DuplexStream; - -/** -@returns Whether `stream` is a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). - -@example -``` -import fs from 'node:fs'; -import StringifyStream from 'streaming-json-stringify'; -import {isTransformStream} from 'is-stream'; - -isTransformStream(StringifyStream()); -//=> true -``` -*/ -export function isTransformStream(stream: unknown): stream is TransformStream; diff --git a/tests/wcag-compliance/node_modules/is-stream/index.js b/tests/wcag-compliance/node_modules/is-stream/index.js deleted file mode 100644 index 887e601..0000000 --- a/tests/wcag-compliance/node_modules/is-stream/index.js +++ /dev/null @@ -1,29 +0,0 @@ -export function isStream(stream) { - return stream !== null - && typeof stream === 'object' - && typeof stream.pipe === 'function'; -} - -export function isWritableStream(stream) { - return isStream(stream) - && stream.writable !== false - && typeof stream._write === 'function' - && typeof stream._writableState === 'object'; -} - -export function isReadableStream(stream) { - return isStream(stream) - && stream.readable !== false - && typeof stream._read === 'function' - && typeof stream._readableState === 'object'; -} - -export function isDuplexStream(stream) { - return isWritableStream(stream) - && isReadableStream(stream); -} - -export function isTransformStream(stream) { - return isDuplexStream(stream) - && typeof stream._transform === 'function'; -} diff --git a/tests/wcag-compliance/node_modules/is-stream/license b/tests/wcag-compliance/node_modules/is-stream/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/is-stream/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/is-stream/package.json b/tests/wcag-compliance/node_modules/is-stream/package.json deleted file mode 100644 index 47d5761..0000000 --- a/tests/wcag-compliance/node_modules/is-stream/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "is-stream", - "version": "3.0.0", - "description": "Check if something is a Node.js stream", - "license": "MIT", - "repository": "sindresorhus/is-stream", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "stream", - "type", - "streams", - "writable", - "readable", - "duplex", - "transform", - "check", - "detect", - "is" - ], - "devDependencies": { - "@types/node": "^16.4.13", - "ava": "^3.15.0", - "tempy": "^1.0.1", - "tsd": "^0.17.0", - "xo": "^0.44.0" - } -} diff --git a/tests/wcag-compliance/node_modules/is-stream/readme.md b/tests/wcag-compliance/node_modules/is-stream/readme.md deleted file mode 100644 index c6f8c1b..0000000 --- a/tests/wcag-compliance/node_modules/is-stream/readme.md +++ /dev/null @@ -1,60 +0,0 @@ -# is-stream - -> Check if something is a [Node.js stream](https://nodejs.org/api/stream.html) - -## Install - -``` -$ npm install is-stream -``` - -## Usage - -```js -import fs from 'node:fs'; -import {isStream} from 'is-stream'; - -isStream(fs.createReadStream('unicorn.png')); -//=> true - -isStream({}); -//=> false -``` - -## API - -### isStream(stream) - -Returns a `boolean` for whether it's a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). - -#### isWritableStream(stream) - -Returns a `boolean` for whether it's a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). - -#### isReadableStream(stream) - -Returns a `boolean` for whether it's a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). - -#### isDuplexStream(stream) - -Returns a `boolean` for whether it's a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). - -#### isTransformStream(stream) - -Returns a `boolean` for whether it's a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). - -## Related - -- [is-file-stream](https://github.com/jamestalmage/is-file-stream) - Detect if a stream is a file stream - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/isexe/.npmignore b/tests/wcag-compliance/node_modules/isexe/.npmignore deleted file mode 100644 index c1cb757..0000000 --- a/tests/wcag-compliance/node_modules/isexe/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.nyc_output/ -coverage/ diff --git a/tests/wcag-compliance/node_modules/isexe/LICENSE b/tests/wcag-compliance/node_modules/isexe/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/tests/wcag-compliance/node_modules/isexe/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/isexe/README.md b/tests/wcag-compliance/node_modules/isexe/README.md deleted file mode 100644 index 35769e8..0000000 --- a/tests/wcag-compliance/node_modules/isexe/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# isexe - -Minimal module to check if a file is executable, and a normal file. - -Uses `fs.stat` and tests against the `PATHEXT` environment variable on -Windows. - -## USAGE - -```javascript -var isexe = require('isexe') -isexe('some-file-name', function (err, isExe) { - if (err) { - console.error('probably file does not exist or something', err) - } else if (isExe) { - console.error('this thing can be run') - } else { - console.error('cannot be run') - } -}) - -// same thing but synchronous, throws errors -var isExe = isexe.sync('some-file-name') - -// treat errors as just "not executable" -isexe('maybe-missing-file', { ignoreErrors: true }, callback) -var isExe = isexe.sync('maybe-missing-file', { ignoreErrors: true }) -``` - -## API - -### `isexe(path, [options], [callback])` - -Check if the path is executable. If no callback provided, and a -global `Promise` object is available, then a Promise will be returned. - -Will raise whatever errors may be raised by `fs.stat`, unless -`options.ignoreErrors` is set to true. - -### `isexe.sync(path, [options])` - -Same as `isexe` but returns the value and throws any errors raised. - -### Options - -* `ignoreErrors` Treat all errors as "no, this is not executable", but - don't raise them. -* `uid` Number to use as the user id -* `gid` Number to use as the group id -* `pathExt` List of path extensions to use instead of `PATHEXT` - environment variable on Windows. diff --git a/tests/wcag-compliance/node_modules/isexe/index.js b/tests/wcag-compliance/node_modules/isexe/index.js deleted file mode 100644 index 553fb32..0000000 --- a/tests/wcag-compliance/node_modules/isexe/index.js +++ /dev/null @@ -1,57 +0,0 @@ -var fs = require('fs') -var core -if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = require('./windows.js') -} else { - core = require('./mode.js') -} - -module.exports = isexe -isexe.sync = sync - -function isexe (path, options, cb) { - if (typeof options === 'function') { - cb = options - options = {} - } - - if (!cb) { - if (typeof Promise !== 'function') { - throw new TypeError('callback not provided') - } - - return new Promise(function (resolve, reject) { - isexe(path, options || {}, function (er, is) { - if (er) { - reject(er) - } else { - resolve(is) - } - }) - }) - } - - core(path, options || {}, function (er, is) { - // ignore EACCES because that just means we aren't allowed to run it - if (er) { - if (er.code === 'EACCES' || options && options.ignoreErrors) { - er = null - is = false - } - } - cb(er, is) - }) -} - -function sync (path, options) { - // my kingdom for a filtered catch - try { - return core.sync(path, options || {}) - } catch (er) { - if (options && options.ignoreErrors || er.code === 'EACCES') { - return false - } else { - throw er - } - } -} diff --git a/tests/wcag-compliance/node_modules/isexe/mode.js b/tests/wcag-compliance/node_modules/isexe/mode.js deleted file mode 100644 index 1995ea4..0000000 --- a/tests/wcag-compliance/node_modules/isexe/mode.js +++ /dev/null @@ -1,41 +0,0 @@ -module.exports = isexe -isexe.sync = sync - -var fs = require('fs') - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, options)) - }) -} - -function sync (path, options) { - return checkStat(fs.statSync(path), options) -} - -function checkStat (stat, options) { - return stat.isFile() && checkMode(stat, options) -} - -function checkMode (stat, options) { - var mod = stat.mode - var uid = stat.uid - var gid = stat.gid - - var myUid = options.uid !== undefined ? - options.uid : process.getuid && process.getuid() - var myGid = options.gid !== undefined ? - options.gid : process.getgid && process.getgid() - - var u = parseInt('100', 8) - var g = parseInt('010', 8) - var o = parseInt('001', 8) - var ug = u | g - - var ret = (mod & o) || - (mod & g) && gid === myGid || - (mod & u) && uid === myUid || - (mod & ug) && myUid === 0 - - return ret -} diff --git a/tests/wcag-compliance/node_modules/isexe/package.json b/tests/wcag-compliance/node_modules/isexe/package.json deleted file mode 100644 index e452689..0000000 --- a/tests/wcag-compliance/node_modules/isexe/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "isexe", - "version": "2.0.0", - "description": "Minimal module to check if a file is executable.", - "main": "index.js", - "directories": { - "test": "test" - }, - "devDependencies": { - "mkdirp": "^0.5.1", - "rimraf": "^2.5.0", - "tap": "^10.3.0" - }, - "scripts": { - "test": "tap test/*.js --100", - "preversion": "npm test", - "postversion": "npm publish", - "postpublish": "git push origin --all; git push origin --tags" - }, - "author": "Isaac Z. Schlueter (http://blog.izs.me/)", - "license": "ISC", - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/isexe.git" - }, - "keywords": [], - "bugs": { - "url": "https://github.com/isaacs/isexe/issues" - }, - "homepage": "https://github.com/isaacs/isexe#readme" -} diff --git a/tests/wcag-compliance/node_modules/isexe/test/basic.js b/tests/wcag-compliance/node_modules/isexe/test/basic.js deleted file mode 100644 index d926df6..0000000 --- a/tests/wcag-compliance/node_modules/isexe/test/basic.js +++ /dev/null @@ -1,221 +0,0 @@ -var t = require('tap') -var fs = require('fs') -var path = require('path') -var fixture = path.resolve(__dirname, 'fixtures') -var meow = fixture + '/meow.cat' -var mine = fixture + '/mine.cat' -var ours = fixture + '/ours.cat' -var fail = fixture + '/fail.false' -var noent = fixture + '/enoent.exe' -var mkdirp = require('mkdirp') -var rimraf = require('rimraf') - -var isWindows = process.platform === 'win32' -var hasAccess = typeof fs.access === 'function' -var winSkip = isWindows && 'windows' -var accessSkip = !hasAccess && 'no fs.access function' -var hasPromise = typeof Promise === 'function' -var promiseSkip = !hasPromise && 'no global Promise' - -function reset () { - delete require.cache[require.resolve('../')] - return require('../') -} - -t.test('setup fixtures', function (t) { - rimraf.sync(fixture) - mkdirp.sync(fixture) - fs.writeFileSync(meow, '#!/usr/bin/env cat\nmeow\n') - fs.chmodSync(meow, parseInt('0755', 8)) - fs.writeFileSync(fail, '#!/usr/bin/env false\n') - fs.chmodSync(fail, parseInt('0644', 8)) - fs.writeFileSync(mine, '#!/usr/bin/env cat\nmine\n') - fs.chmodSync(mine, parseInt('0744', 8)) - fs.writeFileSync(ours, '#!/usr/bin/env cat\nours\n') - fs.chmodSync(ours, parseInt('0754', 8)) - t.end() -}) - -t.test('promise', { skip: promiseSkip }, function (t) { - var isexe = reset() - t.test('meow async', function (t) { - isexe(meow).then(function (is) { - t.ok(is) - t.end() - }) - }) - t.test('fail async', function (t) { - isexe(fail).then(function (is) { - t.notOk(is) - t.end() - }) - }) - t.test('noent async', function (t) { - isexe(noent).catch(function (er) { - t.ok(er) - t.end() - }) - }) - t.test('noent ignore async', function (t) { - isexe(noent, { ignoreErrors: true }).then(function (is) { - t.notOk(is) - t.end() - }) - }) - t.end() -}) - -t.test('no promise', function (t) { - global.Promise = null - var isexe = reset() - t.throws('try to meow a promise', function () { - isexe(meow) - }) - t.end() -}) - -t.test('access', { skip: accessSkip || winSkip }, function (t) { - runTest(t) -}) - -t.test('mode', { skip: winSkip }, function (t) { - delete fs.access - delete fs.accessSync - var isexe = reset() - t.ok(isexe.sync(ours, { uid: 0, gid: 0 })) - t.ok(isexe.sync(mine, { uid: 0, gid: 0 })) - runTest(t) -}) - -t.test('windows', function (t) { - global.TESTING_WINDOWS = true - var pathExt = '.EXE;.CAT;.CMD;.COM' - t.test('pathExt option', function (t) { - runTest(t, { pathExt: '.EXE;.CAT;.CMD;.COM' }) - }) - t.test('pathExt env', function (t) { - process.env.PATHEXT = pathExt - runTest(t) - }) - t.test('no pathExt', function (t) { - // with a pathExt of '', any filename is fine. - // so the "fail" one would still pass. - runTest(t, { pathExt: '', skipFail: true }) - }) - t.test('pathext with empty entry', function (t) { - // with a pathExt of '', any filename is fine. - // so the "fail" one would still pass. - runTest(t, { pathExt: ';' + pathExt, skipFail: true }) - }) - t.end() -}) - -t.test('cleanup', function (t) { - rimraf.sync(fixture) - t.end() -}) - -function runTest (t, options) { - var isexe = reset() - - var optionsIgnore = Object.create(options || {}) - optionsIgnore.ignoreErrors = true - - if (!options || !options.skipFail) { - t.notOk(isexe.sync(fail, options)) - } - t.notOk(isexe.sync(noent, optionsIgnore)) - if (!options) { - t.ok(isexe.sync(meow)) - } else { - t.ok(isexe.sync(meow, options)) - } - - t.ok(isexe.sync(mine, options)) - t.ok(isexe.sync(ours, options)) - t.throws(function () { - isexe.sync(noent, options) - }) - - t.test('meow async', function (t) { - if (!options) { - isexe(meow, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - } else { - isexe(meow, options, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - } - }) - - t.test('mine async', function (t) { - isexe(mine, options, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - }) - - t.test('ours async', function (t) { - isexe(ours, options, function (er, is) { - if (er) { - throw er - } - t.ok(is) - t.end() - }) - }) - - if (!options || !options.skipFail) { - t.test('fail async', function (t) { - isexe(fail, options, function (er, is) { - if (er) { - throw er - } - t.notOk(is) - t.end() - }) - }) - } - - t.test('noent async', function (t) { - isexe(noent, options, function (er, is) { - t.ok(er) - t.notOk(is) - t.end() - }) - }) - - t.test('noent ignore async', function (t) { - isexe(noent, optionsIgnore, function (er, is) { - if (er) { - throw er - } - t.notOk(is) - t.end() - }) - }) - - t.test('directory is not executable', function (t) { - isexe(__dirname, options, function (er, is) { - if (er) { - throw er - } - t.notOk(is) - t.end() - }) - }) - - t.end() -} diff --git a/tests/wcag-compliance/node_modules/isexe/windows.js b/tests/wcag-compliance/node_modules/isexe/windows.js deleted file mode 100644 index 3499673..0000000 --- a/tests/wcag-compliance/node_modules/isexe/windows.js +++ /dev/null @@ -1,42 +0,0 @@ -module.exports = isexe -isexe.sync = sync - -var fs = require('fs') - -function checkPathExt (path, options) { - var pathext = options.pathExt !== undefined ? - options.pathExt : process.env.PATHEXT - - if (!pathext) { - return true - } - - pathext = pathext.split(';') - if (pathext.indexOf('') !== -1) { - return true - } - for (var i = 0; i < pathext.length; i++) { - var p = pathext[i].toLowerCase() - if (p && path.substr(-p.length).toLowerCase() === p) { - return true - } - } - return false -} - -function checkStat (stat, path, options) { - if (!stat.isSymbolicLink() && !stat.isFile()) { - return false - } - return checkPathExt(path, options) -} - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, path, options)) - }) -} - -function sync (path, options) { - return checkStat(fs.statSync(path), path, options) -} diff --git a/tests/wcag-compliance/node_modules/merge-stream/LICENSE b/tests/wcag-compliance/node_modules/merge-stream/LICENSE deleted file mode 100644 index 94a4c0a..0000000 --- a/tests/wcag-compliance/node_modules/merge-stream/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Stephen Sugden (stephensugden.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/merge-stream/README.md b/tests/wcag-compliance/node_modules/merge-stream/README.md deleted file mode 100644 index 0d54841..0000000 --- a/tests/wcag-compliance/node_modules/merge-stream/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# merge-stream - -Merge (interleave) a bunch of streams. - -[![build status](https://secure.travis-ci.org/grncdr/merge-stream.svg?branch=master)](http://travis-ci.org/grncdr/merge-stream) - -## Synopsis - -```javascript -var stream1 = new Stream(); -var stream2 = new Stream(); - -var merged = mergeStream(stream1, stream2); - -var stream3 = new Stream(); -merged.add(stream3); -merged.isEmpty(); -//=> false -``` - -## Description - -This is adapted from [event-stream](https://github.com/dominictarr/event-stream) separated into a new module, using Streams3. - -## API - -### `mergeStream` - -Type: `function` - -Merges an arbitrary number of streams. Returns a merged stream. - -#### `merged.add` - -A method to dynamically add more sources to the stream. The argument supplied to `add` can be either a source or an array of sources. - -#### `merged.isEmpty` - -A method that tells you if the merged stream is empty. - -When a stream is "empty" (aka. no sources were added), it could not be returned to a gulp task. - -So, we could do something like this: - -```js -stream = require('merge-stream')(); -// Something like a loop to add some streams to the merge stream -// stream.add(streamA); -// stream.add(streamB); -return stream.isEmpty() ? null : stream; -``` - -## Gulp example - -An example use case for **merge-stream** is to combine parts of a task in a project's **gulpfile.js** like this: - -```js -const gulp = require('gulp'); -const htmlValidator = require('gulp-w3c-html-validator'); -const jsHint = require('gulp-jshint'); -const mergeStream = require('merge-stream'); - -function lint() { - return mergeStream( - gulp.src('src/*.html') - .pipe(htmlValidator()) - .pipe(htmlValidator.reporter()), - gulp.src('src/*.js') - .pipe(jsHint()) - .pipe(jsHint.reporter()) - ); -} -gulp.task('lint', lint); -``` - -## License - -MIT diff --git a/tests/wcag-compliance/node_modules/merge-stream/index.js b/tests/wcag-compliance/node_modules/merge-stream/index.js deleted file mode 100644 index b1a9e1a..0000000 --- a/tests/wcag-compliance/node_modules/merge-stream/index.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -const { PassThrough } = require('stream'); - -module.exports = function (/*streams...*/) { - var sources = [] - var output = new PassThrough({objectMode: true}) - - output.setMaxListeners(0) - - output.add = add - output.isEmpty = isEmpty - - output.on('unpipe', remove) - - Array.prototype.slice.call(arguments).forEach(add) - - return output - - function add (source) { - if (Array.isArray(source)) { - source.forEach(add) - return this - } - - sources.push(source); - source.once('end', remove.bind(null, source)) - source.once('error', output.emit.bind(output, 'error')) - source.pipe(output, {end: false}) - return this - } - - function isEmpty () { - return sources.length == 0; - } - - function remove (source) { - sources = sources.filter(function (it) { return it !== source }) - if (!sources.length && output.readable) { output.end() } - } -} diff --git a/tests/wcag-compliance/node_modules/merge-stream/package.json b/tests/wcag-compliance/node_modules/merge-stream/package.json deleted file mode 100644 index 1a4c54c..0000000 --- a/tests/wcag-compliance/node_modules/merge-stream/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "merge-stream", - "version": "2.0.0", - "description": "Create a stream that emits events from multiple other streams", - "files": [ - "index.js" - ], - "scripts": { - "test": "istanbul cover test.js && istanbul check-cover --statements 100 --branches 100" - }, - "repository": "grncdr/merge-stream", - "author": "Stephen Sugden ", - "license": "MIT", - "dependencies": {}, - "devDependencies": { - "from2": "^2.0.3", - "istanbul": "^0.4.5" - } -} diff --git a/tests/wcag-compliance/node_modules/mimic-fn/index.d.ts b/tests/wcag-compliance/node_modules/mimic-fn/index.d.ts deleted file mode 100644 index 2a72e0a..0000000 --- a/tests/wcag-compliance/node_modules/mimic-fn/index.d.ts +++ /dev/null @@ -1,52 +0,0 @@ -export interface Options { - /** - Skip modifying [non-configurable properties](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor#Description) instead of throwing an error. - - @default false - */ - readonly ignoreNonConfigurable?: boolean; -} - -/** -Modifies the `to` function to mimic the `from` function. Returns the `to` function. - -`name`, `displayName`, and any other properties of `from` are copied. The `length` property is not copied. Prototype, class, and inherited properties are copied. - -`to.toString()` will return the same as `from.toString()` but prepended with a `Wrapped with to()` comment. - -@param to - Mimicking function. -@param from - Function to mimic. -@returns The modified `to` function. - -@example -``` -import mimicFunction from 'mimic-fn'; - -function foo() {} -foo.unicorn = '🦄'; - -function wrapper() { - return foo(); -} - -console.log(wrapper.name); -//=> 'wrapper' - -mimicFunction(wrapper, foo); - -console.log(wrapper.name); -//=> 'foo' - -console.log(wrapper.unicorn); -//=> '🦄' -``` -*/ -export default function mimicFunction< - ArgumentsType extends unknown[], - ReturnType, - FunctionType extends (...arguments: ArgumentsType) => ReturnType ->( - to: (...arguments: ArgumentsType) => ReturnType, - from: FunctionType, - options?: Options, -): FunctionType; diff --git a/tests/wcag-compliance/node_modules/mimic-fn/index.js b/tests/wcag-compliance/node_modules/mimic-fn/index.js deleted file mode 100644 index bc9ef7d..0000000 --- a/tests/wcag-compliance/node_modules/mimic-fn/index.js +++ /dev/null @@ -1,71 +0,0 @@ -const copyProperty = (to, from, property, ignoreNonConfigurable) => { - // `Function#length` should reflect the parameters of `to` not `from` since we keep its body. - // `Function#prototype` is non-writable and non-configurable so can never be modified. - if (property === 'length' || property === 'prototype') { - return; - } - - // `Function#arguments` and `Function#caller` should not be copied. They were reported to be present in `Reflect.ownKeys` for some devices in React Native (#41), so we explicitly ignore them here. - if (property === 'arguments' || property === 'caller') { - return; - } - - const toDescriptor = Object.getOwnPropertyDescriptor(to, property); - const fromDescriptor = Object.getOwnPropertyDescriptor(from, property); - - if (!canCopyProperty(toDescriptor, fromDescriptor) && ignoreNonConfigurable) { - return; - } - - Object.defineProperty(to, property, fromDescriptor); -}; - -// `Object.defineProperty()` throws if the property exists, is not configurable and either: -// - one its descriptors is changed -// - it is non-writable and its value is changed -const canCopyProperty = function (toDescriptor, fromDescriptor) { - return toDescriptor === undefined || toDescriptor.configurable || ( - toDescriptor.writable === fromDescriptor.writable && - toDescriptor.enumerable === fromDescriptor.enumerable && - toDescriptor.configurable === fromDescriptor.configurable && - (toDescriptor.writable || toDescriptor.value === fromDescriptor.value) - ); -}; - -const changePrototype = (to, from) => { - const fromPrototype = Object.getPrototypeOf(from); - if (fromPrototype === Object.getPrototypeOf(to)) { - return; - } - - Object.setPrototypeOf(to, fromPrototype); -}; - -const wrappedToString = (withName, fromBody) => `/* Wrapped ${withName}*/\n${fromBody}`; - -const toStringDescriptor = Object.getOwnPropertyDescriptor(Function.prototype, 'toString'); -const toStringName = Object.getOwnPropertyDescriptor(Function.prototype.toString, 'name'); - -// We call `from.toString()` early (not lazily) to ensure `from` can be garbage collected. -// We use `bind()` instead of a closure for the same reason. -// Calling `from.toString()` early also allows caching it in case `to.toString()` is called several times. -const changeToString = (to, from, name) => { - const withName = name === '' ? '' : `with ${name.trim()}() `; - const newToString = wrappedToString.bind(null, withName, from.toString()); - // Ensure `to.toString.toString` is non-enumerable and has the same `same` - Object.defineProperty(newToString, 'name', toStringName); - Object.defineProperty(to, 'toString', {...toStringDescriptor, value: newToString}); -}; - -export default function mimicFunction(to, from, {ignoreNonConfigurable = false} = {}) { - const {name} = to; - - for (const property of Reflect.ownKeys(from)) { - copyProperty(to, from, property, ignoreNonConfigurable); - } - - changePrototype(to, from); - changeToString(to, from, name); - - return to; -} diff --git a/tests/wcag-compliance/node_modules/mimic-fn/license b/tests/wcag-compliance/node_modules/mimic-fn/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/mimic-fn/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/mimic-fn/package.json b/tests/wcag-compliance/node_modules/mimic-fn/package.json deleted file mode 100644 index d010cdd..0000000 --- a/tests/wcag-compliance/node_modules/mimic-fn/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "mimic-fn", - "version": "4.0.0", - "description": "Make a function mimic another one", - "license": "MIT", - "repository": "sindresorhus/mimic-fn", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "function", - "mimic", - "imitate", - "rename", - "copy", - "inherit", - "properties", - "name", - "func", - "fn", - "set", - "infer", - "change" - ], - "devDependencies": { - "ava": "^3.15.0", - "tsd": "^0.14.0", - "xo": "^0.38.2" - } -} diff --git a/tests/wcag-compliance/node_modules/mimic-fn/readme.md b/tests/wcag-compliance/node_modules/mimic-fn/readme.md deleted file mode 100644 index 9f571ce..0000000 --- a/tests/wcag-compliance/node_modules/mimic-fn/readme.md +++ /dev/null @@ -1,90 +0,0 @@ -mimic-fn -
- -> Make a function mimic another one - -Useful when you wrap a function in another function and like to preserve the original name and other properties. - -## Install - -``` -$ npm install mimic-fn -``` - -## Usage - -```js -import mimicFunction from 'mimic-fn'; - -function foo() {} -foo.unicorn = '🦄'; - -function wrapper() { - return foo(); -} - -console.log(wrapper.name); -//=> 'wrapper' - -mimicFunction(wrapper, foo); - -console.log(wrapper.name); -//=> 'foo' - -console.log(wrapper.unicorn); -//=> '🦄' - -console.log(String(wrapper)); -//=> '/* Wrapped with wrapper() */\nfunction foo() {}' -``` - - -## API - -### mimicFunction(to, from, options?) - -Modifies the `to` function to mimic the `from` function. Returns the `to` function. - -`name`, `displayName`, and any other properties of `from` are copied. The `length` property is not copied. Prototype, class, and inherited properties are copied. - -`to.toString()` will return the same as `from.toString()` but prepended with a `Wrapped with to()` comment. - -#### to - -Type: `Function` - -Mimicking function. - -#### from - -Type: `Function` - -Function to mimic. - -#### options - -Type: `object` - -##### ignoreNonConfigurable - -Type: `boolean`\ -Default: `false` - -Skip modifying [non-configurable properties](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor#Description) instead of throwing an error. - -## Related - -- [rename-fn](https://github.com/sindresorhus/rename-fn) - Rename a function -- [keep-func-props](https://github.com/ehmicky/keep-func-props) - Wrap a function without changing its name and other properties - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/npm-run-path/index.d.ts b/tests/wcag-compliance/node_modules/npm-run-path/index.d.ts deleted file mode 100644 index fad851b..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/index.d.ts +++ /dev/null @@ -1,84 +0,0 @@ -export interface RunPathOptions { - /** - Working directory. - - @default process.cwd() - */ - readonly cwd?: string | URL; - - /** - PATH to be appended. Default: [`PATH`](https://github.com/sindresorhus/path-key). - - Set it to an empty string to exclude the default PATH. - */ - readonly path?: string; - - /** - Path to the Node.js executable to use in child processes if that is different from the current one. Its directory is pushed to the front of PATH. - - This can be either an absolute path or a path relative to the `cwd` option. - - @default process.execPath - */ - readonly execPath?: string; -} - -export type ProcessEnv = Record; - -export interface EnvOptions { - /** - The working directory. - - @default process.cwd() - */ - readonly cwd?: string | URL; - - /** - Accepts an object of environment variables, like `process.env`, and modifies the PATH using the correct [PATH key](https://github.com/sindresorhus/path-key). Use this if you're modifying the PATH for use in the `child_process` options. - */ - readonly env?: ProcessEnv; - - /** - The path to the current Node.js executable. Its directory is pushed to the front of PATH. - - This can be either an absolute path or a path relative to the `cwd` option. - - @default process.execPath - */ - readonly execPath?: string; -} - -/** -Get your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) prepended with locally installed binaries. - -@returns The augmented path string. - -@example -``` -import childProcess from 'node:child_process'; -import {npmRunPath} from 'npm-run-path'; - -console.log(process.env.PATH); -//=> '/usr/local/bin' - -console.log(npmRunPath()); -//=> '/Users/sindresorhus/dev/foo/node_modules/.bin:/Users/sindresorhus/dev/node_modules/.bin:/Users/sindresorhus/node_modules/.bin:/Users/node_modules/.bin:/node_modules/.bin:/usr/local/bin' -``` -*/ -export function npmRunPath(options?: RunPathOptions): string; - -/** -@returns The augmented [`process.env`](https://nodejs.org/api/process.html#process_process_env) object. - -@example -``` -import childProcess from 'node:child_process'; -import {npmRunPathEnv} from 'npm-run-path'; - -// `foo` is a locally installed binary -childProcess.execFileSync('foo', { - env: npmRunPathEnv() -}); -``` -*/ -export function npmRunPathEnv(options?: EnvOptions): ProcessEnv; diff --git a/tests/wcag-compliance/node_modules/npm-run-path/index.js b/tests/wcag-compliance/node_modules/npm-run-path/index.js deleted file mode 100644 index 77dfae2..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/index.js +++ /dev/null @@ -1,38 +0,0 @@ -import process from 'node:process'; -import path from 'node:path'; -import url from 'node:url'; -import pathKey from 'path-key'; - -export function npmRunPath(options = {}) { - const { - cwd = process.cwd(), - path: path_ = process.env[pathKey()], - execPath = process.execPath, - } = options; - - let previous; - const cwdString = cwd instanceof URL ? url.fileURLToPath(cwd) : cwd; - let cwdPath = path.resolve(cwdString); - const result = []; - - while (previous !== cwdPath) { - result.push(path.join(cwdPath, 'node_modules/.bin')); - previous = cwdPath; - cwdPath = path.resolve(cwdPath, '..'); - } - - // Ensure the running `node` binary is used. - result.push(path.resolve(cwdString, execPath, '..')); - - return [...result, path_].join(path.delimiter); -} - -export function npmRunPathEnv({env = process.env, ...options} = {}) { - env = {...env}; - - const path = pathKey({env}); - options.path = env[path]; - env[path] = npmRunPath(options); - - return env; -} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/license b/tests/wcag-compliance/node_modules/npm-run-path/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts deleted file mode 100644 index f411d62..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -export interface Options { - /** - Use a custom environment variables object. - - Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env). - */ - readonly env?: Record; - - /** - Get the PATH key for a specific platform. - - Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform). - */ - readonly platform?: NodeJS.Platform; -} - -/** -Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform. - -@example -``` -import pathKey from 'path-key'; - -const key = pathKey(); -//=> 'PATH' - -const PATH = process.env[key]; -//=> '/usr/local/bin:/usr/bin:/bin' -``` -*/ -export default function pathKey(options?: Options): string; diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js deleted file mode 100644 index 2c02914..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/index.js +++ /dev/null @@ -1,12 +0,0 @@ -export default function pathKey(options = {}) { - const { - env = process.env, - platform = process.platform - } = options; - - if (platform !== 'win32') { - return 'PATH'; - } - - return Object.keys(env).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path'; -} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json deleted file mode 100644 index 609070d..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "path-key", - "version": "4.0.0", - "description": "Get the PATH environment variable key cross-platform", - "license": "MIT", - "repository": "sindresorhus/path-key", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "path", - "key", - "environment", - "env", - "variable", - "get", - "cross-platform", - "windows" - ], - "devDependencies": { - "@types/node": "^14.14.37", - "ava": "^3.15.0", - "tsd": "^0.14.0", - "xo": "^0.38.2" - } -} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md b/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md deleted file mode 100644 index aa22506..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/node_modules/path-key/readme.md +++ /dev/null @@ -1,57 +0,0 @@ -# path-key - -> Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform - -It's usually `PATH` but on Windows it can be any casing like `Path`... - -## Install - -``` -$ npm install path-key -``` - -## Usage - -```js -import pathKey from 'path-key'; - -const key = pathKey(); -//=> 'PATH' - -const PATH = process.env[key]; -//=> '/usr/local/bin:/usr/bin:/bin' -``` - -## API - -### pathKey(options?) - -#### options - -Type: `object` - -##### env - -Type: `object`\ -Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env) - -Use a custom environment variables object. - -#### platform - -Type: `string`\ -Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform) - -Get the PATH key for a specific platform. - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/npm-run-path/package.json b/tests/wcag-compliance/node_modules/npm-run-path/package.json deleted file mode 100644 index 139b345..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "npm-run-path", - "version": "5.1.0", - "description": "Get your PATH prepended with locally installed binaries", - "license": "MIT", - "repository": "sindresorhus/npm-run-path", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "npm", - "run", - "path", - "package", - "bin", - "binary", - "binaries", - "script", - "cli", - "command-line", - "execute", - "executable" - ], - "dependencies": { - "path-key": "^4.0.0" - }, - "devDependencies": { - "ava": "^3.15.0", - "tsd": "^0.17.0", - "xo": "^0.45.0" - } -} diff --git a/tests/wcag-compliance/node_modules/npm-run-path/readme.md b/tests/wcag-compliance/node_modules/npm-run-path/readme.md deleted file mode 100644 index f2ab84b..0000000 --- a/tests/wcag-compliance/node_modules/npm-run-path/readme.md +++ /dev/null @@ -1,111 +0,0 @@ -# npm-run-path - -> Get your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) prepended with locally installed binaries - -In [npm run scripts](https://docs.npmjs.com/cli/run-script) you can execute locally installed binaries by name. This enables the same outside npm. - -## Install - -```sh -npm install npm-run-path -``` - -## Usage - -```js -import childProcess from 'node:child_process'; -import {npmRunPath, npmRunPathEnv} from 'npm-run-path'; - -console.log(process.env.PATH); -//=> '/usr/local/bin' - -console.log(npmRunPath()); -//=> '/Users/sindresorhus/dev/foo/node_modules/.bin:/Users/sindresorhus/dev/node_modules/.bin:/Users/sindresorhus/node_modules/.bin:/Users/node_modules/.bin:/node_modules/.bin:/usr/local/bin' - -// `foo` is a locally installed binary -childProcess.execFileSync('foo', { - env: npmRunPathEnv() -}); -``` - -## API - -### npmRunPath(options?) - -Returns the augmented PATH string. - -#### options - -Type: `object` - -##### cwd - -Type: `string | URL`\ -Default: `process.cwd()` - -The working directory. - -##### path - -Type: `string`\ -Default: [`PATH`](https://github.com/sindresorhus/path-key) - -The PATH to be appended. - -Set it to an empty string to exclude the default PATH. - -##### execPath - -Type: `string`\ -Default: `process.execPath` - -The path to the current Node.js executable. Its directory is pushed to the front of PATH. - -This can be either an absolute path or a path relative to the [`cwd` option](#cwd). - -### npmRunPathEnv(options?) - -Returns the augmented [`process.env`](https://nodejs.org/api/process.html#process_process_env) object. - -#### options - -Type: `object` - -##### cwd - -Type: `string | URL`\ -Default: `process.cwd()` - -The working directory. - -##### env - -Type: `object` - -Accepts an object of environment variables, like `process.env`, and modifies the PATH using the correct [PATH key](https://github.com/sindresorhus/path-key). Use this if you're modifying the PATH for use in the `child_process` options. - -##### execPath - -Type: `string`\ -Default: `process.execPath` - -The path to the Node.js executable to use in child processes if that is different from the current one. Its directory is pushed to the front of PATH. - -This can be either an absolute path or a path relative to the [`cwd` option](#cwd). - -## Related - -- [npm-run-path-cli](https://github.com/sindresorhus/npm-run-path-cli) - CLI for this module -- [execa](https://github.com/sindresorhus/execa) - Execute a locally installed binary - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/onetime/index.d.ts b/tests/wcag-compliance/node_modules/onetime/index.d.ts deleted file mode 100644 index 3c80803..0000000 --- a/tests/wcag-compliance/node_modules/onetime/index.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -export interface Options { - /** - Throw an error when called more than once. - - @default false - */ - readonly throw?: boolean; -} - -declare const onetime: { - /** - Ensure a function is only called once. When called multiple times it will return the return value from the first call. - - @param fn - Function that should only be called once. - @returns A function that only calls `fn` once. - - @example - ``` - import onetime from 'onetime'; - - let index = 0; - - const foo = onetime(() => ++index); - - foo(); //=> 1 - foo(); //=> 1 - foo(); //=> 1 - - onetime.callCount(foo); //=> 3 - ``` - */ - ( - fn: (...arguments: ArgumentsType) => ReturnType, - options?: Options - ): (...arguments: ArgumentsType) => ReturnType; - - /** - Get the number of times `fn` has been called. - - @param fn - Function to get call count from. - @returns A number representing how many times `fn` has been called. - - @example - ``` - import onetime from 'onetime'; - - const foo = onetime(() => {}); - foo(); - foo(); - foo(); - - console.log(onetime.callCount(foo)); - //=> 3 - ``` - */ - callCount(fn: (...arguments: any[]) => unknown): number; -}; - -export default onetime; diff --git a/tests/wcag-compliance/node_modules/onetime/index.js b/tests/wcag-compliance/node_modules/onetime/index.js deleted file mode 100644 index eae4f33..0000000 --- a/tests/wcag-compliance/node_modules/onetime/index.js +++ /dev/null @@ -1,41 +0,0 @@ -import mimicFunction from 'mimic-fn'; - -const calledFunctions = new WeakMap(); - -const onetime = (function_, options = {}) => { - if (typeof function_ !== 'function') { - throw new TypeError('Expected a function'); - } - - let returnValue; - let callCount = 0; - const functionName = function_.displayName || function_.name || ''; - - const onetime = function (...arguments_) { - calledFunctions.set(onetime, ++callCount); - - if (callCount === 1) { - returnValue = function_.apply(this, arguments_); - function_ = null; - } else if (options.throw === true) { - throw new Error(`Function \`${functionName}\` can only be called once`); - } - - return returnValue; - }; - - mimicFunction(onetime, function_); - calledFunctions.set(onetime, callCount); - - return onetime; -}; - -onetime.callCount = function_ => { - if (!calledFunctions.has(function_)) { - throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`); - } - - return calledFunctions.get(function_); -}; - -export default onetime; diff --git a/tests/wcag-compliance/node_modules/onetime/license b/tests/wcag-compliance/node_modules/onetime/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/onetime/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/onetime/package.json b/tests/wcag-compliance/node_modules/onetime/package.json deleted file mode 100644 index 475a1e3..0000000 --- a/tests/wcag-compliance/node_modules/onetime/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "onetime", - "version": "6.0.0", - "description": "Ensure a function is only called once", - "license": "MIT", - "repository": "sindresorhus/onetime", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "once", - "function", - "one", - "onetime", - "func", - "fn", - "single", - "call", - "called", - "prevent" - ], - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "devDependencies": { - "ava": "^3.15.0", - "tsd": "^0.14.0", - "xo": "^0.38.2" - } -} diff --git a/tests/wcag-compliance/node_modules/onetime/readme.md b/tests/wcag-compliance/node_modules/onetime/readme.md deleted file mode 100644 index e2b26fb..0000000 --- a/tests/wcag-compliance/node_modules/onetime/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# onetime - -> Ensure a function is only called once - -When called multiple times it will return the return value from the first call. - -*Unlike the module [once](https://github.com/isaacs/once), this one isn't naughty and extending `Function.prototype`.* - -## Install - -``` -$ npm install onetime -``` - -## Usage - -```js -import onetime from 'onetime'; - -let index = 0; - -const foo = onetime(() => ++index); - -foo(); //=> 1 -foo(); //=> 1 -foo(); //=> 1 - -onetime.callCount(foo); //=> 3 -``` - -```js -import onetime from 'onetime'; - -const foo = onetime(() => {}, {throw: true}); - -foo(); - -foo(); -//=> Error: Function `foo` can only be called once -``` - -## API - -### onetime(fn, options?) - -Returns a function that only calls `fn` once. - -#### fn - -Type: `Function` - -Function that should only be called once. - -#### options - -Type: `object` - -##### throw - -Type: `boolean`\ -Default: `false` - -Throw an error when called more than once. - -### onetime.callCount(fn) - -Returns a number representing how many times `fn` has been called. - -Note: It throws an error if you pass in a function that is not wrapped by `onetime`. - -```js -import onetime from 'onetime'; - -const foo = onetime(() => {}); - -foo(); -foo(); -foo(); - -console.log(onetime.callCount(foo)); -//=> 3 -``` - -#### fn - -Type: `Function` - -Function to get call count from. - -## onetime for enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of onetime and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-onetime?utm_source=npm-onetime&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/tests/wcag-compliance/node_modules/path-key/index.d.ts b/tests/wcag-compliance/node_modules/path-key/index.d.ts deleted file mode 100644 index 7c575d1..0000000 --- a/tests/wcag-compliance/node_modules/path-key/index.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -declare namespace pathKey { - interface Options { - /** - Use a custom environment variables object. Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env). - */ - readonly env?: {[key: string]: string | undefined}; - - /** - Get the PATH key for a specific platform. Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform). - */ - readonly platform?: NodeJS.Platform; - } -} - -declare const pathKey: { - /** - Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform. - - @example - ``` - import pathKey = require('path-key'); - - const key = pathKey(); - //=> 'PATH' - - const PATH = process.env[key]; - //=> '/usr/local/bin:/usr/bin:/bin' - ``` - */ - (options?: pathKey.Options): string; - - // TODO: Remove this for the next major release, refactor the whole definition to: - // declare function pathKey(options?: pathKey.Options): string; - // export = pathKey; - default: typeof pathKey; -}; - -export = pathKey; diff --git a/tests/wcag-compliance/node_modules/path-key/index.js b/tests/wcag-compliance/node_modules/path-key/index.js deleted file mode 100644 index 0cf6415..0000000 --- a/tests/wcag-compliance/node_modules/path-key/index.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict'; - -const pathKey = (options = {}) => { - const environment = options.env || process.env; - const platform = options.platform || process.platform; - - if (platform !== 'win32') { - return 'PATH'; - } - - return Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path'; -}; - -module.exports = pathKey; -// TODO: Remove this for the next major release -module.exports.default = pathKey; diff --git a/tests/wcag-compliance/node_modules/path-key/license b/tests/wcag-compliance/node_modules/path-key/license deleted file mode 100644 index e7af2f7..0000000 --- a/tests/wcag-compliance/node_modules/path-key/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/path-key/package.json b/tests/wcag-compliance/node_modules/path-key/package.json deleted file mode 100644 index c8cbd38..0000000 --- a/tests/wcag-compliance/node_modules/path-key/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "path-key", - "version": "3.1.1", - "description": "Get the PATH environment variable key cross-platform", - "license": "MIT", - "repository": "sindresorhus/path-key", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "path", - "key", - "environment", - "env", - "variable", - "var", - "get", - "cross-platform", - "windows" - ], - "devDependencies": { - "@types/node": "^11.13.0", - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/tests/wcag-compliance/node_modules/path-key/readme.md b/tests/wcag-compliance/node_modules/path-key/readme.md deleted file mode 100644 index a9052d7..0000000 --- a/tests/wcag-compliance/node_modules/path-key/readme.md +++ /dev/null @@ -1,61 +0,0 @@ -# path-key [![Build Status](https://travis-ci.org/sindresorhus/path-key.svg?branch=master)](https://travis-ci.org/sindresorhus/path-key) - -> Get the [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) environment variable key cross-platform - -It's usually `PATH`, but on Windows it can be any casing like `Path`... - - -## Install - -``` -$ npm install path-key -``` - - -## Usage - -```js -const pathKey = require('path-key'); - -const key = pathKey(); -//=> 'PATH' - -const PATH = process.env[key]; -//=> '/usr/local/bin:/usr/bin:/bin' -``` - - -## API - -### pathKey(options?) - -#### options - -Type: `object` - -##### env - -Type: `object`
-Default: [`process.env`](https://nodejs.org/api/process.html#process_process_env) - -Use a custom environment variables object. - -#### platform - -Type: `string`
-Default: [`process.platform`](https://nodejs.org/api/process.html#process_process_platform) - -Get the PATH key for a specific platform. - - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/shebang-command/index.js b/tests/wcag-compliance/node_modules/shebang-command/index.js deleted file mode 100644 index f35db30..0000000 --- a/tests/wcag-compliance/node_modules/shebang-command/index.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; -const shebangRegex = require('shebang-regex'); - -module.exports = (string = '') => { - const match = string.match(shebangRegex); - - if (!match) { - return null; - } - - const [path, argument] = match[0].replace(/#! ?/, '').split(' '); - const binary = path.split('/').pop(); - - if (binary === 'env') { - return argument; - } - - return argument ? `${binary} ${argument}` : binary; -}; diff --git a/tests/wcag-compliance/node_modules/shebang-command/license b/tests/wcag-compliance/node_modules/shebang-command/license deleted file mode 100644 index db6bc32..0000000 --- a/tests/wcag-compliance/node_modules/shebang-command/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Kevin Mårtensson (github.com/kevva) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/shebang-command/package.json b/tests/wcag-compliance/node_modules/shebang-command/package.json deleted file mode 100644 index 18e3c04..0000000 --- a/tests/wcag-compliance/node_modules/shebang-command/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "shebang-command", - "version": "2.0.0", - "description": "Get the command from a shebang", - "license": "MIT", - "repository": "kevva/shebang-command", - "author": { - "name": "Kevin Mårtensson", - "email": "kevinmartensson@gmail.com", - "url": "github.com/kevva" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "cmd", - "command", - "parse", - "shebang" - ], - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "devDependencies": { - "ava": "^2.3.0", - "xo": "^0.24.0" - } -} diff --git a/tests/wcag-compliance/node_modules/shebang-command/readme.md b/tests/wcag-compliance/node_modules/shebang-command/readme.md deleted file mode 100644 index 84feb44..0000000 --- a/tests/wcag-compliance/node_modules/shebang-command/readme.md +++ /dev/null @@ -1,34 +0,0 @@ -# shebang-command [![Build Status](https://travis-ci.org/kevva/shebang-command.svg?branch=master)](https://travis-ci.org/kevva/shebang-command) - -> Get the command from a shebang - - -## Install - -``` -$ npm install shebang-command -``` - - -## Usage - -```js -const shebangCommand = require('shebang-command'); - -shebangCommand('#!/usr/bin/env node'); -//=> 'node' - -shebangCommand('#!/bin/bash'); -//=> 'bash' -``` - - -## API - -### shebangCommand(string) - -#### string - -Type: `string` - -String containing a shebang. diff --git a/tests/wcag-compliance/node_modules/shebang-regex/index.d.ts b/tests/wcag-compliance/node_modules/shebang-regex/index.d.ts deleted file mode 100644 index 61d034b..0000000 --- a/tests/wcag-compliance/node_modules/shebang-regex/index.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** -Regular expression for matching a [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) line. - -@example -``` -import shebangRegex = require('shebang-regex'); - -const string = '#!/usr/bin/env node\nconsole.log("unicorns");'; - -shebangRegex.test(string); -//=> true - -shebangRegex.exec(string)[0]; -//=> '#!/usr/bin/env node' - -shebangRegex.exec(string)[1]; -//=> '/usr/bin/env node' -``` -*/ -declare const shebangRegex: RegExp; - -export = shebangRegex; diff --git a/tests/wcag-compliance/node_modules/shebang-regex/index.js b/tests/wcag-compliance/node_modules/shebang-regex/index.js deleted file mode 100644 index 63fc4a0..0000000 --- a/tests/wcag-compliance/node_modules/shebang-regex/index.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -module.exports = /^#!(.*)/; diff --git a/tests/wcag-compliance/node_modules/shebang-regex/license b/tests/wcag-compliance/node_modules/shebang-regex/license deleted file mode 100644 index e7af2f7..0000000 --- a/tests/wcag-compliance/node_modules/shebang-regex/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/shebang-regex/package.json b/tests/wcag-compliance/node_modules/shebang-regex/package.json deleted file mode 100644 index 00ab30f..0000000 --- a/tests/wcag-compliance/node_modules/shebang-regex/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "shebang-regex", - "version": "3.0.0", - "description": "Regular expression for matching a shebang line", - "license": "MIT", - "repository": "sindresorhus/shebang-regex", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=8" - }, - "scripts": { - "test": "xo && ava && tsd" - }, - "files": [ - "index.js", - "index.d.ts" - ], - "keywords": [ - "regex", - "regexp", - "shebang", - "match", - "test", - "line" - ], - "devDependencies": { - "ava": "^1.4.1", - "tsd": "^0.7.2", - "xo": "^0.24.0" - } -} diff --git a/tests/wcag-compliance/node_modules/shebang-regex/readme.md b/tests/wcag-compliance/node_modules/shebang-regex/readme.md deleted file mode 100644 index 5ecf863..0000000 --- a/tests/wcag-compliance/node_modules/shebang-regex/readme.md +++ /dev/null @@ -1,33 +0,0 @@ -# shebang-regex [![Build Status](https://travis-ci.org/sindresorhus/shebang-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/shebang-regex) - -> Regular expression for matching a [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) line - - -## Install - -``` -$ npm install shebang-regex -``` - - -## Usage - -```js -const shebangRegex = require('shebang-regex'); - -const string = '#!/usr/bin/env node\nconsole.log("unicorns");'; - -shebangRegex.test(string); -//=> true - -shebangRegex.exec(string)[0]; -//=> '#!/usr/bin/env node' - -shebangRegex.exec(string)[1]; -//=> '/usr/bin/env node' -``` - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt b/tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt deleted file mode 100644 index eead04a..0000000 --- a/tests/wcag-compliance/node_modules/signal-exit/LICENSE.txt +++ /dev/null @@ -1,16 +0,0 @@ -The ISC License - -Copyright (c) 2015, Contributors - -Permission to use, copy, modify, and/or distribute this software -for any purpose with or without fee is hereby granted, provided -that the above copyright notice and this permission notice -appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE -LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/signal-exit/README.md b/tests/wcag-compliance/node_modules/signal-exit/README.md deleted file mode 100644 index f9c7c00..0000000 --- a/tests/wcag-compliance/node_modules/signal-exit/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# signal-exit - -[![Build Status](https://travis-ci.org/tapjs/signal-exit.png)](https://travis-ci.org/tapjs/signal-exit) -[![Coverage](https://coveralls.io/repos/tapjs/signal-exit/badge.svg?branch=master)](https://coveralls.io/r/tapjs/signal-exit?branch=master) -[![NPM version](https://img.shields.io/npm/v/signal-exit.svg)](https://www.npmjs.com/package/signal-exit) -[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) - -When you want to fire an event no matter how a process exits: - -* reaching the end of execution. -* explicitly having `process.exit(code)` called. -* having `process.kill(pid, sig)` called. -* receiving a fatal signal from outside the process - -Use `signal-exit`. - -```js -var onExit = require('signal-exit') - -onExit(function (code, signal) { - console.log('process exited!') -}) -``` - -## API - -`var remove = onExit(function (code, signal) {}, options)` - -The return value of the function is a function that will remove the -handler. - -Note that the function *only* fires for signals if the signal would -cause the process to exit. That is, there are no other listeners, and -it is a fatal signal. - -## Options - -* `alwaysLast`: Run this handler after any other signal or exit - handlers. This causes `process.emit` to be monkeypatched. diff --git a/tests/wcag-compliance/node_modules/signal-exit/index.js b/tests/wcag-compliance/node_modules/signal-exit/index.js deleted file mode 100644 index 93703f3..0000000 --- a/tests/wcag-compliance/node_modules/signal-exit/index.js +++ /dev/null @@ -1,202 +0,0 @@ -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -// grab a reference to node's real process object right away -var process = global.process - -const processOk = function (process) { - return process && - typeof process === 'object' && - typeof process.removeListener === 'function' && - typeof process.emit === 'function' && - typeof process.reallyExit === 'function' && - typeof process.listeners === 'function' && - typeof process.kill === 'function' && - typeof process.pid === 'number' && - typeof process.on === 'function' -} - -// some kind of non-node environment, just no-op -/* istanbul ignore if */ -if (!processOk(process)) { - module.exports = function () { - return function () {} - } -} else { - var assert = require('assert') - var signals = require('./signals.js') - var isWin = /^win/i.test(process.platform) - - var EE = require('events') - /* istanbul ignore if */ - if (typeof EE !== 'function') { - EE = EE.EventEmitter - } - - var emitter - if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ - } else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} - } - - // Because this emitter is a global, we have to check to see if a - // previous version of this library failed to enable infinite listeners. - // I know what you're about to say. But literally everything about - // signal-exit is a compromise with evil. Get used to it. - if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true - } - - module.exports = function (cb, opts) { - /* istanbul ignore if */ - if (!processOk(global.process)) { - return function () {} - } - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') - - if (loaded === false) { - load() - } - - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } - - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) - - return remove - } - - var unload = function unload () { - if (!loaded || !processOk(global.process)) { - return - } - loaded = false - - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 - } - module.exports.unload = unload - - var emit = function emit (event, code, signal) { - /* istanbul ignore if */ - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) - } - - // { : , ... } - var sigListeners = {} - signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - /* istanbul ignore if */ - if (!processOk(global.process)) { - return - } - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - if (isWin && sig === 'SIGHUP') { - // "SIGHUP" throws an `ENOSYS` error on Windows, - // so use a supported signal instead - sig = 'SIGINT' - } - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } - }) - - module.exports.signals = function () { - return signals - } - - var loaded = false - - var load = function load () { - if (loaded || !processOk(global.process)) { - return - } - loaded = true - - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 - - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) - - process.emit = processEmit - process.reallyExit = processReallyExit - } - module.exports.load = load - - var originalProcessReallyExit = process.reallyExit - var processReallyExit = function processReallyExit (code) { - /* istanbul ignore if */ - if (!processOk(global.process)) { - return - } - process.exitCode = code || /* istanbul ignore next */ 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) - } - - var originalProcessEmit = process.emit - var processEmit = function processEmit (ev, arg) { - if (ev === 'exit' && processOk(global.process)) { - /* istanbul ignore else */ - if (arg !== undefined) { - process.exitCode = arg - } - var ret = originalProcessEmit.apply(this, arguments) - /* istanbul ignore next */ - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } - } -} diff --git a/tests/wcag-compliance/node_modules/signal-exit/package.json b/tests/wcag-compliance/node_modules/signal-exit/package.json deleted file mode 100644 index e1a0031..0000000 --- a/tests/wcag-compliance/node_modules/signal-exit/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "signal-exit", - "version": "3.0.7", - "description": "when you want to fire an event no matter how a process exits.", - "main": "index.js", - "scripts": { - "test": "tap", - "snap": "tap", - "preversion": "npm test", - "postversion": "npm publish", - "prepublishOnly": "git push origin --follow-tags" - }, - "files": [ - "index.js", - "signals.js" - ], - "repository": { - "type": "git", - "url": "https://github.com/tapjs/signal-exit.git" - }, - "keywords": [ - "signal", - "exit" - ], - "author": "Ben Coe ", - "license": "ISC", - "bugs": { - "url": "https://github.com/tapjs/signal-exit/issues" - }, - "homepage": "https://github.com/tapjs/signal-exit", - "devDependencies": { - "chai": "^3.5.0", - "coveralls": "^3.1.1", - "nyc": "^15.1.0", - "standard-version": "^9.3.1", - "tap": "^15.1.1" - } -} diff --git a/tests/wcag-compliance/node_modules/signal-exit/signals.js b/tests/wcag-compliance/node_modules/signal-exit/signals.js deleted file mode 100644 index 3bd67a8..0000000 --- a/tests/wcag-compliance/node_modules/signal-exit/signals.js +++ /dev/null @@ -1,53 +0,0 @@ -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] - -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) -} - -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) -} diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/index.js b/tests/wcag-compliance/node_modules/strip-final-newline/index.js deleted file mode 100644 index 034b56f..0000000 --- a/tests/wcag-compliance/node_modules/strip-final-newline/index.js +++ /dev/null @@ -1,14 +0,0 @@ -export default function stripFinalNewline(input) { - const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); - const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); - - if (input[input.length - 1] === LF) { - input = input.slice(0, -1); - } - - if (input[input.length - 1] === CR) { - input = input.slice(0, -1); - } - - return input; -} diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/license b/tests/wcag-compliance/node_modules/strip-final-newline/license deleted file mode 100644 index fa7ceba..0000000 --- a/tests/wcag-compliance/node_modules/strip-final-newline/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (https://sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/package.json b/tests/wcag-compliance/node_modules/strip-final-newline/package.json deleted file mode 100644 index cc1a014..0000000 --- a/tests/wcag-compliance/node_modules/strip-final-newline/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "strip-final-newline", - "version": "3.0.0", - "description": "Strip the final newline character from a string/buffer", - "license": "MIT", - "repository": "sindresorhus/strip-final-newline", - "funding": "https://github.com/sponsors/sindresorhus", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "https://sindresorhus.com" - }, - "type": "module", - "exports": "./index.js", - "engines": { - "node": ">=12" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "strip", - "trim", - "remove", - "delete", - "final", - "last", - "end", - "file", - "newline", - "linebreak", - "character", - "string", - "buffer" - ], - "devDependencies": { - "ava": "^3.15.0", - "xo": "^0.39.1" - } -} diff --git a/tests/wcag-compliance/node_modules/strip-final-newline/readme.md b/tests/wcag-compliance/node_modules/strip-final-newline/readme.md deleted file mode 100644 index 8d9090b..0000000 --- a/tests/wcag-compliance/node_modules/strip-final-newline/readme.md +++ /dev/null @@ -1,35 +0,0 @@ -# strip-final-newline - -> Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from a string/buffer - -Can be useful when parsing the output of, for example, `ChildProcess#execFile`, as [binaries usually output a newline at the end](https://stackoverflow.com/questions/729692/why-should-text-files-end-with-a-newline). Normally, you would use `stdout.trim()`, but that would also remove newlines at the start and whitespace. - -## Install - -``` -$ npm install strip-final-newline -``` - -## Usage - -```js -import stripFinalNewline from 'strip-final-newline'; - -stripFinalNewline('foo\nbar\n\n'); -//=> 'foo\nbar\n' - -stripFinalNewline(Buffer.from('foo\nbar\n\n')).toString(); -//=> 'foo\nbar\n' -``` - ---- - -
- - Get professional support for this package with a Tidelift subscription - -
- - Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. -
-
diff --git a/tests/wcag-compliance/node_modules/which/CHANGELOG.md b/tests/wcag-compliance/node_modules/which/CHANGELOG.md deleted file mode 100644 index 7fb1f20..0000000 --- a/tests/wcag-compliance/node_modules/which/CHANGELOG.md +++ /dev/null @@ -1,166 +0,0 @@ -# Changes - - -## 2.0.2 - -* Rename bin to `node-which` - -## 2.0.1 - -* generate changelog and publish on version bump -* enforce 100% test coverage -* Promise interface - -## 2.0.0 - -* Parallel tests, modern JavaScript, and drop support for node < 8 - -## 1.3.1 - -* update deps -* update travis - -## v1.3.0 - -* Add nothrow option to which.sync -* update tap - -## v1.2.14 - -* appveyor: drop node 5 and 0.x -* travis-ci: add node 6, drop 0.x - -## v1.2.13 - -* test: Pass missing option to pass on windows -* update tap -* update isexe to 2.0.0 -* neveragain.tech pledge request - -## v1.2.12 - -* Removed unused require - -## v1.2.11 - -* Prevent changelog script from being included in package - -## v1.2.10 - -* Use env.PATH only, not env.Path - -## v1.2.9 - -* fix for paths starting with ../ -* Remove unused `is-absolute` module - -## v1.2.8 - -* bullet items in changelog that contain (but don't start with) # - -## v1.2.7 - -* strip 'update changelog' changelog entries out of changelog - -## v1.2.6 - -* make the changelog bulleted - -## v1.2.5 - -* make a changelog, and keep it up to date -* don't include tests in package -* Properly handle relative-path executables -* appveyor -* Attach error code to Not Found error -* Make tests pass on Windows - -## v1.2.4 - -* Fix typo - -## v1.2.3 - -* update isexe, fix regression in pathExt handling - -## v1.2.2 - -* update deps, use isexe module, test windows - -## v1.2.1 - -* Sometimes windows PATH entries are quoted -* Fixed a bug in the check for group and user mode bits. This bug was introduced during refactoring for supporting strict mode. -* doc cli - -## v1.2.0 - -* Add support for opt.all and -as cli flags -* test the bin -* update travis -* Allow checking for multiple programs in bin/which -* tap 2 - -## v1.1.2 - -* travis -* Refactored and fixed undefined error on Windows -* Support strict mode - -## v1.1.1 - -* test +g exes against secondary groups, if available -* Use windows exe semantics on cygwin & msys -* cwd should be first in path on win32, not last -* Handle lower-case 'env.Path' on Windows -* Update docs -* use single-quotes - -## v1.1.0 - -* Add tests, depend on is-absolute - -## v1.0.9 - -* which.js: root is allowed to execute files owned by anyone - -## v1.0.8 - -* don't use graceful-fs - -## v1.0.7 - -* add license to package.json - -## v1.0.6 - -* isc license - -## 1.0.5 - -* Awful typo - -## 1.0.4 - -* Test for path absoluteness properly -* win: Allow '' as a pathext if cmd has a . in it - -## 1.0.3 - -* Remove references to execPath -* Make `which.sync()` work on Windows by honoring the PATHEXT variable. -* Make `isExe()` always return true on Windows. -* MIT - -## 1.0.2 - -* Only files can be exes - -## 1.0.1 - -* Respect the PATHEXT env for win32 support -* should 0755 the bin -* binary -* guts -* package -* 1st diff --git a/tests/wcag-compliance/node_modules/which/LICENSE b/tests/wcag-compliance/node_modules/which/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/tests/wcag-compliance/node_modules/which/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/tests/wcag-compliance/node_modules/which/README.md b/tests/wcag-compliance/node_modules/which/README.md deleted file mode 100644 index cd83350..0000000 --- a/tests/wcag-compliance/node_modules/which/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# which - -Like the unix `which` utility. - -Finds the first instance of a specified executable in the PATH -environment variable. Does not cache the results, so `hash -r` is not -needed when the PATH changes. - -## USAGE - -```javascript -var which = require('which') - -// async usage -which('node', function (er, resolvedPath) { - // er is returned if no "node" is found on the PATH - // if it is found, then the absolute path to the exec is returned -}) - -// or promise -which('node').then(resolvedPath => { ... }).catch(er => { ... not found ... }) - -// sync usage -// throws if not found -var resolved = which.sync('node') - -// if nothrow option is used, returns null if not found -resolved = which.sync('node', {nothrow: true}) - -// Pass options to override the PATH and PATHEXT environment vars. -which('node', { path: someOtherPath }, function (er, resolved) { - if (er) - throw er - console.log('found at %j', resolved) -}) -``` - -## CLI USAGE - -Same as the BSD `which(1)` binary. - -``` -usage: which [-as] program ... -``` - -## OPTIONS - -You may pass an options object as the second argument. - -- `path`: Use instead of the `PATH` environment variable. -- `pathExt`: Use instead of the `PATHEXT` environment variable. -- `all`: Return all matches, instead of just the first one. Note that - this means the function returns an array of strings instead of a - single string. diff --git a/tests/wcag-compliance/node_modules/which/bin/node-which b/tests/wcag-compliance/node_modules/which/bin/node-which deleted file mode 100755 index 7cee372..0000000 --- a/tests/wcag-compliance/node_modules/which/bin/node-which +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env node -var which = require("../") -if (process.argv.length < 3) - usage() - -function usage () { - console.error('usage: which [-as] program ...') - process.exit(1) -} - -var all = false -var silent = false -var dashdash = false -var args = process.argv.slice(2).filter(function (arg) { - if (dashdash || !/^-/.test(arg)) - return true - - if (arg === '--') { - dashdash = true - return false - } - - var flags = arg.substr(1).split('') - for (var f = 0; f < flags.length; f++) { - var flag = flags[f] - switch (flag) { - case 's': - silent = true - break - case 'a': - all = true - break - default: - console.error('which: illegal option -- ' + flag) - usage() - } - } - return false -}) - -process.exit(args.reduce(function (pv, current) { - try { - var f = which.sync(current, { all: all }) - if (all) - f = f.join('\n') - if (!silent) - console.log(f) - return pv; - } catch (e) { - return 1; - } -}, 0)) diff --git a/tests/wcag-compliance/node_modules/which/package.json b/tests/wcag-compliance/node_modules/which/package.json deleted file mode 100644 index 97ad7fb..0000000 --- a/tests/wcag-compliance/node_modules/which/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "author": "Isaac Z. Schlueter (http://blog.izs.me)", - "name": "which", - "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", - "version": "2.0.2", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-which.git" - }, - "main": "which.js", - "bin": { - "node-which": "./bin/node-which" - }, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "devDependencies": { - "mkdirp": "^0.5.0", - "rimraf": "^2.6.2", - "tap": "^14.6.9" - }, - "scripts": { - "test": "tap", - "preversion": "npm test", - "postversion": "npm publish", - "prepublish": "npm run changelog", - "prechangelog": "bash gen-changelog.sh", - "changelog": "git add CHANGELOG.md", - "postchangelog": "git commit -m 'update changelog - '${npm_package_version}", - "postpublish": "git push origin --follow-tags" - }, - "files": [ - "which.js", - "bin/node-which" - ], - "tap": { - "check-coverage": true - }, - "engines": { - "node": ">= 8" - } -} diff --git a/tests/wcag-compliance/node_modules/which/which.js b/tests/wcag-compliance/node_modules/which/which.js deleted file mode 100644 index 82afffd..0000000 --- a/tests/wcag-compliance/node_modules/which/which.js +++ /dev/null @@ -1,125 +0,0 @@ -const isWindows = process.platform === 'win32' || - process.env.OSTYPE === 'cygwin' || - process.env.OSTYPE === 'msys' - -const path = require('path') -const COLON = isWindows ? ';' : ':' -const isexe = require('isexe') - -const getNotFoundError = (cmd) => - Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) - -const getPathInfo = (cmd, opt) => { - const colon = opt.colon || COLON - - // If it has a slash, then we don't bother searching the pathenv. - // just check the file itself, and that's it. - const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] - : ( - [ - // windows always checks the cwd first - ...(isWindows ? [process.cwd()] : []), - ...(opt.path || process.env.PATH || - /* istanbul ignore next: very unusual */ '').split(colon), - ] - ) - const pathExtExe = isWindows - ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' - : '' - const pathExt = isWindows ? pathExtExe.split(colon) : [''] - - if (isWindows) { - if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') - pathExt.unshift('') - } - - return { - pathEnv, - pathExt, - pathExtExe, - } -} - -const which = (cmd, opt, cb) => { - if (typeof opt === 'function') { - cb = opt - opt = {} - } - if (!opt) - opt = {} - - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] - - const step = i => new Promise((resolve, reject) => { - if (i === pathEnv.length) - return opt.all && found.length ? resolve(found) - : reject(getNotFoundError(cmd)) - - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw - - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd - - resolve(subStep(p, i, 0)) - }) - - const subStep = (p, i, ii) => new Promise((resolve, reject) => { - if (ii === pathExt.length) - return resolve(step(i + 1)) - const ext = pathExt[ii] - isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { - if (!er && is) { - if (opt.all) - found.push(p + ext) - else - return resolve(p + ext) - } - return resolve(subStep(p, i, ii + 1)) - }) - }) - - return cb ? step(0).then(res => cb(null, res), cb) : step(0) -} - -const whichSync = (cmd, opt) => { - opt = opt || {} - - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] - - for (let i = 0; i < pathEnv.length; i ++) { - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw - - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd - - for (let j = 0; j < pathExt.length; j ++) { - const cur = p + pathExt[j] - try { - const is = isexe.sync(cur, { pathExt: pathExtExe }) - if (is) { - if (opt.all) - found.push(cur) - else - return cur - } - } catch (ex) {} - } - } - - if (opt.all && found.length) - return found - - if (opt.nothrow) - return null - - throw getNotFoundError(cmd) -} - -module.exports = which -which.sync = whichSync diff --git a/tests/wcag-compliance/package-lock.json b/tests/wcag-compliance/package-lock.json deleted file mode 100644 index e0fc0c6..0000000 --- a/tests/wcag-compliance/package-lock.json +++ /dev/null @@ -1,326 +0,0 @@ -{ - "name": "wcag-compliance", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "wcag-compliance", - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "color-contrast-checker": "^2.1.0", - "execa": "^6.1.0" - } - }, - "node_modules/color-contrast-checker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", - "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - } - }, - "dependencies": { - "color-contrast-checker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", - "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" - }, - "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==" - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==" - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==" - } - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } -} diff --git a/tests/wcag-compliance/package.json b/tests/wcag-compliance/package.json index a77038f..4212881 100644 --- a/tests/wcag-compliance/package.json +++ b/tests/wcag-compliance/package.json @@ -1,32 +1,31 @@ { "name": "wcag-compliance", "version": "0.1.0", - "description": "An accessibility checker tool for validating the color contrast of Catppuccin's palettes based on WCAG 2.0 and WCAG 2.1 standards", - "main": "./src/index.js", + "description": "WCAG compliance checker", + "main": "index.js", + "type": "module", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node index.js" }, "repository": { "type": "git", - "url": "git+https://github.com/catppuccin/catppuccin.git" + "url": "git+https://github.com/catppuccin/catppuccin.git#dev" }, "keywords": [ - "wcag", - "wcag-aa", - "color", - "contrast", - "verifier", - "accessibility", - "standard" + "wcag-compliance", + "catppuccin", + "test" ], - "author": "Pocco81", + "author": "Catppuccin Org", "license": "MIT", "bugs": { "url": "https://github.com/catppuccin/catppuccin/issues" }, - "homepage": "https://github.com/catppuccin/catppuccin#readme", - "dependencies": { - "color-contrast-checker": "^2.1.0", - "execa": "^6.1.0" + "homepage": "https://github.com/catppuccin/catppuccin/tree/dev#readme", + "devDependencies": { + "@catppuccin/palette": "^0.1.0", + "chalk": "^5.0.1", + "color-contrast-checker": "^2.1.0" } } diff --git a/tests/wcag-compliance/src/index.js b/tests/wcag-compliance/src/index.js deleted file mode 100644 index 1d5ac3c..0000000 --- a/tests/wcag-compliance/src/index.js +++ /dev/null @@ -1,110 +0,0 @@ -// import { platform } from 'os'; - -const os = require('os') -const execa = require("execa") -const ColorContrastChecker = require('color-contrast-checker') - -const {stdout} = execa('echo', ['unicorns']); -console.log(stdout); - - -function get_git_root() { - try { - let cmd = '' - - if (platform() === 'win32') { - cmd = `git rev-parse --show-toplevel ` - } else { - cmd = `(git rev-parse --show-toplevel )` - } - - const { stdout } = execa.shellSync(cmd) - - return stdout - } catch (e) { - return '' - } -} - -// console.log(execa.shellSync("echo 'hello'")) - -// /* File System Object */ -// var fs = require('fs'); -// -// pr - -/* Read File */ -// fs.readFile(get_git_root() + "palettes.json", bar) - -function bar (err, data) - { - /* If an error exists, show it, otherwise show the file */ - err ? Function("error","throw error")(err) : console.log(JSON.stringify(data) ); - }; - -// const fs = require("fs") -// - -// var ccc = new ColorContrastChecker(); -// var palettes = fs.readFileSync('../../palettes.json', 'utf8'); -// var palettes = fs.readFile('test.json', 'utf8'); - -// fs.readFile("../../../palettes.json", function(text){ -// palettes = text.split("\n") -// }); - -// for (var key in palettes) { -// console.log(key) -// if (ccc.isLevelAA(background, rainbow[key], 14)) { -// console.log(" •" + key + ": ✅"); -// } else { -// console.log(" •" + key + ": ❌"); -// } -// } - -// const background = "#1E1D2F" -// var rainbow = { -// rosewater: "#F5E0DC", -// flamingo: "#F2CDCD", -// mauve: "#DDB6F2", -// pink: "#F5C2E7", -// red: "#F28FAD", -// maroon: "#E8A2AF", -// peach: "#F8BD96", -// yellow: "#FAE3B0", -// green: "#ABE9B3", -// blue: "#96CDFB", -// sky: "#89DCEB", -// teal: "#B5E8E0", -// lavender: "#C9CBFF", -// white: "#D9E0EE", -// gray2: "#C3BAC6", -// gray1: "#988BA2", -// gray0: "#6E6C7E", -// black4: "#575268", -// black3: "#302D41", -// black2: "#1E1D2F", -// black1: "#1A1823", -// black0: "#131020", -// } -// -// console.log("\t---- WCAG conformance level AA on Catppuccin ----\n") -// -// for (var key in rainbow) { -// if (ccc.isLevelAA(background, rainbow[key], 14)) { -// console.log(" •" + key + ": ✅"); -// } else { -// console.log(" •" + key + ": ❌"); -// } -// } - -// var color1 = "#FFFFFF"; -// var color2 = "#000000"; -// -// if (ccc.isLevelAA(color1, color2, 14)) { -// console.log("Valid Level AA"); -// } else { -// console.log("Invalid Contrast"); -// } -// -// console.log("Hello world!") diff --git a/tests/wcag-compliance/test.json b/tests/wcag-compliance/test.json deleted file mode 100644 index df68a9c..0000000 --- a/tests/wcag-compliance/test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "hello": "world" -} From b2eaa55767c6300c358f6e6aabd634dedfeaf970 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 09:20:34 -0500 Subject: [PATCH 10/43] feat: added dynamically generated circles --- README.md | 148 ++++++-- assets/palette/circles/black0.png | Bin 2272 -> 0 bytes assets/palette/circles/black1.png | Bin 2275 -> 0 bytes assets/palette/circles/black2.png | Bin 2273 -> 0 bytes assets/palette/circles/black3.png | Bin 2278 -> 0 bytes assets/palette/circles/black4.png | Bin 2280 -> 0 bytes assets/palette/circles/blue.png | Bin 2412 -> 0 bytes assets/palette/circles/flamingo.png | Bin 2249 -> 0 bytes assets/palette/circles/frappe_base.png | Bin 0 -> 1128 bytes assets/palette/circles/frappe_blue.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_crust.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_flamingo.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_green.png | Bin 0 -> 1127 bytes assets/palette/circles/frappe_lavender.png | Bin 0 -> 1125 bytes assets/palette/circles/frappe_mantle.png | Bin 0 -> 1127 bytes assets/palette/circles/frappe_maroon.png | Bin 0 -> 1125 bytes assets/palette/circles/frappe_mauve.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_overlay0.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_overlay1.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_overlay2.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_peach.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_pink.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_red.png | Bin 0 -> 1125 bytes assets/palette/circles/frappe_rosewater.png | Bin 0 -> 1125 bytes assets/palette/circles/frappe_sapphire.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_sky.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_subtext0.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_subtext1.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_surface0.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_surface1.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_surface2.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_teal.png | Bin 0 -> 1126 bytes assets/palette/circles/frappe_text.png | Bin 0 -> 1127 bytes assets/palette/circles/frappe_yellow.png | Bin 0 -> 1126 bytes assets/palette/circles/gray0.png | Bin 2277 -> 0 bytes assets/palette/circles/gray1.png | Bin 2249 -> 0 bytes assets/palette/circles/gray2.png | Bin 2255 -> 0 bytes assets/palette/circles/green.png | Bin 2409 -> 0 bytes assets/palette/circles/latte_base.png | Bin 0 -> 1122 bytes assets/palette/circles/latte_blue.png | Bin 0 -> 1124 bytes assets/palette/circles/latte_crust.png | Bin 0 -> 1124 bytes assets/palette/circles/latte_flamingo.png | Bin 0 -> 1123 bytes assets/palette/circles/latte_green.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_lavender.png | Bin 0 -> 1124 bytes assets/palette/circles/latte_mantle.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_maroon.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_mauve.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_overlay0.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_overlay1.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_overlay2.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_peach.png | Bin 0 -> 1122 bytes assets/palette/circles/latte_pink.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_red.png | Bin 0 -> 1127 bytes assets/palette/circles/latte_rosewater.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_sapphire.png | Bin 0 -> 1125 bytes assets/palette/circles/latte_sky.png | Bin 0 -> 1124 bytes assets/palette/circles/latte_subtext0.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_subtext1.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_surface0.png | Bin 0 -> 1127 bytes assets/palette/circles/latte_surface1.png | Bin 0 -> 1128 bytes assets/palette/circles/latte_surface2.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_teal.png | Bin 0 -> 1125 bytes assets/palette/circles/latte_text.png | Bin 0 -> 1126 bytes assets/palette/circles/latte_yellow.png | Bin 0 -> 1124 bytes assets/palette/circles/lavender.png | Bin 2409 -> 0 bytes assets/palette/circles/macchiato_base.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_blue.png | Bin 0 -> 1124 bytes assets/palette/circles/macchiato_crust.png | Bin 0 -> 1125 bytes assets/palette/circles/macchiato_flamingo.png | Bin 0 -> 1125 bytes assets/palette/circles/macchiato_green.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_lavender.png | Bin 0 -> 1123 bytes assets/palette/circles/macchiato_mantle.png | Bin 0 -> 1125 bytes assets/palette/circles/macchiato_maroon.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_mauve.png | Bin 0 -> 1124 bytes assets/palette/circles/macchiato_overlay0.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_overlay1.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_overlay2.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_peach.png | Bin 0 -> 1125 bytes assets/palette/circles/macchiato_pink.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_red.png | Bin 0 -> 1126 bytes .../palette/circles/macchiato_rosewater.png | Bin 0 -> 1125 bytes assets/palette/circles/macchiato_sapphire.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_sky.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_subtext0.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_subtext1.png | Bin 0 -> 1125 bytes assets/palette/circles/macchiato_surface0.png | Bin 0 -> 1127 bytes assets/palette/circles/macchiato_surface1.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_surface2.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_teal.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_text.png | Bin 0 -> 1126 bytes assets/palette/circles/macchiato_yellow.png | Bin 0 -> 1126 bytes assets/palette/circles/maroon.png | Bin 2254 -> 0 bytes assets/palette/circles/mauve.png | Bin 2248 -> 0 bytes assets/palette/circles/mocha_base.png | Bin 0 -> 1125 bytes assets/palette/circles/mocha_blue.png | Bin 0 -> 1123 bytes assets/palette/circles/mocha_crust.png | Bin 0 -> 1124 bytes assets/palette/circles/mocha_flamingo.png | Bin 0 -> 1124 bytes assets/palette/circles/mocha_green.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_lavender.png | Bin 0 -> 1123 bytes assets/palette/circles/mocha_mantle.png | Bin 0 -> 1124 bytes assets/palette/circles/mocha_maroon.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_mauve.png | Bin 0 -> 1123 bytes assets/palette/circles/mocha_overlay0.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_overlay1.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_overlay2.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_peach.png | Bin 0 -> 1125 bytes assets/palette/circles/mocha_pink.png | Bin 0 -> 1125 bytes assets/palette/circles/mocha_red.png | Bin 0 -> 1125 bytes assets/palette/circles/mocha_rosewater.png | Bin 0 -> 1123 bytes assets/palette/circles/mocha_sapphire.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_sky.png | Bin 0 -> 1125 bytes assets/palette/circles/mocha_subtext0.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_subtext1.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_surface0.png | Bin 0 -> 1127 bytes assets/palette/circles/mocha_surface1.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_surface2.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_teal.png | Bin 0 -> 1125 bytes assets/palette/circles/mocha_text.png | Bin 0 -> 1126 bytes assets/palette/circles/mocha_yellow.png | Bin 0 -> 1125 bytes assets/palette/circles/peach.png | Bin 2256 -> 0 bytes assets/palette/circles/pink.png | Bin 2251 -> 0 bytes assets/palette/circles/red.png | Bin 2244 -> 0 bytes assets/palette/circles/rosewater.png | Bin 2256 -> 0 bytes assets/palette/circles/sky.png | Bin 2410 -> 0 bytes assets/palette/circles/teal.png | Bin 2410 -> 0 bytes assets/palette/circles/white.png | Bin 2253 -> 0 bytes assets/palette/circles/yellow.png | Bin 2255 -> 0 bytes docs/README.md | 239 ++++++++++++ samples/python2.py | 1 + tests/wcag-compliance/.npmrc | 1 - tests/wcag-compliance/README.md | 17 - tests/wcag-compliance/index.js | 104 ------ .../node_modules/.package-lock.json | 30 -- .../color-contrast-checker/.eslintrc.js | 29 -- .../.github/workflows/npmpublish.yml | 45 --- .../color-contrast-checker/LICENSE | 202 ----------- .../color-contrast-checker/README.md | 152 -------- .../color-contrast-checker/example/index.html | 71 ---- .../color-contrast-checker/package.json | 62 ---- .../src/color-contrast-checker.js | 241 ------------ .../test/color-contrast-checker.js | 342 ------------------ tests/wcag-compliance/package.json | 31 -- 142 files changed, 355 insertions(+), 1360 deletions(-) delete mode 100644 assets/palette/circles/black0.png delete mode 100644 assets/palette/circles/black1.png delete mode 100644 assets/palette/circles/black2.png delete mode 100644 assets/palette/circles/black3.png delete mode 100644 assets/palette/circles/black4.png delete mode 100644 assets/palette/circles/blue.png delete mode 100644 assets/palette/circles/flamingo.png create mode 100644 assets/palette/circles/frappe_base.png create mode 100644 assets/palette/circles/frappe_blue.png create mode 100644 assets/palette/circles/frappe_crust.png create mode 100644 assets/palette/circles/frappe_flamingo.png create mode 100644 assets/palette/circles/frappe_green.png create mode 100644 assets/palette/circles/frappe_lavender.png create mode 100644 assets/palette/circles/frappe_mantle.png create mode 100644 assets/palette/circles/frappe_maroon.png create mode 100644 assets/palette/circles/frappe_mauve.png create mode 100644 assets/palette/circles/frappe_overlay0.png create mode 100644 assets/palette/circles/frappe_overlay1.png create mode 100644 assets/palette/circles/frappe_overlay2.png create mode 100644 assets/palette/circles/frappe_peach.png create mode 100644 assets/palette/circles/frappe_pink.png create mode 100644 assets/palette/circles/frappe_red.png create mode 100644 assets/palette/circles/frappe_rosewater.png create mode 100644 assets/palette/circles/frappe_sapphire.png create mode 100644 assets/palette/circles/frappe_sky.png create mode 100644 assets/palette/circles/frappe_subtext0.png create mode 100644 assets/palette/circles/frappe_subtext1.png create mode 100644 assets/palette/circles/frappe_surface0.png create mode 100644 assets/palette/circles/frappe_surface1.png create mode 100644 assets/palette/circles/frappe_surface2.png create mode 100644 assets/palette/circles/frappe_teal.png create mode 100644 assets/palette/circles/frappe_text.png create mode 100644 assets/palette/circles/frappe_yellow.png delete mode 100644 assets/palette/circles/gray0.png delete mode 100644 assets/palette/circles/gray1.png delete mode 100644 assets/palette/circles/gray2.png delete mode 100644 assets/palette/circles/green.png create mode 100644 assets/palette/circles/latte_base.png create mode 100644 assets/palette/circles/latte_blue.png create mode 100644 assets/palette/circles/latte_crust.png create mode 100644 assets/palette/circles/latte_flamingo.png create mode 100644 assets/palette/circles/latte_green.png create mode 100644 assets/palette/circles/latte_lavender.png create mode 100644 assets/palette/circles/latte_mantle.png create mode 100644 assets/palette/circles/latte_maroon.png create mode 100644 assets/palette/circles/latte_mauve.png create mode 100644 assets/palette/circles/latte_overlay0.png create mode 100644 assets/palette/circles/latte_overlay1.png create mode 100644 assets/palette/circles/latte_overlay2.png create mode 100644 assets/palette/circles/latte_peach.png create mode 100644 assets/palette/circles/latte_pink.png create mode 100644 assets/palette/circles/latte_red.png create mode 100644 assets/palette/circles/latte_rosewater.png create mode 100644 assets/palette/circles/latte_sapphire.png create mode 100644 assets/palette/circles/latte_sky.png create mode 100644 assets/palette/circles/latte_subtext0.png create mode 100644 assets/palette/circles/latte_subtext1.png create mode 100644 assets/palette/circles/latte_surface0.png create mode 100644 assets/palette/circles/latte_surface1.png create mode 100644 assets/palette/circles/latte_surface2.png create mode 100644 assets/palette/circles/latte_teal.png create mode 100644 assets/palette/circles/latte_text.png create mode 100644 assets/palette/circles/latte_yellow.png delete mode 100644 assets/palette/circles/lavender.png create mode 100644 assets/palette/circles/macchiato_base.png create mode 100644 assets/palette/circles/macchiato_blue.png create mode 100644 assets/palette/circles/macchiato_crust.png create mode 100644 assets/palette/circles/macchiato_flamingo.png create mode 100644 assets/palette/circles/macchiato_green.png create mode 100644 assets/palette/circles/macchiato_lavender.png create mode 100644 assets/palette/circles/macchiato_mantle.png create mode 100644 assets/palette/circles/macchiato_maroon.png create mode 100644 assets/palette/circles/macchiato_mauve.png create mode 100644 assets/palette/circles/macchiato_overlay0.png create mode 100644 assets/palette/circles/macchiato_overlay1.png create mode 100644 assets/palette/circles/macchiato_overlay2.png create mode 100644 assets/palette/circles/macchiato_peach.png create mode 100644 assets/palette/circles/macchiato_pink.png create mode 100644 assets/palette/circles/macchiato_red.png create mode 100644 assets/palette/circles/macchiato_rosewater.png create mode 100644 assets/palette/circles/macchiato_sapphire.png create mode 100644 assets/palette/circles/macchiato_sky.png create mode 100644 assets/palette/circles/macchiato_subtext0.png create mode 100644 assets/palette/circles/macchiato_subtext1.png create mode 100644 assets/palette/circles/macchiato_surface0.png create mode 100644 assets/palette/circles/macchiato_surface1.png create mode 100644 assets/palette/circles/macchiato_surface2.png create mode 100644 assets/palette/circles/macchiato_teal.png create mode 100644 assets/palette/circles/macchiato_text.png create mode 100644 assets/palette/circles/macchiato_yellow.png delete mode 100644 assets/palette/circles/maroon.png delete mode 100644 assets/palette/circles/mauve.png create mode 100644 assets/palette/circles/mocha_base.png create mode 100644 assets/palette/circles/mocha_blue.png create mode 100644 assets/palette/circles/mocha_crust.png create mode 100644 assets/palette/circles/mocha_flamingo.png create mode 100644 assets/palette/circles/mocha_green.png create mode 100644 assets/palette/circles/mocha_lavender.png create mode 100644 assets/palette/circles/mocha_mantle.png create mode 100644 assets/palette/circles/mocha_maroon.png create mode 100644 assets/palette/circles/mocha_mauve.png create mode 100644 assets/palette/circles/mocha_overlay0.png create mode 100644 assets/palette/circles/mocha_overlay1.png create mode 100644 assets/palette/circles/mocha_overlay2.png create mode 100644 assets/palette/circles/mocha_peach.png create mode 100644 assets/palette/circles/mocha_pink.png create mode 100644 assets/palette/circles/mocha_red.png create mode 100644 assets/palette/circles/mocha_rosewater.png create mode 100644 assets/palette/circles/mocha_sapphire.png create mode 100644 assets/palette/circles/mocha_sky.png create mode 100644 assets/palette/circles/mocha_subtext0.png create mode 100644 assets/palette/circles/mocha_subtext1.png create mode 100644 assets/palette/circles/mocha_surface0.png create mode 100644 assets/palette/circles/mocha_surface1.png create mode 100644 assets/palette/circles/mocha_surface2.png create mode 100644 assets/palette/circles/mocha_teal.png create mode 100644 assets/palette/circles/mocha_text.png create mode 100644 assets/palette/circles/mocha_yellow.png delete mode 100644 assets/palette/circles/peach.png delete mode 100644 assets/palette/circles/pink.png delete mode 100644 assets/palette/circles/red.png delete mode 100644 assets/palette/circles/rosewater.png delete mode 100644 assets/palette/circles/sky.png delete mode 100644 assets/palette/circles/teal.png delete mode 100644 assets/palette/circles/white.png delete mode 100644 assets/palette/circles/yellow.png create mode 100644 docs/README.md delete mode 100644 tests/wcag-compliance/.npmrc delete mode 100644 tests/wcag-compliance/README.md delete mode 100644 tests/wcag-compliance/index.js delete mode 100644 tests/wcag-compliance/node_modules/.package-lock.json delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/README.md delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/package.json delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js delete mode 100644 tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js delete mode 100644 tests/wcag-compliance/package.json diff --git a/README.md b/README.md index ac0f77a..cdf6242 100644 --- a/README.md +++ b/README.md @@ -51,39 +51,121 @@ To make the best use them please refer to the [Styleguide](https://github.com/catppuccin/style-guide).
-#### Morning - -| | Name | Hex | RGB | HSL | CMYK | -| ----------------------------------------------------------------------- | -------- | --------- | --------------- | --------------- | ------------------ | -| | Flamingo | `#F2CDCD` | `242, 205, 205` | `0, 59%, 88%` | `0%, 15%, 15%, 5%` | -| | Mauve | `#DDB6F2` | `221, 182, 242` | `279, 70%, 83%` | `9%, 25%, 0%, 5%` | -| | Pink | `#F5C2E7` | `245, 194, 231` | `316, 72%, 86%` | `0%, 21%, 6%, 4%` | -| | Maroon | `#E8A2AF` | `232, 162, 175` | `349, 60%, 77%` | `0%, 30%, 25%, 9%` | -| | Red | `#F28FAD` | `242, 143, 173` | `342, 79%, 75%` | `0%, 41%, 29%, 5%` | -| | Peach | `#F8BD96` | `248, 189, 150` | `24, 88%, 78%` | `0%, 24%, 40%, 3%` | -| | Yellow | `#FAE3B0` | `250, 227, 176` | `41, 88%, 84%` | `0%, 9%, 30%, 2%` | -| | Green | `#ABE9B3` | `171, 233, 179` | `128, 58%, 79%` | `27%, 0%, 23%, 9%` | -| | Teal | `#B5E8E0` | `181, 232, 224` | `171, 53%, 81%` | `22%, 0%, 3%, 9%` | -| | Blue | `#96CDFB` | `150, 205, 251` | `207, 93%, 79%` | `40%, 18%, 0%, 2%` | -| | Sky | `#89DCEB` | `137, 220, 235` | `189, 71%, 73%` | `42%, 6%, 0%, 8%` | - - - -#### Night - -| | Name | Hex | RGB | HSL | CMYK | -| ------------------------------------------------------------------------ | --------- | --------- | --------------- | ---------------- | ------------------- | -| | Black 0 | `#161320` | `22, 19, 32` | `254, 25%, 10%` | `31%, 41%, 0%, 87%` | -| | Black 1 | `#1A1826` | `26, 24, 38` | `249, 23%, 12%` | `32%, 37%, 0%, 85%` | -| | Black 2 | `#1E1E2E` | `30, 30, 46` | `240, 21%, 15%%` | `35%, 35%, 0%, 82%` | -| | Black 3 | `#302D41` | `48, 45, 65` | `249, 18%, 22%` | `26%, 31%, 0%, 75%` | -| | Black 4 | `#575268` | `87, 82, 104` | `254, 12%, 36%` | `16%, 21%, 0%, 59%` | -| | Gray 0 | `#6E6C7E` | `110, 108, 126` | `247, 8%, 46%` | `13%, 14%, 0%, 51%` | -| | Gray 1 | `#988BA2` | `152, 139, 162` | `274, 11%, 59%` | `6%, 14%, 0%, 36%` | -| | Gray 2 | `#C3BAC6` | `195, 186, 198` | `285, 10%, 75%` | `2%, 6%, 0%, 22%` | -| | White | `#D9E0EE` | `217, 224, 238` | `220, 38%, 89%` | `9%, 6%, 0%, 7%` | -| | Lavender | `#C9CBFF` | `201, 203, 255` | `238, 100%, 89%` | `21%, 20%, 0%, 0%` | -| | Rosewater | `#F5E0DC` | `245, 224, 220` | `10, 56%, 91%` | `0%, 9%, 10%, 4%` | +| | Labels | Hex | RGB | HSL | +| ------------------------------------------------------------------------------ | --------- | --------- | -------------------- | -------------------- | +| | Rosewater | `#dc8a78` | `rgb(220, 138, 120)` | `hsl(11, 59%, 67%)` | +| | Flamingo | `#dd7878` | `rgb(221, 120, 120)` | `hsl(0, 60%, 67%)` | +| | Pink | `#ea76cb` | `rgb(234, 118, 203)` | `hsl(316, 73%, 69%)` | +| | Mauve | `#8839ef` | `rgb(136, 57, 239)` | `hsl(266, 85%, 58%)` | +| | Red | `#d20f39` | `rgb(210, 15, 57)` | `hsl(347, 87%, 44%)` | +| | Maroon | `#e64553` | `rgb(230, 69, 83)` | `hsl(355, 76%, 59%)` | +| | Peach | `#fe640b` | `rgb(254, 100, 11)` | ` hsl(22, 99%, 52%)` | +| | Yellow | `#df8e1d` | `rgb(223, 142, 29)` | `hsl(35, 77%, 49%)` | +| | Green | `#40a02b` | `rgb(64, 160, 43)` | `hsl(109, 58%, 40%)` | +| | Teal | `#179299` | `rgb(23, 146, 153)` | `hsl(183, 74%, 35%)` | +| | Sky | `#04a5e5` | `rgb(4, 165, 229)` | `hsl(197, 97%, 46%)` | +| | Sapphire | `#209fb5` | `rgb(32, 159, 181)` | `hsl(189, 70%, 42%)` | +| | Blue | `#1e66f5` | `rgb(30, 102, 245)` | `hsl(220, 91%, 54%)` | +| | Lavender | `#7287fd` | `rgb(114, 135, 253)` | `hsl(231, 97%, 72%)` | +| | Text | `#4c4f69` | `rgb(76, 79, 105)` | `hsl(234, 16%, 35%)` | +| | Subtext1 | `#5c5f77` | `rgb(92, 95, 119)` | `hsl(233, 13%, 41%)` | +| | Subtext0 | `#6c6f85` | `rgb(108, 111, 133)` | `hsl(233, 10%, 47%)` | +| | Overlay2 | `#7c7f93` | `rgb(124, 127, 147)` | `hsl(232, 10%, 53%)` | +| | Overlay1 | `#8c8fa1` | `rgb(140, 143, 161)` | `hsl(231, 10%, 59%)` | +| | Overlay0 | `#9ca0b0` | `rgb(156, 160, 176)` | `hsl(228, 11%, 65%)` | +| | Surface2 | `#acb0be` | `rgb(172, 176, 190)` | `hsl(227, 12%, 71%)` | +| | Surface1 | `#bcc0cc` | `rgb(188, 192, 204)` | `hsl(225, 14%, 77%)` | +| | Surface0 | `#ccd0da` | `rgb(204, 208, 218)` | `hsl(223, 16%, 83%)` | +| | Base | `#eff1f5` | `rgb(239, 241, 245)` | `hsl(220, 23%, 95%)` | +| | Mantle | `#e6e9ef` | `rgb(230, 233, 239)` | `hsl(220, 22%, 92%)` | +| | Crust | `#dce0e8` | `rgb(220, 224, 232)` | `hsl(220, 21%, 89%)` | + +| | Labels | Hex | RGB | HSL | +| ------------------------------------------------------------------------------- | --------- | --------- | -------------------- | -------------------- | +| | Rosewater | `#f2d5cf` | `rgb(242, 213, 207)` | `hsl(10, 57%, 88%)` | +| | Flamingo | `#eebebe` | `rgb(238, 190, 190)` | `hsl(0, 59%, 84%)` | +| | Pink | `#f4b8e4` | `rgb(244, 184, 228)` | `hsl(316, 73%, 84%)` | +| | Mauve | `#ca9ee6` | `rgb(202, 158, 230)` | `hsl(277, 59%, 76%)` | +| | Red | `#e78284` | `rgb(231, 130, 132)` | `hsl(359, 68%, 71%)` | +| | Maroon | `#ea999c` | `rgb(234, 153, 156)` | `hsl(358, 66%, 76%)` | +| | Peach | `#ef9f76` | `rgb(239, 159, 118)` | `hsl(20, 79%, 70%)` | +| | Yellow | `#e5c890` | `rgb(229, 200, 144)` | `hsl(40, 62%, 73%)` | +| | Green | `#a6d189` | `rgb(166, 209, 137)` | `hsl(96, 44%, 68%)` | +| | Teal | `#81c8be` | `rgb(129, 200, 190)` | `hsl(172, 39%, 65%)` | +| | Sky | `#99d1db` | `rgb(153, 209, 219)` | `hsl(189, 48%, 73%)` | +| | Sapphire | `#85c1dc` | `rgb(133, 193, 220)` | `hsl(199, 55%, 69%)` | +| | Blue | `#8caaee` | `rgb(140, 170, 238)` | `hsl(222, 74%, 74%)` | +| | Lavender | `#babbf1` | `rgb(186, 187, 241)` | `hsl(239, 66%, 84%)` | +| | Text | `#c6ceef` | `rgb(198, 206, 239)` | `hsl(228, 56%, 86%)` | +| | Subtext1 | `#b5bddc` | `rgb(181, 189, 220)` | `hsl(228, 36%, 79%)` | +| | Subtext0 | `#a5acc9` | `rgb(165, 172, 201)` | `hsl(228, 25%, 72%)` | +| | Overlay2 | `#949bb7` | `rgb(148, 155, 183)` | `hsl(228, 20%, 65%)` | +| | Overlay1 | `#838aa4` | `rgb(131, 138, 164)` | `hsl(227, 15%, 58%)` | +| | Overlay0 | `#737891` | `rgb(115, 120, 145)` | `hsl(230, 12%, 51%)` | +| | Surface2 | `#62677e` | `rgb(98, 103, 126)` | `hsl(229, 13%, 44%)` | +| | Surface1 | `#51566c` | `rgb(81, 86, 108)` | `hsl(229, 14%, 37%)` | +| | Surface0 | `#414559` | `rgb(65, 69, 89)` | `hsl(230, 16%, 30%)` | +| | Base | `#303446` | `rgb(48, 52, 70)` | `hsl(229, 19%, 23%)` | +| | Mantle | `#292c3c` | `rgb(41, 44, 60)` | `hsl(231, 19%, 20%)` | +| | Crust | `#232634` | `rgb(35, 38, 52)` | `hsl(229, 20%, 17%)` | + +| | Labels | Hex | RGB | HSL | +| ---------------------------------------------------------------------------------- | --------- | --------- | -------------------- | -------------------- | +| | Rosewater | `#f4dbd6` | `rgb(244, 219, 214)` | `hsl(10, 58%, 90%)` | +| | Flamingo | `#f0c6c6` | `rgb(240, 198, 198)` | `hsl(0, 58%, 86%)` | +| | Pink | `#f5bde6` | `rgb(245, 189, 230)` | `hsl(316, 74%, 85%)` | +| | Mauve | `#c6a0f6` | `rgb(198, 160, 246)` | `hsl(267, 83%, 80%)` | +| | Red | `#ed8796` | `rgb(237, 135, 150)` | `hsl(351, 74%, 73%)` | +| | Maroon | `#ee99a0` | `rgb(238, 153, 160)` | `hsl(355, 71%, 77%)` | +| | Peach | `#f5a97f` | `rgb(245, 169, 127)` | `hsl(21, 86%, 73%)` | +| | Yellow | `#eed49f` | `rgb(238, 212, 159)` | `hsl(40, 70%, 78%)` | +| | Green | `#a6da95` | `rgb(166, 218, 149)` | `hsl(105, 48%, 72%)` | +| | Teal | `#8bd5ca` | `rgb(139, 213, 202)` | `hsl(171, 47%, 69%)` | +| | Sky | `#91d7e3` | `rgb(145, 215, 227)` | `hsl(189, 59%, 73%)` | +| | Sapphire | `#7dc4e4` | `rgb(125, 196, 228)` | `hsl(199, 66%, 69%)` | +| | Blue | `#8aadf4` | `rgb(138, 173, 244)` | `hsl(220, 83%, 75%)` | +| | Lavender | `#b7bdf8` | `rgb(183, 189, 248)` | `hsl(234, 82%, 85%)` | +| | Text | `#c5cff5` | `rgb(197, 207, 245)` | `hsl(228, 71%, 87%)` | +| | Subtext1 | `#b3bce0` | `rgb(179, 188, 224)` | `hsl(228, 42%, 79%)` | +| | Subtext0 | `#a1aacb` | `rgb(161, 170, 203)` | `hsl(227, 29%, 71%)` | +| | Overlay2 | `#8f97b7` | `rgb(143, 151, 183)` | `hsl(228, 22%, 64%)` | +| | Overlay1 | `#7d84a2` | `rgb(125, 132, 162)` | `hsl(229, 17%, 56%)` | +| | Overlay0 | `#6c728d` | `rgb(108, 114, 141)` | `hsl(229, 13%, 49%)` | +| | Surface2 | `#5a5f78` | `rgb(90, 95, 120)` | `hsl(230, 14%, 41%)` | +| | Surface1 | `#484c64` | `rgb(72, 76, 100)` | `hsl(231, 16%, 34%)` | +| | Surface0 | `#363a4f` | `rgb(54, 58, 79)` | `hsl(230, 19%, 26%)` | +| | Base | `#24273a` | `rgb(36, 39, 58)` | `hsl(232, 23%, 18%)` | +| | Mantle | `#1e2030` | `rgb(30, 32, 48)` | `hsl(233, 23%, 15%)` | +| | Crust | `#181926` | `rgb(24, 25, 38)` | `hsl(236, 23%, 12%)` | + +| | Labels | Hex | RGB | HSL | +| ------------------------------------------------------------------------------ | --------- | --------- | -------------------- | -------------------- | +| | Rosewater | `#f5e0dc` | `rgb(245, 224, 220)` | `hsl(10, 56%, 91%)` | +| | Flamingo | `#f2cdcd` | `rgb(242, 205, 205)` | `hsl(0, 59%, 88%)` | +| | Pink | `#f5c2e7` | `rgb(245, 194, 231)` | `hsl(316, 72%, 86%)` | +| | Mauve | `#cba6f7` | `rgb(203, 166, 247)` | `hsl(267, 84%, 81%)` | +| | Red | `#f38ba8` | `rgb(243, 139, 168)` | `hsl(343, 81%, 75%)` | +| | Maroon | `#eba0ac` | `rgb(235, 160, 172)` | `hsl(350, 65%, 77%)` | +| | Peach | `#fab387` | `rgb(250, 179, 135)` | `hsl(23, 92%, 75%)` | +| | Yellow | `#f9e2af` | `rgb(249, 226, 175)` | `hsl(41, 86%, 83%)` | +| | Green | `#a6e3a1` | `rgb(166, 227, 161)` | `hsl(115, 54%, 76%)` | +| | Teal | `#94e2d5` | `rgb(148, 226, 213)` | `hsl(170, 57%, 73%)` | +| | Sky | `#89dceb` | `rgb(137, 220, 235)` | `hsl(189, 71%, 73%)` | +| | Sapphire | `#74c7ec` | `rgb(116, 199, 236)` | `hsl(199, 76%, 69%)` | +| | Blue | `#87b0f9` | `rgb(135, 176, 249)` | `hsl(218, 90%, 75%)` | +| | Lavender | `#b4befe` | `rgb(180, 190, 254)` | `hsl(232, 97%, 85%)` | +| | Text | `#c6d0f5` | `rgb(198, 208, 245)` | `hsl(227, 70%, 87%)` | +| | Subtext1 | `#b3bcdf` | `rgb(179, 188, 223)` | `hsl(228, 41%, 79%)` | +| | Subtext0 | `#a1a8c9` | `rgb(161, 168, 201)` | `hsl(229, 27%, 71%)` | +| | Overlay2 | `#8e95b3` | `rgb(142, 149, 179)` | `hsl(229, 20%, 63%)` | +| | Overlay1 | `#7b819d` | `rgb(123, 129, 157)` | `hsl(229, 15%, 55%)` | +| | Overlay0 | `#696d86` | `rgb(105, 109, 134)` | `hsl(232, 12%, 47%)` | +| | Surface2 | `#565970` | `rgb(86, 89, 112)` | `hsl(233, 13%, 39%)` | +| | Surface1 | `#43465a` | `rgb(67, 70, 90)` | `hsl(232, 15%, 31%)` | +| | Surface0 | `#313244` | `rgb(49, 50, 68)` | `hsl(237, 16%, 23%)` | +| | Base | `#1e1e2e` | `rgb(30, 30, 46)` | `hsl(240, 21%, 15%)` | +| | Mantle | `#181825` | `rgb(24, 24, 37)` | `hsl(240, 21%, 12%)` | +| | Crust | `#11111b` | `rgb(17, 17, 27)` | `hsl(240, 23%, 9%)` |   diff --git a/assets/palette/circles/black0.png b/assets/palette/circles/black0.png deleted file mode 100644 index b6dfa4a7511a01b68b4911bf6af476e1f8af7977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2272 zcmai0eOyyz8$N);WI!PjWKyRgSR(s^F?ZY`J|HtS zhah33)ud7zPzugQbr>#U+-W?)fH94Tv6v@g%S z0Rl#pQo&YZ4o)Ig5yPR2fZz6M76W!rD1(ThlqJA1gc*f-OdgZXh;W02W{nm}id{G! z3`Qb`o}x?$isNk2ke>USnQ=u!7;EG?xdD-5)(1_T-GDYq&*dyr~~52PDW@za-j~vNk|$K zlVB#aSPsC*q_}8UDvk-~2*SfdxXiH?K+zBoi)n4KDhjZ;Y|xu*P6$V!;P8=9Ho|2G zvpEQx?ND~G!CBC#DAoVt+dCQ-f(V%mkzgc6m~D=!u{KXemyeCchB=s{zhT%>WkjX6 znnp>lf!0)Jsy#(M}gY2 z_r@B}jAcJ@f2Ag5J(0Z7L3redg1E6caP+|)!kV~5z+mDULUC~Sn879El@vfhkkcv* zl;w$XK+x-@meTIv;zYle$gBG7sw#SG^Ti|I_r`hf+jb_tZP?|`ziNp5?jQd;ey6fG z^=L-ok7pX_BhGk*p|0eEciMQ%i!;v~mX(P<9jrM&T>G;P`B{*)QCm@y*+DDuf4hZ=YxK^EFPkEVci^*(Fntd2P+ zzT7M8Ne%Q~IwRu62g}S+J%;2(ivPCuQfngP+dnSl>_7Zm4wY#+Y;kHO|l-XxsZm@n{ zX;6$;!|uR;)_%YX%u8BW>2q+j;9>ozuD=Ce_IKJ{z}~Qhxt}WVnsX?!>mXnrg8wV?D|EM9Y z^b0A&_4LlJB7AKwbET7YSl8c_ni2+H7t>6VG!la7-uA}{s;cpWAZLj*HcFvf^Yw=Z z4Bm;eS|V-Y_g>5yXp36lzue^2azjJy%gAUvTx^IMb#_56*KMQuHf}w(>-LSHL&ecw zRxh#ME>4|SE<=TZSuZK4 zFbk8fxzBfcP?)d2FYB@`6V%m0FUx+E=AZ8KH0FpoBRB@W+wTb}05@1Daih|ViNQTKx=e4P#-S=~!m z8rBmt9xD3ko)?CtzFIyVOWfy&kEH%y=h|95x_#~^?o}W;YhC!Rn0CCc zJsl_axfnQnc5C$a{8#@ocPBbndbnG+=jQ4B^y4C6$~#=+;(G2`&m(Oe;wfM3&0Mf) z-U##D(${z^EADNZ3WW~5ceAT*YjwsEy7056wgc$ikrxW2{IF_CYy!=nU$BbhKRWHM zUeogYHP^kc*Qv0QgJng|vkxw^?0Czilhv`_v#j*@v&ZI_-w!xxx$`-n-+0$cAeh-3 zAJy{h)Wd~5_5B7_@vpP1iNedyry~Md`v#5_m1~-AN?O7{y51h#8+anw8dP(}hc43u l-gIAdsZrv(k}a(onJQ)0&rH9e=(PVak&5N9pG9Y_`V#_BTG{{r diff --git a/assets/palette/circles/black1.png b/assets/palette/circles/black1.png deleted file mode 100644 index be66d76547e36c1963fdf5902a0fef9a87292ccb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2275 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 diff --git a/assets/palette/circles/black3.png b/assets/palette/circles/black3.png deleted file mode 100644 index 4c341024baf70ecd63795dd5afd5fb586f428a71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2278 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 diff --git a/assets/palette/circles/flamingo.png b/assets/palette/circles/flamingo.png deleted file mode 100644 index 47068c2e9d24489b955d5201b1cd52dd7611f002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2249 zcmai0dsGuw9-aWAB#nD453}vk&5nX>fxJjaGfhZi5(r|Dr-1K}Op-B>iJ1ursP$CD zm4^pnc~}mpth6Gwf~Cimf=6mgX=tqvT0z-EtJ0#?A{;zb>K6AVP|&Koe@v2lzwh_m z-|PM+#Yu^Abm~h~2!iPGDn$zTUgmxl_=3-}!^r{&@@d7=GRaK!N<@q2vNSq88)Z3i zEdYlgvD9JFXiX@|%tj5ESpwhfI0G{=odnJhs5xqj95rI90xOzYkeH?|Flj|PSQkEAGK zXN<25jK~_VLwhMG5vGsZsaMt#fXzQVZ<%7 z0X%WUEc}!qNZ+$f92(2B$ZGZfrsw895e7jj^FShIlKO;CzaK!PCV_=K_G8CnJrkO(1LE;cjq8AOQ69lL zC|)j4vf_Fy2Vg`>+;V2TQXb6}MMp>SSkotfq9MQ*)8{KRBw+D4pf@?(NUkW2D@3BW z2u~Q!;UXN4N7=&$cR{BiHUE$A?r5eMSg6&A3L{9|n(x_~Zu3-h%k*k`nS*)yo5}Q4 z8PRCnNs_=8E3UI?QJv>-AUBN?xSq6Ytfm>i&eM0R zhgY|+Prm+n3vJ5FTxEK9PvyE^!Ir`e=S`dUNsdg^ou51~l8=mtHtp3{)otjfwQox< z_3<9PGEg@-wP)Vq$d95J8KjN>mxalFL*}Jx?(`ZiHwWKu5k!XC=0(uYE-7gaELyfp z{-yHUVfD4uA^sZ!VuF6zY?WOzrLIbQ;2I{2q$@A~)5&c;xuB!(%xmMNRb|!w)ipO< zXhQG#?O)Zrwr}zsEbDbN?~woBRFLrPvZ&n$V|I5x9KX1#{7#eeyNC5srOX;Q{%W`} z!Wk-G)Y24k^gyK`q#z}>ILDHI3u0(7xIgpG+*`_jK9(_D)nC_^pm` z&@QG=Hq!=%-ZB^4S=%U%NyF&b)#-fjy7058vIq#G`MVzqR9nY@ATMsbLY9_UbZ-9% zv%f4rSsq9Ip;5J~vhuw{#l~1_@NVD6ifUX%y{a0Umr12t-`?hZ%VG>ZqNw#M4q$ep zDHQ=jJXKKl);3;;DbAF4nm|l?N&oq%w!1??v$UK-Nj`qNQ+`MDcK#}DqC`k-L_wj)q2`Gl$lFI7u1!;EjRBORsdE z!mq>cjJ%4s#aRSGC>y&(dN1#ktk%?KgLWQ&peeZcKkuDbKl9V1mSc|Flh>Ja?zBzwhv; zXt8aBj|}4;j=c9Q4?+v7(=0Oh9U6oiioYmI+TGhG{{FGb9)8iRH4L&1^|zWCK3MWR&=0YJWejJG^<4=mTSke?sYBK8N%K zi8dTu|NQsu?1@<*@(Lo;tbB6IZhuR9GI$eW9bP=+2t(qw<8& z`b$7%dpgdqU&6q%pJ&l$9aV5CbJ%mwWpWeyO^OYQg`CZK%g7`F< zj_|t*$xbS|q0QjEU$^Y}Mt6p`{K>I9b3_{+-cBpF(_O=(#F-=5;9f7Ab1HK!&{(~& z=SRgJ%rRy9@M8Vs(4D%R2}vKBZk|o5^Ja>OpXmK8@=U%T!#w#d2Xp$0(ze2vbUIo6D7*r_99`oZR2$d2i>b>AD9j zof#wk)fPSav7J-^abJ#tD94aZ;4Qm~yKlwSmLfV6~L||t5 z%GV527U(2>)~!_R5SrpxGH>a6mY^nJa?0=XJ~%~zKk}LB^}P*zF==W?1ts}c&5n_F z+t0I-dA^pHVzsGmq4@;eM0wX|Yp=Y0z;~c_VeQp(wp?;1meCGp_&2EP1n!B-vJtq% zxFh(+`qXy|u4s9OH7M>skR=dc>wZZ{L7=X(UulMgudjEXY#J*J%8hQ7qA3j@O1TaS?83{1OU}C B;Aa2; literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_blue.png b/assets/palette/circles/frappe_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..777988794c4628bf38e866a2914dfb5188a26d53 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-N7b*{u2Jyil%=rTwA@~esecCRaN}`hVi#K{!ZE~D#xCm_A%>R`1{jW>5llk zE$kCIl^etlzMadkhb!+q5Bpn2jsm8FK0B4e$8UdoR6D2T`$DH)(FM#O{Hp~R>fGnc zU+4}L-O7=m`o*&C@oG1=*GwUXoyt6^FRr+4WLnL1Me2{l!*WB-CR4^JF1uq(IKo&m zEPqG@D`jv$(EK4GtdtSU{)6TILw?J}^Z7+hv>2NAKYM;V`(swXCZ-y;!|{)L>gII? zu3|Fy@wKMDS~rN-D}#lEQ zcPat0ycoXy+cx7&F_fNMd(SeN=|gS(?4D<*xE{=jXjpT4LWfoO&tps`Kd&2{v=0Bd ziPa)qgW>dke!U_&t^=RmH+Rpu$u!5AagH#{gQN2Cd!C==dLRQvbC@gM-`AGC!2Mx? zHQ%Bm%s|Ex5JUJtF~j!&hUX+983vmy{-zZlIKD91yzXn(_{j5xsUUQM|2c;9jCX*x zLmco*0q%e~3mM$E22Pk1^TbBvf&ars0a?AGH0}aF9fsQuw_~14b009fUY=3bx1<-qwWA=od6@!U-63V!C4KgJ4(9l=aJ0-?42{eY5z)o~gTJ?=bGr-?IMJPWOY&YU$h^KN+{R zsCI>W_p&=#F_d%t-g-uMN>u7eE`ulH5xh*Ro_jWPIk!RI*>oZQ%ECmC35qotwsWea zdl&Ee&{(B)Kt_MZyUp$=?6y=febCxrYrI9_fW&%(x=*RC|1TNVv>)te4F#4T44$rj JF6*2UngD@s_9OrR literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_crust.png b/assets/palette/circles/frappe_crust.png new file mode 100644 index 0000000000000000000000000000000000000000..10cbce1855ebaf278870ab4b7cf8ac6a0be68e91 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-67SOahduFsY9Qjc*^Q4+#N&LP#=8va) zzcCmUvV2h5u~)bu{NUS}4;R=nF#0i^yV#!cqvCelp8m-n>_S#-WGZ3!m&wm`;Qfow z%vFY~7Kt&gX|X$AP;>P}LTrPUT4BpVp1HR)!V*FoqMGHE|LCc?ZcuaZK6reF$iXfK zU3U3oFP2&bCziFZ8RkE*{-c=w<@3TOH`as?*Z&EeVg*BW{_~AY0;`v}h zuTTcI{qx@EuXkPL*vWO^!}q|HdqrFy1bOVI8vm+15Js$GOc@7CRD(CCF7<_F+ZZddU zF5wWc7x66dIF-1bLFezb8*`7#F-q+7Eql5tl%Xwu_Sv6XHW+oNY;a|e`&+s}bNN=F zvAZJXibppTU*kBic)wrR(`_mZokzJ-%)5W;awgQe>dj0y+;7QPQFnoDv*o$kkLy1; zbntDq^y55m@4ndNN*KNAymh({!@l?VlP|_ZGR_g^o=_?&6!={0enf-Xe<`)f=UVaG z7@qU6Cj9(<(Dj@%W5mDOf{DgJYc(2*n;7=|c-;Mc4^W>o7!@XZXt_L!tpgGJ9?r$9hMCBUe8q)6;3aHL&jAK~G_35PK1IvbLpzUA> z#K=B@JHS}v!3s03ph?|x+L``n+6XKTBL1VtA=>AeW%-i&69xi7^KQyKXL+!{FT44s%=9YT^Q^DZ z4EHb1f3VZxuFkXV&p4i!Hd;kamG<6Ke2wdXR)F~G&$ogYH5_GgPIc-Yu#9F+5Z!S0 zSrt;o#nLED?H8NRoE3$^~PQE}l(4x^#{foU6D zK4z`_=-|Qrz%OzCw4KdCt92q7+x{@Ec69hEViHj@*9*K z7NiRLu*w6o&;nIKA2#_7S`G`O_gvc&wR6`0!@vx8K=NDa3bikarg}V_MlJkn+k^8L z7lw%21^Bbhc+7ge_8Z5|_Aq~jIM(gyZDK4Ek42C9?_2Xh{$)kg19=|<5n%bj;OXk; Jvd$@?2>?Bn?cM+Y literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_flamingo.png b/assets/palette/circles/frappe_flamingo.png new file mode 100644 index 0000000000000000000000000000000000000000..071e9bbc52aef04265db955fe05e499c69aff2cf GIT binary patch literal 1126 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 II;Vst0OQK{djJ3c literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_maroon.png b/assets/palette/circles/frappe_maroon.png new file mode 100644 index 0000000000000000000000000000000000000000..0c49ff0d43094210389aa2dd95dd21ace0e654c2 GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1h(aSW-L^LFlCzdHs3t^V6q z>|QY?-CM})e*7iO8v1;PMT@0ZJ z4?%@GjY%&iOgS9K81XB2qjkS6lR?ewH>XlpGw|FuoBcU6F;&1bp_{?x*Xx8}zignf zr5mmEw=q0lBiP_xKX=WkTu%n!Zt)X&VxOah4*cqhF*=`ASIqR`&jQ}G;yJ$`#XoEm zkOi`Y8usqjRr?I1Q|6bSo54_X|GwJdotu~})WsBD8>uWh7rJjFgYQ36pHDzm4&ymV zt^=RmH+RozXWH=R_XDMLptS)E&si8NJ{}i;U%8pdq8*H$Gu-?A-HZJTlg*31W{r;w zK*mcDgXM$F0b7v+mLwr|hW=a43R*Tydl}B}daU4O!@QRvM)b*K;{(ME-+{J+9k9dd z1l$4X8V3S%MV6?DTk^C12(D0YY44tMlWC4H_W`pDX5l}NF>T=8au(tp;Rf;6TPY^t zVGPfGI2{acB^jMxssBN;aodbD#qT`+Pe@c)Vzb%u9Or?0+3ReZE%m-u&EvjuHmT10 z{(<7gU6E(<&kCM<%~ZNc%Y0hJ^EILkp$qiFo^M^s6wqXKV~TKeL-97Q16m2Q&;ER~ zl3~gLwcSNGZ!>8$>Xtp9Sj1N_`@?3Jz9lk2EES$N4F#1o+pm-}=CJNkIluqNZ3nLf zz|`R#%f5gmRd9CxNp8m}3wRcN)~QvUAoK*7oQh+(ma$ZxFj~L!9c#%0BV*0J6BPk> zpWHI|mFgk;BP5XP=IYGO-Hkb%zcq~Vm*%mTGrZ$|ySnUM;D-e#Z!#s-HRvXGKDrw8 zxN!pCfw_n3bc@-ShDB~-;`zxM*4*&Qa?&)0#t)~fMGhW0xp5l+FwwpX(~)9*9R6K44$rjF6*2U FngBAG^2-1K literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_mauve.png b/assets/palette/circles/frappe_mauve.png new file mode 100644 index 0000000000000000000000000000000000000000..01b134d771e7ab138dc5a7e8fec084c7297c4df8 GIT binary patch literal 1126 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 KT-G@yGywp=4EE>% literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_peach.png b/assets/palette/circles/frappe_peach.png new file mode 100644 index 0000000000000000000000000000000000000000..a3dd453e6b1275d1806888c60ab0abbd3396c73d GIT binary patch literal 1126 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 C_Tzp4 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_red.png b/assets/palette/circles/frappe_red.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6487bb5477d82621e3e44a7d948bb818529dd3 GIT binary patch literal 1125 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 Iol`;+00eLI#sB~S literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_sapphire.png b/assets/palette/circles/frappe_sapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..25f47008880ddfe1663a49de5ade314e32a342b0 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C<9*{F?WHit`qVi)wAXEq_qs_1U}0=Wi6-ajq4ZATeLx_@+wRyVKY673y|g zlygw)V~AtfUe5GEYlp3|%ocWq1Dppee@)<#&%fRMy-?_0JC|u#1K$Drw~h=yWNYgj z^xZPAE&wt-;^)S^4WR&=4*L5b^kI}B_;qoFk`~I6Jt};pNk$GrVGHu#~#Y_f&Y*J>1 zXEI9E#T|Jb9>mZV&vvnLnoz^T>8?5ZR9O;!SaqDKUd6x@KmEy1f58Qv?Ml)Ln(ZQt zkJ^kQ+^@>GX8j4(&pOY{)fvw7-%2n$zEl67s2s<| zM6=_Xj5mJYPBJ9#)`ldzHY^- ztOe($Fo-PHRr@^W7t?&fjP8>*&-=dcOR_ngGM@c-4#S`8g}DZ^9|x^}zSH5Z&a>@b zcx}X2%s%?(n#{vJdI9RIi;_Fb&qXmtu)azvjf>V|P+igNYq^otB7HT(8m4VG=bWF% z<-nPN#$~y&l$FJ+Iv6oIHl;?Fnx-wu;HX4k6Q5qVGF!J{qf$zyMzUp zI(AtXLpwiU&fH{nXV~bAH z$_LEXfDDzUlRyzxj*{lzjbD@bLdC#FAC#Q@4W4@?V)4FHtjBCL1gTd3)&t;uc GLK6UaMd`f& literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_sky.png b/assets/palette/circles/frappe_sky.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdbe9b50839e4f772e666ebf402bbe4f7f04b07 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C<9u{ObMMit`qVi)wAXEq_qs_1U}0=Wi6-ajq4ZATeLx_@+wRyVKY673y|g zlygw)V~AtfUe5GEYlp3|%ocWq1Dppee@)<#&%fRMy-?_0JC|u#1K$Drw~h=yWNYgj z^xZPAE&wt-;^)S^4WR&=4*L5b^kI}B_;qoFk`~I6Jt};pNk$GrVGHu#~#Y_f&Y*J>1 zXEI9E#T|Jb9>mZV&vvnLnoz^T>8?5ZR9O;!SaqDKUd6x@KmEy1f58Qv?Ml)Ln(ZQt zkJ^kQ+^@>GX8j4(&pOY{)fvw7-%2n$zEl67s2s<| zM6=_Xj5mJYPBJ9#)`ldzHY^- ztOe($Fo-PHRr@^W7t?&fjP8>*&-=dcOR_ngGM@c-4#S`8g}DZ^9|x^}zSH5Z&a>@b zcx}X2%s%?(n#{vJdI9RIi;_Fb&qXmtu)azvjf>V|P+igNYq^otB7HT(8m4VG=bWF% z<-nPN#$~y&l$FJ+Iv6oIHl;?Fnx-wu;HX4k6Q5qVGF!J{qf$zyMzUp zI(AtXLpwiU&fH{nXV~bAH z$_LEXfDDzUlRyzxj*{lzjbD@bLdC#FAC#Q@4V}4RsvtqBE$WvhX!QkoY=d#Wz Gp$Pyt1L+q4 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_subtext0.png b/assets/palette/circles/frappe_subtext0.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c4f290a587e2e02320e5e15154fa3779817639 GIT binary patch literal 1126 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 I&MBb@0Pkn@P5=M^ literal 0 HcmV?d00001 diff --git a/assets/palette/circles/frappe_yellow.png b/assets/palette/circles/frappe_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..6c78760dada0be74f39847d44c34c50827cd30ab GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-NB|%ezkw&kIUjOTwA@~esecCRaN}`hVi#K{!ZE~D#xCm_A%>R`1{*e?vD7p zE$kCIl^etlzMadkhb!+q5Bpn2jsm8FK0B4e$8UdoR6D2T`$DH)(FM#O{Hp~R>fGnc zU+4}L-O7=m`o*&C@oG1=*GwUXoyt6^FRr+4WLnL1Me2{l!*WB-CR4^JF1uq(IKo&m zEPqG@D`jv$(EK4GtdtSU{)6TILw?J}^Z7+hv>2NAKYM;V`(swXCZ-y;!|{)L>gII? zu3|Fy@wKMDS~rN-D}#lEQ zcPat0ycoXy+cx7&F_fNMd(SeN=|gS(?4D<*xE{=jXjpT4LWfoO&tps`Kd&2{v=0Bd ziPa)qgW>dke!U_&t^=RmH+Rpu$u!5AagH#{gQN2Cd!C==dLRQvbC@gM-`AGC!2Mx? zHQ%Bm%s|Ex5JUJtF~j!&hUX+983vmy{-zZlIKD91yzXn(_{j5xsUUQM|2c;9jCX*x zLmco*0q%e~3mM$E22Pk1^TbBvf&ars0a?AGH0}aF9fsQuw_~14b009fUY=3bx1<-qwWA=od6@!U-63V!C4KgJ4(9l=aJ0-?42{eY5z)o~gTJ?=bGr-?IMJPWOY&YU$h^KN+{R zsCI>W_p&=#F_d%t-g-uMN>u7eE`ulH5xh*Ro_jWPIk!RI*>oZQ%ECmC35qotwsWea zdl&Ee&{(B)Kt_MZyUp$=?6y=febCxrYrI9_fW&%(x=*RC{~xTaS-^Jk;Ywin!QkoY K=d#Wzp$PyLp7$95 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/gray0.png b/assets/palette/circles/gray0.png deleted file mode 100644 index 53853a22bb85368a405880d11edca9463f562d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2277 zcmai0dt4J&7M>s!Bx1FJmHJp`2k?bt@-Wh*1PTe7SVJKO2tEnPgp47XFf$U3OGR43#MbDD42*3z zSpW_}Q89LlMr*`qI0MVX&0?glr4@m3oft_KC^!m>1T)~WJQ7=$m!Q(-8MQ(k5)=9-v#4RzbA;l;yiCbu# zFvD(5O$K45#Rvj$ctjkt<74V(YUKDJ5vUtMxoi&lJe|h%uc5nEM49xqwQ6)s#D!DA1507Vl4TU?(j)zE;&HFbhGh@0hL>5mr@vv?Q)Q7x z>rRpwv5O63=Rj^4r3gK3(~wwfCMd8NiPh_Ikj`8<(cQT)m(As{7rba;GhjgN z^=CszB17Fb?&r{=(3gUb@(`Z8qQGu=4_tjPL(tJ70v4lV2s4A(LxLfr%DpFsAjU=< zl;x#zK+v2rYuUB%O-aFRF;@&3)z!@QlmBS`wr6obWXJxb_l*Z9L|!q*T=?y=zw}l1 zq#Rw9^v_d`%posxh4Da1`N|GK_NLY6jB9s@54jxY25Ne9MZLoGZTbqw>Tc%I^+{X3 z$KAVp$#G?<#Aiyx7yRH<+PYx+#H7xv=FsJLIx;WT&3M!(h?r&dnICW>_7j(_B*v@*9LdT#K)3B{qw>N z^UG#QCO6iGeO6O02+LD0sto%4*@nToLvK6@@0!7=-M}f`#cm>;nU^_N9|hcWL0OM1 zm5u+J@>BW`$q&e6*PV@2K*HDc%QKh>-G8{7u+7*{w9o3SUh{)7Vq>po*atH2ok&Su0A3g4EwVHUf|xA#!+@$C!4Tx7kV|7#>f*Ci z+^o*`0ynp=^a-gj6kqsIlO9_-kyZF78pBM!XI6x%qrQs^t@?1Qg+YJbU%-60l-bYjl>Yk`Ab=e4qXU4zf2Qj?1N71z1{32bIIF#heF zXYp|`dYyAE(DbSGjjoHI-3ol@cPVGD`Ih~GFG6;!^HsIYb4vThMa;gv0Uw8M>sq5% zIOehaZ%%VggS}OZ6K`#Hu1IfFKYjNI;H4Ji>xhbYU%S3xs76pV7x30OXYX0Px2Y() zNz*V?{p(;>Z%V@vSTjB!mNj0F89aUWk57G=f9)E)etWx&xZhpg(sr=_Z(TFFPgZ=N z-T!gMwT@#G3Vl!AW+~&AtHLLwwpOgXkWSyX)ho+mJJtE+4Ht3_C{JDXsy({>aoE7| z3XBiko6~dmfjrpB`$iS$;-Z@r#SgU6%2e6DA3}`&Kc?sFRx!ep>#Lk~Uc7a4-)vTv zyxm{MFK!Ny`UcWN)qslN=gXaG<9xyK&ulzv?4}ze}zqgS8J^dJvN#=cAH6{-VP} zeru*boBK`G?Z=GoiUL9rwYNNlcd4Vz~Xed2zI2sfH8JsyvBGWn=pn9Pb!05w(A~u-h1Z;CJzzw zfhHtahUBYMI)$c@VIGx^AXsq}MUiuWkdu_A5sJ}z{Wb_Rwf?yG?)UqAzMtRs`P=3+ zd6K8cd=ChMJX4Yr6yUqi@l1CI?}`KI0tj+DiYryLN|uV|5k`($L*!x{o6!t#2#Sia znbmoEjD~YDEp8Gc_fDNbU|b_cvIH`o%q+olcyb|$WfaPld4>8skp_v0_K32fK){I6 zYS?Bpm?+dHMx44R`0d!{BCwM}>&1vlmIg}*5`zUC0f&b~d%#hoCLdKKBu*HEl^D^{ zv>D}ctyU|?8pa_=EtfA6iMYH_ZfGbQFxXUqiB{X#CMwV&F|Lt-QF$b8rg6dqJ2cg~ zgoPF(2*BY9am7N5AWq}#vDlm$$ka?JN4Q8SPotbdt z1x>?km_e0*8!;0FvMWZyME?S_p8-k;13_khrozMs-)ZB>9GYTOYq2a`L+d8BruI`Y zllI?$!!v`$QQAxs4q^$N(o#)fVni6qedL(zr$Uo;K%L&n2n}#9%qchprAQ=cB$1CB z07fa2;^7pjB!VxBh+v0u#!mo6LxC-xUyz`t0V|XTdXvXz^F>O&5Dnv@g2)gaALa3! z%1$Q0yxdlxiFu@=W)Uxx3KCkp!V$8xD%dn z9TWGDYf;=MoR4x69vM+!H@*i(AKW3_$x8$*Ca)pP1nwRZTr$mxqqiW4u^tCyd7>N; z^m3)8vM;18-M2NSN0+;MH?!^h<&!rClRSm(2h$hpKb$G-(Z^gV`ttO>n!%-CEKeV3 zX<+{8Vyf1EuxaP(?Sj>1D?0S6s>FvzYCFd2ZWW-nL^<2?t7}(WV}9{Q`c^mByWQ7o zd;Z)s&4+y=%r}d+gunQFdS|a`!LmE;+OB&4hYbRDuw~jSp3Q+<>b=VsZjfA*ULBNu zw={^ga&Gjz(N$#JclwMa%3s?C>GGJ=uKkt#qm9!~b)JbF-dbHz!>ZYJvkhC^-m&iM zU6EB|@8a37Vr%xY0+J!&+ZACO-;dsS-adS3$y;|0SN7TW#7N^v@8Lxux>qWLC0-4O zgO1eg6a*D25^KDV|5a?SKji*f$W?#F;bLCJF3wTnthSri`_S{|2xNF@u4(w*XEbLh z^FEn5a%Vl|DgXAPWw}iGwS7Oyx9Nw8w&2d)ubmt53U57YnXzr8y6%r!%Er8uIabfS z-dk$gY~{Scu#IW&HZRQ#2Y(kc%*ojl1Tk5ThXL)b^@Si8eo8`|QdR!VJI9F5*tspm zq8W+kiTG8myrXc-r(UYqMa#2KkGglg-Oq)qveV{SAG{`1bcOqO?-+szL^aecLp&1OuBUm!u25tG0Oke4}Y7t2^h&$p!M4TvnEt%9^8CIUP+yNkw~MdB~_m z=2#0?o+}=$ynF0`fGN3VKX_X^C@e@lzSiK^Vfmxt4srGNzzYxR+UvhAY3-6~2RGcu zvwWM1`ih5Q*NnW?qfo{Jy(?Mmjf+0Gz=%y+Igq7Xn-%fR+>^wPPQNN%iRWJJ;aga* zo8A3~*7$?^9f|yeM$gOVHeT4yi0D~*tc2~lb5y}F8)t{jL44d-rv#ArZ2LTfRiUZqGMm|Ni0t~ zbRno%wKljmX`5}<5zVgi_-}4)C9NMF{Gpf;e7_F+j1>Up8-h}#@`O*~bJqV25UNcj diff --git a/assets/palette/circles/gray2.png b/assets/palette/circles/gray2.png deleted file mode 100644 index 00691e186a40a671d6e41cbc939414c2b644ac2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 zcmai0dsGu=79XA}5Il$vc3awEQcxSogCs&m!b1`uKp;E?*H%I@Nya=TP9_kjwhBtM z!eOxmss&43x=?B%J=&gnsD*N>oIou_w5V)-m6h&Ud}LWcWQ+SHP|&LFA2Z4K{eJg% z?|1M0Zn9sNnn3gVvlj$GG)bZ;1AMM_Jc~WSyW(%@d4QQ|_7h`FRb7Spc|Oj*T7jFo|z2s5d` z#D$oFqB}F;$O|gNEtoD>gzGVb31nA@a0R~s^PU055juj*1Wknr5suTwkvUYNm#eW& zxRTP$Yc1@jU0qu|aRLIiVau7AG9# za!@vp!3J-(Q`yM|cR?wqbTk|ZETmF25jRl;S?t`JZSzcQ`|N6Vsl%Q94a3eV zqjH5KNkYU(5=yfIQ#zdkxmnaisHh@2iN&fxfrUt{N`-@T7Q-?}=fWH&ht1?YZc(Jc zfZDUq#+r+a<+yRbh8D?sBKSxr;gKr}>}L1C)dw?#H9thaVtx!^1~7X_Fl27?w)jGj zODPV@@xi2n{B+$Zpo6?iDfAX10U_Lks}j=aMUF3E_mU2**38`G`Lo(~uo0$p0(U{};Jtwfjl68p*|?Wb`_H)*VG zzqx86|L5%glG)>9r6yYHcOP#q@J=22;8tp-)=t<$1`j8FJ?_Wr=`t^=9IrX@OTEeB zJ&--s>V5IbZo~c}<_;Ijl=^mePBstxTr4pr=9wVK+u!lHK!@uCAjmabB8tt*-Fx<3 z4lx)LQ2u_sJ3Vl7&}WK(Tv-p&pmgmEs%iUQd13x1?wz|5t&Qt$5slBSEvw^wHnN+x z-#2U9nZib&f8{pqyFRV+7?%7qzh_c6&|o6I`bR_Or2bPVJ>cr1BW~@x61q^U%Q2Us zu3)3b7O1C7a&1h1$-FsOEOeX5I$yS|>I#f3bycS^R;=1<_iz08=uBPIU8ZrO=N13a zw+?jQf8nm5#qC|MJ;5ovUa-CxG2MLPi!~LScGH!_h0~BFFk-qxW0h@Lex_=7drU{X zdlqjSw< z+p+gJcfW_52Up7>Mof?FY~Po@g+Ax1rV@wY%A-}so@*+*S50#}w*Hd>Pp#*gu@57! zU4~WPBrs_=4(=G~g(uD?#Cv|Ki#iwHwd4k4XMvATCA$4;Yti!&uf2C7Wl?34&9wOP z)HczzXM$cL%P~aW_a`4EobuV>Ry=Ry_C6 UWFS9?bo>vIh*L#v8}m#55AXL+00000 diff --git a/assets/palette/circles/green.png b/assets/palette/circles/green.png deleted file mode 100644 index 066f0a8a1922ecc9f7fc29cb14d633d46c19fcf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2409 zcmah~Yfw{X8a@c5Xr!Zq2<_IIo)mGxB$sywCf7 z?=3rH6;a-E-k$?Okhd&4JRW=pIv+0z_}ukn91ns#68=)nR54{IKynOv5xHIE5!?$t_Y;k45JYXhM!6QJrH@^EI$UJV)pd z009$9s%Q?A(QFksM6gR&0De1PBQVWHAq^r}DUYQ|aRR0Bm^>y67SEvx35`||A09bj z3{E0gPm&e^g4peLrk%^g2_3@b^Z5vigK#(uz+hOj&7{h~Fk9(PiE)i^)T$;h3yI-o znp0Dif!jzC3g;)#H}Qpk}z3gkLiR>3*|`LuGjrSuX!$y2&)-8dfqQ3nXr$ z2s2`O<-nSlZ9$QE)QZ~(H5!oxvPX9%&Y2fMEapIs%5V%M)e5R1g1P+PfvIl+rMM9% z5?K?*V6IMw_!0lFS&m3uj78IfaSf5DqfU zP3jw=$vOyJ(aCWQ2#)I#oPuOhX)J+jF(bgN@lmU3vIyx4Hh;wm28TKB0TfLDY%y(i zxQYZU4h!@$i_Kv36WJjGE=Ry&2ea4$7R#mVVuRVys7TfS<2xsSCe)|}Bt{xh*J*qr z!i?njY5Zu!oMRv`s?0hO>|kh6t;%L3VR4e#WvCG%&ap9K6AG@=D+wVoLthBulgkCs zn3cqd>}f6&&`mR4x~7jtbM=%!rFND?1X~DPV^gCV*HuCA!8m^(NIX)E^grgabfG&aM!xe zhH6W0jeQ}B2qS!lgM#(TN|s3H*VhId-@lg^kP{zS;d|=kma)2Hl+oa;i`;6ruy$24 zPvXtG8?4?Z-gibI;}c6o{h;6D^m|GFA(BRhwpzUvKmB8U232wW&;!M8!!X{yq`PX( zg^~Ho+nQ~&caN0se_m~MP`i?z)lqwT^UXW$%v?9eGu>}3$w|w>pV@3nbgC7Cs6Nie z4XUd4hoD(pS$J5Ya@(bSY`lAwf8l{@5Bj3@s;|`k%GkDs`N~y6O~ad|p(m3MpU;a% z!%}~_)n`_uc9Rec|OLmO{x$6IVhs6u3hqXWbWy{U&hMwJ*ci7L^r$>O1a;bTVvW2*%fuo`^tsU z9}3-)|DMb);JGh&9RH!kFpt|$PoZp*i3!uZu|Yb$K)GV^{Xg~19WEEMDTR?=oW-w( z+VY!X)*t;c^2h+6@*tN7KRS~0{Nsjw=8FAMYMqmq<^pLYiq+d&^ekSszGeqwd{*8c$pR(~Y` diff --git a/assets/palette/circles/latte_base.png b/assets/palette/circles/latte_base.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6b16b08a1a4f8a5bba30839d48ef2d245b13f6 GIT binary patch literal 1122 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1q+aSW-L^LFlAzuOK1uIq!Z zuuT2L)A7CD+~xL)g+Z_X8Ax09?JqA&FMBS>>B_NT`rhNleQ#Tzz5UDcXgd2_MwLe# z50rN76>i`^_;%*Q1-1-~ehjw`wx|5~apzuvy!yl16#+@C84Q0e%ds@vZ$8ie;)q69 z5X%OkUow9`iYhmkGIq^4BKXV5Bx`X*V<@8+Z(Yxa-7`cE&SEfSwLh|iBaCH*3w!{%gwA7?MxQx90$7X_w9Igmg|8G7|mg>cz<7;_X6jKMb>_g$fMe z>^~pPGS_Y>)@UgH#Uyjp&9SIxa&dfv{Y;>LcbuH5d%)6}@dn$gXL|P+GUPCq7EjlY zZYVy+^1yYWmE_r}q6aL4nF4x1A@Yj5#%+O~+UGgem-eejaGX4!(^t&&!Ehre{8nE7 z9J3%t>~r)lwt3uB&L-7m_Z7s6YfKK^x$%f~`dWrHOsN~K*6WHk2u(S-Yz`<^LK(ss zfzg)k&$@uc?B>+d_rx4Hb2eJ{&nRv<-Z5Xb2pr|AX~$i9R>&mXXWbzB0+<|x@|iUo z`IJ8EmC7~f5q*ksdjZu6I^4qg+)KK}GA)SMx-MDgUFWxK>LG@L%O#6szz zYSXM%g8j(#Xzv;Ko>*f zELQ{3ngg?d3>O2*nggpC8kc>Kx|H=a=^sBZ$1&-?IUV5hqSh-$LMVkpK8k<29pACQ zm>&+7q6vN6?|#1#+{C|j9zzXB-gzEV4ufOtJ@acKAKFV6G^J>4Y<32g9SokXelF{r G5}E*1z48?R literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_blue.png b/assets/palette/circles/latte_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ce2f7d7ff5df6832df4995c43561e52e73456736 GIT binary patch literal 1124 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1w;aSW-L^LFlAzdHs3uKC+m z>|Qa&eT4x3_2X_f&e0(&uH@CTEM8-NU#|MtylRy#P7X;m{%M;$dG2n1udh(I^P-%C zS|39k>-KV{4{AGXjb*m5D;(fFVEJnTkNo@F-QNp^?zMB7hBfdVuz%~w@I$t?&OzTT z^oml$)Ct#|?^X{}jX*|;e|BAGqWu`{njbDNajBD1PQ2ng)%v_z}JpZi(v*SDU|B1?RTud}O zuE}`g_w6L3^HAFVTjlc}&I8~7<{Hh?)@~?HV%((Xtn@18sWkV6C-H|>6G#8$8#9|TrbQunEg0t{qvm;cXgg^|H5k{ zzGC*#Ki6a)?$HZSUtN^kS$-~xF@p6~QfXYY7K7@FW?##VtQP638P+guyE*6lJT3>$ zoK4!(_v$tX-AF2z(|pdbozvd?iN`5L*M{p;WQ7eU6?xQ(9|&9E{ppYQ9^NG^z|^t( zN-2X^fY`>L)Ak6saGp}II)5pgNz)OSoXn3eP4Jq~uJd`;>o^B?J>$ubI(pcz`mW<$ z9N%`O(O-1wguSz-?T|h(Z9~7(=df301?&&@UD%iPT#l80)*M}hXX-bErfJ0Kn#ys! zWVoaG=DJaNK-N@M?E@3UH%PIBoS(Rbg`*|@-eL|lzrL-k92G(bT|O{sGqFU89Sr%v zmu~3HIs5LeaQSZ zq`@+-@NRnlgxZX+EDwAOs?#zY8w~Fy{CRSk>px?0Z}lC6FZqXor3ZtjtDnm{r-UW| DQdi=n literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_crust.png b/assets/palette/circles/latte_crust.png new file mode 100644 index 0000000000000000000000000000000000000000..5d194e306c2effd9dfd4909f46aa5ac942fa22bf GIT binary patch literal 1124 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1w;aSW-L^LFlCzdHs3t^V6q z>|QY?-C@svWyK?@>whnHT3S{u*t6;0pXxV~)#ua~iZTg3{+y~d`^W{`y*11qPxpRf zFe+sEptWPKaD(~5w=*9uuw`KMV>oxQJ>^Hm{kT2-lRwyntk}p@!tgJXpXtE+7oVA{ z3|B1@V_ef>cf6qH>WPHd1}(M1mW4cXZ)t=jgf>Jq%ParUQ*+&*=HPws_zaPQT@1SH z^2uH-xr{cf^2tstYhN?OKd}CznEvJS!X`J?gb&yM)YR+7@p^?dtWWsiJ?G;2U_-A^ z2Dbh4-oIb(y2`PW>%fQafhqTjxIReo*iSY7Re8p3o!Ef~PdTkajaXo|1-)%SM9+zX3*ymgJbWQLF>${_c*bc5#dtw3XU zMa&hCZYaLSabWR&zp$slCh%h0^4TGbG0AWe{ksF z+idB_dEnlCvB{M%deeF9bRUL&@AD^LjEQ8NBg{RaR8lDLxz_!N2DSfEYCj)n#cyMH z&cmAU^ZP;9bIyzr|7r^+8UwA>Xee%C*z@CYcmE!sK4&m0W_bU%dMR@iqg=^x$0-#I zRgCjWK@7GEz6Ww#4`fI|bC?_4-#QA2$~DF{h~F&~P>pMdV_3)a>7?WX%Z6&8?O+GQ z$UcEPz*ywL3Nx;tN!@eWnf_?n2rN46dM=0YTqkRSbjIw}HOY)O*ls-od#8u%`3nX$4XFk6o{-ehs+UJ>N`I7om1_D9zZpu7od9c4PyZNTf^eWr)tgq4x z_b<(Vu+!nL&a>^$IG&d_T18Hk_TE!`jq89`fcWaqw}Kco9A$G(b?P3ljAl&`-Ej6< z&9@K+uY}35JKy9oPB|d9`?H57`wrh9kxK4Ce40#qmc5zLF>#9XtKAISm|`bAkAIY_ zpn3tAI+m_u4rtocad!KYRt2vBwu_b1_6d1#egY;ZOFh=$CYzL**JHjjSryEjDdL`D zvm&o3SK_bH626*M8m(`xZaH$-VOvYB$jt3Q+ncQ!zPEl0wf?SAap6f0qoMtQX&YQV zX080_;KBaDFLD30oy|e3bs`zt{xGd}boeUc>D}P)|!lNe<(G3mif<7$r8}W(wJ(aMdOVy)E&OZSgYy>` zhKSn*__NMFVdQ I&MBb@039#u9smFU literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_flamingo.png b/assets/palette/circles/latte_flamingo.png new file mode 100644 index 0000000000000000000000000000000000000000..9b98d09481d322990b9bb40eff25d961d3c3d1b1 GIT binary patch literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1k)aSW-L^LFlQzdHs3t^V6q z>|QY?-N8mxKl+IAmqkuX%YG|Mr0(5W{YJ9-occmhCZWflQ`Kf4xlmhO#q{xX?>7dc zLY5C&JN61Um>+yQ^Wg$p21Y-Ia~IoFepK9#+tWY!gI&mqjZ7sB|1$ZR4!nQynYqev z)gm#*H7$0>3u>;ONQiCFQY&m($TRnrMp!~?8LJ6HADOZ>pzO=Up_Bva$`;SaQ#nBy>1+@S6IXPgdg5>E}joI^a^EQ z+duF9`}MA?96PxVeE1%ia<7Q%gCvjrRO4TjXWZ6_9eD7RWBbC*TUum98y-GaJiW(@ z`@o0KN_P7vF&X?Z>NvM~3Ior6outpYiVTOZJEq(VW=;69OXYlh7lW^j$V~=M%OxBF z_9C7o9;Xu5GwA%?c4O{wIYx8a(_!VXfEFhGUCxABSG}3(hWjlUE9x$=ZMHmD`*HmThYr5Y zmVTTE?%fxgTnVE$owrW+Vc7RRfAYncNX9wB+!IPAg#w>z-H&Kc`!A*T^MO|UHiqXs ztO-BAA9OwE%oy>nwqT+$&{~a#;wFYYKOT4Y?*Zy_2BTtz_kXLGGFLIml^l1RQo&Hg zIIk4MV5{JJAjkDUh7>f1xxxLdqkyPfV_bvy-9iD?xP~}}bzGlLNbsJLMY9 z($;P$UdFOOBG+){^DE*%dK{vCo>`VJsXt{P5H#d1<3nj$FO)le<17f>BdswpX@cj{~d>$gzr?-~^sp5!nZ+8>y<|1B_fOl|9JE>|lCkX%(`rYDuQHzA4Guq^+IA&8dJ+-c(4a2p!y>;y$zegN zpbx7&FbgeE74%_~-=O8NKzh%$Em1pX{XY!Ma0ev6rLIu>qG+ne!)esQzqUO%e{o@m zxLtrh>x{>u*K5CV+-wi?XSm0*J-tngMdC5vQKFBZTtuZ*wwjd2ycrbXn`njxg HN@xNArt#^& literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_green.png b/assets/palette/circles/latte_green.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2ffb8fb2f3626028ae2b9f8409b1e8fb3b9460 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-Qmw$?=OMBQ##ULxVCz|{pN0Ps;c<=4dZWf{GGH}RE|AA?PJ!t@b|B`+#T_G zTi7RbDmRE9d^?w64_DrK9`?7490g1TeRe8`kKg|GsCG`v_k~Wqq6?Tm_*V-s)Va@> zzt9~hx|JhA^^0ZON0(JvA)^Ya;<2? z!|O+1?YY4;XR{lF+~3koTH93_eRSd!c1NDc_hfjjU3Ai>`{!BC1D~7CW}Gd2*InPr z?ohzppKOf&0S( zYraKCn1PHXAcpXPVutSl49`hIG7L6Z{7ox9aC~91dEM8n@sZ~XQ$gqi|8orI8SemX zhdAJs0^9*}7BaYR4V*A3=828S1OJDO0VIt;fRZpS>8=00F{!3^RZABH%Q ztjQN+A{plxt1=wT=ssz)eBXg|mRm_i=XWaqb#7~%@afDm3w4J7r7_ZHp6$5ux>7H| zy!)qaE%SNSS80a(P2DZlb6+{R>Q2O?xtqfn!Wwr)%)LI1%YpM%La<*BLq&dXt076>dq7(8A5 KT-G@yGywpp@An%3 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_lavender.png b/assets/palette/circles/latte_lavender.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c9cf3ad761d8fac8260056c1ccf04af3c61fcc GIT binary patch literal 1124 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1w;aSW-L^LFlQzdHs3t^V6q z>|QY?-N8ml|KfHR8)tp3kgV;_nj2MuqzzkJYe~20+0Or+uh#_h3>U;nT9p+9k74v$nZn9w$4G{ zE%b^~!_*7UCHmG&Nv`1zII7ZTFlAw|^ii%gTmji1l3VT{UBYpVB}4Ov#AKxi!39qr zB>QwO&}~=_q&pUr%0A$(X}5pUQ)d@)VFd%vzghF&uRprl@g&y=QJ(rv<6o6pZY#MC zJh=Y(@87K+rW%2a694SF&P4k$+BH91UgT!qfAhpuCW$>V56w!ZO`EWo$>5Jo%FOUg zMv1z(BhSNw7~105E>=zxYIr!^HD{kHOTrJUjx*J(7bhNbt#c7ML1%y4-7$#pT?xDI^C-E28uER1a;%QlV!i}&-HJ>3!pG**1| z=Opfeb5e{IU#_2Ab!Qrj!N!WlH))3ZRTVN8I-+C~o zFPLe=_w7eh=E3MUpU+7OH@yFSJH;eCjN$narj*z=mn%C@nTstrxxdZRZpW$Vx(6(s z86*DH7EJscz%Z>|KIX|8u?I3-59TN^=>PliNI4&y~>n`(;KD)=7AaX}pr&i)hb z03KG0RlQA9o+v$E$WYJ4-}0hhqH%OXaT4PVwp-7%?nf|eYuvUI?44w$4~qh3_dGiV z^n@m(hFi4HGs~~6cFGsTCRd)5eL3HVr)5gI*>Ow8AL}23LT_o@`QpZ1k!SK>N>}Iw zn0NnNYk8a0Uf|QY?-C@svW5sn^Usnayhpf1gr{5HKZFYUXZSwh_DqEZ!l4|yyNtrCMOFw>p9H*^{e(@3?1$yw;TnMk|K@Ti6*Nlz;ij zxK|=Hu$v*wX@0WBzO0lDdJdwKEe-{=`Q?geZ_sjBd$3=yPJFUbgz$o;50ZVl5?mXm zHTN5;Hf>{=*VJ#Q*mSM5!T*EozX`^_eg-%$W-|DZUAJ$q*m^cq?E~ose^k%Cc)n6% zsTM&o^DTi|>d?;$UeIYW+sgLWxhtCsI zBZ0%FShaLG=YYPuN92muVgZ)iJkP^-nBtZt}CZuiA)en zhkTccmCDl%;SAI2qTifL?q}e+ueQ7BrWV8D?Ps6WL`6ut2;ER(=>KPRW6I?yps}%Q z&UNb^u*_z8a4}weby2j?fg_JtH_bl!XBx|feM-~MY@Ts{4ug$-M)OUX=lgzyS17o& z-;`O-lJGvi`=kwwzWIEvu^Pku@7qsitXsoyu9Nk|E}qU6#Z&Wj946QEPTo^IRX@6+ zxQ%JUpWhFZo-bt3`ER%5#7v;IA_puT8RGtYJX(DZsBa+{SvGwCxAzj`UIzYMj}^RZ z81^#wgBgrA>;?R+1$?BSbBqTTe^cn->UYpTu=$-uhtPQkeTHz>pHFx`$Q-Z*+75QW zI=)YE2S{=igh;b$o^(Cu%=k}4j^pA(rSxqK&yO%|;N5aIbl*mX9OhhzcaE_ffSzqL&J@4mu5nwStM+-0^(Ffh2@cKkIeo=UAL5U1J($zyy?5Sorcz*d zUNZj>vmj6Gb98ab=UonS*PQBAy=R%tnjpHO`)XzGN`@&5_{^Rj5qmIaEz<_B8)?OM z)mjXy8&0l^`L>P0E1~;t<&rtfchvsqOjOov7h#MGD)TwwaZ2%PEJJjo-pSAUAI&BR zy#S_;pzDkpj*&;6MSpS+jJ&-T{WZZjx#=8%0_Y_ z<~z-L>Li2M?LwzGeanh^l&27V$gb;5^vc@@WgC7w{a!V2PSi%VLR8@bZ(MfN+L*Kd6M-4-0ncxv5aC}Fq{Q1;BoDP;JG^rHMT=G3 z@++1zo%z`G+OE3gjq_@ChV@Oijh(rfdOmVJR*w(+!LOcOtN3KTV>z(=VDNPHb6Mw< G&;$VI$mj(C literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_maroon.png b/assets/palette/circles/latte_maroon.png new file mode 100644 index 0000000000000000000000000000000000000000..710ff9b29db3abe8cc224b0ec4835007d7d3997a GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C>XS`~~m(e_UmM;o9o;_M5xGsjA}dH;li{@psZ@Q91Vfw2xWm!r$MXYInrv zZDF6#soWrb@a{RASeR0KYBhzZ8D^h|Jn1~*&nk4HZj$(9gct0Q#Y?G za21omkFPcL)w)5vULg!^`}>tXPYZ77Px!HN&c*Y|W<^^W*!10Z@XlST`eX$Ik3E0n zv(PApw)x^8e@+!?csSj$WZqJigdeGbv-3F_CHC#rkGn%eA5n z53e76wdV%YoXu_wa(_!VX>C_!^wEh^*d2K$-;?3BcF{?j?w@Bl4}5Mmn{l@AU3Yye zyHg2}<;C#r-?kZNilOx6+IyDCOdo3NXZJii#r0rLM8lfX6FRKIe;#8p`FY*oq;>eu zO{^B_8VslR^XnDKaUJ;dzPWqOO{O`{jB|up9vqdA-}C$|*8>?an!{Z2{=T;C1?~?E ztoarlVFogmfEdCDiW$BKFgzy-$uQVt@i(pb!10C2=5=4Q#z&qnOa-A6{Le9*XS@Tn z9pZpj3UCL^S;*kNHE_bDm?t(O5BwiC3drgerEwSd=`h@OxE=FUn)`s+1v7|ud>Gq@-< z^X{Lzwan*PU!@uDH+8pI&wb_Osyh*n=57vS2y5IGG57j3E(gw63Bi6jjOT7@F|2OL zHG95!Ia2`B>^G-U^SKwWY`Zbn{gmZ_+(YMuEGHFt2tH6vJ?_%8L?-Ay>ju#mlWhJA z9|XHYK$U_DtO+dxvp{{+9K(cDf&IR!isZ_{q4f zMYSv3yO-U`ilLnA_trDAQ=(E&av3}kkKkom_1q(hiRF;~`#=_9_2ajgSZq2Ilzudb zGBW9QCusd>Fa4Vk|TjMPX2PD=T)O|{A{a?PL`eAe9y%)gpgTd3) K&t;ucLK6T`E%@sI literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_mauve.png b/assets/palette/circles/latte_mauve.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2493203d58696254c67f3cb4db89881917867f GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C>XG{SE$|70q6IR|KrQ`;WsdGXI@i^|5)MJu_Mxj{K;Zc~Z@=Bz}Jl^T*S@ z-x!PvSw1N3*el!+e(>$ghYM^O82uQ|U2ISJQE@wNPygf(b|EV^GLf#yA3Q!oz6U*Ay4D%mY|4~f;@_AvC8*9Rc>wjvhb>n!w!Wzye{P3Q0@qDnM zS11G9{(0~7*SoHA?BqJ|;d@}py&|p;f;{$9jek|1aa$*L;K5Ul?F%<=X^|0ac=%lL z^d2wn10Oys+3laiWbntRW}JnsI!2dK{(jEWiF|E*riT*W9?a@=uB z1w$3%JTQZ)g71MG*8>?+&>ZFl_qUD$qH>LK4e56a1ytuX#xbnp`gBtAfn`HA&~~r` zVq~Ad9bhc-V1*f1(4_7;?M#0(Z3Gq_c0HHFc&?K*K{{jh>Y8N68*I0pfxXkid7#@V z*Jzfuc0=(pmIV^IhBKdE5&zNS5bg8KvV2MX2?K$kc{gRAvpm?}m)(3*W_p$FdDd5H zhWnT1KiKJTSLfOGXB^K<8?7RzN_+1qzQ%PxD?ohp=UYLH8ji9#r#f{HSVprZh;BIh ztmaz?gIB`j*qv{38K)c&+x^+Yl6{Bok4Po=AU;i|Jxkuq=$JUg`PFWQZA`I~p2t7R zRZzVEOdU(tF$Xkl>NvaoNvnca0NcgNY5RmcI6ncClcgSOaFb2S%PqXbE4#(h*R%GV(pzY1p4BuP7g<5~tsJQSXhtbgfz_bl6 zAG20|bnsw*;Fq|6+Ro;n)jE-kZGV_nJ34%o@$_zR`0>=XE8)?Ti0Fm}bwM8%`3*`A z3sMDrSml9PXo0Gr51af3Er$itd#-JX+Bxh0VPJ+kAo(qIh1wTIQ#~F|qZa10{mHLJZ8OK`;Fsfdze2%9P9S@ys?lb@Z literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_overlay0.png b/assets/palette/circles/latte_overlay0.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0904858f8d148f648bfc0892139918c4ae5795 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-NB~3{)^x*myYxouB~2gzquQnsw)0|!}!}AexbVq#N z7WN69$_?TN-_B*&!s{?!5ub?)=! zFLVcrZskZ&{bJenc(ohbYo-vxPGz3d7gyXiGOcF1BK1e&VY#7ZlPO~qm))@?9APXO zmOmtdl`^;=X#S88R?3KF|G{$qA;0C~`TU|LS`5wmpFO{w{V^+G6H^V_;rK^Ab@RFc zS1}p<_*zq6tsBJa6~fTAzhCL|wBUyRgdZ#CTs)s_Rn3&JD-zLVjrK<=XqKThp($v{tITwc(m{Yo5v|d z*M=VpJr+3!@l~@Xyxe~Doy|9n10QlXX-{9vWKeTE=iKtvsg5d*x=bHltZ(+UTr1k} z@cPkLdu}kz+3dz3_qTMD)^=4!ADuXb-H~VVJsDnW7oD`}{&|-3z~^SO8D|UMb=SAD zJCy)gUJT#!*i0541-M;f76N&9AB7hUiUR?eB}AUR1iAB{~W`4#yddU zAr5$@0C&Kgg$(Xn11C(1d152-!2e;RfUI6o8h3%84#RDS+c8h2xeu6KFoSr`JKvto!c5Gd^+>YLY?7%X^ixlXFIOEuG9-K z@BXP<%Y2^oRhr>`Q+JE?+*eMnx)bqe?&dItu*O{xbFWY1a^QTG5bT%3czUM zKC@;cFm>pa$~Fj1an0GMs?QSGWYlqP^Ova(UK4=H>1?6q4525Ar}sSDC4Qmt^qD0V zN{<~&CubjiFA@=+L literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_overlay1.png b/assets/palette/circles/latte_overlay1.png new file mode 100644 index 0000000000000000000000000000000000000000..010550052704d6beb479a5e130d7e03a47692d65 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-N7b*shx8?&qtoUD*{&D{m0=Jng33%`q;eBo*AtTM}E}IJgH__62GsG`Qz!{ zZwy9-EFYA1>=kYZKlpa$!v(esjD8H~F1DxqsJI=sr+@MXyO0$dnMxS`W%4r}c>m%v zbCuz$MPiI=TI`M&)LcE05Zj=oR@kzTXYMVHu!PWtsAhTPKYD7e8`K=U4<4T(as?nlc5)r~@I5f)UJ=&^K_2_5#=k1hxUCaA@Zc%O_Jy0bw8)4yJbbQr zdXE?Pfe)XR?DkJ$GWcWEac=Vz2A=&oNuPBU84h1}Ot}}#n($+n%K7>(245SIn+%?o zOE?7VMLbJ9P9?5q(D}RV#@yp_j1v2N%bsouWoXNvefH;;4MrU*8(bOW{+4dgT)q`( z?5>Ep;?WJo*EkL=-tQOobel>;=TYty^X{LzoC&qAdNb1v_ggYn)LmfPY6 zf}x6W9+<&Y!S_Ip>wyd@Xby9O`&&l=QMtyrhV;9I0;=;G;~3U)eL5-mz_OtlXgk;e zF|tqK4lovZu)>ThXj1o_cBVg?HUf(dyPnHoJlDyZAe}LLbxktk4Ypg)z~1TMJkafw zYcxw+yPZNyqhx5Ssv`~%Wl3YGrh|8JnO48 z!~IM1AMA9vtMhF8Gmht_jaHFUrM>qQU*kHU6(GL)^Q|C84M*9WQ=Pg8ETdTyL^qs$ zR`V@{!7E{M?9Mm2j8hJX?f&dx$-cw)N2HQ_5T7Q~o+WQ)bWEJ${AxGDHm2A~&*LBE zDyUunrjDiSm;;(Nb)4P)q*cKyfbC-Cw0%MzoS%Tn$x@FsxXC7E=JlBGOjZRmXNtI| z*sRDa%9Z$Qw1lr_l}78Et6PrTb=cNYD>8F?(Dr6)hVQN4Lao1RR9twH!)R!KVA=+k zk69}}I(V=@@Jrl3ZD(`PYMn^Nwm(d(9UZ>PczQQD{CH~HmGJ0EM07)gx}Xn>{01e5 z1*w8Qtn$Dtv_MtRhfRKimcs(+J=eBG?VR=hFfhX%ko=aqLhXy9sU8ofQ49at_Tc=* zg(2d00sgEr9@zi?NR^$ literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_overlay2.png b/assets/palette/circles/latte_overlay2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9fe68b568029c935fd1e812aa482a5a08d754d GIT binary patch literal 1126 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 GLK6UBZtA80 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_red.png b/assets/palette/circles/latte_red.png new file mode 100644 index 0000000000000000000000000000000000000000..156e4bd6a9f572963d036b7a2b32f950a904193e GIT binary patch literal 1127 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1n*aSW-L^LB2o-yH*iw);7O z<$;=enI4Jl{m)y)a76OgLZ_u=zm+9Y_x}8L!}!~t{+2KfkDmML#y3^k-rb(QUZHO1 zML7qxK884!?d41#w077U%WPp+IKX+p^4A0&`TX16-wTEAwR4$|95Uy#rf6`ND7jj_*1JA!%^YhmqUF~?1>w_dueW&rSN-ejQ zTn8Rp|NQsuRu5B+Kt_pwc3o$p{TS_<9xg9(v+uuo;wqEG9+`(`CDW!&Sj=Sb$0lWF zcqXGnUEGo9;Xw>-@oX0>rwKJYobH;lPn9L%hgHX!>QxLp@zbCD^cP&v*{&q5pxG|M z_^4f}lh4!gjcCKt`(nF4-%w^ay#3_5m~C7KKICq;oG%u}Hj!l;$AQKB`OKbf2?H7{ zzWQ?#cfmO+#)>c3Pp-N%jm2PNMdO<^!~Lp^Yu2Ao{jBrMT%F-O|E&bG<2&{LiOO+Y zOf);L$#~=U?Ife~P}=`nhP z_F&FJ2A%(QJ5E$;Fr41cuUC}DUBJg$;3v=^USIQZo;gsT1{m=@*jvB8#6kZ+^E-|5ELN_L!>se8b3BSQ{zZt>K79fsQuw;|p!WUL5W;p-aUYKhz`*G0v=Q|zl>O9;2 zh1W)W#q6VhuE{*yqZgpQx+uA`{9F`c1naA$(zs|X2GteKzLpzVEz(yrtYO-AbI$pB zTn?N$o3y9z)ol>EkyI|H`J7=pr@i+Rk5h`S4b!K{3L8!;@~9O*5VpYk(;x3Wyh~Vs zsblw*QUurKSm94r5eG zmE(BHa7Xjab))ittf{Kn2PVWPm~yO`r<}4=PQa517MPIJW3C zt$e_I4aiVwItdhE)~e{(_F>`If>*gFeXkC& zzgo#qyywBL^Ky#6FTCPBu=>HbGZ&f|lJ^|?adNuoKW2wj)wPaWlO6#J5C%_IKbLh* G2~7YOJn8NL literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_rosewater.png b/assets/palette/circles/latte_rosewater.png new file mode 100644 index 0000000000000000000000000000000000000000..0ceafa0a386910c846d6bb7d0918618bd5e4c516 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-N7bx{=)MSit`qVi)wAXEq_qs_1U}0=Wi6-ajq4ZATeLx_@+wRyW7|G73y|g zlygw)V~AtfUe5GEYlp3|%ocWq1Dppee@)<#&%fRMy-?_0JC|u#1K$Drw~h=yWNYgj z^xZPAE&wt-;^)S^4WR&=4*L5b^kI}B_;qoFk`~I6Jt};pNk$GrVGHu#~#Y_f&Y*J>1 zXEI9E#T|Jb9>mZV&vvnLnoz^T>8?5ZR9O;!SaqDKUd6x@KmEy1f58Qv?Ml)Ln(ZQt zkJ^kQ+^@>GX8j4(&pOY{)fvw7-%2n$zEl67s2s<| zM6=_Xj5mJYPBJ9#)`ldzHY^- ztOe($Fo-PHRr@^W7t?&fjP8>*&-=dcOR_ngGM@c-4#S`8g}DZ^9|x^}zSH5Z&a>@b zcx}X2%s%?(n#{vJdI9RIi;_Fb&qXmtu)azvjf>V|P+igNYq^otB7HT(8m4VG=bWF% z<-nPN#$~y&l$FJ+Iv6oIHl;?Fnx-wu;HX4k6Q5qVGF!J{qf$zyMzUp zI(AtXLpwiU&fH{nXV~bAH z$_LEXfDDzUlRyzxj*{lzjbD@bLdC#FAC#Q@4V_uV4<5)9M|QY?-C>V~|HbQ$HqQE5Az9n)n*y)R-hF)D#^*IcQHlzNcJXPOJbCUOzHBbA|4s(K zg0MTo`lj2~j1|In=1KD1VitJ7@<686qpkn@+oQiNINv+BN@+W=KbZebf#FY|o&5sw z#adZ{2fSVs^BfQF<+;YXB1yhCf`O-A-u0R8a)$W_KLlGYo_{>&NfskdTwj5-mAChaKt_o=xlLzQ zZ(-oE*MIa`Ta)3ie)9_(Z_WcBPAi$+7h*D~k#%`y8_LkO-uu&^;mqeyTK)H);$tiie*ZI*JUdnNfaOMp$mxoLrRzTRvSxf*pE!ws-KSLU zf^z{3)9U48p4f;qJiX5@Zn>G&qMgY?o#Q~a{k|V3W&`z!fD!wLd;7z!7KlG^ESGWV zWCt=LL5%c<=M3)_GMpm`Su#{ykz)ybDENZ4;-V~j;3L)-tPfTx%%8(Jk9h~sc8CM6 zIwBn4%-EN;SV48?iAs$F^A9mATE#p$BlciU1jDw*Z97kyi#6mf$c1=k2E!hWD{6~( zZep@X_hRU}C^os$ueR|#$Cjfh^NQVnE$3lYd^+=Np&!G)*E`H+oGn~={d3HMJh9Kw zzu4w+Upbppm)%zoC%$5G=+2Ettkc&rtYIqMXtiEfv_a^~!DVx9FwNN<$`HnQJLg=w zKkEV(vzt>--xG7-%-Lw&Kc%?gcFTO#B9*5Tln!K{>g$y7v|O@}J3;$`YUMxGdu%~W zz|;}@%8Ef%qx(jUcO1temQ;bc=`Xb#rzilE)9lAV2C65Vr&XRU)nC9oeWquj%dzHH zYS-H?>N~$Wu)HhiM4Yep9o`i08}1V;wM(scFc-vU#BVL`Z({d7CnoTjIfv6*Wc@TL z{+1GkcOu`iXIg7)JvB)*;e`GMDVC7)6SuH%w8Ygu2NzzoMRCo#S)%Sk@y@u3L{&Oa_xS$s8QuV@+3?ezcv literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_sky.png b/assets/palette/circles/latte_sky.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2624d89d5e1e666f704b9a901e8ad2f8cb68ef GIT binary patch literal 1124 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1w;aSW-L^LFlQzdHs3t^V6q z>|QY?-C>XQ`qm$p#b3C#dcFPTZg8rq`1=jxZ*%;ev{_V+JwNSZ*12$ZOu>(iCs+c2%E-%ztjlrf6W z?${KLTTB&PcE?&cqOLRUJ5c_^`P_@=&aAy$2Og~d`SV}Y9;qp77~&6pm~OFn{_>dZ|3w&QRcLHtoK)l? zs8FXd>BWR8hvOI{e&ueo?zd$!sG0rdRO)I5p8ICAKW8SU3V0@TGuZrkoe=Do4K%iN zqm}+PhUaSp8{F&Xt~r(K$spV0s!-9L95! zTn9eAZ|T=8au(tp;Rf;6TPY^t zVGPfGI2{acB^jMxssBN;aodbD#qT`+Pf1i*Vzb%u9Or?0+3ReZE%m-u&EvjuHmT10 z{(<7gU6E(<&kCM<%~ZNc%Y0hJ^EILkp$qiFo^M^s6wqXKV~TKeL-97Q16m2Q&;ER~ zl3~gLwcSNGZ!>8$>Xtp9Sj1N_`@?3Jz9lk2EET>t4F#1o+pm-}=CJNkIluqNZ3nLf zz|`R#%f5gmRd9CxNp8m}3wRcN)~QvUAoK*7oQh+(ma$ZxFj~L!9c#%0BV*0J6BPk> zpWHI|mFgk;BP5XP=IYGO-Hkb%zcq~Vm*%mTGrZ$|ySnUM;D-e#Z!#s-HRvXGKDrw8 zxN!pCfw_n3bc@-ShDB~-;`zxM*4*&Qa?&)0#t)~fMGhW0xp5l+SiLzf7H9M^f<8eVDNPHb6Mw< G&;$V00P(f} literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_subtext0.png b/assets/palette/circles/latte_subtext0.png new file mode 100644 index 0000000000000000000000000000000000000000..861186933bf60e49019179be1ad51f4ae5a5293c GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-N7b)shw-Q@JF7#D*{&D{m0=Jng33%`q;eBo*AtTM}E}IJgH__62GsG`Qz!{ zZwy9-EFYA1>=kYZKlpa$!v(esjD8H~F1DxqsJI=sr+@MXyO0$dnMxS`W%4r}c>m%v zbCuz$MPiI=TI`M&)LcE05Zj=oR@kzTXYMVHu!PWtsAhTPKYD7e8`K=U4<4T(as?nlc5)r~@I5f)UJ=&^K_2_5#=k1hxUCaA@Zc%O_Jy0bw8)4yJbbQr zdXE?Pfe)XR?DkJ$GWcWEac=Vz2A=&oNuPBU84h1}Ot}}#n($+n%K7>(245SIn+%?o zOE?7VMLbJ9P9?5q(D}RV#@yp_j1v2N%bsouWoXNvefH;;4MrU*8(bOW{+4dgT)q`( z?5>Ep;?WJo*EkL=-tQOobel>;=TYty^X{LzoC&qAdNb1v_ggYn)LmfPY6 zf}x6W9+<&Y!S_Ip>wyd@Xby9O`&&l=QMtyrhV;9I0;=;G;~3U)eL5-mz_OtlXgk;e zF|tqK4lovZu)>ThXj1o_cBVg?HUf(dyPnHoJlDyZAe}LLbxktk4Ypg)z~1TMJkafw zYcxw+yPZNyqhx5Ssv`~%Wl3YGrh|8JnO48 z!~IM1AMA9vtMhF8Gmht_jaHFUrM>qQU*kHU6(GL)^Q|C84M*9WQ=Pg8ETdTyL^qs$ zR`V@{!7E{M?9Mm2j8hJX?f&dx$-cw)N2HQ_5T7Q~o+WQ)bWEJ${AxGDHm2A~&*LBE zDyUunrjDiSm;;(Nb)4P)q*cKyfbC-Cw0%MzoS%Tn$x@FsxXC7E=JlBGOjZRmXNtI| z*sRDa%9Z$Qw1lr_l}78Et6PrTb=cNYD>8F?(Dr6)hVQN4Lao1RR9twH!)R!KVA=+k zk69}}I(V=@@Jrl3ZD(`PYMn^Nwm(d(9UZ>PczQQD{CH~HmGJ0EM07)gx}Xn>{01e5 z1*w8Qtn$Dtv_MtRhfRKimcs(+J=eBG?VR=hFfhX%ko=aqLhXy9sU8ofQ49at_Tc=* zg(2d00sgEr9|QY?-N7b&sh!(>v5!1^R|KrQ`;WsdGXI@i^|5)MJu_Mxj{K;Zc~Z@=Bz|8V^T*S@ z-x!PvSw1N3*el!+e(>$ghYM^O82uQ|U2ISJQE@wNPygf(b|EV^GLf#yA3Q!oz6U*Ay4D%mY|4~f;@_AvC8*9Rc>wjvhb>n!w!Wzye{P3Q0@qDnM zS11G9{(0~7*SoHA?BqJ|;d@}py&|p;f;{$9jek|1aa$*L;K5Ul?F%<=X^|0ac=%lL z^d2wn10Oys+3laiWbntRW}JnsI!2dK{(jEWiF|E*riT*W9?a@=uB z1w$3%JTQZ)g71MG*8>?+&>ZFl_qUD$qH>LK4e56a1ytuX#xbnp`gBtAfn`HA&~~r` zVq~Ad9bhc-V1*f1(4_7;?M#0(Z3Gq_c0HHFc&?K*K{{jh>Y8N68*I0pfxXkid7#@V z*Jzfuc0=(pmIV^IhBKdE5&zNS5bg8KvV2MX2?K$kc{gRAvpm?}m)(3*W_p$FdDd5H zhWnT1KiKJTSLfOGXB^K<8?7RzN_+1qzQ%PxD?ohp=UYLH8ji9#r#f{HSVprZh;BIh ztmaz?gIB`j*qv{38K)c&+x^+Yl6{Bok4Po=AU;i|Jxkuq=$JUg`PFWQZA`I~p2t7R zRZzVEOdU(tF$Xkl>NvaoNvnca0NcgNY5RmcI6ncClcgSOaFb2S%PqXbE4#(h*R%GV(pzY1p4BuP7g<5~tsJQSXhtbgfz_bl6 zAG20|bnsw*;Fq|6+Ro;n)jE-kZGV_nJ34%o@$_zR`0>=XE8)?Ti0Fm}bwM8%`3*`A z3sMDrSml9PXo0Gr51af3Er$itd#-JX+Bxh0VPJ+kAo(qIh1wTIQ#~F|qZa10{mHLJZ8OK`;Fsfdze2%9P9S%ag2 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_surface0.png b/assets/palette/circles/latte_surface0.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6955ed95c8e79854e665775a0a8a38db0c3cb6 GIT binary patch literal 1127 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1n*aSW-L^LFlCzdHs3t^V6q z>|QY?-C@uF#a|X(-|JxGTpzOHN}hgG;I-NH{kF;Hf2wS8a!9J#cP3@B#4i2#{f$4K zx>YmGv|y?bymOE9!0HFz&JcoKsAf;D{=MU#74lkFA{eb0{%>Jtd{F-7 zC*xj;(7gu(gyzzvi~L+|N0r=xR}Y{M|R!5y<+RxRJ9MJ8~jl{_u~0V ziKSW$&GF~IZ@;c|b%6_O!jIn?M){VkKRDXvpOXA*lcpTbo$#Tk<@SZhD5pNI10Oz5 zNR3+xR8}cCKi-p3qE6D~d88LZTfErDpVI^y9==vEdcTs%peAhYHMy>wh9xpV zEFJP)Dpo2_H-s}xtBZbfF1eq9=f2wRqMKR_hqs@7RudH==^}JPiJ||W)r~2aqkzW7 zt~uAOd%!ZA<-x^x_0>huLI;jKV%;?R=$~mU8}=zpKeKtp{W%Oa_8HALWuEW*5niF- z(tcBBIZML({O*%BF#6{6xyEV?_rGsHnXzsS!?{k@6T5giR}@dp*KwF!&pUZf@l^fj zhT=A+4S#+=PSo}?)gR9>`|G?&V79B$89rPK(S${s^`5<$^7HB)z z0qgia!5tvURS+W0s(I4&oHOG;5jl>F50%olF+4xQw1Ica+0cC(8FH9&A>KL0^1yYW zndI52q6aL4nF4yY%{Wv1io3>bfv(!;Io6l#QzSSv&*$_NGku6ZzV%>EpZDH*&zVYr z;d#mYL(GCavCq-PEuVKe%w2P;SM{D{Hfw_DitekGxhol_EZ{SHdPMBOoV83FxNf8s z+f{2ZsBSp9F6P@d2CszfyOm4kFyB%8qcc%ivt5KSE~w1sh{q|#udxi#jd~|P>wh$x zAoK#5I)bh~+#36rVz&#O;`A*m>QSCT^dY;hGtnz=ACztQ?eu%q+-eb)pRR@JXpX6K(3X9h0IvkkHq1MD7A*gU+ z6UQWp3%qgJQEOw){!avExCcDHjY5QfO^_0AW05@6e(mte?H4Up zam%k*&UEHu(`&oxmN(9;)fv_|-8OdSX6pIK^;kVV><9n<^))vc)s2q>3lIiRS3j3^ HP6%4tM@@{JqHhg{Q;#i*u{j+i&g$r>Z``-I)HSQl4|Izyyi?{%M;$dG1bMf8XIx z(PG;M9~s6y9C`0q9)uQDr&(n1J2VJ46n{~aw7a)W{QYBTfkOe6arY zry;Iq)e2Vz?S+Izl4EjKhL7iI;sqZ^}BD>cyk>1P%1F`IBRJ=7=^tyq#8Tr@Mwni8DvA!M$EK=Tzoeps{*k z&yR{dm}AQH;l=vNp*wXs6OukM-8`FA=gkxmKhgVH9xE{<=V9@{f|U0`Uit3LKwUP*k>0daTlBmV~k+U*=#xAR#7>7lXd0wOW$O(+R)y8rC{YfAVvBg|r7}iNMVA zm9H75EYL~%tXrwrAvDFYWZu&CEJ01cw6pcV$#%(3QF>?njItU zwx4Gu^L#BY#cEUCLh}i_iSn+`)?Ru0fbT%$gg{+LnDq25I*4O^S{w%y^b<4`4I$#OH;OXk;vd$@?2>?|@ B;Zpzr literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_surface2.png b/assets/palette/circles/latte_surface2.png new file mode 100644 index 0000000000000000000000000000000000000000..ee8b3f18951e44045c35f9cceba20a24b2e29356 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-NB~5{tM?XjgIseuB~2gzquQnsw)0|!}!}AexbVq#N z7WN69$_?TN-_B*&!s{?!5ub?)=! zFLVcrZskZ&{bJenc(ohbYo-vxPGz3d7gyXiGOcF1BK1e&VY#7ZlPO~qm))@?9APXO zmOmtdl`^;=X#S88R?3KF|G{$qA;0C~`TU|LS`5wmpFO{w{V^+G6H^V_;rK^Ab@RFc zS1}p<_*zq6tsBJa6~fTAzhCL|wBUyRgdZ#CTs)s_Rn3&JD-zLVjrK<=XqKThp($v{tITwc(m{Yo5v|d z*M=VpJr+3!@l~@Xyxe~Doy|9n10QlXX-{9vWKeTE=iKtvsg5d*x=bHltZ(+UTr1k} z@cPkLdu}kz+3dz3_qTMD)^=4!ADuXb-H~VVJsDnW7oD`}{&|-3z~^SO8D|UMb=SAD zJCy)gUJT#!*i0541-M;f76N&9AB7hUiUR?eB}AUR1iAB{~W`4#yddU zAr5$@0C&Kgg$(Xn11C(1d152-!2e;RfUI6o8h3%84#RDS+c8h2xeu6KFoSr`JKvto!c5Gd^+>YLY?7%X^ixlXFIOEuG9-K z@BXP<%Y2^oRhr>`Q+JE?+*eMnx)bqe?&dItu*O{xbFWY1a^QTG5bT%3czUM zKC@;cFm>pa$~Fj1an0GMs?QSGWYlqP^Ova(UK4=H>1?6q4525Ar}sSDC4Qmt^qD0V zN{<~&CubjiF|QbD_B|!Jo#nNbM~uI?w|c$(rX-QN_viN;#^2`nJ88419D9D+$E~9%43YZG|>{JdPzy0k|?VOhH3!QpJ7chVDuNGjabDuAN zp*v7?D@TIr7t6NCtKHaMGldv-D)XeixZ<{vX*JUosXr1A%MCS~Oc|rN?2awr2xG~x z{2>vnl)?Q#^M{16QbsKM50?86`7IaE=NC26Vrbs~?D_5Nk68hmm}=M#$3N<+o7WY% zipk)|*P8lj-5_4C5Qet>{Ysyw1vm63{8%~X;`wB=qOA;U`tCb;=Pp%!vVwufoj9vd-_@?gPPkp=a#olbyR88W%}@9eY3CSTG57w z*N?v1bAxHlW;X`8zonbBwyQGw=)@`Pjy#j^$?#gc=%h{e&$FBdJ~x}qI9vFxyS|m( zsRYRKV)*uN+l({CP^aHd487bfeaYUVXk<8Ut9J9_lE`6 ze2b1S0~t#|4B-RC4BrD7o|A-R7;Limn^t___`+oKy02N|BhMG6g3t;6=NQg2-T~SU zalk7DxC7=aWN_aaIAK!E6C05S{tp`kWc7;DxC{Jr7;ZbJ0x&W2DbK+i~S}rCxw} z_fOqg=JTwt(hT>Tx?8O0zH)Naorp(sH-|BVHSUU-dwm+01Lv!RV80y3b2qgZRyX9D zJ>R^XDS&DAn^URz+zVK?-I(is%JM+&q4PqPlZre9AE>4tcj;Lo6Lg<-gXoJ%Hvfh4 znKc`MsY9<+wn1o$YtBAZeU`u`qmFZ%zf5)TngC2rXA3oF2t83ez3163@e7To&n&S} zdhA#_Is5R7>58Qff?YLJ)-O|i$F@oJ&EgY#rtXrx!?;6#%lcb8-48aarE_=uWZc%G z+7<5I%kE^wP|o#x>lxW8QK=`n44#Nb@G`A>?h(bra!CJuAd9g2@mowRHk}DdKN>_C znRL4ow0<<00vVkNMn4)t8JX@r*t+cMsjGkFffKBcz)51n4U^pEb9K49^|;OXk; Jvd$@?2>{|*_T~Tp literal 0 HcmV?d00001 diff --git a/assets/palette/circles/latte_text.png b/assets/palette/circles/latte_text.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f68e7043ef5468c28e7dd3a4352f29af4b482d GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-ND9xshxYg)JLAZD*{&D{m0=Jng33%`q;eBo*AtTM}E}IJgH__62GsG`Qz!{ zZwy9-EFYA1>=kYZKlpa$!v(esjD8H~F1DxqsJI=sr+@MXyO0$dnMxS`W%4r}c>m%v zbCuz$MPiI=TI`M&)LcE05Zj=oR@kzTXYMVHu!PWtsAhTPKYD7e8`K=U4<4T(as?nlc5)r~@I5f)UJ=&^K_2_5#=k1hxUCaA@Zc%O_Jy0bw8)4yJbbQr zdXE?Pfe)XR?DkJ$GWcWEac=Vz2A=&oNuPBU84h1}Ot}}#n($+n%K7>(245SIn+%?o zOE?7VMLbJ9P9?5q(D}RV#@yp_j1v2N%bsouWoXNvefH;;4MrU*8(bOW{+4dgT)q`( z?5>Ep;?WJo*EkL=-tQOobel>;=TYty^X{LzoC&qAdNb1v_ggYn)LmfPY6 zf}x6W9+<&Y!S_Ip>wyd@Xby9O`&&l=QMtyrhV;9I0;=;G;~3U)eL5-mz_OtlXgk;e zF|tqK4lovZu)>ThXj1o_cBVg?HUf(dyPnHoJlDyZAe}LLbxktk4Ypg)z~1TMJkafw zYcxw+yPZNyqhx5Ssv`~%Wl3YGrh|8JnO48 z!~IM1AMA9vtMhF8Gmht_jaHFUrM>qQU*kHU6(GL)^Q|C84M*9WQ=Pg8ETdTyL^qs$ zR`V@{!7E{M?9Mm2j8hJX?f&dx$-cw)N2HQ_5T7Q~o+WQ)bWEJ${AxGDHm2A~&*LBE zDyUunrjDiSm;;(Nb)4P)q*cKyfbC-Cw0%MzoS%Tn$x@FsxXC7E=JlBGOjZRmXNtI| z*sRDa%9Z$Qw1lr_l}78Et6PrTb=cNYD>8F?(Dr6)hVQN4Lao1RR9twH!)R!KVA=+k zk69}}I(V=@@Jrl3ZD(`PYMn^Nwm(d(9UZ>PczQQD{CH~HmGJ0EM07)gx}Xn>{01e5 z1*w8Qtn$Dtv_MtRhfRKimcs(+J=eBG?VR=hFfhX%ko=aqLhXy9sU8ofQ49at_Tc=* zg(2d00sgEr9|Qa&d__ye13RUsl2w5VgLeNF?Adhhj_tP|+vk%na4~j%{Ao1VH|fQ`+P_SXrc1wN zOnJodz_p-Sond{`ZR5j^)eKB?80IYIKl$O~w!Ibd>JMvI1SGS*VEA)cj-}!L#pmo_ zl0sZ{nIbrA`yT#SHSypshEShJ9L|zfTLae|SjDiF&ED-ttWQ^hZ^N{venZVBQN}1f zyJJ&0ZZTDG*&S=)h`P>bcd-12^SKw#omqRi4m?=@^XIpyJyKKFFw8&rVYC zIaRFT;d9rTI#t$$AE^R!(={0->LQOki*{mYTi<+Q&vLEm*Ncr zflu$7yXUksZTR#1fl@lq+5m>PEgPo24Ci+}R`9Z6-pddp`ed^4fntX5K-<9%*kN@7 z?tpZS1A)0BOH{-y`B{GiS17o&ch9-WG)I{GfY}AJ@Sn$+Ht=pa3-OL{gLvz$6qE2U zhUY$<4u-dqjLxsr{~+18ZN{16cOL&IBq}Vi*=%`^^FY1qb+*lxdS9#NabG!`ROfyF zKyl-)$TRt81<$=^D&3@IKCR;U8qtQ(1$tr6w=QK0XtKI7ML4>lcpKLNt%TWUf4*7C zFy(;S?xLHwnKT-8%brgx;wzZ_VY5r$5}6>D3eTH{g36lhSIQZ4Sa+$M-+$z`gVzFJ z>hO+bU%-+oI6MC&x8sxrJc~Z-)T&MpdIC&N#W7sVSSn8#t>5{Mwd8@3v1Z?iih#RM zZW;Va^^pA$63BIPb!O-8#vIPy8bi4*4kl<@ekkuh6Sm zFptaNIQP2WZv;2-ubs!Rhb!+qk1mJ7G3}oDHIWbP>zb?IDqQA}0G1vMp00i_>zopr E06nwvsQ>@~ literal 0 HcmV?d00001 diff --git a/assets/palette/circles/lavender.png b/assets/palette/circles/lavender.png deleted file mode 100644 index 7a741bf713203da32ec01f3b0a8fc1f90523e58e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2409 zcmai0dsGu=79XflFpWJHDU`El927m$ya<72NI(n`s3yD;2`@=VCSjT(6EhPDRO@2Z zLn;=b1uRRgii$L^iRr{}ia^GdnI&ir7F%FJlMCbuZGllM)WMMvGetH8 z5agnihH1;iO(bFy!!BL~{B|C5V5UojGKyi9EP*K@EGSdJ7O=T+#7w5hqSGTu(aXn- zfh2}=D9Vg*IC*(_>^wf3uoyTzp-{--26KXgSwMqD=9?&ujb$POoD`!R(I~04U}g#< zOiU-ICY!KQVi*QEbBtW49p^S%Ex3zWr{$nHnv0q!lEY*3IFt2J8#WP*i5yE8NF2wB z0CnyZbqdqJK;4Nvqi)V2D1yu(%;P~#aWM`*V+hjyd=s0-{5)lu?9bJ6bEjN`q@-&> z;>LDx91@qSF`y}!j>;M5nmAvHnhbvgoRQ&HXDcX87`RLD1ea<86T@M_ zoJnp{p9_uG0dYkqBXl4*zKd`IijznZEQB7z0Y)apEMvw=C80cFXecX~J?a4z4FR^8 zK0jJR0j*#z=w&XC#S7`Cx=s9s~mDL6uDavADG9Ou~J*cgLLdP*VUOyL)S_+&C9 z79%Obl0V61GP-7}OV{)_*SPVgehEGrr=0 zFuo*F6WELvumT0^7Z@SPZ6gMn;F;n>(Be{SX;095iN2>IyK}Ous_1R47ry$jH--_` zzBh4&asSI<-NwjE?>2oiSkb%cSZ3n&@9ODK+)d@ieMKK-vai*ypR08VWh5h`lF!B{%!|0 zaEmM14MelyD)-t0#tjFAKQLF+_xapc|Dyb_Md|3@NHXL<98Alm%R6`fN50KCM6?B7 zta|H&V|K`?W~=8mNBPdj)ufGnUO8Mx@48lKvgfhax!Hyd11+nRA>d`^X^u@LA&Bnf zeB7X_YF`L)=f_1yDO8)!?%>6DFZJE>X}J9Z6jE;F`G2jz`;P9j_%lDT$ZieR_?}^Pxx644l^T>UT?hy2!%e^t24$)}Ut3!~eX!=anXK zkQt&{%r3reXinLstZCRZzu~64gCD-#tJZtuC{yDpQS;MJY`9-K@WqETx}!9MDCEo{656w`sPka2k;}Dm6EWdkVX@TRFswBnIZd#w{ zvrDF$q`Uo)?|OSr!a!zfSinzqsk}D61*#}Ky05A--ycukJI_&CA@!5aOFa@h<4(Yx z*Hlzq}rgsv6&&7Vup6qRJ8o?JM5`XAE%zm>eq%D%d8uc45CGUd@p4_}q_`nSr# zOSC>V_VEXP>77VrBcK$<(lggw2zD&LGe@>N!Bme*a diff --git a/assets/palette/circles/macchiato_base.png b/assets/palette/circles/macchiato_base.png new file mode 100644 index 0000000000000000000000000000000000000000..e70ec6f606be0334826ab39de536d095e678098c GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C;%0{e|!U%XFl_aBcN^`_0|pR8{f!8^+(}_&aH{s2qEK+Q+PO;qOmhr90yD zwy;m=RBjMI_;xPC9KDtl$E)4gUNeOlb}I9vzPRGHk!dy46{$ZG56cZTn@ky_xa^KC;Rs{N zu>2trtdzn1K=X%$uu?`W`wy1;5BV(@&*v94(PC)c|Lpng?2lOio0w|Y4#z+0shigo zxQfZ($Jd(rYTY1SuMmc|{ryUxrv*3kC;V7B=i>Qfv!bmGZ2Imyc;_xveX@dq$DTj( zS!fhP+kEklKc|W`Je=-WGH)qM!jDwJ+4-D|68rd+KF`x)IDB2T@?S7Z#-oKN*gQ@t zx;Fe+=&{H-h_9M8;pO(D?`*zt9QcsCNqhQQCWD&WIp>zQPIXji)MfhcVtuo(@5%65yXd4%_s_GO2R=8O%{W{5uDiaK z-Khk~@?!Y*Z`+JB#ZY>3?LEt6rVq9CvwNPM;(9PAqG8SH2_079KaVk){Jd^((mMR- zCRU4d4TjVE`SptAxDI@J-`qXtCes{e#yP?)501*m?|FWf>wydy&0(&1e_vbn0{4dn z)_jYOFasG&Kn&pn#SGsA7@m`aWEgC+_?uRI;P}F1^SZBD<0H=(rh?E3{^uCZGu{E( z4spOM1-Jv|EM#!s8aQE6%o7`t2mTKm1!VP#(zpx!bQo?s+>UuF&3(Y^f*Hg+J`8ap zS(7iuL^94XR%JMv(S6cp`Mv|`EVq)3&hJ$I>)h5j;nSIC7U~TDOJk(ZJlk>Qb){Z_ zdG}AUww%wTPe#-Jd?xFKSmXnG+1RtoT9(UX9zt}JiX`HF7XSEr_U_0 zPy{AAqL zqS_Vi-OKJ|#Zb=md+Qn5DN(5>xeT6&NANPOdhQX$#BxageISdl`te&#EH<49NZz-L4)iu-j6_^g(Nft??Fx0}|^E>OQ5m{(pPB>V@3>kG#P0gTd3) K&t;ucLK6U}zxa{> literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_blue.png b/assets/palette/circles/macchiato_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e58c33bad39792b822513addc2ab1aaa245a9fa5 GIT binary patch literal 1124 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1w;aSW-L^LFlQzdHs3t^V6q z>|QY?-N8oh{iSdx8)tp3kgV;_nYcJXPOJbCV3-acQUZs$cg z2em$iIM(guOdr&C*c!`hVOKc7dBC#Dv#tO8+oQiNINv+BN@+W=KbZebf#FY|o&5sw z#adZ{2fSVs^BfQF<+;YXB1yq$2MHJMC42Ba{nJe{EA z@Fzg!qM~N|UZxFSZYPz?RkI}gFuOVRbQq(=zFf2Cmk*s%m~=plvEs}1gUjYz0~-4} zsWdK!@m!=bL;pXk$f>s{F{p{@Pq?e|Y`aRsSJ9m*^N#*`#`55&qx6|)7T=HVKg6tP z1!So*RM$uQJhOz-C+*(PF=YI)Z@;fwaVl$ppN_+|R1cTAt80=OXZ^{Z@uYcm%}u5` z#v%<*@3V_r^0OxV{C?2&9MIZ@4CgqRK0NBzxBHaFTEGWJ=NR{Ve?OJ)1#86xS@yt3 zj6lXU5JU2TWka<_LorE+k3nuLJ1{Y^R58Yt9Cw^j!C1w(L+gZkdc$*ucR<_04k##{ z0C&K-fQH4lG(0@@isZOHEdSup!6$CHnbksFtRZ(n?z&ICtO?Q?vmxG5W6DdkuAI?t`Qsav6a=$o`nieE8@#BJB zC$}bkIX%JZ!^%Y>o5C*(l{4QI`WBdS&+9JVJBB;rx5D4vS^U6p@@Cc}e;A?<2_0R% z^cb_EY=d>{->7GNUTZg{uu6R5Uc<(CwOB=$k?G;|?;1^=laq59ndZ3|2-Y0vVrZP^ zY9Ly3U>14S-iM9LuAaL3N1p996U(^``p%{c`BxSudQ4E|QbD^*6r4i{I;&ju?M&Z}ocnO-Ukk@6YcyjK9tCchY82IrjXtk6Gu!-=Drpcf{vy zVV}^c+#r7N?OcXETzTht*xxd86fhO^*{K{pe*4>_+Bq%X7drKdE@1xPUoF5;=RRNl zLU*9(R*nSKFP3eOSG%#jW(qOvROU&2am8&T(`u$GQhy{KmK$m|nKDLk*&SQL5yp~X z`9mUDDTDig<_`&BrHokiA1wDD@>?#R&o64C#n8O}+4I}kAF~2BG1aggj(^lsH?J#j z6_de_uQm16xH&Mj}9>ZsDF%k<&J`et9twW19V zuOEH2=LXZ9&29{Ge@i!MZC7RV(TP*o9eF0-li{^?(Mg-`pJzD_d~PlMjy9r*OVxqHq{ra8`xbA(wQ9F>pX^ZYE=0~s)y!(8$HzP9WI?hgyB z`4$~v1~Qg_7{UjN8NLTFJSPdsFxX`AH?8=<@rB9ebzif_N1iWC1)&rC&oP{5yaTiy z;(%8Qa0kp;$l$&;aKfaRCpIDv{2w+7$m$iPaToaMFx+;y9rIM0`+(U6Gl+M57~({- zCSQz+WSnEH%5XHJ`=rhCeFxH6ZY3F=->Ll9xvg=+r!&ti)EWMl#z>!ew&Tj{O1%K{ z?w`7~%;#BOr5Wxwb+=g0edXk;I}wlOZVqDzYuptv_xdz02hLXs!G1Z6=Wc2-tZv9P zd%k%&QvlQKH>Xnbxfif(yD``Ol;wfkL+6DoClz@JK2S|P?$WbFCg?uv2GJLjZ2k-7 zGix>iQ-@xuY=h7g*PMN-`YeG>Mjhuif0^pwH368M&K7FU5PG6`de5_6;ujiEpIKs| z^w_a;AL9%+#`yK<&ggSKo(*3`I8_p1N^ literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_flamingo.png b/assets/palette/circles/macchiato_flamingo.png new file mode 100644 index 0000000000000000000000000000000000000000..230268c778c117297e829a693431cc8b2580ed14 GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1h(aSW-L^LFlQzdHs3t^V6q z>|QY?-C@uF;tvuX?klPS7Y6PAE7-H?-W}U-J+{v$U*KZw{P@#ovTxFheYUoZKc2c( zGt9JLst~<%kMqFn2j9*VT###EP-l4l!r7>1Prm-W$>2wJ-M;-|>)BMb4}=^1Q9bwK`AUhU zS`5wc=f8iyu5@*Q3v0rU-x@~wmaIQ`+UB2<{A-h@9L}Bap{V8dg~%wUKCS~FK2J!E zTMATGDL6mglTo5h(&c%i7eiaT*v6mJ1R5T`RxoTEW z*R6ZNGMnYW#d!7AMbSbBjyz)BH2dhEX)GJ|DNR4KdB*)Y3^w)|%{OJ9@B0y6q2SVf zQ)W3!!u$O0lQuB==JUD6Y7F}5C)W-!~Z7x1$d@R5SfF&ffSzqL&J@4mu5nwStM+-0^(FgM2@cKkIeo=UAL5U1J($zyy?5Sorcz*d zUNZj>vmj6Gb98ab=UonS*PQBAy=R%tnjpHO`)XzGN`@&5_{^Rj5qmIaEz<_B8)?OM z)mjXy8&0l^`L>P0E1~;t<&rtfchvsqOjOov7h#MGF7r9!aZ2%PEJJjo-pSAUAI&BR zy#S_;pzDkpj*&;6MSpS+jJ&-T{WZZjx#=8%0_Y_ z<~z-L>Li2M?LwzGeanh^l&27V$gb;5^vc@@WgC7w{a!V2PSi%VLR8@bZ(MfN+L*Kd6M-4-0ncxv5aC}Fq{Q1;BoDP;JG^rHMT=G3 z@++1zo%z`H+OE3gjq_@ChWw`6#?IVKJs;T~tH+1^;AeKJxi2GfZ62`rVDNPHb6Mw< G&;$S%ujl*# literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_green.png b/assets/palette/circles/macchiato_green.png new file mode 100644 index 0000000000000000000000000000000000000000..bd67b99b4874dd9ad4d4217ec93d0e07649db9b9 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C<90{6hY#@*U|fTwA@~esecCRaN}`hVi#K{!ZE~D#xCm_A%>R`1{ve?vD7p zE$kCIl^etlzMadkhb!+q5Bpn2jsm8FK0B4e$8UdoR6D2T`$DH)(FM#O{Hp~R>fGnc zU+4}L-O7=m`o*&C@oG1=*GwUXoyt6^FRr+4WLnL1Me2{l!*WB-CR4^JF1uq(IKo&m zEPqG@D`jv$(EK4GtdtSU{)6TILw?J}^Z7+hv>2NAKYM;V`(swXCZ-y;!|{)L>gII? zu3|Fy@wKMDS~rN-D}#lEQ zcPat0ycoXy+cx7&F_fNMd(SeN=|gS(?4D<*xE{=jXjpT4LWfoO&tps`Kd&2{v=0Bd ziPa)qgW>dke!U_&t^=RmH+Rpu$u!5AagH#{gQN2Cd!C==dLRQvbC@gM-`AGC!2Mx? zHQ%Bm%s|Ex5JUJtF~j!&hUX+983vmy{-zZlIKD91yzXn(_{j5xsUUQM|2c;9jCX*x zLmco*0q%e~3mM$E22Pk1^TbBvf&ars0a?AGH0}aF9fsQuw_~14b009fUY=3bx1<-qwWA=od6@!U-63V!C4KgJ4(9l=aJ0-?42{eY5z)o~gTJ?=bGr-?IMJPWOY&YU$h^KN+{R zsCI>W_p&=#F_d%t-g-uMN>u7eE`ulH5xh*Ro_jWPIk!RI*>oZQ%ECmC35qotwsWea zdl&Ee&{(B)Kt_MZyUp$=?6y=febCxrYrI9_fW&%(x=*RC|4${>R2bP>*8$5922WQ% Jmvv4FO#sac^-=%; literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_lavender.png b/assets/palette/circles/macchiato_lavender.png new file mode 100644 index 0000000000000000000000000000000000000000..5d7958d99f79effcabe9284ef01ab124838bdd5c GIT binary patch literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1k)aSW-L^LB1@-faT`*Y$T6 zlwB~%=GgTAe@&^jQ~m zEYfgg&|Y}{qHMgOQH1z{4o{hd+Rls3x3eYy^QD1ti4%jDa%^8Xc}t6kXv4$hiYNDY zaUb|_S;=nyBqoDDHXY|SPhsG(*H8MatH^Npx?{?{WY&ZqyIjuK_b`Ooh(t05S{~uJ zP_HrRg}~Iqaf}haayMG{+cFu{%zkq!bu|OeeY4r0S0<(lbS88&*!(`75bT!?)StT1 zN`D)}^EHAE>Gd<$oXYiN5S}f5B2Vmdw9tWHeKAJolj@3@3Tgw`H(Q>o{k;BzLkHhx zOFzy7_u|DTSHkE`=dIIy80y}wpL{VUl5x&uafO#=DvQo3+~3C#`Y(URlT!-uKs!oU z6MlX_=zA`fG2&ls!DQp;hGLC|;wFYYKOT2y-&@0QZXp<1HhllL_Y%We2LD};6})U1 z*D|aJG4?RUFz;w*vLFdPXLt}duohVh`r*W5{7HH9oOjpW(K{ zU7k;=+y&=mFznF?QD3}s6O%={7eiMdC_HML&vRTknli6A{nv69X2qW~&ldVI{Cl;- zYR1{ZmDh`P1I)UA>i%V2$9gKwaKCA~#d_{3Cs*Bxcr*aKg)KA_;6mDkP;Vs zmpkJ?Zd#Dc#1Bh$d4D~Yv0c&hL9nZ#%KBxN@7Ok}zEM8C=jkrlI}8O4`dPUPR?ay zn&)C5SaYC@p>dY0foRQvSwM!1fn?2rRSb>GK1W^3dzw_o-(1SbBz|N1!WkEKPuXFp zazbF=7CFDY?|T>T_|RCSbwDPa=l2`IP5f);G3?>qH(xSKAfcyRBEBZ_q5aQaHRoq; S&|Qa&eT9Jkf#3E#k0h%C7Y6PAE7-H?-W}U-J+{v$U*KZw{P@#ovTxFheYQ4@Kc2c( zGt9JLst~<%kMqFn2j9*VT###EP-l4l!r7>1Prm-W$>2wJ-M;-|>)BMb4}=^1Q9bwK`AUhU zS`5wc=f8iyu5@*Q3v0rU-x@~wmaIQ`+UB2<{A-h@9L}Bap{V8dg~%wUKCS~FK2J!E zTMATGDL6mglTo5h(&c%i7eiaT*v6mJ1R5T`RxoTEW z*R6ZNGMnYW#d!7AMbSbBjyz)BH2dhEX)GJ|DNR4KdB*)Y3^w)|%{OJ9@B0y6q2SVf zQ)W3!!u$O0lQuB==JUD6Y7F}5C)W-!~Z7x1$d@R5SfF&ffSzqL&J@4mu5nwStM+-0^(FgM2@cKkIeo=UAL5U1J($zyy?5Sorcz*d zUNZj>vmj6Gb98ab=UonS*PQBAy=R%tnjpHO`)XzGN`@&5_{^Rj5qmIaEz<_B8)?OM z)mjXy8&0l^`L>P0E1~;t<&rtfchvsqOjOov7h#MGF7r9!aZ2%PEJJjo-pSAUAI&BR zy#S_;pzDkpj*&;6MSpS+jJ&-T{WZZjx#=8%0_Y_ z<~z-L>Li2M?LwzGeanh^l&27V$gb;5^vc@@WgC7w{a!V2PSi%VLR8@bZ(MfN+L*Kd6M-4-0ncxv5aC}Fq{Q1;BoDP;JG^rHMT=G3 z@++1zo%z`H+OE3gjq_@ChWw`6#?IVKJs;T~tH+1^;D2aRb#dYQPIh4N!QkoY=d#Wz Gp$P!*9Oy6r literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_maroon.png b/assets/palette/circles/macchiato_maroon.png new file mode 100644 index 0000000000000000000000000000000000000000..379f6fb1a0a1c13adc522b8bbdc3f92d09ee6ad3 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlCzdHs3t^V6q z>|QY?-CMvaDLsneL({BpAHoLyxHu?Ndl`T#VNj3YBm#I zYKEB>OcjE6?r|Pi{ovb~f(vpD4C)NeUpO1p?8()?cigi=Uh7H(qZPydE$oaB%D?<% z+$#|p*v$~;G(Xv5UslQnJqOXr7KZ}b{BlLKH)uJmJ=iZ;Cq7vzLU_T_2gyEN39b#( zn)?k^o3=5`Yw9;tY`Rw3;QvAP-vr}dKLZ>WGa3BIuG_a)Y(1N*_JMSRKdR?mJYOlX zREwcG{`~jt*Ojg=aA8gO@ms?v-;(tQN89{Ul7DT|l*73bJ`}awz7QGZ)W>z;!{-U9 zaZ7>9Dh21qdooJYNxD3b^kQg>7u)!Ann1(D*9u1OS27vY#7=r{@7kay*Ok+-L?(!( zL%vJJO6BQ>aE57h(QnQr_cQR^SKD25Q;Xs7_Os7wq9P<+gl;G?^#8NEG39a;(Ad~D z=el(dSZ1?4xEQa#x+q%cz>!C+n`R&VGmT}#KBehrHqW>}hrz}^qxq)H^L;MX zZ^|rZNqC>%ebNR--+VsTSdHQS_w6S$)~#VU*U5Tf7f;!3;(l_5yy^0zOjEImQEvzbSNZ^*iVv*!<3-L+HGNK0`R`&nG+|WDeK@Z3jDG z9p5Lo10=Z$LZn$WPr9CSX8b22$8qtYQu;QA=SP?}@NPL9x^E*x4s$NVJI7caxGpr4 zJUdnNfMqaKK+m=rXNq5O*SIavRr@^0`jUN$1c&DNoW5eF5Anyh9?a?U-aGF(Qz*R#J8FM)CMs*Ti!jComH8a;IHmYCmLa-P@8oCwk7g5u zUI0@^&~-))$H*hkqCYtasA@F7u^u9{JH#~Gh4Wh1!| z^POfrb&^5scA-<8zGX!{%2S9wWY={jdgbkdvJJnTey^HaEn<^Vw5?%=e1dnxqKd6o zDioG57cAcpfBKH&%FtRY1fpz!CDoU1`$(HdQc1Cu$_n)o9G6)tSz zSO#PWD_oewq1MbFA*yhJH!eGBZOqyKiNFl^fakYSi14ooQsQkal84%_9bUQpqQxq1 z`4!8V&U|coZCBm$#(A|m!}_M%#?IVKJs-IqtH+1^;J?yQ(^ZprcowkyVDNPHb6Mw< G&;$S+59#;- literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_mauve.png b/assets/palette/circles/macchiato_mauve.png new file mode 100644 index 0000000000000000000000000000000000000000..497bf5953db414c4e657da5615cfd5cec5990cad GIT binary patch literal 1124 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1w;aSW-L^LFlQzdHs3t^V6q z>|QY?-NB}E{<8kYinh3gLA(D7_H4R$$M#!~?eobOxEMP>{xq8GoAhE|-A~p>)1}`s zraak5qxV>6(lZb&*G&MLRLHt#3ZDXF1n_52c>-{);fqs?gZPIH|}( zP@zs^(u)aG4#zP@{L0;E-EYfeP&50@snpdBJon9Jf6h!y74S^xX0ZA7Iw9CE8)$6l zMl1bo4A0jHHn`W%U2`helR>y!{6wDE=V+k=zq(?K&L`CsGky58fH$pp&hJO@4;uw! zfh?hhz58|5KEvpg`Q_(kFx1??ueNySCMFAYF@@JgDvQpA?%T-V`_I(p6Ofg|cutb* zz^C`k-E-QRHvIYhKq(z)Z2-e_7RHK?$Hm`QZf3G*2czc<_kMr(V*kQq^P;a=<0Au* z@e;&f`5<$^R^)&sNr;`H|5metmJQQhhV#1~D|p#3?`4P)eKOhjKrzF2pzUA>?65ik zcR;$vfxujmB`V^U{H#BMD->MXyXV|wnj_48!0duq_|IcZ8+f;zg?LA}LA>==ib;4F z!*d@_2g6%QM(0=Re~@h4Hseh3JCFYp5*3!%Y_>edd7xhQI@@MTy{}dCxUZZ|s`I{o zptx~YJJFKi{lm zm~udEchSw;Od5^4WzQ!T@fFPeu-T<=iA)enh38E}L1oSME9Hzith-ds?>}r)Jpm@C;ux-FER`pW*6)1BTJpfiShMd$MZn!B zw+w!zddU6=3FNxDIi4*4kl<@ekkuh6Sm zFptaNIQP2WZv;2-ubs!Rhb!+qk1mJ7G3}oDHIWbPKU&x9*JuB&4J literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_overlay0.png b/assets/palette/circles/macchiato_overlay0.png new file mode 100644 index 0000000000000000000000000000000000000000..96bce398ad0a30f8f446affc22e17fe07f53f6c3 GIT binary patch literal 1126 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 E0EQpsga7~l literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_pink.png b/assets/palette/circles/macchiato_pink.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcd90042beedea1ef2f1b7754040a244ba82f7d GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlCzdHs3t^V6q z>|QY?-C@sv?JuDM;k6ChRs^iP8^^MEjro7M>SOahduFsY9Qjc*^Q4+#iT?e4%|D*H zRWr=AV5$(kbC2`D><8b@6kL#NU{Ggx{=(U)W>3EUz2lx0@>*9S7_AuoZ((PAQ2ym7 z<6eo-z;1>xr}@bi`?69t=sAc^wm1~f=9ep?y+O-i?ZJM*I`PR$5yA_WK1lZIN^otM z*4%HX+O&;fUQ@rJV$-$K2K^7R|0Wp!`WfK3n91NrcHQ3nV(ZydwGV_F{82sk;`vI6 zrCJQl@#p)$Ust-iz=bv8$8Qazd`s3JJZ~BU&&-p6Fcd-y=#M-TvtxR5}6>D z4*4z>E0w1k!WpL3MZYY`|&14kaQZkm1c&oq_|`;?}i**xR^90nWvjOLp%&-eWZuTXGl zzbUhvCEO2R-?yL4Sht4ZTqo;^T|AvDil^r5I83hRom^8eRX@6+ zxQ%JUpWhFZo-bt3`ER%5#7v;IA_puT8RGtYJnDWAsBa+{SvGwCxAzj`UIzYMj}^RZ z81^#wgBgrA>;?R+1$?BSbBqTTe^cn->UYpTu=$-uhtPQkeTHz>pHFx`$Q-Z*+75QW zI=)YE2S{=igh;b$o^(Cu%=k}4j^pA(rSxqK&yO%|;N5aIbl*mX9Om3&uy>BJJaAoT zCV6(M=mE=MrhuMpGtLyh;;wO9psV(Ij`bz`R0$5v^ErLROdsNpZ#|gP=e>8{bEZ;Y zcwRF95VIgp>~nN+%jaDVbJv{eRlR4K&6*&(qWfxP?n;I!3;4{Q9ua#mXD!nPt{Z8^ zcGX%8svAzOi}|*V!7HKrZsn3W%y-oO=uA}BY!_jS3oi3H;&DpxYb--_qu$BS`X9|E z2)zKNj-cy|8jg`io<)Ch5>VA>eqrMs&$)yJn4Ip*OmEV3l-qPBdtEi7?2a=&UCKss zA?7>Hdg>&D*zH26IDN~CdX%RSeaNosO!Ugz2W1<6JN;fYw_3y|qi9>hjQI)P5sNCe zUa3%6!d$R?L;UGGjw?f_tzmGEJCG$1VC#NKNI{^kvR`S2h2=Fdg$JH2!Ux&ca0p~X zvIGMeoB|o1ER%r@E`b+p>rK~&t$X(0AVOTBpsiMN6=$tSFSm0O&qL?e53k(Lkh$8* zeJ7`hURkgTd3)&t;uc GLK6T-Xz1wx literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_red.png b/assets/palette/circles/macchiato_red.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4126a5899f013b869fa8bef3c534398fb516b7 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C zzt9~hx|JhA^^0ZON0(JvA)^Ya;<2? z!|O+1?YY4;XR{lF+~3koTH93_eRSd!c1NDc_hfjjU3Ai>`{!BC1D~7CW}Gd2*InPr z?ohzppKOf&0S( zYraKCn1PHXAcpXPVutSl49`hIG7L6Z{7ox9aC~91dEM8n@sZ~XQ$gqi|8orI8SemX zhdAJs0^9*}7BaYR4V*A3=828S1OJDO0VIt;fRZpS>8=00F{!3^RZABH%Q ztjQN+A{plxt1=wT=ssz)eBXg|mRm_i=XWaqb#7~%@afDm3w4J7r7_ZHp6$5ux>7H| zy!)qaE%SNSS80a(P2DZlb6+{R>Q2O?xtqfn!Wwr)%)LI1%YpM%La<*B|QY?-C@uF&tH}aJ(7%C<+QY{TCiu+y+74&B&*MM})e*7iO8v1;PMT@0ZURAI|4qJa=a8Esom>Y#d=E^ySH$%}lE;3k@vq7=ZtKJjJb22nec|RUEi$4F51%WZ z-s8o6;KOGnyZw`x4E`8(oZCEwfoH!?(q~;ohQrq#Q|<+`Cj8i?a=yNc!PiFQCWEKt z5)J`-5zi8jQ;F*tbpCF;G55F}qr^VnvZtFu8QSt^pZ&RIgHead23H2Tzoi>Amv03c zyDMU@cyvSYHI4&|_xpuC-KNsed6YZFy!)pvXF{#3-pq8v{g#Xsbr;w+Tb`@^xc-Af z2j6B(Kh6X9?u$*XgwdPMTc`Ul?0cU-`C?2Y;~Zh`38j)kfzP$>M>MGYms0!rKr4P5 z!*d?igrDCJx}I}pjQCeuFwq!jtwuv}6T_Y#kGuQ#0QEV8Q8B~&ztu~bs~F`@dLTmzn#0`S{?<`IRIV|uA^mQlfa<))IEHmxpH50XuxzLX+75O= zjO-J*1B^u;tT5vWn$$g~o#~IJjliPAuIF+X&vmjUNN3DmU6agsgYDKcuy=Ym4|F@_ z8qLzyZYW;HvOpr&aOU$X;y-#EqJ5rOmM^J4WgrkV@21RimIwR$vYT(pOs}#%&-yCO zaR1W$2Rj|^>O9;2jN^G}qgCWoY41J7*SHR71&FWyd@G1i!%;TpRHyC%%V^dF(G6#x z)qD$K@Jg5*yYo#h9TTTGzuL{PjVX50^Y}-( z3aS@?sblFn=76S69cQ;cX;ttFV7pj3ZJ&?_=OXsvS9k#X9ip<;|w7uDy;d|@1Q0wm+6&If5FdEt)oVLN` zW7f)#4j$|e{1W$1+u0nnS|^gR?GMvxM~AO6p56@(Kc3olB|Lf(5#7+BF6hG|zd^}i zL8_n+tNaEvhXtyFK5X(Ev>X;l@42=mYUix~hZABO4oH4WU7_|x(NvFz)2M}iZF_M3 z;=&Mdy8wUI8IMJ;*M8%;*&gQ4aF1nsdYc%F#ADuL{`=N^ke57L%VBJGPY+mpFnGH9 KxvXIg literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_sapphire.png b/assets/palette/circles/macchiato_sapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..48f281bee20308fc6ef418e07169b0628e5d3307 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C{RASeR0KYBhzZ8D^h|Jn1~*&nk4HZj$(9gct0Q#Y?G za21omkFPcL)w)5vULg!^`}>tXPYZ77Px!HN&c*Y|W<^^W*!10Z@XlST`eX$Ik3E0n zv(PApw)x^8e@+!?csSj$WZqJigdeGbv-3F_CHC#rkGn%eA5n z53e76wdV%YoXu_wa(_!VX>C_!^wEh^*d2K$-;?3BcF{?j?w@Bl4}5Mmn{l@AU3Yye zyHg2}<;C#r-?kZNilOx6+IyDCOdo3NXZJii#r0rLM8lfX6FRKIe;#8p`FY*oq;>eu zO{^B_8VslR^XnDKaUJ;dzPWqOO{O`{jB|up9vqdA-}C$|*8>?an!{Z2{=T;C1?~?E ztoarlVFogmfEdCDiW$BKFgzy-$uQVt@i(pb!10C2=5=4Q#z&qnOa-A6{Le9*XS@Tn z9pZpj3UCL^S;*kNHE_bDm?t(O5BwiC3drgerEwSd=`h@OxE=FUn)`s+1v7|ud>Gq@-< z^X{Lzwan*PU!@uDH+8pI&wb_Osyh*n=57vS2y5IGG57j3E(gw63Bi6jjOT7@F|2OL zHG95!Ia2`B>^G-U^SKwWY`Zbn{gmZ_+(YMuEGHFt2tH6vJ?_%8L?-Ay>ju#mlWhJA z9|XHYK$U_DtO+dxvp{{+9K(cDf&IR!isZ_{q4f zMYSv3yO-U`ilLnA_trDAQ=(E&av3}kkKkom_1q(hiRF;~`#=_9_2ajgSZq2Ilzudb zGBW9QCusd>Fa4Vk|TjMPX2PD=T)O|{A{eNj^O-E*g@PA|QY?-C$7*0&)+Dv<6J8+L1MnX@lBPscc-uCE7a}0 zDCeNo#}LP|y`1TT)(%@^nJw%J2RIK{{+hrepMSgid!f+1b}rMf2EGIKZygza$kx_5 z=(~kpQEHfa;kiWLdMU{@+yO^b`V6Kl43<91wT3Go`$KZe{i91buCZij{*aig6d}0a z>4RjS&IP&+%Yk&qf>PNB!Zq#oPkQR?LN2Ue;Q2Ree*XHSs~t~reURj-?==2ZspYnk z>%fESpZ~ty>S3x8$SCp8uIo&+AERBJcyw!p6z1gG@*uv(_M4+sj?*eupV`wbVL)TW zSAS08E;uK}Sn=ih$yIlzu^4QuXnd1qxL=iV&H59npLL#@t23PEzm;Hie5d|DQ8|u_ ziDt(&8E^c)on&+#O8bASeBQ%(;QQZPqgmS84aG@}oAjKOUd23>=DzSG{;uWyFGY9I^03*H!d+XPiIOrc}erM4k z#1CXl1~L2@&NJR|W}HJ3DrWew!j@yvA>|9)AJ$m&EjnU+f%`zHqn#zQ4SNAUE7Sq2 zn-LCZW0JY*=IB*4@pC|feJi_D$&M2WXNI8EuNaM!*JW-HpDxIj1_?^eBFvu zSqsihVGvoYtM+-$FQ)l|8Qmvsp7(v>mt=D~Wjy=w9ELyF3v&%-KMq>|e5b=*ooCy> z@Y;y4n0@rmHJOKd^a9jZ7bSO=pNnFQV11QT8W*j_pt_>j*K#APMfz%nHB8%X&N)Ai z%YidzllJtzx(z}%lFH>YpEGRdwD*4EaZ1s(VfqwVVZ%v99<|~J!WMXc`s2NacL@tH zb?m-U%HS0sw(;k*JpwMArxdKtUkYc^bOa_R^W#esye72ke4h0>&VgOec=Dr;9`>ug z>v$K(w_R!U7hO7G@2qJ%q)$xS(6974>{VF-`-6QK_GLYnW96SUM_1t)`wgLK8gaU& zavU!i?r6TbZd4wSHC0vnz=Ze&Q;rq$lruR6IQH*x7xbAUlg%ygL8Ynl0dp7&#}=KY zl@FM&0U0VyCxIfY93{=yXN75pf3BBU!!2NOcpuNz7P}?KS`{7JJ}mrN@G94&@6{pp zS1TEc_dM8jUQY4%g;$&hRzLW5=0X!g@}5IKPEHs7$NYRx&AN*H`7XfngTd3)&t;uc GLK6VGtLkY0 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_subtext0.png b/assets/palette/circles/macchiato_subtext0.png new file mode 100644 index 0000000000000000000000000000000000000000..ca912cdeaf94f839212a1485fc4751b04368f618 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C zzt9~hx|JhA^^0ZON0(JvA)^Ya;<2? z!|O+1?YY4;XR{lF+~3koTH93_eRSd!c1NDc_hfjjU3Ai>`{!BC1D~7CW}Gd2*InPr z?ohzppKOf&0S( zYraKCn1PHXAcpXPVutSl49`hIG7L6Z{7ox9aC~91dEM8n@sZ~XQ$gqi|8orI8SemX zhdAJs0^9*}7BaYR4V*A3=828S1OJDO0VIt;fRZpS>8=00F{!3^RZABH%Q ztjQN+A{plxt1=wT=ssz)eBXg|mRm_i=XWaqb#7~%@afDm3w4J7r7_ZHp6$5ux>7H| zy!)qaE%SNSS80a(P2DZlb6+{R>Q2O?xtqfn!Wwr)%)LI1%YpM%La<*B|QY?-C@sv+3mGrM~uI?w|c$(rX-QN_viN;#^2`nJ88419D9D+$E9+A<$7%+qISg|a^Pl|iao^qwdG&|2D*}>PUoiZ+EXUGt|KfA@ zFG(S;x=azAwS5nNteSXm7elDeBMxUttF3`+4y%4YBOBi5%Y!M9;rQ@^2RlPF^p zpWU%39JiP%xa^L#a70~a+;^b-hx54?&z)I&xeh#7|MTa+s6A3s)-c2${4m{O@%-gU zQ&utX)Y;y@AKx9)EF{|S@crTwd!C9sFqWv(O8@eCMsJL6!@<*ndCuvXoR(S)htE4t ztDGv<@bI~7O`R%h!jDvex#^mW5_OSBo<%z`w5@MGv1d8gfe)pg^Ztu4&Z^MZ#5k$Q zLr|ekW73NWQx3;5M*Pa%Xx(qiWKc8v&8gJY3_SPEW`E91Ocn4<=w`6_^*SNgFB@oV z=|(I4Z4A%X2sXIa&s}pW*ONiGTl_?x*ym`W1HZarjLs+36*GPKvw%0Pc+T%f@edmX zWPvQ9hQ0fB)jq@Ml=W2P{cK>{GXDju*7Dwc$k|=!W8LTnDrgW}p4} zW+lUv18TdAZr*0nXw)rxKCy_eVD^X2E`3X6f>+a4lo0JYlqc=R4Mt2S&!4eJ3gc z?moF?@GI3r_D4t{*UiU7SBo4xa&qG~21b9S860*At_=>S zm1c0+0ke>Ux6%wAyM)jN2lI-xnOloY|F;7(T%+-u(*eFOoU>vigi<)wdox+{C|j9>X5ayz@M|90tdvd*;_fKD2)&TC?e~q-O-M_+apK^>bP0 Hl+XkKoV)Ra literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_surface0.png b/assets/palette/circles/macchiato_surface0.png new file mode 100644 index 0000000000000000000000000000000000000000..6d507417f88b1b2a3214ada79b29c0b9575e4834 GIT binary patch literal 1127 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1n*aSW-L^LFlCzdHs3t^V6q z>|QY?-ND91|Cdnhf9WH}U))>0-hNY(NZtGM`wio7bNrpOSyYZaKkZ}Ix$yU=uhJdy zd0W^gbSgK9AACEPVGmc{c^>w+j2s0_1$}lZhmYU>_NaDF%lCy&y`l@4KloP*Fx0uv zm%q>*D7uv+LG_De+vC-4Y_FL@3_F#1QeRwg+sL$<>59}JiHGHenoXvRQCxP%mT-iz zWLW-?2v*AAexUh7LRcvymi-6I{fGRPi|6x;nrJaJ?|=6EcJ{}tfK5y_Y=`3?_0-Ml z3S7lx@Z)PueYI{7uU7~|+x~u~&(ne%`V)SvoOAJfvRTnq1~z^79lUdwsy4kS$DdP08Xit}ESa~ICE-V^;Ou-(Mu~lVN}uOxF&w_GTKO-SCF9Y;6Ko!* z6kQvBEc9699K=`6n(%V_(RViAI1YTs-K0HzEt5gb?VNMVTcITGbCYR~Gvgd#mIp`W*!Wa~3kVZw;ImnU`%T>~)^lGux#~{Dqq&>I7{VHNMa;cEjmv@aRYI^|4&%9-S`4cj za?PG^Ud|N2H2ck|)O_v*EZc6(bw6c!AotLDAbM#Uz{m zLix;^jlk5QS1Q{eG{rS%pQ=7fV3SeDxy@guI(SV0Ca1H7nlpr+D4yQ)Y?t_j#?xn( zSSUSqES;Qv_{DU^(g(q=nknm-slH>|r21y@i9J(y$=+eyp}%GQt)1=%o7K{}JAN{5 zYfwt{@j(3~gPuOj#V)~%9!`66bP0l+XkKYP$A9 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_surface1.png b/assets/palette/circles/macchiato_surface1.png new file mode 100644 index 0000000000000000000000000000000000000000..65a7e3ea21f166bfede1e5935bb47793c4d16d0e GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-NDAU{)^$SJ00mSTwA@~esecCRaN}`hVi#K{!ZE~D#xCm_A%>R`1{jW>5llk zE$kCIl^etlzMadkhb!+q5Bpn2jsm8FK0B4e$8UdoR6D2T`$DH)(FM#O{Hp~R>fGnc zU+4}L-O7=m`o*&C@oG1=*GwUXoyt6^FRr+4WLnL1Me2{l!*WB-CR4^JF1uq(IKo&m zEPqG@D`jv$(EK4GtdtSU{)6TILw?J}^Z7+hv>2NAKYM;V`(swXCZ-y;!|{)L>gII? zu3|Fy@wKMDS~rN-D}#lEQ zcPat0ycoXy+cx7&F_fNMd(SeN=|gS(?4D<*xE{=jXjpT4LWfoO&tps`Kd&2{v=0Bd ziPa)qgW>dke!U_&t^=RmH+Rpu$u!5AagH#{gQN2Cd!C==dLRQvbC@gM-`AGC!2Mx? zHQ%Bm%s|Ex5JUJtF~j!&hUX+983vmy{-zZlIKD91yzXn(_{j5xsUUQM|2c;9jCX*x zLmco*0q%e~3mM$E22Pk1^TbBvf&ars0a?AGH0}aF9fsQuw_~14b009fUY=3bx1<-qwWA=od6@!U-63V!C4KgJ4(9l=aJ0-?42{eY5z)o~gTJ?=bGr-?IMJPWOY&YU$h^KN+{R zsCI>W_p&=#F_d%t-g-uMN>u7eE`ulH5xh*Ro_jWPIk!RI*>oZQ%ECmC35qotwsWea zdl&Ee&{(B)Kt_MZyUp$=?6y=febCxrYrI9_fW&%(x=*RC|8=daqo2jxk_MI^44$rj JF6*2UngDHY_F(`3 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/macchiato_surface2.png b/assets/palette/circles/macchiato_surface2.png new file mode 100644 index 0000000000000000000000000000000000000000..c8068255466f1ed4ec8db7aa47b2bfa88f6980af GIT binary patch literal 1126 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 Gp$Pz880l32 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/maroon.png b/assets/palette/circles/maroon.png deleted file mode 100644 index c4bb18531bb19c1a86abdc47f549e2c40c8b2adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2254 zcmai0dt4J&79K!Rh}i89l~mVuIy@`|@&E#4B(O0&f)XGQ5G<>NWJsoYOw3Fmuqy8s zD%yntwiKzNSfmfK%FkbYP|%g4Y>^_R%Cd_{(@MKk%fiaTRre-P(5l-%=5g=$o$sD| z&beo%G%hC6$#JbC1VK(w!mxPo++ewu+k<=A5itjXmY8r!GLO)LCF9DG&=AL9 zBMJmG7$t>`8nu>0jXcDvi-LE{G!ucX6iUTIl0|W_fY4(whrwa6kPt^WSTD~&1vUf(+I;znI6|s zIH83tn$mQ_K=BX+;PAXSX2ciOwdDNvK_HkGgvn;Gn2*vaJmVR33-SbArz9wXR1&&{ z4Lr8Q0{ny_2;b99j8fgx$Rg4Ir)xBiZG)u3GeIEcgZh|HzbrsXvUM0U9wP~ZUWSEd zVp_`88VO5W&^X+PsguKS4W=bQba{v$_g7%bGe7~MCiDrQs4yPFw%S-Chem0n3T!Jb zr<4m?i}TT#R`F}V;+fiDNo}GQ2Yc~d)Jk5&cu1fx^O0pzo(e7G0kwK3BILk1Kday( z6eSSE>4^+n4KOl3auXaCE(ll0=3Cv`>?qZb|C7< zMmhdoEH=twS(UA9a2DiJO8Q%TOGU%Mz(OQKg*ZtO`fTgeT$v|eJLg7oLp5%#Zy2^_ z8I{T`LE<4gJs~&9Fu8ScAUB7SLqw z#DLnf_r{#}jA=P>zql66e8Tx)E8&qN3hd_Qz|jXigt^c}z+j;bVOr38^q|RzoWARZ zAe#alq~(cpK+r4YhVmO;g<^VV=%6yariOO8i<`DDqpEiMHQMQ2 z;=N1kZVz0q9ehx-)WxU8kG_>M`2T*TxNk`7wr#9S@lDhEsb-FkhheF=(*@VJnpPKY zC=&cFyx%OkndI)gV^zqSyRYl{H&qF-lIhE4syHD2PGeQiPGd#lQ-ovROg zdl}o()wBD{13?ut@8KyMvCKoxFAJf-cgp(#&BrZJaQc7S0b+7$z=p(&?tCm{8d zuDbbqm%C}BiIe)oiLnCGDdx&Y+tO(<*AD*_vrjcnT=wXz*?fNDdH>FKgTuaws=E8N zq>Bp+gFA7uoD7m2C zPS|~YTmAYA$wy0W@?JZi8PB~we*e_ymDAu;aBFI}&l-5;k+bay!|p#r$;$%rIKz&g zL5zHIm>%R%+v<5X=A)yH8`|sMIxWmD4cTAW)210o z-MN$gPn!^^*(M?1ROIlL-CaAy!^$--Z}z^bD;oRc3>|8=RW$FlrvcN+-%Z=Ls8&_8 zY){!Ka^=hPBQ5DW4!C(sm#8tX>7J0Qyv!E4bTsD!>VD;zM{aEEpVTk*fcHtF|6e2P z`s=z*MCV23pH#?;C_IUNW>4VER|S*bzZB5Wm=`lVhQ}Xojc70rELHxn<-ac94OJQZ z>~F6#Q?qU>(w2_Wo3h`#c78v9mi-dG?x=XO+)zlFLQY8Y`i~`knbr*zw^lAoec@u+ z^rd2cYQ@{BYcGC2bLkRX-5oh=AH?6)5L=diSiIr(Yya7Arywe-e>f!e%wEagxMSb) zUB|bFmU{CA-6xf^cI{Wj61ePi|4it0UcN>AsXJ3J7H6nM}_XFWd;dO!}3r*=Mf z$oW)xN!kl;DN&!=cupQ)+oXQkg*v$6&t+ys?{Kv9Cv9f#&*eYHj)%2Pb$mQc>vDhp zPToPsqTLY{-6sb<7!?k8ko}s5i$`SUiqMaPov+kKoGX-^=pOUmT_kV+Yxvd4Hu_YJ VxYKoIqUARvDm*6a(@kjw{{y!jUv~fi diff --git a/assets/palette/circles/mauve.png b/assets/palette/circles/mauve.png deleted file mode 100644 index 055971a0b603486d38875edf4163a0584c021dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2248 zcmai0Yg7~079O5OFf1%ug{n7>A}%0rAd)6xOd_Eggzzv}Um=+!Lmm@mCM2M(qQI@z zSFC}Sl?qm=NLPi{F0Dl>^{NzZ>nlE>bj2#%Yag^ou~?*)dlD#U)!rYI%sJn;zrD}i z`|M;}dRhu4I5HT5AWEuKEC=7wo+l^}eC{}ykpMydjcAsFRLGX|RG5*jRAYGv-DWfc z9D?}CHnUQtM@VWOqD4&txUcCnOhwfKcx8f&DKm=@9V#uxk<8+>ELE{ym86D~7X|Ze zJRo31NF~)~G?)mUO#pj!dEni%&48(13aJ;s3RyZ;gy9G^fu2BT!i$2bd|a*J$;C^@ zjKN9(>qyefV=$~%E8WVWW4M;VN=iy%Fxdu>@98EsrTJ-One6ZBM&o10AV^6eNW@rDAB*Wv2Siqp8DYo~0<+*ML{f;D z$hqE3c=EzaM{S5fAx4dei2&IZz?`JNfVs~AMVJA@GeJ`!0+{8s@nnvdYE){Gm8hE3 zjcZNpFGoz;zXG1f3>HsmvrQ;C3wuIKF@XtSE}QX)o7|^D<8|P9qmyB35FE!VI02=K zMCmxDK@9*SivS_TNEEbo?VevTJ zSSE|dWO|joY;YIUN>cg%_@0iY@_~g+#*?B1iQz@wt~CU@!bs;WZT&RzNB>z)(}xBXDYGW~m#xn26?tFN7E?yKm@ zIk_g|_W6d8hrT9K?@rSCof?O8?TwI=8#CVU z_xriC!`b!l^?>QLk2y0|l9u?Hp&2f>Y2K>dcJ1~0S@#x6Ap|t9)Jw@%@qy* zoj$n!yX<>-_CW6zf|7RO{Z)A(X*Ul1l(tjfkG0KrRlWTAz?Asb7R#ia1CITFI0;+G zNqataFe@qHe|{IDs)xAj6--+kHY82YZg&$Xm{ zOIx2GR>AfQY_Sgvu0R0K;H&+@oxgp`-Sb7mO@_v-)ia}Zmjr#6xF8PkwcYt?_wS2^ z&Ya#Kt4eE^Z*JZgFw&XwY3qgSag*2d9XncWzuEH-UEyw8cNuv9Hl_c80kIM2g30t-^- z;Ht3U7vS)%isNAsk>C3EJLa$g&M$q(rn~l%)$OjOxl-SkZ+C7f{48=xsk~Vknfv95 z|Mcyd{h3Tt@Ap>t;m&h46bUg|PWVYgM5)-{$h`6^XGy{Dth?lq?&mH|n!PRPy0FSI zHFA%Y+T4~3u=?TRzac1Uw*J`t#5VR$kdDXHmsvxOJj>H%~PeLDZea*SW&p*3C8r2k+=8BdE^4CVmMnY7jm9@UFlAix5P^u(N Ke00hBE&l@;drk!a diff --git a/assets/palette/circles/mocha_base.png b/assets/palette/circles/mocha_base.png new file mode 100644 index 0000000000000000000000000000000000000000..3f24ca5f50f47c3d69dd41c0c77646d750b44b39 GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1h(aSW-L^LFlQzdHs3t^V6q z>|Qa&-Jyg1#czAwN0L>63xjt573|q`?~d)a9^2=WFK{t-e*9@P**EEhoZP;~A5Yz? z8D?5ARfyiX$9Z7(gKuXFF32@7s53l&;cQg1Ctv^GanA~Qtt%0XRt*2Qurod=|MHV@ zuS95IH$#}y{A7!LSt%Rz97HEu913Xj%N5bypyjakV839U_++IB;RQ<{B>QwFxHe2{ z?l)9z+Qu-isozks=~`)n{s-BA6O4cT3~*e`Wbh-qZr^^f^=zuz2f_{hsGfWAe5J%v zEr#a!^WVQ;SGu~ug*D;FZw;e-OV%GeZSzk_{5opC_co zEd?s86r3OL$tY1L>GC|%i=i!EY~#;q0u2veD;T|B$z)IyJL$Q-YlE6xS5CtcnIM)9 z`7RYJm8ToR8K%`mzd4uO&%kqEZFkX4Er!F}&pxY(ijZ^>x}n6-|Ig~il*>^-V`JBx z>()JBna%RxV!Zn5qG+K5M;@_mntk-oG?oqfl%}8AJmdZx1{?c~=9@Cl_x%X3P;hC# zDYKj<;eCGhNgEh_^Z8t3HHQ1&x1Y>dw}#K;{JR*>V6NXZy^|2HhllL_Y&h?hW=fT6})Vi z_A;CYGnj4I3;0J7ZaEveZzDqvb8a!%JI7caxGpr4 zJUdnNfMqaKK+m=rXNq5O*SIavRr@^0`jUOB1c&DNoW5eF5Anyh9?a?U-aGF(Qz*R#J8FM)CMs*Ti!jCom-!s=IHmYCmLa-P@8oCwk7g5u zUI0@^&~-))$H*hkqCYtasA@F7u^u9{JH#~Gh4Wh1!| z^POfrb&^5scA-<8zGX!{%2S9wWY={jdgbkdvJJnTey^HaEn<^Vw5?%=e1dnxqKd6o zDioG57cAcpfBKH&%FtRY1fpz!CDoU1`$(HdQc1Cu$_n)o9G6)tSz zSO#PWD_oewq1MbFA*yhJH!eGBZOqyKiNFl^fakYSi14ooQsQkal84%_9bUQpqQxq1 z`4!8V&V1~8ZCBm$#(A|mLw?h3V`pxro{wyg)#Jl{@ZV>uI&1%H`g&mT!QkoY=d#Wz Gp$Py#!{|K# literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_blue.png b/assets/palette/circles/mocha_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..daf3659c24f14adb8728fe5c76868e809fd08bbf GIT binary patch literal 1123 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 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_green.png b/assets/palette/circles/mocha_green.png new file mode 100644 index 0000000000000000000000000000000000000000..fd39a1d4f76f1977c10ae39a09c47ecf54a3a7b0 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C$7*0&)+Dv<6J8+L1MnX@lBPscdxhWE7a}0 zDCeNo#}LP|y`1TT)(%@^nJw%J2RIK{{+hrepMSgid!f+1b}rMf2EGIKZygza$kx_5 z=(~kpQEHfa;kiWLdMU{@+yO^b`V6Kl43<91wT3Go`$KZe{i91buCZij{*aig6d}0a z>4RjS&IP&+%Yk&qf>PNB!Zq#oPkQR?LN2Ue;Q2Ree*XHSs~t~reURj-?==2ZspYnk z>%fESpZ~ty>S3x8$SCp8uIo&+AERBJcyw!p6z1gG@*uv(_M4+sj?*eupV`wbVL)TW zSAS08E;uK}Sn=ih$yIlzu^4QuXnd1qxL=iV&H59npLL#@t23PEzm;Hie5d|DQ8|u_ ziDt(&8E^c)on&+#O8bASeBQ%(;QQZPqgmS84aG@}oAjKOUd23>=DzSG{;uWyFGY9I^03*H!d+XPiIOrc}erM4k z#1CXl1~L2@&NJR|W}HJ3DrWew!j@yvA>|9)AJ$m&EjnU+f%`zHqn#zQ4SNAUE7Sq2 zn-LCZW0JY*=IB*4@pC|feJi_D$&M2WXNI8EuNaM!*JW-HpDxIj1_?^eBFvu zSqsihVGvoYtM+-$FQ)l|8Qmvsp7(v>mt=D~Wjy=w9ELyF3v&%-KMq>|e5b=*ooCy> z@Y;y4n0@rmHJOKd^a9jZ7bSO=pNnFQV11QT8W*j_pt_>j*K#APMfz%nHB8%X&N)Ai z%YidzllJtzx(z}%lFH>YpEGRdwD*4EaZ1s(VfqwVVZ%v99<|~J!WMXc`s2NacL@tH zb?m-U%HS0sw(;k*JpwMArxdKtUkYc^bOa_R^W#esye72ke4h0>&VgOec=Dr;9`>ug z>v$K(w_R!U7hO7G@2qJ%q)$xS(6974>{VF-`-6QK_GLYnW96SUM_1t)`wgLK8gaU& zavU!i?r6TbZd4wSHC0vnz=Ze&Q;rq$lruR6IQH*x7xbAUlg%ygL8Ynl0dp7&#}=KY zl@FM&0U0VyCxIfY93{=yXN75pf3BBU!!2NOcpuNz7P}?KS`{7JJ}mrN@G94&@6{pp zS1TEc_dM8jUQY4%g;$&hRzLW5=0X!g@}5IKPEHs7$9(l!O>bs_svfZXVDNPHb6Mw< G&;$TJV(G#F literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_lavender.png b/assets/palette/circles/mocha_lavender.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd74fc2ec1afb9cb21a99cbe976dcd9e32ab0f2 GIT binary patch literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1k)aSW-L^LFlCzdHs3t^V6q z>|QY?-C@sv)$6q)M~uI?w|c$(rX-QN_viN;#^2`nJ88419D9D+$Eha`AkAQ4=kO=Kar}|IYrH6|jk^hV^j#qn^5XU4g5Z z41RpAsjt@!;`It)Xxrbf^m$rv!})|CE9YE1pKMmNm4Qv)eFyK{rK(R>F!0#(M?MRU zVrZK${_*Ejk%ouU9ZTjdWl8vvDmXizlTl(HpVH@fS`3G;t5*ICX32Q8@C2L3DMijTdOyEjksQ~7Pw$(%=iFqPG-O!+FL#K-(b> zc%=Y$z?_8)?pp&VOp1A8Bl5uiVWWVoUQrr%fu9b;ZHL=2Po=pJm|ZY~c*ln!P9$sc z#h6IOImW6CM>D!l+AQC9Af4q_lF|8{%725~8Yg@@^UOk>;eTn2^qFTnuDq_)3o!5g zsawl@p7m9l;eJzhi}l=BPOiEW@o4VmFov+kT@iDyPvdgne3cOFm&17OrWV8MhFr7f zo0l^MFwK5*Dm9;b0n4@_g(UdVD%k%!;|)70ZGJxgSQ?z3(XeKE=AzfeB2 zW+O0l=#|Pg2u*R#*{7<{64+$aac=XMsSaKffXV4>q2>&sCyJ-{JliFHq4D&YB^FAL z9ZM%?AAT`ivGhT(t7gjjWvcJkHmSZ@d}7bkU9xu=cj#|fe`}}v!Dh8|?v9^~+gen+ z!o7RhovawjxqfdwBReH3^(2?U6Y&UMrd7{9qL^3?>Aw$T5mrBbi;2aiGePM`gD4}D zZg+y#j|Nj9qcg$iM?)wh)7=MKmt8$|^^ZI-!?B#(pzmzDkbh-iqQ?Zqnhe`HRnonS zcYSEA(mEise#g7b?kDWFR55)}+hJ?GMd5%%zCqom)YkuhRBJ8=bd(+d79I?qu6{1- HoD!M<*lhTO literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_mantle.png b/assets/palette/circles/mocha_mantle.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe8e5cc5f17412d8bef43d0279e0ab1983eb86e GIT binary patch literal 1124 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 literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_overlay0.png b/assets/palette/circles/mocha_overlay0.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b26accf2fbba9bcb63b4a88b375069e82a1a6d GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C<8`{TI_;Gdj{=xVCz|{pN0Ps;c<=4dZWf{GGH}RE|AA?PJ!t@b{;$(jD=6 zTi7RbDmRE9d^?w64_DrK9`?7490g1TeRe8`kKg|GsCG`v_k~Wqq6?Tm_*V-s)Va@> zzt9~hx|JhA^^0ZON0(JvA)^Ya;<2? z!|O+1?YY4;XR{lF+~3koTH93_eRSd!c1NDc_hfjjU3Ai>`{!BC1D~7CW}Gd2*InPr z?ohzppKOf&0S( zYraKCn1PHXAcpXPVutSl49`hIG7L6Z{7ox9aC~91dEM8n@sZ~XQ$gqi|8orI8SemX zhdAJs0^9*}7BaYR4V*A3=828S1OJDO0VIt;fRZpS>8=00F{!3^RZABH%Q ztjQN+A{plxt1=wT=ssz)eBXg|mRm_i=XWaqb#7~%@afDm3w4J7r7_ZHp6$5ux>7H| zy!)qaE%SNSS80a(P2DZlb6+{R>Q2O?xtqfn!Wwr)%)LI1%YpM%La<*B?|&F*Xap=j7(8A5 KT-G@yGywp=xAwgN literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_overlay1.png b/assets/palette/circles/mocha_overlay1.png new file mode 100644 index 0000000000000000000000000000000000000000..a2efaf032236608192e609fe5a5c1dab4baa2d38 GIT binary patch literal 1126 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1t-aSW-L^LFlQzdHs3t^V6q z>|QY?-C<8!{a43dSsm#wTwA@~esecCRaN}`hVi#K{!ZE~D#xCm_A%>R`1{jW>5llk zE$kCIl^etlzMadkhb!+q5Bpn2jsm8FK0B4e$8UdoR6D2T`$DH)(FM#O{Hp~R>fGnc zU+4}L-O7=m`o*&C@oG1=*GwUXoyt6^FRr+4WLnL1Me2{l!*WB-CR4^JF1uq(IKo&m zEPqG@D`jv$(EK4GtdtSU{)6TILw?J}^Z7+hv>2NAKYM;V`(swXCZ-y;!|{)L>gII? zu3|Fy@wKMDS~rN-D}#lEQ zcPat0ycoXy+cx7&F_fNMd(SeN=|gS(?4D<*xE{=jXjpT4LWfoO&tps`Kd&2{v=0Bd ziPa)qgW>dke!U_&t^=RmH+Rpu$u!5AagH#{gQN2Cd!C==dLRQvbC@gM-`AGC!2Mx? zHQ%Bm%s|Ex5JUJtF~j!&hUX+983vmy{-zZlIKD91yzXn(_{j5xsUUQM|2c;9jCX*x zLmco*0q%e~3mM$E22Pk1^TbBvf&ars0a?AGH0}aF9fsQuw_~14b009fUY=3bx1<-qwWA=od6@!U-63V!C4KgJ4(9l=aJ0-?42{eY5z)o~gTJ?=bGr-?IMJPWOY&YU$h^KN+{R zsCI>W_p&=#F_d%t-g-uMN>u7eE`ulH5xh*Ro_jWPIk!RI*>oZQ%ECmC35qotwsWea zdl&Ee&{(B)Kt_MZyUp$=?6y=febCxrYrI9_fW&%(x=*RC|63nb|GAL4pcq(wFnGH9 KxvX|QY?-NB~d|5wjnb{*+2TwA@~esecCRaN}`hVi#K{!ZE~D#xCm_A%>R`1{jW>5llk zE$kCIl^etlzMadkhb!+q5Bpn2jsm8FK0B4e$8UdoR6D2T`$DH)(FM#O{Hp~R>fGnc zU+4}L-O7=m`o*&C@oG1=*GwUXoyt6^FRr+4WLnL1Me2{l!*WB-CR4^JF1uq(IKo&m zEPqG@D`jv$(EK4GtdtSU{)6TILw?J}^Z7+hv>2NAKYM;V`(swXCZ-y;!|{)L>gII? zu3|Fy@wKMDS~rN-D}#lEQ zcPat0ycoXy+cx7&F_fNMd(SeN=|gS(?4D<*xE{=jXjpT4LWfoO&tps`Kd&2{v=0Bd ziPa)qgW>dke!U_&t^=RmH+Rpu$u!5AagH#{gQN2Cd!C==dLRQvbC@gM-`AGC!2Mx? zHQ%Bm%s|Ex5JUJtF~j!&hUX+983vmy{-zZlIKD91yzXn(_{j5xsUUQM|2c;9jCX*x zLmco*0q%e~3mM$E22Pk1^TbBvf&ars0a?AGH0}aF9fsQuw_~14b009fUY=3bx1<-qwWA=od6@!U-63V!C4KgJ4(9l=aJ0-?42{eY5z)o~gTJ?=bGr-?IMJPWOY&YU$h^KN+{R zsCI>W_p&=#F_d%t-g-uMN>u7eE`ulH5xh*Ro_jWPIk!RI*>oZQ%ECmC35qotwsWea zdl&Ee&{(B)Kt_MZyUp$=?6y=febCxrYrI9_fW&%(x=*RC|Cd+PSh~F}cL$aq44$rj JF6*2UngH|H_RjzS literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_peach.png b/assets/palette/circles/mocha_peach.png new file mode 100644 index 0000000000000000000000000000000000000000..8b02b71dfb3f6169fecec4120f2b6d95562460e7 GIT binary patch literal 1125 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 CxaIZ$ literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_sapphire.png b/assets/palette/circles/mocha_sapphire.png new file mode 100644 index 0000000000000000000000000000000000000000..c98fdf007e45436d75552a08672359626410d6b4 GIT binary patch literal 1126 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 G2~7Z74)J;b literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_surface0.png b/assets/palette/circles/mocha_surface0.png new file mode 100644 index 0000000000000000000000000000000000000000..063a0b6c1e7afe833e44cf90af96a19bf94d922c GIT binary patch literal 1127 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1n*aSW-L^LB2o-yH*iw);7O z<$;>%4tEyVI=`=HIU@OMq0`c`-^voHdw+hrVf<}Re@hsLN6&qA0 zQO-fFk0Fj_dpXkwtsS<;GF#Xc4saf@{563`KL2+2_d=n2?Odi|4SWae-#RkHqSP?;!gGnf^-_{+xC4%=^chT97%Y91YYkUG_J`z_`$v~>Tw}@5{2?(}DME0; z(+9~uoeOjumILXI1*NhNglpREpY+t(g1HrR(fB6KaK9?!n)N4CKkGa*S7$iSe=EW4_)h(QqH-J; z6U~lmGT!)oJIUxgl=lBt`Miho!1uqoMzgfF8;X+{H|aSmy^47%&3)lX{9%>%F;7p6 zJ(#nQLFd2SjuVv{45#<=>lLMO7x1wb_z5(K*VlZUXAab-0Y-ce_SUa2anL`|{LZ37 zh#$z93}W~*oM*h_%s7W6RLt;Ug)PUTL&_JpKdiClTXe+u0{4MXM>|Vq8}K?G%$dJRFTRb&ihvBxvZHRXa87l%;__`IR zvKE}1!XUC(SMBqhUrh4_GrCXOJn#F$FUjU~%6RtUIShZU7v>twejK#^`A&zsI?uL$ z;k6N8G5hGBYcdb_=mn^+E=uk!KNrOq!TKtxG%i|;L3Ks5ujNKoi}ckDYnZm(oO6C2 zmjh?cChh5absL0kB$dl)K4;j@Y482Sezjyl))=NY~#;qdjwoKPbpZPzZA}-=?F|t=Es*Ncui>6`8?}&oCCX_@#IGxJ?vL~ z*YPfnZ@bdyFS>NX-dWRjNS~OtpXCH zuU0Y??|HE6yqx0i3$Hj2tbXwA%!MX~|QY?-C>W{QacxUxsN=1R|KrQ`;WsdGXI@i^|5)MJu_Mxj{K;Zc~Z@=Bz|8V^T*S@ z-x!PvSw1N3*el!+e(>$ghYM^O82uQ|U2ISJQE@wNPygf(b|EV^GLf#yA3Q!oz6U*Ay4D%mY|4~f;@_AvC8*9Rc>wjvhb>n!w!Wzye{P3Q0@qDnM zS11G9{(0~7*SoHA?BqJ|;d@}py&|p;f;{$9jek|1aa$*L;K5Ul?F%<=X^|0ac=%lL z^d2wn10Oys+3laiWbntRW}JnsI!2dK{(jEWiF|E*riT*W9?a@=uB z1w$3%JTQZ)g71MG*8>?+&>ZFl_qUD$qH>LK4e56a1ytuX#xbnp`gBtAfn`HA&~~r` zVq~Ad9bhc-V1*f1(4_7;?M#0(Z3Gq_c0HHFc&?K*K{{jh>Y8N68*I0pfxXkid7#@V z*Jzfuc0=(pmIV^IhBKdE5&zNS5bg8KvV2MX2?K$kc{gRAvpm?}m)(3*W_p$FdDd5H zhWnT1KiKJTSLfOGXB^K<8?7RzN_+1qzQ%PxD?ohp=UYLH8ji9#r#f{HSVprZh;BIh ztmaz?gIB`j*qv{38K)c&+x^+Yl6{Bok4Po=AU;i|Jxkuq=$JUg`PFWQZA`I~p2t7R zRZzVEOdU(tF$Xkl>NvaoNvnca0NcgNY5RmcI6ncClcgSOaFb2S%PqXbE4#(h*R%GV(pzY1p4BuP7g<5~tsJQSXhtbgfz_bl6 zAG20|bnsw*;Fq|6+Ro;n)jE-kZGV_nJ34%o@$_zR`0>=XE8)?Ti0Fm}bwM8%`3*`A z3sMDrSml9PXo0Gr51af3Er$itd#-JX+Bxh0VPJ+kAo(qIh1wTIQ#~F|qZa10{mHLJZ8OK`;Fsfdze2%9P9S|QY?-N7bg=|0!_5+8Z?t_WCp_aBE_Wd1w3>SOahduFsY9Qjc*^Q4+#N&LP#=8va) zzcCmUvV2h5u~)bu{NUS}4;R=nF#0i^yV#!cqvCelp8m-n>_S#-WGZ3!m&wm`;Qfow z%vFY~7Kt&gX|X$AP;>P}LTrPUT4BpVp1HR)!V*FoqMGHE|LCc?ZcuaZK6reF$iXfK zU3U3oFP2&bCziFZ8RkE*{-c=w<@3TOH`as?*Z&EeVg*BW{_~AY0;`v}h zuTTcI{qx@EuXkPL*vWO^!}q|HdqrFy1bOVI8vm+15Js$GOc@7CRD(CCF7<_F+ZZddU zF5wWc7x66dIF-1bLFezb8*`7#F-q+7Eql5tl%Xwu_Sv6XHW+oNY;a|e`&+s}bNN=F zvAZJXibppTU*kBic)wrR(`_mZokzJ-%)5W;awgQe>dj0y+;7QPQFnoDv*o$kkLy1; zbntDq^y55m@4ndNN*KNAymh({!@l?VlP|_ZGR_g^o=_?&6!={0enf-Xe<`)f=UVaG z7@qU6Cj9(<(Dj@%W5mDOf{DgJYc(2*n;7=|c-;Mc4^W>o7!@XZXt_L!tpgGJ9?r$9hMCBUe8q)6;3aHL&jAK~G_35PK1IvbLpzUA> z#K=B@JHS}v!3s03ph?|x+L``n+6XKTBL1VtA=>AeW%-i&69xi7^KQyKXL+!{FT44s%=9YT^Q^DZ z4EHb1f3VZxuFkXV&p4i!Hd;kamG<6Ke2wdXR)F~G&$ogYH5_GgPIc-Yu#9F+5Z!S0 zSrt;o#nLED?H8NRoE3$^~PQE}l(4x^#{foU6D zK4z`_=-|Qrz%OzCw4KdCt92q7+x{@Ec69hEViHj@*9*K z7NiRLu*w6o&;nIKA2#_7S`G`O_gvc&wR6`0!@vx8K=NDa3bikarg}V_MlJkn+k^8L z7lw%21^Bbhc+7ge_8Z5|_Aq~jIM(gyZDK4Ek42C9?_2Xh-f2g56RYnYXJGlk;OXk; Jvd$@?2>?fa?L`0p literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_teal.png b/assets/palette/circles/mocha_teal.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b7120da3bcb06858b82c9c5f356b8f9bfa079f GIT binary patch literal 1125 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA1h(aSW-L^LFlQzdHs3t^V6q z>|QY?-NB|fer>(rE9EbXoR*gTR+dQJyR-U@Wc4}qg`!MCk3XlX%|3FW_UAXzBl_mI zm`@xLJkb5%n;%0Q>-O}v=5Guv7K|3|@{=Au&aM7v=XdCLz`|o(7Z`smx8-2izxX`= zi=!*LqF6Qv{gOHSF;uy^lyTLJBZ6&4C0UCj8bcYgc*lF_dDp?;y8z5h{- zP)3PARr~hu6N{lzWc<=)0zj|4gQ3jd-2>*dS?_v^K|7qZRait6@@Ug&2QKF ztfk9v_Pj@MlxU+3hV1Jn`%kEB!?q9=@Jr^Iwz69{@ zidI0DDnoUBw9hk3D1FlI{TxHaAN%(Ex)rCg7WnBnTub$EnY+3snQ_*i>={phteZ@8 zj71ur-e(uLMyaU<}c0fVt z1h@mv1vD(arQzYJS0u;vVfhD#4nA?q&8!ycVhy^9N~ulR_l1viep}VwGm%2`{7!m2RGKf0pu`>#VO*Li2P!o{Q9GSnUwI=3KTn>jIY24VvoP7@p^dHiRB9oBjD_ zFr!AJZ`spL+gSscqTifTek$|8>|uJRjHl%ijt`SIB`diF@vVH%bc3tJb6$Pt_Qoj= zz|=8)7oP*?DJ8S}lf;`e93@?zNB;6sP(1-mPS19T_;7xjkQ!Hfm;1$m)U+U(i60m2 zI=MCR%jpSLA670B*%W?RsGRwx(6_*pdtP_>-Z9(}zZL%W&f*7-lQ**-`NI%>Na*P5 zrN@{RWgDzp|3*FI^IE$pg;nAc_Zl|FtHmn1j7$%wf7fX0oSdA?$TZKzK(OXO7enJT zR|CJ&AQO(cT9lA2ZN`ppUXO@ GgeCx`hVx$l literal 0 HcmV?d00001 diff --git a/assets/palette/circles/mocha_text.png b/assets/palette/circles/mocha_text.png new file mode 100644 index 0000000000000000000000000000000000000000..b1af5645177855811897d3e6172ada242a201e76 GIT binary patch literal 1126 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 YRJEDw->ta*1Jn@lboFyt=akR{0HxtotN;K2 diff --git a/assets/palette/circles/pink.png b/assets/palette/circles/pink.png deleted file mode 100644 index fd38941c9d49437e19b25e944e83efc18d280083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2251 zcmai0dsGuw9-bht664yU0^Qmj2SJ6B2aq6B0u2c-F$f{Z<5(n+$z&RmiJ6H6R6r~& zDzst+78RgTYgp*>h0TXlt1q4c1ItPhq}D7zxE)x8N6wCe63lgz!}_xpa& zdy}2KCtpJksV@FB>)iIAtzDblrQ7O7<`lw>BxHfi+$ zhoF!!lU|Xf!Du)W!wH=bxqqPrfeED$N#;wrQoR^c6VZ7FEHN)mo|UJ`3RWUvp)MgN z6bNWBS^=B1**Xd}2@#tv3f`^T90ayeXpIm_k;cPf(tyEyHlNK!LS5hxgHnacB#|@5 zU?oJ(BA`_X7++DpyAuEMU#eH+t&1$Ct{nXSJTUE!ZzP9Z0jwI!9r^L^x=$5D}?V1Sn@N9B-Xmn8)UE*@4emaBmOmS7+ANGCMDJpZ(Sn#R}>=ln|>qGC!za6ZZG~&%d}| zWm$jj-Gsrf8<~&obd{RJrTaE?@i*;AzoL0>ukh%&`O0M7om})za7MYR(wu&Sd2VaM zZu@yZ_Vt?kAD23~`85Z)C)38jHx?xH4Ct1pjdbDH8UEyzuH*ub*ye5-z!fRS+)4olY*&+qmGY!uPtTN7jVm}*-d0C-p3u7U=58!*%SJz z#@lWWGVUh*%aAlaQbe)hE+0?JWX9e2^oO`|%^2C~-BY{f%kftO+gpvVl#f@|{cNU8 z%&SS04b0ww?Yf;g?5zybB>v-9>yrY(&&4bH=u`@Vn6B1`0o9t_A;>NuMk11@6kqxS zkL-EJz2tz|ezzCe9De=-MTV#hyU=PUyVpgkovyDLWtQ4AySg7cp07B0WUQk^;Ixg*vc-3lh1H^aa4gP@*#o`rCmI{=_lvA$LpV9&Yzc?f6ni3J3QFE z`rN#&Q2M+hj*2=DF0{ZCe-wj~|G|HE@6ESUPjTrl)}7Cf%>St6XrJ(O84lhboEbKbmFKO) zl2olj9etD`{86*-{C8XKhtcqb$#(53pHJO_e>=5iX|vDaj?j0aHV!7swG9ahEo6Oy*WbYg?6)}HYY#u9*%Qf={85DVF6pl5uQ=>Uw@fVPyhe` diff --git a/assets/palette/circles/red.png b/assets/palette/circles/red.png deleted file mode 100644 index 75e7a05ea6e70bb449283e4719f3000a7b136fdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2244 zcmaJ@dstIt7(W9>3M@0!sK@ej2r(|Z!N47uI5%$TxXhtohK%iu9d|k7oHG~;0x?Vy z`l!QaSkccRZ8a!Drb=$pQ#+tHl+mbgFC-sv-<*rJBgZ*cO8c;1CoU zWicsLI*f)hu`JvuLIw`EATX{LAxi}^uFNFCw0NAA#1>l<6e_DuB~&9(^E@IgC=f7U zv=X)$^hOG`h!CeP3f>*t90Yb!Xq^a2l_kLvg2Z3}TfpWb^E}{4QmsMd(wH%0uo59! znl_;vPHt{4J2!+)kXam_P$=YZ`5Zn!7%+mVJR_~N1RE(|hs3Cc6r)rmZlZC*2s<>D znS_}ZAqc?XF>%a-PpBKIvEze8a2yDS$L4Y#q|>2YM4?EmQo!$ZfQ=;$1fh_R$T6w|*BC`FzL5L zlL{_^T1hMam+a_eI1B( zS%s;co`KvbN)Z}5S4m>xEKphzBGzbdkjOkZ$;I%d*H@{(ZLy?9bhp&eJ~>!IV6}Z-{1iS5X30PK{Xz!0tC&m znQa#WS10?lM)hbjtE)ZRj-UDbhrU==c>B)eg}U8d;XS&j&bPieGEmjG^_t3>^mCqv@{`xOx&G08zNY8? zTIO@XO(8x@X>;hzr;|H+jjt^0Z_n!5`{JzzLGWxdGl+G}_uakIOZ?xKoQOW#C%d@B z&wItRc{6UVB*hnXixU;M+xqB|s6|~nY`n%#Cmrr+nLD_yvaHIxYV+kbY+?J!f^Rp^ ztr&g}Pm92EKJb1y4hr8`7P4mhyfw#122UrJ_t)7jjJzKeEheWA1_Ww@Y_la(8|wV_ zY}+L8v&v(trXT#faAa?-`<=kEFEZ*1xn-N#jf6d`o7;Pfb$JNV-!fG-{PNt*j9*i3 zkSRm`#S|;y`+dtYJrmA-_7-5}96yQBKGFNdavw%W~;*AG>0yH`V5JWr<#@AW+2 zyUJLa%g$$5hO_=Swj?DK{7OtV#idaYkk5tg+7d)E@sOCS7G+DPX-n~ zTg7z=J2?F=G3&RNBGM0V=_8!xw_eNHSh%xS6jr_&yx;lks(Enr%0w(}wmsxpF~wid z92)5LM$6WGt=Kv=Wvg5ne8LjZWE#*zDGjr~I(=0|)XLWP!D?0)-jhdok>Fuudtjw7FzB4epEwpx$vtt>Mz4zfubeBI zc1OWV3A1@NC%DJOTtBQe?Jn(FaoywgqQ7b_J1&e^m)vFkT=AW2My-o-g-tzlx4v|p z`q<&Ms@Go~{MF}BUwOdEw-44$9e^wKArZ1!FF*gM$rgHV#&2HLP5KuSQyqUk;-eF! J^$RkJ{{d)hP>uiq diff --git a/assets/palette/circles/rosewater.png b/assets/palette/circles/rosewater.png deleted file mode 100644 index 69432de4d47e5865c3e3ab3f25443ed8cb52fcdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2256 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 diff --git a/assets/palette/circles/teal.png b/assets/palette/circles/teal.png deleted file mode 100644 index 1b816d7f4e6973e025c550aae01aba7c87d5d01f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2410 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 diff --git a/assets/palette/circles/white.png b/assets/palette/circles/white.png deleted file mode 100644 index 143fe7395125acb640f4e8d303730688321fd42b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2253 zcmai0dsGuw9-dG|B&0poSGJZq9eiw|d4T~ENoY*MLro++1X|RDWJtz5CT1p(AXR~4 zK|mWyV&x#MT~VN|P}}2CtG0D<6@0BCqSckv#uj&3l%h~XbZ-I$t=j%Ek9)uG_ub#? z-kFjFc`VKU6@LhVXz_89MDU#Nx%_;=z3guaE(A?z!jjX-G}%(V8aFak8axwa+Kgs^ zLr_$-&8$-EQ4-EXwU|kO-2UcU1jaN1B$X>;%gka_hsEVu(4<^>vN~6<=4p^*o^4`NnV&_L$^MvbG(HgqK}xehB1V(?gipUMKqTAEC@T>qaH~a)O0!WD z8RX4`ColX2%!V4$B$yF35g@w)B#ievF#S287&qXSB+yi-0O5FTJelLi8&z5~71NNq zF|G0WrKm~!d%)wF!Rje(iU|X;gpO;ajbj2NB9!&mGU?BR#_GWLdMCp*z_~E5;5Za7 z7AIKnEX)8fA~ALm94{4zb9mw5j8Nvt3ZQ6wV2fqhB`OlILfN1<*&GIkm&}RahjI99 zUI-i9*-_y}>6tIxV_;DCP;ugDiYNXAR&^05Yk)Z+e_BRZBtISua zJxLNEW(%&ds!@%1aUeH>5_lGwqq3kPEhw-65oKjzAf0wN!PB`ghsj|x7d&Z^qeFq( z^J8O;ddBkXxZhlhVm;-2l$Y?>76o=Ab71R(GlVsEh=9S^F@&1H*<%5ROvF8PDg;pq zFi@7K$^k)tbyyvpA%zP1@#rhM%&IDC%dzwOe{jdrB3gGUmgsi{L|oBFUs!kO@NJiS z`GFOR8~MIY6C(dMi9Y#+jtqWd#QPFnIH0SN^R_(=xz=1|CW1e;5o3x`rn;NDU&3{jP zQrhm8U0*(T>Z)nN8U3p*qU-vkWy!y`xXGgEr58VSaGLh{ebe@BWN)dn%r(`u^~V-; zN$c5nPi>8?7~F=XFGRCHnfiJh6!BqM*v5~A8;=e3o?Eu1yUx)$v^`oXvP|y{4$-~o zm?xgnSU0!6rjk21H!;RF{i{dohZ=VK-VbRHq|~ivmu+P>;ooU5v#$-%e(Zw`17=s_ zPc!?KT`6}hDSh1q1WkVCv$r#;@{S$u<#RFcEYqu2(uJx7z9p0)nVhJr@P4s-{Db4>w*SN=_>}{SgOm zdyBsDJfbb_sb1T6v**EKymVsm4fpGJUba!AC>Qf-O4@#3W`4-O zeIhAxBmJst#qN~E3shyQR1nBU9Z#4UKZpbb_`f8B!_Zw=SMDluxUzfRBgx^lhSwUw`(3>Kzc(he*R<|k zx~4mOO~KdCh4J^L=fW zo4h|KKsm9C-eBL>@%=v0ea>ub)=tG;hqaJw67E%PXy27`N_iS8I$Sv^V^(w7uP16n z85LVH{?dG8@Wct&bvpLGZ=^J@c3D~e4#oVQckanSGzVR`niOx?H@~%TRk>eY{mM@1 zj5g!o+MVy?6(#?Hb~R(!=k$xtO%rHMFs|!&6n`?=_u#rstj&*nY{HJ-7rNeK%t6w8 znISD)xJZ~HcFNoZdp@L8I35JQQjL9jZ|fmnVbbs$HC+QowoP9zI-uzbYFd%s)EKwd zzOJ)b8hSmj`O7aVZDd)-FR@PT(ew+&IUg+Ew{82bEguBf_QzE{e5rqqi$IX(V$WYl Myi_jPvq)L+fA%C>E&u=k diff --git a/assets/palette/circles/yellow.png b/assets/palette/circles/yellow.png deleted file mode 100644 index 36b591de293aa6295d8808996a706687ad80af2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 zcmai0dstIt96o?xu;_^hp^`ivKug@t#x@3r4a5xrb;zB00XMb-I}CQ#&Y5f^DmNb$ zluH6>M4*zmGI+GdyrijV3Z-NuX!c+lDJCgASO|FO+d%MIf1GXK?|pyo_q%=H+4|_H zaA&7CogfHuj*O7Rg72A@=OqX5S+YHb4?&ZfiFg?;lP<)RWEM-IB2#geF-r$<2oi=E zbqb{hr{PpQozRMq+lRhEU_vEAlK4`#R42yOL`04rkIRXQSLSGxfhr^<*hy%_fIt>b zD_~<*rk28tBE+hTf!`K0iojM1tq~zIX*4V*^*GFD@mXvn*a;TuRcTnPWZsxFScwod zP3tfe&CbqdWpi1iJ{{!*1_q*RKh)2U2^dVuq@@)`rk3)uNQ`Poa7w8sbTmO~VT-0B zl{C;I1OYfaCXO4433V+smOdy1YC%vAi;X@`r-`%|&@IR_be)={NlH!X#uIpAi*fiF zM^L`!yBHO^=aHq-|E6bUJ&^`QhphmG7%S=%F+JLViZ|(SG!~~wgI zx?s_S5zmxKh%8)7f$EA7Zs1ek;unBoGLzKDfuX`h2*>JUsT>xWrAWt<2oXbF&u--MQI0uvzuKlHI}7C#pn?*nFyPD-jka9pe41QaP2N9)Nn zA`@U#Z1`L_GED5x3H0}8`msiL08PVyFOg=FC}_a)V}sdbbC{gKc#Z($`e7WNFPnq0 z*;ZvM8=M7|f>!(=-!jp#5O_$XSOh`Qq~2sTjgEO7{@&%58tlpPCSqt zbM?C>#sgbzrKVxs=4Gw?_X<+lG#M45odY#(L$%jU*!4j9#~3AW zP;=?QI(v8Kmt2n|+Q6IoN=$o~)_X~BYkG&-bFhieoMEt^?R?y8gW0WUW}*1|u=Cy0 zD~Ud?%U=(k@=u07^ok~KQT*MOZn`LBVaK*|PV>H(4z+(1&|h3xQsr7z{d)_(ptUXc zhw6Zep)JJXAbdrg>+}dn@IeW8?I*!&Pmc7TTU6THSbllrcLaJn*`3)I}_&Ac)~=d2FDqH69RTD~ObY#>{I3e@8Gp+BZ5a^_1@5cFLCuNz%jfLaQ#boBvaY}-Vpp1HklV@Zv}=5SdvpJ! zs66h?{QbSy?uu=-HY2nCRICqwh#;k(GtT*UFOO<(R0a7xN^RgvdULPlkB-%fRN^s=c%A017qOWxjG=+X>q z+@Lbooo*xhycLdK@}Q;1f<__+FSJw?)!)qR_&aXTNB7Ed1}_LxdWPS z(M=C~zbv=!@i3dVbRPR6beJ=Zcxy+@opM6~-5k6}vF7}z2|visKt+c)PyW^8M9JOL zm7&WjN|(KL;>ghH({R<9@L`7l@ydopC3*ERGjA>ZJ8C!M>JA*sh@W4p{PAp(m+f+M z=OU!|#=d)=KYc4`kr<%3tGq)!{Cf3 +

📄 Docs

+

+ +
+ +

+ Documentation for Koy, the human-friendly data serialization language +

+ +  + +### 🎏 Koy Lang + +Koy is designed to be a minimal, simple and intuitive data serialization language; easy for you, your dog and your average 5 year-old. It has a small set of symbols, not too many rules and only one singular statement. Its lack of complexity makes it the perfect language for your project! easy to implement, debug and modularize. + +Go ahead and check out the [Conventions](https://github.com/Pocco81/koy-lang/blob/main/docs/conventions.md) to learn about the generalities of the language! if you end up liking it, consider checking out the [Specs sheet](https://github.com/Pocco81/koy-lang/blob/main/docs/specs.md) and the [Style Guide](https://github.com/Pocco81/koy-lang/blob/main/docs/style-guide.md). + +  + +### 📚 Cheat sheet + +
+ Cheat sheet for symbols +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Symbols Function Example
// Single-line comment + +``` +// hello world! +``` + +
/**/ Multi-line comment + +``` +/* + This is a multi-line comment and + you are watcing Disney channel! +*/ +``` + +
: Set a key, followed by its data type (optional) and then the value. To define a literal key put it between single quotes ('') + +``` +hello: "world!" + +// specifying data type +temperature:int 12.23 +``` + +
${} Call a variable + +``` +// simple usage +name: "Michael Theodor Mouse" +hello: "Good evening ${name}" + +// with arrays (using the `.` notation) +user: { + name: "Michael", + surnames: "Theodor Mouse" +} +hi: "Good morning ${user.name}" +``` + +
"" Define a normal string + +``` +hello: "world" +``` + +
""" """ Define a multi-line string + +``` +hello: """My name is + Michael Theodor Mouse, but + you can call me Peter. +""" +``` + +
'' Define a literal value + +``` +weird_path: 'pc/\fds!fd/\&24324%!@' +``` + +
[] Define an array + +``` +hosts: [ "omega", "alpha", "gama" ] +``` + +
{} Define an object + +``` +user: { + name: "Michael Theodor Mouse", + age: 92 +} +``` + +
import Import other .koy files + +``` +// single import +import "./directory/settings.koy" + +// multiple imports +import { + "./directory/user0.koy", + "./directory/user1.koy", + "./directory/user2.koy" +} +``` + +
<< Overwrite values from objects + +``` +user: { + name: "Michael Theodor Mouse", + age: 93 +} + +laptop: { + name: "Lenovo Thinkpad", + owner: ${user} << { + name: "Dominic Toretto" + } +} +``` + +
+ +
+
+ +
+ Cheat sheet for rules +  + +
+
+ +
+ Example .koy file using every feature +  + +
+
+ +& diff --git a/samples/python2.py b/samples/python2.py index 4f029c0..d0d5ef9 100644 --- a/samples/python2.py +++ b/samples/python2.py @@ -23,6 +23,7 @@ def get_vcs_settings(): except AttributeError: print(_("Error: Class {} not found").format(type)) continue + else instance = constructor() instance.verbose = verbose diff --git a/tests/wcag-compliance/.npmrc b/tests/wcag-compliance/.npmrc deleted file mode 100644 index 43c97e7..0000000 --- a/tests/wcag-compliance/.npmrc +++ /dev/null @@ -1 +0,0 @@ -package-lock=false diff --git a/tests/wcag-compliance/README.md b/tests/wcag-compliance/README.md deleted file mode 100644 index 9e1eb48..0000000 --- a/tests/wcag-compliance/README.md +++ /dev/null @@ -1,17 +0,0 @@ -### 📄 Doc - -This program tests how compliant Catppuccin's variants are with WCAG standards. The test looks like this: ever color is put on top of the `base` color of the palette with a font size of 15; colors from `subtext0` up are expected to be acceptable. In the case of the dark palettes, they should meet Level AA requirements. As for the light palette, however, they must meet a contrast ratio greater than `2.314159265359`. - -#### Dev - -```sh -# clone this repo -npm install # fetch all dependencies -``` - -#### Testing - -```sh -npm start - -``` diff --git a/tests/wcag-compliance/index.js b/tests/wcag-compliance/index.js deleted file mode 100644 index 39f62c9..0000000 --- a/tests/wcag-compliance/index.js +++ /dev/null @@ -1,104 +0,0 @@ -import {variants, labels} from '@catppuccin/palette' -import ColorContrastChecker from "color-contrast-checker" -import chalk from "chalk" -var ccc = new ColorContrastChecker(); - -const FONT_SIZE = 15 -const LATTE_CONTRAST_RATIO = 2.314159265359 - - -function write(msg) { - process.stdout.write(msg) -} - -function get_tabs(str) { - if (str.length > 6) { - return '\t' - } - return '\t\t' -} - -function get_rgb(c) { - return parseInt(c, 16) || c -} - -function gets_rgb(c) { - return get_rgb(c) / 255 <= 0.03928 - ? get_rgb(c) / 255 / 12.92 - : Math.pow((get_rgb(c) / 255 + 0.055) / 1.055, 2.4) -} - -function get_luminance(hexColor) { - return ( - 0.2126 * gets_rgb(hexColor.substr(1, 2)) + - 0.7152 * gets_rgb(hexColor.substr(3, 2)) + - 0.0722 * gets_rgb(hexColor.substr(-2)) - ) -} - -function get_contrast(f, b) { - const L1 = get_luminance(f) - const L2 = get_luminance(b) - return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05) -} - -function get_text_color(bg_color, preferred_white, preffered_black) { - let white = preferred_white ? preferred_white : '#ffffff' - let black = preffered_black ? preffered_black : '#000000' - const whiteContrast = get_contrast(bg_color, white) - const blackContrast = get_contrast(bg_color, black) - - return whiteContrast > blackContrast ? white : black -} - -function print_color(text, background, preferred_white, preffered_black) { - write( - chalk.bgHex(background)( - chalk.hex( - get_text_color(background, preferred_white, preffered_black) - )(text) - ) - ) -} - -function good_contrast(base, label_color, custom_ratio) { - - let good_contrast_ratio = ccc.isLevelAA(base, label_color, FONT_SIZE) - - if (custom_ratio) { - good_contrast_ratio = ccc.isLevelCustom(base, label_color, custom_ratio) - } - - if (good_contrast_ratio) { - return "✅" - } else { - return "❌" - } -} - -function get_symbol_space(str) { - if (str.length < 8) { - return '\t' + ' '.repeat(2) - } else if (str.length == 8) { - return ' ' - } - return ' ' -} - -write(chalk.hex('#fff')('|Latte|\t\t|Frappe|\t|Macchiato|\t|Moccha|\n\n')) -for (let label in labels) { - for (let palette in variants) { - let label_color = variants[palette][label]["hex"] - let base = variants[palette]["base"]["hex"] - var symbol_space = get_symbol_space(label) - let good_contrast_ratio = good_contrast(base, label_color) - - if (palette == "latte") { - good_contrast_ratio = good_contrast(base, label_color, LATTE_CONTRAST_RATIO) - } - - print_color(label, base, label_color, label_color) - write(symbol_space + good_contrast_ratio + "\t") - } - console.log('') -} diff --git a/tests/wcag-compliance/node_modules/.package-lock.json b/tests/wcag-compliance/node_modules/.package-lock.json deleted file mode 100644 index e5b9b5f..0000000 --- a/tests/wcag-compliance/node_modules/.package-lock.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "lockfileVersion": 2, - "requires": true, - "packages": { - "node_modules/@catppuccin/palette": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@catppuccin/palette/-/palette-0.1.2.tgz", - "integrity": "sha512-5Gt/goIgHAKjQtMqYhMJeoUWXj5d0HNai3gOPRzDVuz6V4ptTbnSxRyyooOY5OnYn/p0YLEtED/K0JvJPan9Aw==", - "dev": true - }, - "node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-contrast-checker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-2.1.0.tgz", - "integrity": "sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==", - "dev": true - } - } -} diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js b/tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js deleted file mode 100644 index beb8ffa..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/.eslintrc.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - "env": { - "browser": true, - "node": true, - "mocha": true - }, - "extends": "eslint:recommended", - "parserOptions": { - "ecmaVersion": 6 - }, - "rules": { - "indent": [ - "error", - 4 - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ] - } -}; \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml b/tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml deleted file mode 100644 index 5c98e5b..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/.github/workflows/npmpublish.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Node.js Package - -on: - release: - types: [created] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: 12 - - run: npm ci - - run: npm test - - publish-npm: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: 12 - registry-url: https://registry.npmjs.org/ - - run: npm ci - - run: npm publish - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} - - publish-gpr: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: 12 - registry-url: https://npm.pkg.github.com/ - scope: '@Qambar' - - run: npm ci - - run: npm publish - env: - NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE b/tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE deleted file mode 100644 index 055302e..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2019 BBC - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/README.md b/tests/wcag-compliance/node_modules/color-contrast-checker/README.md deleted file mode 100644 index a08b648..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/README.md +++ /dev/null @@ -1,152 +0,0 @@ -# Color Contast Checker - -An accessibility checker tool for validating the color contrast based on WCAG 2.0 and WCAG 2.1 standard. - -The formula (L1/L2) for contrast is based on [ISO-9241-3] and [ANSI-HFES-100-1988] standards as described here : - -http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef -http://www.w3.org/TR/WCAG20/#contrast-ratiodef -https://www.w3.org/TR/WCAG21/#contrast-minimum - -It also supports shorthand color codes e.g #FFF or #000 etc. - -https://www.w3.org/TR/2001/WD-css3-color-20010305#colorunits - -Installation: ------------- - -``` -npm install color-contrast-checker -``` -or using package.json - -``` -{ - "name": "my-app", - .. - "devDependencies": { - .. - "color-contrast-checker": "2.1.0" - } -} -``` -Then do `npm install` - -Usage: ------ - -To check specific WCAG levels -``` -var ccc = new ColorContrastChecker(); - -var color1 = "#FFFFFF"; -var color2 = "#000000; - -if (ccc.isLevelAA(color1, color2, 14)) { - alert("Valid Level AA"); -} else { - alert("Invalid Contrast"); -} - -``` - -To check custom ratios -``` -var ccc = new ColorContrastChecker(); - -var color1 = "#FFFFFF"; -var color2 = "#000000; -var customRatio = 5.7; - -// No need for font size, now that we are using a custom ratio. -// This is because we are no longer checking against WCAG requirements. -if (ccc.isLevelCustom(color1, color2, customRatio)) { - alert("Above given ratio"); -} else { - alert("Invalid Contrast"); -} - -``` - -Advanced Usage: --------------- - -You can pass pairs and get results: - - -``` - var pairs = [ - { - 'colorA': '#000000', - 'colorB': '#000000', // All should fail - 'fontSize': 14 - }, - { - 'colorA': '#000000', - 'colorB': '#FFFFFF', //All should pass - 'fontSize': 14 - }, - { - 'colorA': '#000000', - 'colorB': '#848484', //AAA should fail - 'fontSize': 14 - }, - { - 'colorA': '#000000', - 'colorB': '#848484', //All should pass (because of font) - 'fontSize': 19 - }, - { - 'colorA': '#000000', - 'colorB': '#757575', //AA should pass AAA should fail - 'fontSize': 14 - }, - { - 'colorA': '#000000', - 'colorB': '#656565', //All should fail - 'fontSize': 14 - } - ]; - - var results = ccc.checkPairs(pairs); - -``` - -The result will look like this: - -``` -[ - { - 'WCAG_AA' : false, - 'WCAG_AAA': false - }, - { - 'WCAG_AA' : true, - 'WCAG_AAA': true - }, - { - 'WCAG_AA' : true, - 'WCAG_AAA': false - }, - { - 'WCAG_AA' : true, - 'WCAG_AAA': true - }, - { - 'WCAG_AA' : true, - 'WCAG_AAA': false - }, - { - 'WCAG_AA' : false, - 'WCAG_AAA': false - } -] -``` - -## Tests - - `npm test` - -## Contributing - -In lieu of a formal style guide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code. diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html b/tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html deleted file mode 100644 index 4218da1..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/example/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - Example - Color Contrast Checker - - - -

Color Contrast Checker

-

Try changing the values in the fields below

- - - -
- - - -
- - - -
- -
- : - - -
- : - - - - - - - - \ No newline at end of file diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/package.json b/tests/wcag-compliance/node_modules/color-contrast-checker/package.json deleted file mode 100644 index 5d3efd2..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "color-contrast-checker", - "version": "2.1.0", - "description": "This is an accessibility validator based on WCAG 2.0 standard for checking the color contrast.", - "main": "src/color-contrast-checker.js", - "directories": { - "example": "example" - }, - "scripts": { - "test": "mocha --reporter spec", - "lint": "eslint test" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/Qambar/color-contrast-checker.git" - }, - "keywords": [ - "wcag", - "wcag-aa", - "color", - "contrast", - "verifier", - "accessibility", - "standard" - ], - "author": { - "name": "Qambar Raza", - "email": "qambar.raza@bbc.co.uk", - "url": "http://www.bbc.co.uk" - }, - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/Qambar/color-contrast-checker/issues" - }, - "homepage": "https://github.com/Qambar/color-contrast-checker#readme", - "gitHead": "45b65d45fc281ba90529183ff412299a7c1379d0", - "_id": "color-contrast-checker@1.2.0", - "_shasum": "a43bd41523775450e6f31ce38e64b44312157325", - "_from": "color-contrast-checker@1.2.0", - "_npmVersion": "2.13.1", - "_nodeVersion": "0.12.0", - "_npmUser": { - "name": "qambar", - "email": "qambar.raza@bbc.co.uk" - }, - "dist": { - "shasum": "a43bd41523775450e6f31ce38e64b44312157325", - "tarball": "http://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-1.2.0.tgz" - }, - "maintainers": [ - { - "name": "qambar", - "email": "qambar.raza@bbc.co.uk" - } - ], - "_resolved": "http://registry.npmjs.org/color-contrast-checker/-/color-contrast-checker-1.2.0.tgz", - "devDependencies": { - "chai": "^4.2.0", - "eslint": "^5.12.1", - "mocha": "^5.2.0" - } -} diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js b/tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js deleted file mode 100644 index d4075b4..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/src/color-contrast-checker.js +++ /dev/null @@ -1,241 +0,0 @@ -"use strict"; - -/** - * Color Contast Checker - * An accessibility checker tool for validating the color contrast based on WCAG 2.0 standard. - * var ccc = new ColorContrastChecker(); - - * var color1 = "#FFFFFF"; - * var color2 = "#000000; - - * if (ccc.isLevelAA(color1, color2, 14)) { - * alert("Valid Level AA"); - * } else { - * alert("Invalid Contrast"); - * } - */ - -function ColorContrastChecker() {}; - -module.exports = ColorContrastChecker; - -ColorContrastChecker.prototype = { - fontSize: 14, - rgbClass : { - toString: function() { - return ""; - } - }, - isValidSixDigitColorCode: function (hex){ - var regSixDigitColorcode = /^(#)?([0-9a-fA-F]{6})?$/; - return regSixDigitColorcode.test(hex); - }, - isValidThreeDigitColorCode: function (hex){ - var regThreeDigitColorcode = /^(#)?([0-9a-fA-F]{3})?$/; - return regThreeDigitColorcode.test(hex); - }, - isValidColorCode : function (hex){ - return this.isValidSixDigitColorCode(hex) || this.isValidThreeDigitColorCode(hex); - }, - isValidRatio : function (ratio){ - return (typeof ratio === "number"); - }, - convertColorToSixDigit: function (hex) { - return "#" + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3]; - }, - hexToLuminance: function (color) { - if (!this.isValidColorCode(color)) { - throw new Error("Invalid Color :" + color); - } - - if (this.isValidThreeDigitColorCode(color)) { - color = this.convertColorToSixDigit(color); - } - - color = this.getRGBFromHex(color); - - var LRGB = this.calculateLRGB(color); - - return this.calculateLuminance(LRGB); - }, - check: function (colorA, colorB, fontSize, customRatio) { - if (typeof fontSize !== "undefined") { - this.fontSize = fontSize; - } - - if(!colorA || !colorB) { - return false; - } - - var l1 = this.hexToLuminance(colorA); /* higher value */ - var l2 = this.hexToLuminance(colorB); /* lower value */ - var contrastRatio = this.getContrastRatio(l1, l2); - - if (typeof customRatio !== "undefined") { - if (!this.isValidRatio(customRatio)) { - return false; - } - return this.verifyCustomContrastRatio(contrastRatio, customRatio); - } else { - return this.verifyContrastRatio(contrastRatio); - } - }, - checkPairs: function (pairs, customRatio) { - var results = []; - - for (var i in pairs) { - var pair = pairs[i]; - if (typeof pair.fontSize !== "undefined") { - results.push( - this.check( - pair.colorA, - pair.colorB, - pair.fontSize, - customRatio - ) - ); - } else { - results.push( - this.check( - pair.colorA, - pair.colorB, - void 0, - customRatio - ) - ); - } - } - return results; - }, - calculateLuminance: function(lRGB) { - return (0.2126 * lRGB.r) + (0.7152 * lRGB.g) + (0.0722 * lRGB.b); - }, - isLevelAA : function(colorA, colorB, fontSize) { - var result = this.check(colorA, colorB, fontSize); - return result.WCAG_AA; - }, - isLevelAAA : function(colorA, colorB, fontSize) { - var result = this.check(colorA, colorB, fontSize); - return result.WCAG_AAA; - }, - isLevelCustom : function(colorA, colorB, ratio) { - var result = this.check(colorA, colorB, void 0, ratio); - return result.customRatio; - }, - getRGBFromHex : function(color) { - - var rgb = Object.create(this.rgbClass), - rVal, - gVal, - bVal; - - if (typeof color !== "string") { - throw new Error("must use string"); - } - - rVal = parseInt(color.slice(1, 3), 16); - gVal = parseInt(color.slice(3, 5), 16); - bVal = parseInt(color.slice(5, 7), 16); - - rgb.r = rVal; - rgb.g = gVal; - rgb.b = bVal; - - return rgb; - }, - calculateSRGB : function(rgb) { - var sRGB = Object.create(this.rgbClass), - key; - - for (key in rgb) { - if (rgb.hasOwnProperty(key)) { - sRGB[key] = parseFloat((rgb[key] / 255), 10); - } - } - - return sRGB; - }, - calculateLRGB: function (rgb) { - var sRGB = this.calculateSRGB(rgb); - var lRGB = Object.create(this.rgbClass), - key, - val = 0; - - for (key in sRGB) { - if (sRGB.hasOwnProperty(key)) { - val = parseFloat(sRGB[key], 10); - if (val <= 0.03928) { - lRGB[key] = (val / 12.92); - } else { - lRGB[key] = Math.pow(((val + 0.055) / 1.055), 2.4); - } - } - } - - return lRGB; - }, - getContrastRatio : function(lumA, lumB) { - var ratio, - lighter, - darker; - - if (lumA >= lumB) { - lighter = lumA; - darker = lumB; - } else { - lighter = lumB; - darker = lumA; - } - - ratio = (lighter + 0.05) / (darker + 0.05); - - return ratio; - }, - verifyContrastRatio : function(ratio) { - - - var resultsClass = { - toString: function() { - return "< WCAG-AA: " + ((this.WCAG_AA) ? "pass" : "fail") + - " WCAG-AAA: " + ((this.WCAG_AAA) ? "pass" : "fail") + - " >"; - } - }; - var WCAG_REQ_RATIO_AA_LG = 3.0, - WCAG_REQ_RATIO_AA_SM = 4.5, - WCAG_REQ_RATIO_AAA_LG = 4.5, - WCAG_REQ_RATIO_AAA_SM = 7.0, - WCAG_FONT_CUTOFF = 18; - - var results = Object.create(resultsClass), - fontSize = this.fontSize || 14; - - if (fontSize >= WCAG_FONT_CUTOFF) { - results.WCAG_AA = (ratio >= WCAG_REQ_RATIO_AA_LG); - results.WCAG_AAA = (ratio >= WCAG_REQ_RATIO_AAA_LG); - } else { - results.WCAG_AA = (ratio >= WCAG_REQ_RATIO_AA_SM); - results.WCAG_AAA = (ratio >= WCAG_REQ_RATIO_AAA_SM); - } - - return results; - }, - verifyCustomContrastRatio : function(inputRatio, checkRatio) { - - var resultsClass = { - toString: function() { - return "< Custom Ratio: " + ((this.customRatio) ? "pass" : "fail") + - " >"; - } - }; - - var results = Object.create(resultsClass); - - results.customRatio = (inputRatio >= checkRatio); - return results; - } - -}; diff --git a/tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js b/tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js deleted file mode 100644 index aedef22..0000000 --- a/tests/wcag-compliance/node_modules/color-contrast-checker/test/color-contrast-checker.js +++ /dev/null @@ -1,342 +0,0 @@ -"use strict"; - -var expect = require("chai").expect; -var ColorContrastChecker = require("../src/color-contrast-checker"); -var ccc = new ColorContrastChecker(); - -describe("Three Digit Color Code Lengths", function() { - it("should accept 3 digit color code", function() { - var result = ccc.isValidThreeDigitColorCode("#FFF"); - expect(result).to.be.true; - }); - - it("should reject 2 digit color code", function() { - var result = ccc.isValidThreeDigitColorCode("#FF"); - expect(result).to.be.false; - }); - - it("should reject 4 digit color code", function() { - var result = ccc.isValidThreeDigitColorCode("#FFFF"); - expect(result).to.be.false; - }); - - it("should reject 6 digit color code", function() { - var result = ccc.isValidThreeDigitColorCode("#FFFFFF"); - expect(result).to.be.false; - }); -}); - -describe("Six Digit Color Code Lengths", function() { - it("should accept 6 digit color code", function() { - var result = ccc.isValidSixDigitColorCode("#FFFFFF"); - expect(result).to.be.true; - }); - - it("should reject 5 digit color code", function() { - var result = ccc.isValidSixDigitColorCode("#FFFFF"); - expect(result).to.be.false; - }); - - it("should reject 7 digit color code", function() { - var result = ccc.isValidSixDigitColorCode("#FFFFFFF"); - expect(result).to.be.false; - }); - - it("should reject 3 digit color code", function() { - var result = ccc.isValidSixDigitColorCode("#FFF"); - expect(result).to.be.false; - }); -}); - -describe("Supported Color Code Lengths", function() { - it("should accept 3 digit color code", function() { - var result = ccc.isValidColorCode("#FFF"); - expect(result).to.be.true; - }); - - it("should accept 6 digit color code", function() { - var result = ccc.isValidColorCode("#FFFFFF"); - expect(result).to.be.true; - }); - - it("should reject 7 digit color code", function() { - var result = ccc.isValidColorCode("#FFFFFFF"); - expect(result).to.be.false; - }); -}); - -describe("Supported Custom Ratio Inputs", function() { - it("should accept an integer", function() { - var result = ccc.isValidRatio(1); - expect(result).to.be.true; - }); - - it("should accept a float", function() { - var result = ccc.isValidRatio(3.2); - expect(result).to.be.true; - }); - - it("should reject a string", function() { - var result = ccc.isValidRatio("3.2"); - expect(result).to.be.false; - }); -}); - -describe("Convert Color from 3 digit to 6 digit", function() { - it("should convert 3 digit color to 6 digit", function() { - var result = ccc.convertColorToSixDigit("#FFF"); - expect(result).to.equal("#FFFFFF"); - }); -}); - -describe("Convert Hex to Luminance", function() { - it("should convert 3 digit color luminance value", function() { - var result = ccc.hexToLuminance("#FFF"); - expect(result).to.equal(1); - }); - - it("should convert 6 digit color luminance value", function() { - var result = ccc.hexToLuminance("#FFFFFF"); - expect(result).to.equal(1); - }); - - it("should convert blue color luminance value", function() { - var result = ccc.hexToLuminance("#0000FF"); - expect(result).to.equal(0.0722); - }); - - it("should convert yellow color luminance value", function() { - var result = ccc.hexToLuminance("#ffff00"); - expect(result).to.equal(0.9278); - }); -}); - -describe("Basic Validation for LevelAA", function() { - it("should return true when contrast is valid for three digit color codes", function() { - var result = ccc.isLevelAA("#FFF", "#000", 14); - expect(result).to.be.true; - }); - - it("should return true when contrast is valid", function() { - var result = ccc.isLevelAA("#FFFFFF", "#000000", 14); - expect(result).to.be.true; - }); - - it("should return false when contrast is invalid", function() { - var result = ccc.isLevelAA("#000000", "#000000", 14); - expect(result).to.be.false; - }); -}); - -describe("Basic Validation for LevelAAA", function() { - it("should return true when contrast is valid for three digit color codes", function() { - var result = ccc.isLevelAA("#FFF", "#000", 14); - expect(result).to.be.true; - }); - - it("should return true when contrast is valid", function() { - var result = ccc.isLevelAA("#FFFFFF", "#000000", 14); - expect(result).to.be.true; - }); - - it("should return false when contrast is invalid", function() { - var result = ccc.isLevelAA("#000000", "#000000", 14); - expect(result).to.be.false; - }); -}); - -describe("Basic Validation for Custom Ratio", function() { - it("should return true when contrast is valid for three digit color codes", function() { - var result = ccc.isLevelCustom("#FFF", "#000", 5); - expect(result).to.be.true; - }); - - it("should return true when contrast is valid", function() { - var result = ccc.isLevelCustom("#FFFFFF", "#000000", 5); - expect(result).to.be.true; - }); - - it("should return false when contrast is invalid", function() { - var result = ccc.isLevelCustom("#000000", "#000000", 5); - expect(result).to.be.false; - }); -}); - -describe("Six Digit Pair Validation for LevelAAA", function() { - var pairs = [ - { - "colorA": "#000000", - "colorB": "#000000", // All should fail - "fontSize": 14 - }, - { - "colorA": "#000000", - "colorB": "#FFFFFF", //All should pass - "fontSize": 14 - }, - { - "colorA": "#000000", - "colorB": "#998899", //AAA should fail - "fontSize": 14 - }, - { - "colorA": "#000000", - "colorB": "#998899", //All should pass (because of font) - "fontSize": 19 - }, - { - "colorA": "#000000", - "colorB": "#887788", //AA should pass AAA should fail - "fontSize": 14 - }, - { - "colorA": "#000000", - "colorB": "#656565", //All should fail - "fontSize": 14 - } - ]; - - - var expectedResults = [ - { WCAG_AA: false, WCAG_AAA: false }, - { WCAG_AA: true, WCAG_AAA: true }, - { WCAG_AA: true, WCAG_AAA: false }, - { WCAG_AA: true, WCAG_AAA: true }, - { WCAG_AA: true, WCAG_AAA: false }, - { WCAG_AA: false, WCAG_AAA: false } ]; - - function objectsAreSame(x, y) { - var objectsAreSame = true; - x.forEach((element, index) => { - if (element.WCAG_AA !== y[index].WCAG_AA) { - objectsAreSame = false; - } - if (element.WCAG_AAA !== y[index].WCAG_AAA) { - objectsAreSame = false; - } - }); - return objectsAreSame; - } - - it("should return the expectedResults for checkPairs", function() { - var results = ccc.checkPairs(pairs); - expect(results).to.be.an("array"); - expect(results).to.have.lengthOf(6); - expect(objectsAreSame(results, expectedResults)).to.be.true; - }); -}); - -describe("Three Digit Pair Validation for LevelAAA", function() { - var pairs = [ - { - "colorA": "#000", - "colorB": "#000", // All should fail - "fontSize": 14 - }, - { - "colorA": "#000", - "colorB": "#FFF", //All should pass - "fontSize": 14 - }, - { - "colorA": "#000", - "colorB": "#989", //AAA should fail - "fontSize": 14 - }, - { - "colorA": "#000", - "colorB": "#989", //All should pass (because of font) - "fontSize": 19 - }, - { - "colorA": "#000", - "colorB": "#878", //AA should pass AAA should fail - "fontSize": 14 - }, - { - "colorA": "#000", - "colorB": "#656", //All should fail - "fontSize": 14 - } - ]; - - - var expectedResults = [ - { WCAG_AA: false, WCAG_AAA: false }, - { WCAG_AA: true, WCAG_AAA: true }, - { WCAG_AA: true, WCAG_AAA: false }, - { WCAG_AA: true, WCAG_AAA: true }, - { WCAG_AA: true, WCAG_AAA: false }, - { WCAG_AA: false, WCAG_AAA: false } ]; - - function objectsAreSame(x, y) { - var objectsAreSame = true; - x.forEach((element, index) => { - if (element.WCAG_AA !== y[index].WCAG_AA) { - objectsAreSame = false; - } - if (element.WCAG_AAA !== y[index].WCAG_AAA) { - objectsAreSame = false; - } - }); - return objectsAreSame; - } - it("should return the expectedResults for checkPairs", function() { - var results = ccc.checkPairs(pairs); - expect(results).to.be.an("array"); - expect(results).to.have.lengthOf(6); - expect(objectsAreSame(results, expectedResults)).to.be.true; - }); -}); - -describe("Six Digit Pair Validation for Custom Ratio", function() { - var pairs = [ - { - "colorA": "#000000", - "colorB": "#000000", // This should fail - "fontSize": 14 - }, - { - "colorA": "#000000", - "colorB": "#FFFFFF", // This should pass - "fontSize": 14 - }, - { - "colorA": "#000000", - "colorB": "#998899", // This should pass - "fontSize": 14 - }, - { - "colorA": "#000000", - "colorB": "#656565", // This should fail - "fontSize": 14 - } - ]; - - - var expectedResults = [ - { customRatio: false }, - { customRatio: true }, - { customRatio: true }, - { customRatio: false } ]; - - function objectsAreSame(x, y) { - var objectsAreSame = true; - x.forEach((element, index) => { - if (element.WCAG_AA !== y[index].WCAG_AA) { - objectsAreSame = false; - } - if (element.WCAG_AAA !== y[index].WCAG_AAA) { - objectsAreSame = false; - } - }); - return objectsAreSame; - } - - it("should return the expectedResults for checkPairs", function() { - var results = ccc.checkPairs(pairs, 5.6); - expect(results).to.be.an("array"); - expect(results).to.have.lengthOf(4); - expect(objectsAreSame(results, expectedResults)).to.be.true; - }); -}); diff --git a/tests/wcag-compliance/package.json b/tests/wcag-compliance/package.json deleted file mode 100644 index 4212881..0000000 --- a/tests/wcag-compliance/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "wcag-compliance", - "version": "0.1.0", - "description": "WCAG compliance checker", - "main": "index.js", - "type": "module", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start": "node index.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/catppuccin/catppuccin.git#dev" - }, - "keywords": [ - "wcag-compliance", - "catppuccin", - "test" - ], - "author": "Catppuccin Org", - "license": "MIT", - "bugs": { - "url": "https://github.com/catppuccin/catppuccin/issues" - }, - "homepage": "https://github.com/catppuccin/catppuccin/tree/dev#readme", - "devDependencies": { - "@catppuccin/palette": "^0.1.0", - "chalk": "^5.0.1", - "color-contrast-checker": "^2.1.0" - } -} From eb788e398ada1edaa67edc8ab37fb83d5d913548 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 09:30:45 -0500 Subject: [PATCH 11/43] added details --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index cdf6242..5422b4a 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,8 @@ To make the best use them please refer to the [Styleguide](https://github.com/catppuccin/style-guide).
+
+🐑 Latte | | Labels | Hex | RGB | HSL | | ------------------------------------------------------------------------------ | --------- | --------- | -------------------- | -------------------- | | | Rosewater | `#dc8a78` | `rgb(220, 138, 120)` | `hsl(11, 59%, 67%)` | @@ -79,7 +81,11 @@ To make the best use them please refer to the [Styleguide](https://github.com/ca | | Base | `#eff1f5` | `rgb(239, 241, 245)` | `hsl(220, 23%, 95%)` | | | Mantle | `#e6e9ef` | `rgb(230, 233, 239)` | `hsl(220, 22%, 92%)` | | | Crust | `#dce0e8` | `rgb(220, 224, 232)` | `hsl(220, 21%, 89%)` | +
+ +
+🦦 Frappé | | Labels | Hex | RGB | HSL | | ------------------------------------------------------------------------------- | --------- | --------- | -------------------- | -------------------- | | | Rosewater | `#f2d5cf` | `rgb(242, 213, 207)` | `hsl(10, 57%, 88%)` | @@ -108,7 +114,10 @@ To make the best use them please refer to the [Styleguide](https://github.com/ca | | Base | `#303446` | `rgb(48, 52, 70)` | `hsl(229, 19%, 23%)` | | | Mantle | `#292c3c` | `rgb(41, 44, 60)` | `hsl(231, 19%, 20%)` | | | Crust | `#232634` | `rgb(35, 38, 52)` | `hsl(229, 20%, 17%)` | +
+
+🌺 Macchiato | | Labels | Hex | RGB | HSL | | ---------------------------------------------------------------------------------- | --------- | --------- | -------------------- | -------------------- | | | Rosewater | `#f4dbd6` | `rgb(244, 219, 214)` | `hsl(10, 58%, 90%)` | @@ -137,7 +146,10 @@ To make the best use them please refer to the [Styleguide](https://github.com/ca | | Base | `#24273a` | `rgb(36, 39, 58)` | `hsl(232, 23%, 18%)` | | | Mantle | `#1e2030` | `rgb(30, 32, 48)` | `hsl(233, 23%, 15%)` | | | Crust | `#181926` | `rgb(24, 25, 38)` | `hsl(236, 23%, 12%)` | +
+
+🌿 Mocha | | Labels | Hex | RGB | HSL | | ------------------------------------------------------------------------------ | --------- | --------- | -------------------- | -------------------- | | | Rosewater | `#f5e0dc` | `rgb(245, 224, 220)` | `hsl(10, 56%, 91%)` | @@ -166,6 +178,7 @@ To make the best use them please refer to the [Styleguide](https://github.com/ca | | Base | `#1e1e2e` | `rgb(30, 30, 46)` | `hsl(240, 21%, 15%)` | | | Mantle | `#181825` | `rgb(24, 24, 37)` | `hsl(240, 21%, 12%)` | | | Crust | `#11111b` | `rgb(17, 17, 27)` | `hsl(240, 23%, 9%)` | +
  From 10897936b79156bcbe03e6cec8ee82cfd791b228 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 09:33:26 -0500 Subject: [PATCH 12/43] fix: table --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5422b4a..5611c99 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,13 @@ ### 🎨 Palette -**Catppuccin** constist of two main color palettes. All the details can be found below.
+**Catppuccin** constist of 4 beautiful pastel color palettes. All the details can be found below.
To make the best use them please refer to the [Styleguide](https://github.com/catppuccin/style-guide).
🐑 Latte + | | Labels | Hex | RGB | HSL | | ------------------------------------------------------------------------------ | --------- | --------- | -------------------- | -------------------- | | | Rosewater | `#dc8a78` | `rgb(220, 138, 120)` | `hsl(11, 59%, 67%)` | @@ -81,6 +82,7 @@ To make the best use them please refer to the [Styleguide](https://github.com/ca | | Base | `#eff1f5` | `rgb(239, 241, 245)` | `hsl(220, 23%, 95%)` | | | Mantle | `#e6e9ef` | `rgb(230, 233, 239)` | `hsl(220, 22%, 92%)` | | | Crust | `#dce0e8` | `rgb(220, 224, 232)` | `hsl(220, 21%, 89%)` | +
From 53ea9a713c867974657101c254fd370d11f38cab Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 09:59:59 -0500 Subject: [PATCH 13/43] fix: rewrote palettes in html --- README.md | 879 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 764 insertions(+), 115 deletions(-) diff --git a/README.md b/README.md index 5611c99..90745eb 100644 --- a/README.md +++ b/README.md @@ -53,133 +53,782 @@ To make the best use them please refer to the [Styleguide](https://github.com/ca
🐑 Latte - -| | Labels | Hex | RGB | HSL | -| ------------------------------------------------------------------------------ | --------- | --------- | -------------------- | -------------------- | -| | Rosewater | `#dc8a78` | `rgb(220, 138, 120)` | `hsl(11, 59%, 67%)` | -| | Flamingo | `#dd7878` | `rgb(221, 120, 120)` | `hsl(0, 60%, 67%)` | -| | Pink | `#ea76cb` | `rgb(234, 118, 203)` | `hsl(316, 73%, 69%)` | -| | Mauve | `#8839ef` | `rgb(136, 57, 239)` | `hsl(266, 85%, 58%)` | -| | Red | `#d20f39` | `rgb(210, 15, 57)` | `hsl(347, 87%, 44%)` | -| | Maroon | `#e64553` | `rgb(230, 69, 83)` | `hsl(355, 76%, 59%)` | -| | Peach | `#fe640b` | `rgb(254, 100, 11)` | ` hsl(22, 99%, 52%)` | -| | Yellow | `#df8e1d` | `rgb(223, 142, 29)` | `hsl(35, 77%, 49%)` | -| | Green | `#40a02b` | `rgb(64, 160, 43)` | `hsl(109, 58%, 40%)` | -| | Teal | `#179299` | `rgb(23, 146, 153)` | `hsl(183, 74%, 35%)` | -| | Sky | `#04a5e5` | `rgb(4, 165, 229)` | `hsl(197, 97%, 46%)` | -| | Sapphire | `#209fb5` | `rgb(32, 159, 181)` | `hsl(189, 70%, 42%)` | -| | Blue | `#1e66f5` | `rgb(30, 102, 245)` | `hsl(220, 91%, 54%)` | -| | Lavender | `#7287fd` | `rgb(114, 135, 253)` | `hsl(231, 97%, 72%)` | -| | Text | `#4c4f69` | `rgb(76, 79, 105)` | `hsl(234, 16%, 35%)` | -| | Subtext1 | `#5c5f77` | `rgb(92, 95, 119)` | `hsl(233, 13%, 41%)` | -| | Subtext0 | `#6c6f85` | `rgb(108, 111, 133)` | `hsl(233, 10%, 47%)` | -| | Overlay2 | `#7c7f93` | `rgb(124, 127, 147)` | `hsl(232, 10%, 53%)` | -| | Overlay1 | `#8c8fa1` | `rgb(140, 143, 161)` | `hsl(231, 10%, 59%)` | -| | Overlay0 | `#9ca0b0` | `rgb(156, 160, 176)` | `hsl(228, 11%, 65%)` | -| | Surface2 | `#acb0be` | `rgb(172, 176, 190)` | `hsl(227, 12%, 71%)` | -| | Surface1 | `#bcc0cc` | `rgb(188, 192, 204)` | `hsl(225, 14%, 77%)` | -| | Surface0 | `#ccd0da` | `rgb(204, 208, 218)` | `hsl(223, 16%, 83%)` | -| | Base | `#eff1f5` | `rgb(239, 241, 245)` | `hsl(220, 23%, 95%)` | -| | Mantle | `#e6e9ef` | `rgb(230, 233, 239)` | `hsl(220, 22%, 92%)` | -| | Crust | `#dce0e8` | `rgb(220, 224, 232)` | `hsl(220, 21%, 89%)` | - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelsHexRGGHSL
Rosewater#dc8a78rgb(220, 138, 120)hsl(11, 59%, 67%)
Flamingo#dd7878rgb(221, 120, 120)hsl(0, 60%, 67%)
Pink#ea76cbrgb(234, 118, 203)hsl(316, 73%, 69%)
Mauve#8839efrgb(136, 57, 239)hsl(266, 85%, 58%)
Red#d20f39rgb(210, 15, 57)hsl(347, 87%, 44%)
Maroon#e64553rgb(230, 69, 83)hsl(355, 76%, 59%)
Peach#fe640brgb(254, 100, 11) hsl(22, 99%, 52%)
Yellow#df8e1drgb(223, 142, 29)hsl(35, 77%, 49%)
Green#40a02brgb(64, 160, 43)hsl(109, 58%, 40%)
Teal#179299rgb(23, 146, 153)hsl(183, 74%, 35%)
Sky#04a5e5rgb(4, 165, 229)hsl(197, 97%, 46%)
Sapphire#209fb5rgb(32, 159, 181)hsl(189, 70%, 42%)
Blue#1e66f5rgb(30, 102, 245)hsl(220, 91%, 54%)
Lavender#7287fdrgb(114, 135, 253)hsl(231, 97%, 72%)
Text#4c4f69rgb(76, 79, 105)hsl(234, 16%, 35%)
Subtext1#5c5f77rgb(92, 95, 119)hsl(233, 13%, 41%)
Subtext0#6c6f85rgb(108, 111, 133)hsl(233, 10%, 47%)
Overlay2#7c7f93rgb(124, 127, 147)hsl(232, 10%, 53%)
Overlay1#8c8fa1rgb(140, 143, 161)hsl(231, 10%, 59%)
Overlay0#9ca0b0rgb(156, 160, 176)hsl(228, 11%, 65%)
Surface2#acb0bergb(172, 176, 190)hsl(227, 12%, 71%)
Surface1#bcc0ccrgb(188, 192, 204)hsl(225, 14%, 77%)
Surface0#ccd0dargb(204, 208, 218)hsl(223, 16%, 83%)
Base#eff1f5rgb(239, 241, 245)hsl(220, 23%, 95%)
Mantle#e6e9efrgb(230, 233, 239)hsl(220, 22%, 92%)
Crust#dce0e8rgb(220, 224, 232)hsl(220, 21%, 89%)
-
🦦 Frappé -| | Labels | Hex | RGB | HSL | -| ------------------------------------------------------------------------------- | --------- | --------- | -------------------- | -------------------- | -| | Rosewater | `#f2d5cf` | `rgb(242, 213, 207)` | `hsl(10, 57%, 88%)` | -| | Flamingo | `#eebebe` | `rgb(238, 190, 190)` | `hsl(0, 59%, 84%)` | -| | Pink | `#f4b8e4` | `rgb(244, 184, 228)` | `hsl(316, 73%, 84%)` | -| | Mauve | `#ca9ee6` | `rgb(202, 158, 230)` | `hsl(277, 59%, 76%)` | -| | Red | `#e78284` | `rgb(231, 130, 132)` | `hsl(359, 68%, 71%)` | -| | Maroon | `#ea999c` | `rgb(234, 153, 156)` | `hsl(358, 66%, 76%)` | -| | Peach | `#ef9f76` | `rgb(239, 159, 118)` | `hsl(20, 79%, 70%)` | -| | Yellow | `#e5c890` | `rgb(229, 200, 144)` | `hsl(40, 62%, 73%)` | -| | Green | `#a6d189` | `rgb(166, 209, 137)` | `hsl(96, 44%, 68%)` | -| | Teal | `#81c8be` | `rgb(129, 200, 190)` | `hsl(172, 39%, 65%)` | -| | Sky | `#99d1db` | `rgb(153, 209, 219)` | `hsl(189, 48%, 73%)` | -| | Sapphire | `#85c1dc` | `rgb(133, 193, 220)` | `hsl(199, 55%, 69%)` | -| | Blue | `#8caaee` | `rgb(140, 170, 238)` | `hsl(222, 74%, 74%)` | -| | Lavender | `#babbf1` | `rgb(186, 187, 241)` | `hsl(239, 66%, 84%)` | -| | Text | `#c6ceef` | `rgb(198, 206, 239)` | `hsl(228, 56%, 86%)` | -| | Subtext1 | `#b5bddc` | `rgb(181, 189, 220)` | `hsl(228, 36%, 79%)` | -| | Subtext0 | `#a5acc9` | `rgb(165, 172, 201)` | `hsl(228, 25%, 72%)` | -| | Overlay2 | `#949bb7` | `rgb(148, 155, 183)` | `hsl(228, 20%, 65%)` | -| | Overlay1 | `#838aa4` | `rgb(131, 138, 164)` | `hsl(227, 15%, 58%)` | -| | Overlay0 | `#737891` | `rgb(115, 120, 145)` | `hsl(230, 12%, 51%)` | -| | Surface2 | `#62677e` | `rgb(98, 103, 126)` | `hsl(229, 13%, 44%)` | -| | Surface1 | `#51566c` | `rgb(81, 86, 108)` | `hsl(229, 14%, 37%)` | -| | Surface0 | `#414559` | `rgb(65, 69, 89)` | `hsl(230, 16%, 30%)` | -| | Base | `#303446` | `rgb(48, 52, 70)` | `hsl(229, 19%, 23%)` | -| | Mantle | `#292c3c` | `rgb(41, 44, 60)` | `hsl(231, 19%, 20%)` | -| | Crust | `#232634` | `rgb(35, 38, 52)` | `hsl(229, 20%, 17%)` | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelsHexRGGHSL
Rosewater#f2d5cfrgb(242, 213, 207)hsl(10, 57%, 88%)
Flamingo#eebebergb(238, 190, 190)hsl(0, 59%, 84%)
Pink#f4b8e4rgb(244, 184, 228)hsl(316, 73%, 84%)
Mauve#ca9ee6rgb(202, 158, 230)hsl(277, 59%, 76%)
Red#e78284rgb(231, 130, 132)hsl(359, 68%, 71%)
Maroon#ea999crgb(234, 153, 156)hsl(358, 66%, 76%)
Peach#ef9f76rgb(239, 159, 118)hsl(20, 79%, 70%)
Yellow#e5c890rgb(229, 200, 144)hsl(40, 62%, 73%)
Green#a6d189rgb(166, 209, 137)hsl(96, 44%, 68%)
Teal#81c8bergb(129, 200, 190)hsl(172, 39%, 65%)
Sky#99d1dbrgb(153, 209, 219)hsl(189, 48%, 73%)
Sapphire#85c1dcrgb(133, 193, 220)hsl(199, 55%, 69%)
Blue#8caaeergb(140, 170, 238)hsl(222, 74%, 74%)
Lavender#babbf1rgb(186, 187, 241)hsl(239, 66%, 84%)
Text#c6ceefrgb(198, 206, 239)hsl(228, 56%, 86%)
Subtext1#b5bddcrgb(181, 189, 220)hsl(228, 36%, 79%)
Subtext0#a5acc9rgb(165, 172, 201)hsl(228, 25%, 72%)
Overlay2#949bb7rgb(148, 155, 183)hsl(228, 20%, 65%)
Overlay1#838aa4rgb(131, 138, 164)hsl(227, 15%, 58%)
Overlay0#737891rgb(115, 120, 145)hsl(230, 12%, 51%)
Surface2#62677ergb(98, 103, 126)hsl(229, 13%, 44%)
Surface1#51566crgb(81, 86, 108)hsl(229, 14%, 37%)
Surface0#414559rgb(65, 69, 89)hsl(230, 16%, 30%)
Base#303446rgb(48, 52, 70)hsl(229, 19%, 23%)
Mantle#292c3crgb(41, 44, 60)hsl(231, 19%, 20%)
Crust#232634rgb(35, 38, 52)hsl(229, 20%, 17%)
🌺 Macchiato -| | Labels | Hex | RGB | HSL | -| ---------------------------------------------------------------------------------- | --------- | --------- | -------------------- | -------------------- | -| | Rosewater | `#f4dbd6` | `rgb(244, 219, 214)` | `hsl(10, 58%, 90%)` | -| | Flamingo | `#f0c6c6` | `rgb(240, 198, 198)` | `hsl(0, 58%, 86%)` | -| | Pink | `#f5bde6` | `rgb(245, 189, 230)` | `hsl(316, 74%, 85%)` | -| | Mauve | `#c6a0f6` | `rgb(198, 160, 246)` | `hsl(267, 83%, 80%)` | -| | Red | `#ed8796` | `rgb(237, 135, 150)` | `hsl(351, 74%, 73%)` | -| | Maroon | `#ee99a0` | `rgb(238, 153, 160)` | `hsl(355, 71%, 77%)` | -| | Peach | `#f5a97f` | `rgb(245, 169, 127)` | `hsl(21, 86%, 73%)` | -| | Yellow | `#eed49f` | `rgb(238, 212, 159)` | `hsl(40, 70%, 78%)` | -| | Green | `#a6da95` | `rgb(166, 218, 149)` | `hsl(105, 48%, 72%)` | -| | Teal | `#8bd5ca` | `rgb(139, 213, 202)` | `hsl(171, 47%, 69%)` | -| | Sky | `#91d7e3` | `rgb(145, 215, 227)` | `hsl(189, 59%, 73%)` | -| | Sapphire | `#7dc4e4` | `rgb(125, 196, 228)` | `hsl(199, 66%, 69%)` | -| | Blue | `#8aadf4` | `rgb(138, 173, 244)` | `hsl(220, 83%, 75%)` | -| | Lavender | `#b7bdf8` | `rgb(183, 189, 248)` | `hsl(234, 82%, 85%)` | -| | Text | `#c5cff5` | `rgb(197, 207, 245)` | `hsl(228, 71%, 87%)` | -| | Subtext1 | `#b3bce0` | `rgb(179, 188, 224)` | `hsl(228, 42%, 79%)` | -| | Subtext0 | `#a1aacb` | `rgb(161, 170, 203)` | `hsl(227, 29%, 71%)` | -| | Overlay2 | `#8f97b7` | `rgb(143, 151, 183)` | `hsl(228, 22%, 64%)` | -| | Overlay1 | `#7d84a2` | `rgb(125, 132, 162)` | `hsl(229, 17%, 56%)` | -| | Overlay0 | `#6c728d` | `rgb(108, 114, 141)` | `hsl(229, 13%, 49%)` | -| | Surface2 | `#5a5f78` | `rgb(90, 95, 120)` | `hsl(230, 14%, 41%)` | -| | Surface1 | `#484c64` | `rgb(72, 76, 100)` | `hsl(231, 16%, 34%)` | -| | Surface0 | `#363a4f` | `rgb(54, 58, 79)` | `hsl(230, 19%, 26%)` | -| | Base | `#24273a` | `rgb(36, 39, 58)` | `hsl(232, 23%, 18%)` | -| | Mantle | `#1e2030` | `rgb(30, 32, 48)` | `hsl(233, 23%, 15%)` | -| | Crust | `#181926` | `rgb(24, 25, 38)` | `hsl(236, 23%, 12%)` | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelsHexRGGHSL
Rosewater#f4dbd6rgb(244, 219, 214)hsl(10, 58%, 90%)
Flamingo#f0c6c6rgb(240, 198, 198)hsl(0, 58%, 86%)
Pink#f5bde6rgb(245, 189, 230)hsl(316, 74%, 85%)
Mauve#c6a0f6rgb(198, 160, 246)hsl(267, 83%, 80%)
Red#ed8796rgb(237, 135, 150)hsl(351, 74%, 73%)
Maroon#ee99a0rgb(238, 153, 160)hsl(355, 71%, 77%)
Peach#f5a97frgb(245, 169, 127)hsl(21, 86%, 73%)
Yellow#eed49frgb(238, 212, 159)hsl(40, 70%, 78%)
Green#a6da95rgb(166, 218, 149)hsl(105, 48%, 72%)
Teal#8bd5cargb(139, 213, 202)hsl(171, 47%, 69%)
Sky#91d7e3rgb(145, 215, 227)hsl(189, 59%, 73%)
Sapphire#7dc4e4rgb(125, 196, 228)hsl(199, 66%, 69%)
Blue#8aadf4rgb(138, 173, 244)hsl(220, 83%, 75%)
Lavender#b7bdf8rgb(183, 189, 248)hsl(234, 82%, 85%)
Text#c5cff5rgb(197, 207, 245)hsl(228, 71%, 87%)
Subtext1#b3bce0rgb(179, 188, 224)hsl(228, 42%, 79%)
Subtext0#a1aacbrgb(161, 170, 203)hsl(227, 29%, 71%)
Overlay2#8f97b7rgb(143, 151, 183)hsl(228, 22%, 64%)
Overlay1#7d84a2rgb(125, 132, 162)hsl(229, 17%, 56%)
Overlay0#6c728drgb(108, 114, 141)hsl(229, 13%, 49%)
Surface2#5a5f78rgb(90, 95, 120)hsl(230, 14%, 41%)
Surface1#484c64rgb(72, 76, 100)hsl(231, 16%, 34%)
Surface0#363a4frgb(54, 58, 79)hsl(230, 19%, 26%)
Base#24273argb(36, 39, 58)hsl(232, 23%, 18%)
Mantle#1e2030rgb(30, 32, 48)hsl(233, 23%, 15%)
Crust#181926rgb(24, 25, 38)hsl(236, 23%, 12%)
🌿 Mocha -| | Labels | Hex | RGB | HSL | -| ------------------------------------------------------------------------------ | --------- | --------- | -------------------- | -------------------- | -| | Rosewater | `#f5e0dc` | `rgb(245, 224, 220)` | `hsl(10, 56%, 91%)` | -| | Flamingo | `#f2cdcd` | `rgb(242, 205, 205)` | `hsl(0, 59%, 88%)` | -| | Pink | `#f5c2e7` | `rgb(245, 194, 231)` | `hsl(316, 72%, 86%)` | -| | Mauve | `#cba6f7` | `rgb(203, 166, 247)` | `hsl(267, 84%, 81%)` | -| | Red | `#f38ba8` | `rgb(243, 139, 168)` | `hsl(343, 81%, 75%)` | -| | Maroon | `#eba0ac` | `rgb(235, 160, 172)` | `hsl(350, 65%, 77%)` | -| | Peach | `#fab387` | `rgb(250, 179, 135)` | `hsl(23, 92%, 75%)` | -| | Yellow | `#f9e2af` | `rgb(249, 226, 175)` | `hsl(41, 86%, 83%)` | -| | Green | `#a6e3a1` | `rgb(166, 227, 161)` | `hsl(115, 54%, 76%)` | -| | Teal | `#94e2d5` | `rgb(148, 226, 213)` | `hsl(170, 57%, 73%)` | -| | Sky | `#89dceb` | `rgb(137, 220, 235)` | `hsl(189, 71%, 73%)` | -| | Sapphire | `#74c7ec` | `rgb(116, 199, 236)` | `hsl(199, 76%, 69%)` | -| | Blue | `#87b0f9` | `rgb(135, 176, 249)` | `hsl(218, 90%, 75%)` | -| | Lavender | `#b4befe` | `rgb(180, 190, 254)` | `hsl(232, 97%, 85%)` | -| | Text | `#c6d0f5` | `rgb(198, 208, 245)` | `hsl(227, 70%, 87%)` | -| | Subtext1 | `#b3bcdf` | `rgb(179, 188, 223)` | `hsl(228, 41%, 79%)` | -| | Subtext0 | `#a1a8c9` | `rgb(161, 168, 201)` | `hsl(229, 27%, 71%)` | -| | Overlay2 | `#8e95b3` | `rgb(142, 149, 179)` | `hsl(229, 20%, 63%)` | -| | Overlay1 | `#7b819d` | `rgb(123, 129, 157)` | `hsl(229, 15%, 55%)` | -| | Overlay0 | `#696d86` | `rgb(105, 109, 134)` | `hsl(232, 12%, 47%)` | -| | Surface2 | `#565970` | `rgb(86, 89, 112)` | `hsl(233, 13%, 39%)` | -| | Surface1 | `#43465a` | `rgb(67, 70, 90)` | `hsl(232, 15%, 31%)` | -| | Surface0 | `#313244` | `rgb(49, 50, 68)` | `hsl(237, 16%, 23%)` | -| | Base | `#1e1e2e` | `rgb(30, 30, 46)` | `hsl(240, 21%, 15%)` | -| | Mantle | `#181825` | `rgb(24, 24, 37)` | `hsl(240, 21%, 12%)` | -| | Crust | `#11111b` | `rgb(17, 17, 27)` | `hsl(240, 23%, 9%)` | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
LabelsHexRGGHSL
Rosewater#f5e0dcrgb(245, 224, 220)hsl(10, 56%, 91%)
Flamingo#f2cdcdrgb(242, 205, 205)hsl(0, 59%, 88%)
Pink#f5c2e7rgb(245, 194, 231)hsl(316, 72%, 86%)
Mauve#cba6f7rgb(203, 166, 247)hsl(267, 84%, 81%)
Red#f38ba8rgb(243, 139, 168)hsl(343, 81%, 75%)
Maroon#eba0acrgb(235, 160, 172)hsl(350, 65%, 77%)
Peach#fab387rgb(250, 179, 135)hsl(23, 92%, 75%)
Yellow#f9e2afrgb(249, 226, 175)hsl(41, 86%, 83%)
Green#a6e3a1rgb(166, 227, 161)hsl(115, 54%, 76%)
Teal#94e2d5rgb(148, 226, 213)hsl(170, 57%, 73%)
Sky#89dcebrgb(137, 220, 235)hsl(189, 71%, 73%)
Sapphire#74c7ecrgb(116, 199, 236)hsl(199, 76%, 69%)
Blue#87b0f9rgb(135, 176, 249)hsl(218, 90%, 75%)
Lavender#b4befergb(180, 190, 254)hsl(232, 97%, 85%)
Text#c6d0f5rgb(198, 208, 245)hsl(227, 70%, 87%)
Subtext1#b3bcdfrgb(179, 188, 223)hsl(228, 41%, 79%)
Subtext0#a1a8c9rgb(161, 168, 201)hsl(229, 27%, 71%)
Overlay2#8e95b3rgb(142, 149, 179)hsl(229, 20%, 63%)
Overlay1#7b819drgb(123, 129, 157)hsl(229, 15%, 55%)
Overlay0#696d86rgb(105, 109, 134)hsl(232, 12%, 47%)
Surface2#565970rgb(86, 89, 112)hsl(233, 13%, 39%)
Surface1#43465argb(67, 70, 90)hsl(232, 15%, 31%)
Surface0#313244rgb(49, 50, 68)hsl(237, 16%, 23%)
Base#1e1e2ergb(30, 30, 46)hsl(240, 21%, 15%)
Mantle#181825rgb(24, 24, 37)hsl(240, 21%, 12%)
Crust#11111brgb(17, 17, 27)hsl(240, 23%, 9%)
  From d3d930763ad052aaa23cdfc47cbd04353ada409b Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 10:11:18 -0500 Subject: [PATCH 14/43] feat: added social images --- assets/social/discord.png | Bin 0 -> 278886 bytes assets/social/github.png | Bin 0 -> 10191 bytes assets/social/npm.svg | 4 ++++ 3 files changed, 4 insertions(+) create mode 100644 assets/social/discord.png create mode 100644 assets/social/github.png create mode 100644 assets/social/npm.svg diff --git a/assets/social/discord.png b/assets/social/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..c71fe213c38b072baf797574ac4ebc83410110a4 GIT binary patch literal 278886 zcmZ_02V9fq+CToZzSVP%gL-Vm%Bsq!G8Ng&78S!(K-myQLD{mxPHay>tAGRn83_)C zVFVBX*|8`XWGI9^f)c+2>{=NZ@&lru@n5oel9Hv{`#MQ-%!^70ACURxPBM>|9|>junPcy#Gj%6 zzOmDE(gZ*JDe#^ZKD%Tde?ae_?s4YNU)=gG<2;XjLJK^Sdj-c-0Gp!)Y+ z>4&WRJkFB6XHj0QXHVWrRMpDTy7hOUs?baQ;h#I=ed(vgqIc(yZsa6g^(k{pcP|SY zvu#Lnjc!fqG9z8}jQt7k#c!SsTIx1dmqE!G@@q4*rzZDAcGo_co)pJjKnfs4*Mz9i5ZF;Q}&KJg7G$O9JYmt(a>2{<=HlKHi zP{<%DN74y-iTtURM(xZ=xjO#}ycOYrOPG(6bq}3CkQ?^?v1EIon`rcdiD=18$C$U&q$*#)j z7n0<|s$RtGiuj+3@+8Z%!W=AZWNOPg7cQ&W3=QDZVyVeTBG2WL%_sBBT`nalGSf`L z>Jsy=H_?h7F$4Wy;?4cFle$(t+H zXf5;+tDev)oiSXAv-X`@jJWZb?-H|UWpnuyo!V_oo}`s$RY+H!pf2l{@~?pEyEe5ft@EYy`s+uH(z$gJI^3}V|2zx1pgbKp`Lc||7T6mX&}u;*hpw0}Yi0~v zmyT8Ds%O4lXK5QS^93?T>^?u+i@e9FxqViQT$-j;64b;nIbrTsN&^apQ=8lJrdu>4 znDf`&@r0!5Y30az&o6;!?TN&U7mTxVa_l6Bo_l*n@3As2OuYRVbhK1iZ#ciR8pP=J)kou0HjkT6LdGm_lDFjhuy%t5l~B zzU>1Q@KOrCC|++JUTG5Cjnv^um4U$fpn5 z_!um_4eATLiYe?4(qr_K9W?^UX6%fUq2@B}D1WEA#h|HI?|`Y{ROxuxwcqef9iat@ zO?m8_cq7l2=SjTkJhLXrdd{SgREVdZmbVhJHYM8~c>@5w7nkdqj5g=g8S|yKlV$RH zEHaHOU7a{>>S5DSov5opRq<8?_;(jb;wBRz_ygcCPDtZt+aRfS1v!r!y1~_*m{^HLEmUJwcaPlKRcmOl|aWY^k8?oYZpNT87yQ$&_+g0mO?mJYC5`PPq0 zc)L>n8H>iJYJ4!1NEb0>fjo=;n)b8Dp@4R?} z0nwlTCbO<$Y-Ws?h|<;aweqAPl=DaG2CWeA`iF&Vs4mGBC1o*Yt8G-h9?~=2s}LD+ zqw_$feb_*dd(J)qcPd$Iy8iw(2(dXzBESL!@criF5OIM*+tZawoKiizQ_3w6;$y{b4m7^@=M0#lP9h7K(~p zle7dxPfGUZXA;QU-ZRc+y#YN@%e39&r@}Agx>$E9Pm^a~H1F04{k1Nz+JDj@65sbFQOR26;c9`tyI z#L^>8gFl?gDCaW?)1iO-qZ+E*k94o+HO?bYSjQzWAHzmau9 z!i2O*IlM5bv67_IP7LEUd-=3~td;8uKhf7o(nDb}cyB9>Z-J@CL{bE~Dn7XDQ(zqU zqwjUtVoS*9QK^WYvJY0fzD1VgrwbAL`t8AkVaYSO&YCHG_qDmt_Vgu^MP<0pq?L`? zgCwzUa39W2ETHsLX>#(Ta@CVxZI`H5ZPyqpy1q@hqN1J|+WV0emE<b_g22l~4g?bBGa?a^U~0FLJ$2xy6N4vk0#fVyvDHogIf`$q*I%$c1MeuX;dTp!`> zlrSsN7=^+(TPDq#v%i40`H#H~1pu*kiKsZ)wX+!gOG)vuhLHuC%`S?y;k-{I!BS`s zp;fQFYCK9Ng0URhZV1XJ@-?ixmbz+ltLv1LCd`I*0e)IjjO*Dv_w4xKrG&P*_h90M zy=z`JV%1f*S%BZeuaw_~epk=XVQH3(k}5fJ`3+tcH)@_%k!NYdEZ+8PR$39CCkR8<8{s z0I#LZrGrj0kD(-)dCv_e-ZxVVv9*w|n-E1Psy76#!l}(r?hFTd=q@<@#Ew)O=j7F0 zHLc6Vi^^5{PlA0vQt6g$Py8HLTA|?06|rL zi$}u*?$ua)IF&f~khX+!$z)8D)a*!<`IYB0kJk+4ZAfS`Exci!UZp8 zxi+l%RRo|k2C7pNq~oo}lvU%f`WhPRU&HD8{69$z$gQ??VUo_hlFzs)cyk@t7jilK5RK81n}!?QuT) zPXEl%`QFjtyefU_UX*hJqw+v5=!)nrD%DsLHI~5AKV>bUpQtKTIXl7%fZPPVR3tVR zNdSBIdcUugvqfzyxtwfNBo;qwek#2RY^2^B%Sg>m*1sTwfX|%xJI4Uauhzi22{lpL zD_lg3R)`@EIh9paxYuepg(q&H@l!c0kco&TRw&*nrx=~l&rhQpltX#l_4bYhw}mSZ zorHMmuC!5H9wfIDLaCrJ&BYZSHFZ|X7XGa?Z?FY=cZupRhb1;28;ZRCLOX)pyk-zO zQnTF=tGF;Y*SDvc=M{G`PkRyaq$bntjiFABHn`F=*AaErL<^ zM|HcIpyW_GU6GXlbS&qdjue4@3NvQX#Hzg<6sfHty_Sn2XFwjY)wptEEkrIRQPg%nound>)8=$TDe}HG#6`hg(ub=rTz%VKVnCIQba*w13_QcTEe;S z6gGruKs#U+gGlwV7RH1qvwOE*`oQh+@VfD0{;;%-*%0{EoPr&RG3uiBFTZQN_>|;H zlF)edZ-sE6XF1I3f^|E{w>``^$Y*kohHP!fpRELX0nv5g3pAFbqL@C}7k~ZG7B%){JeD=%^J0PVkhS6_(T{9jy#003hOCq5eU6o}WeABW4{}V)a1#eN5RyRyLrIRPM#gt@&w-1Wh(bz4n}Pk?XP& zxK7t<^WM*w@9R~pm*zTG*#|8=tRf{!8M8BB-`ggd+i>Em*^u+qU3%FchcG>BB!Tq0 z{X*r_7E673U&?n+6m7hDdc~LAW=5#eqF%PbfEpAl6-qCC3Y26W5s4LLk91T|ND;K5 zEf;V;@)V|D_kaGE_t>in;NrOZ+5V>qF`Y{nFH6>~NI1kxcUie3kx$VOZ56y5%s&|J zv*K=18(20uek90Bj(>_81k3ibTmKDjV7~OZ#9hR@u6XQe^(=Wo=ztVaq59`4pzf7S z-lMUXkY43)g|~s29U6mHjdU*&446kmWVoNZ3iMyWW0=5!V#1DX#I9nFGv+xF&2!gd z3HRYQKI-{iIika z*Di3AV}VIZgq#K7mRjN8U`jvW4&EuPR=QqO**KWdY=)}W)yII}jriMWrL{FM!+r^n zmkQ$#V0be$6nqbb^W`^P_}z$D71Rrc`_zy+*7E`aS-kyReTWc`r_g46nzn8ReKG z%#b7Of|LyZORfg0E^<;9y!B_77Yvc=DG(Xz|A18mQlta{_4~6dT~&DIy3l@Ul23+h*p>7BAE$| ztQ5`_tu)5Pcaf#pW_QjfO2jz z=~o=>X`k29N2GcP;!@Fw=nfPZR)}ksuT2gIk6z5zumM-+evnRwi!vZvnnuf%iG0zh ztLs%a7c(0^RY4FsImAuqWbL`Ucf<<`t}Z6sR4#wyV+ z#KgtPy>0mP^}!U_-?KxIH?3ZXoB6-E62MQ&U*NC6w1cF5c~ zSSH{~-C7|R0=aM7=Ktc`<`H%FD=Z6o(f-y$Tm~h7C zqoC9(POy%X)dDj;z(#**T@WK=Qda+$s5p#jN=4RG*)H?ig2vBHmTRA-HDoKVO`ZU6 z#+fjv#`?Nf^sV#r>-jtkYqfM!Yuh4WgjHY7?an3tPE>SmFR z#-G7O!MIxpZ|(FO5KHm>y6AbLw#W+P#~e~RbV2v)t}LDc)9`X7U#5D(pa$AQxdeRy z6ekN3ABUw(@rpX>%ZxucHc7)NZJzjPVijZ*d@Ve+~iA`I4da~iEvM%<+A0kTK%>vOX!g;~5 z+(*ZcqvbjobD~z6;DDb_gXNCAq^(`M%zIM3?}j)FY;nuQ)3p&t=b&Nv;I>%f-@mo1 zdmAk6aNWC(AH*|~P|^3`n!9>9Nu0^31I0>|jfsdz7VNgtfI~~k7T&yfrhG?krfMA5 zH;+Av;`-qU$R%?Rbe)+Z*$X=9tV9uWg<~czXtZ2IiT;tta3-|_mUEu2CtLHYrRn-``T}ak!rFNQJ^mG zh)`XtW&YpyW)FF?jPk==!vYQJX$)atqW3N@Raf^a;LNKPSjx3`b0&6W67G!(!)Qc4HB-e zBdgCXbya5ZpH!!ioqsY2SsBu?Fn5Cag3>4;RowmYWf%K87Aa}IDbM2wHC`Ibcv)!u zRoMdBwON95+LT%SQeCw=Hdp{Aby-0f)6IwZZL+|JMEeadHd=cVx=;PFaa`b1hstu~ z%3#^(98C}U5bzRLs)8ktIJ|t_+t3uJNbe=|SdZmaE#MIpjr^N45E$uKP~~gnz1Hx@ zuBpET*;?Qth)PJ~!Ql>@c7pS8Pic*;Yt&I_8wFl8aVp|u5`89by|GeG(iYwjMancf z@+2%CoaJ9aJ&=1qqzOLLl-+@L>sVTxR4yTC}Q&{GdWwx>KZVHkonnfzyu zvWrejqm511Z+Nik+(P_g8*?RbW5rxKw$!Y?a$DuVl~ECqfXfZOa>i<0*VR>$v7&V7 z4g6K)&fYVPS-jI~!v@yFnD!zc{#&7;g5eQ(&(pDB*%7)FUGx{Rt~FRV&M9YQjH<#& zO`mswjWVw&hXw10wpSW~UGUm;Xt{Artg7+P#ksVs6?3>q0V&mBF#KIEv+7qy%3}og zjC80X8v6aT*8G%jJk(D}F-5MAaKfgOMY=zltVm{HHNj2^E{3@K?E)|EEZ+*A^x6ul z&J!_dB~E ze)n>J@OwlIg(E;VnqY7HwQsO(%x2kkH>pmMS|%XUM6Cn{?{Mj9gLJ;0D7tn;S5Dp7Znl!nn@G0<4 z7qTPkB0v*P?Q8x%u8p#EAJPi|#VoyK#+}2Zul&P!7k12GWMSdw1NJ&UAPMKtpyO0@+NH=YOl>sO+?0y&Bg^sI1HDxgyrrP0xMOSz7 zWRvKRZ-nsI_xW(|lMr_*?Ghxc(lcZ)sIR`TxjlF4hSdtZT!iWgt&T2}{QR}0Y>W>- zofHm#tbSq#BCY-9pDvm~tp(AU=1Wuf!9%m};O0ckSc3InRzjmyzj(2{Ff+3XmV!QZ z`_pmgK1%6G@{T5T-?oi-o0Td2#!bALAmEPI^HIF;s$tb?4r!%+wvZkihEN%9sSS}x z(O`D@vg9!t4!i`(mk$|qnZ8p_|5y+Kr(t9OD7YbTXBYt9M)4FZ-(r~ z6(1A?c{Mz0dGADBr1%x*0jKrEs5QY|VwMxw>tDlPo?5xHQt$bpgcJbm@wQSEJ_`W( zru$z=P$)Niq0=P4nB}1&8zWxT|RIQ7QW|T()52a+k zdnc(M?6uZt?qlJO#TN?0GERKK;5`VPofmB}n1c`BU?%e;3Dj1Suc*Df7EQi=#K|BN z9FY*l8<7fBaH{WXm@JAM8HtNGMQq*N=uof8)bR`M`O|qV6(rrtTL`QHVjW0?Y+{#L zLy=;w_tb=7vDc3UN{V$r&5ecQ?eXNvC?~v>$tev40013d(t%Y89@cT5XJ7?~Z7>8v zgrleWgDnG#+Pn!Z$ixaz&dr~dS#fU(w=r+$vpOsb%@JbTJXZ_KXTOqU)A#5?GI{sG9sB*i~V3ErSLiwas?ScY@V?zDV zinR!a9^TVkpN@Pwk}BBpFAyt=3UH~Mp{g2O8Unp(lql%@07_cmQ=NJZYi>Wd)4u{9 zcL|41T|qg*sm%&;I+)7n7bt0Kpsi(>M1R4kU6CAI{wP2c|BwJKX|JFyi#SoY-K33c z9m<&kC6|iu#|Smx#ArC~k0qJpN3a^v8< zQ}PwugHjL=iC9-@i}HUlI82HZkkc7UaC14lsODJ|SC4;tKs1+(++`rR%f#(=Nld(i zLtRPYK<8SYw1c1&fn&&;G3&$Q6>t=s!Lq(fb?D1vh$hzD z6zCYTQ$K~#Q{9M(0MX3X3WD)iTp~8s%Pqq78J{YG<^) z>5?bDc4vC`5K<8`>20U z)8JY_X}k*E0XBTeL${mmNlZ+PN6B{8XE3q_9-+uA+MuEePt4YUJw#Iu;>B(aL7+9f z`C{fQiI~r4s-l#@gBFD1DgPlBF#gE@X&cbb@g~CLH!d`)eH=&)twJCkDOM8t3Za^T704@k! z*1`8K_&h?N8RiVYZ2K!Dk<#x5{Q|A4IvB+qTyW2qH%MWm;3Fp9YQdiu6D3U8!(Ect zASPKNGea8=vu(P77F=#zed=B|IxW(AO7bg%4xPawlbrfPh!wj1{KCt56I;zHrC;F8 z3;3Gl*jyJ!Dgou3$*2+r;M5$3$vJ}=p1*@>hoLq|7_^4Uthz!CH{&p`L}~hJ{ej5KkagPLdUhhk0>8%@f zKKh>n3ZCaDhEsc{ltcJoZ2@iW%Rz+x%ooRt{?ajoU34=mLSN0wNXJM&icYJHFGDh- zf9^53dkp{wpQ?$)Z=7W^@M&RJQCBKhaJ~S%<~OvLxjn7R%$esd9tcTiI3r1fPBtp?!x7^u~6i+f^L7?~DkNuz~-Kw@x}0x~-IaJO8X{_NQquDxZs^iqri0&QSnJRQYi zErw%;OQ#Bo%8+~*k4DTsB9(hB9doOLnA1_mw4lN7dI&)ks4Th8nB;K0@ zdMZ(=wi`jHs-R(wrhQj``)k4QJ+^1|BaPhgb3zNp>xh;Z#hE}>Z>jg<=WZlxse&Hf zaQt_(80YTUKv~ODed=G`$hbwJguayKJAlH%F$Ej7Su}wx;jvUSMNBC?umI!L*Z(N& z79RT%@fvVwUp7O&Y~1xj@{Nh1ig-PNH&+J`KEi!d?zZqbQ|Y*`X>)%Tu}^rHy;0({ zMQ*(}f4M8u6N$C1V3R}z-Pknsvdylv-rA#9m)c$?z{kNf_8QG}>AcahDcvznfGM6B zlISWwcl&6D`6OpNzM$xU-?%u1@HzTwKJ}^Phao%vFXP;SHqHWKEe>)0O`oB+Eg!5F z#u2Xz;BhV&^g1D`(wk2HWFebf4!3W(cg=82fYWnTd*dGv`|RqJ2w`>}QO|-z;4dgH z91nc8wh6~-Ww4Tio`N~t)=QA6w_dp|w9w_L(b5M{Z5~62&U4nr{#nV>`L!>XDCAFk zfkzMS7Fg6SE9W_3Lf7Opn{!g+LW2fBAX+z!m6knns1IVjH&}1EuJs8apo6DG;1(QB zbPW9TrmHDAII1?wF@f=?026@ur$3Gd8O?@FEHmR{^*aQ29Tf;`QtA!-dV_23epGEL zvEZgaLzO1tFI4{U)I@hUCN{DhDK!d$5{llp@#V(SgAzG67n}bIl%`(ugq3QSm_(my zWPnyTQfQ(Hi1wP_c`8Ruf0rG8%|x;95yMWX-r-P98J%!~493(~XF;sc6>=)tRsbUR z5g4+{gb#@YW-ng}U5@)Ivu15TaF`uB>5oM`en=f5jFDSuk6)OGxG!fW+ZSD6mkPz~ zbXbch-_Wiz}2KISilDG1~;?n$pCKN4G> zImEq&;Nh_df(Ki_ZnKt}nr_D=M%Qh@v|0R-hUbJcQwEl24p$c;;BJwLhX-%l?`35t zI~r2Cx!K(nGHa;O7t%FxU1UUZtZ)-a;4xnM6nx_?St_f*xhYA-|7L?Md% zS$Ny&`PN6;UCeHW*~);WHwYomnIh;$|56w^`bIRTC(_kS={R*#c+V>v{IRm+_@K#q z>8!q>?jC!%noy_$CtS3vo*ywV&RtKIp28~#;s;R9Ov5=4^$B-J zL(5LbC3NI{ekaM7e0)M!dC@N-%9H&)`6KUVO)XNK5znm-2qJ{$!fEcR>S=u3MlN&{ z4blCXG+Mm=l{nUG-^sxydj#NCNWVs**zp^Wwd)Vh`l1w5WJ9kAF?8^e5q>bqd8M3- zDU2vaoE{;-(4Gfs>2WpEBws}tQCT~IZvotQGqz?dbN|je60R=Z5-?%iLo#nCCGDP} zvSL}lIs9&Xps?H)zgSG%@L@8z>*ev>bi~;TJ_rtOxGt9Qtsv4~$1xO*4kMcKC&vBt;KG(+W z)RxScDH_>~3?UHa_C)Ap57&9!>I++$ag8rWWPKLkpyoAt^bMcvl3b&f?PL1#rGOlP zmOIZ$H*AUmHX50vQvNf<)4K&vk&e^EWZkeYZPtA)UaC_&gpyQ5;^g{V*2fHY1;_GY z1fCN|Joos(l&qVxvnSb@J^2~~&$9q}e$|UP5gl3G$nuncKBCMmd@lz6#<_cKIgV_; z#lKGo>^1xKiY1Zw83NSMfLjLuutyH5LK&~-=c@`zJ>0x=ALV6LOHQ?r=#7hlp`&zjQU#`JsXLtI7%710AA*x=de7=Rqo^0v zudufY$JqD+A0Z$b@}!MC6r~(Gm=SZMR`T^or-OTQ9WoHW&7Q2gv0OPc%9Y3a+iled zVE6k^w3qqmte6#+?!pwp+=mnpkFUy)rtjkte5!1+X!oQ)Y})nh@^$I*oPx zFbm_}pb;?zeIX1veRwqSUTB19c&W)yzg1VUQ3A}kl6tgLz&5U5C9fc9i?ogd(D zC`Z{TQhac$qIvUDk;T4__Py)Du~Davmm#oRKz55M-)<6=ryO_`!W80?f?EHra4CoP zxumwUGrI>-XAQ|w^c}cgH_%*{&+eYW*JKG3z^}Q^)|30Oq7D251l7c`vk0w?6XEdV zzH^JHQJNyB)&7zVKG(ck=v*LxWsz8eEqK66O*_$q@TUq!VEFe?iF5C2>9=eS$8TH^ zItx7dtkXxQChY+FPBy!W9%6iT!{diB#W_J$yrf}n&89(R8rl#`QVJAsn zCkXx&L06By5F6ifW9V|JXg19gpV1?zh``MP+AfdQ*l5_T(J6=(M;7jq= z3d?k?yJm$7HHz4PJ01WqA8tVTXxqD03~L0jToJsk@&u;7nB}ZuFXJbK9Xk*`eC+sA z9P1}JpZ@Blj8ueBB9sv|cDO}+XgEd~b@x&zb0pv=$^{(*a4^F+mo~5$)?<(0S;HM) ziu8H8HLBDAA*zAh!xdJOGqsC8M56Y(A7Ub+$mtcNN7r*T!DFPgs)dLseoxa)Gv|I~ z%dJ;T4@Y)C?S?1%`$!*$J3s8#_uN%Z(k1wuCEXI=C8QtRxmg`jWl6>K{6NlZ$g&qK z3is|k0`Obq+Z^SNpAa@az^bQ*q*-p%tMJBq>B~NP?m0pGpfF#%2H!VwdhOkZ$)ED$ zT6tlXMJCjMO$2TLbaQsX@cXacof;_u7a!b#_-w&z6SdCU0tm=4!J~IY1O2cm*3j5I z;^*B0vqDduyp+XFte5;}u&{P@xx`+(6Fc8Papzdi9L0TNOCJ<^msc0F() zi20e(b&A0HnGa7&7{Kp`4;hocq%kH3sNz0w;&CI_^8ftT1zJ|mIjY$DP=w|r~u%QwA$L}BeuRF ztb&|?eo(8*QvCH<3wCFr1N;R5>>QMO6h)?2cuv=KAAvq=_#6I)(pkKW@3YD7!MYgp znuOd27>>K7JfaU)xGuVs?}KC=3Pd#I9TfG_-JtiFlZ(KG;7r5fYHQ9hW#*$WC$lIu)4_ek{v zi-?JsYCATI=4A?QSs;J`iq9;Wum`ex>N&*fD||ZyyT4wA*ZY}TbuZPuD@{Jpk$63H zGg#-oP#;aR6q$}XkxlOf(}X>;d7$8dOdvz5<xNm|M&s%GWQP<6XD z4QA*kKf*dto-Ov@+tu!9XQX7}e;Hr8nZOUF*Ua%E5{jh`v+3F^B}mwEk!R4*mr}v` z&7D&!noFZfw{HT2VihJ$jg3i(A7+yZ$Lv)5KlO_1nyxJzL9*6%wfp3vPy!Cqt z*aW^)tJGJk7hgekF#uq&?so#=M?+7Dd51X?Y`~(O-0X@P>X(<(SJ4Yv{){wd z?f-#u2L094l$Nc^?YnO^8J?({E2I%%N7neKM-i)Y>`xB*Wo5dbv>~lVt|QG^^aVvv zu+c1|aqdVPbO^H*_v;njQMI1>)tUrCVq!KO{(OXqG|zkf?C~Y))hC7-TDtUay7!3X zLM7h6tB&wI(}w_cnsa|35_a}iwHooF%(!TL&nsbGp+k~r>z?)eIBsyC)ix1KDPxG#_c&`nSYC18JxyjD_+NQaj~vXaT#TCONDUxHobt8s55z|R z(Ui){Ciu4!y`PI9ed(&;;ies*%MOSTD__PrCNl`AE1NYDM5!4`WBE$lkP5Ur0%r;Z zGzb7b(iqogBG#r6e&hPo zL3kkmxWJb3JU*+XqNY8h4Ygyo8A#-FhtkYq_%W8vv8br>O|Wm6Wskconbfi=ahLgI z_~T+hcWs_tCTg(!yMos3Nc`?mXUOy53-{)V3H#oGGHlmkTNl3)ZsLkHLvBJ_VJ+43 ziX!oW78$p1cz}P`$rd&lfZxA~riue$gwfg5&4P`-ittKH`n`KqfjI`@w~ZrR@b1FF z6r3XpAauRP+*}-IGTGPR79M>S8GTyrBS_&XqIgl8razVkHzc`_JolN#nj=Je5a}T( z8CB@crzuM&6UR`_pM=N)#y{nD&N@|Md+hjiLD0hs#eN8~#@~vm>jgU(1$;@Pc^P*I zCu{)7{Z)}F=TWf|hwLaq)rK;M*pY!>nv${)jd=H0MQ$=i+U}DOUVwQ$+t#uoI7JG} zA1<6|c}0e@O3=oQ`~=rcY~=Xgcz;7<;wC78os#Ybh(A6|@PS9NJ)#J&bgD;D6QpJrr(#Ul^_!W3`_;yB zb{11*BiXCZ{u8ca6h9;pH_mu!i0f&Xg!SaOx#Bm+BjC_cu5@_HBi3c9O#8J~n1Ly1 z#QX@CB0|VqOOoAM9Ib62G0aU^Q-DL)N>Pj2Izc0a zF{Jj>W-$fsfBf`_lQ3ox7wNacVu!$LJ%NJ)6yGfz&|K*6rxv1k=9_4=T{Mn-vb>PK zD>!ZjW$aCWtjmakdjj-+d)3=tv$KOiGZr?@z|GDp>o6T}x5p(Ic)tk!7b4+cB9>7 zET;X?I%R8OSwJQ>1-~ivwwm(b022>q+Gdu7H1e{N+2kEo&pQ$43Z}1vFUrJ3c+Uf? zH00Lg3M1OTpAZU4~YYpv3*TW$!&6w^4vpW1q7tgOb6$c)fn zgyFtJ&&ZS(o#67k)z;=Wdo{`}u;mPUcSj;$zY8WwO*KTVyM?u@C8F1<_rRTS-ys3z z0jF1}&NKC)VH1=5LHKgPbIO$O!)D(8;ZAO8#$+Yu;}teXFksIESCr3`V&q1}*4Qw@ zK+HH&>NDEn=_yws6MA(MENFCOZ8wLtL&s(aq3sY3Oxu))hv+H`t^}XTvMgTv7F3?j zGx6;4NS*Wby|6~BZ;;Dz)nA|ekuT-aU#m@Zz$qoWd_d^7zv%$Mr7@=Y!47lcQh)9tlVM`pql1FCR@zX1vV6 z4W7+-e>XwTrhQnpDCGPBx6Bk5fq?g`jScP?lL`0$X^TEim!8FrHUUTCY*geR+f5)E4msu2KrfV1bsb zz4lTmv`xcJN%8os*{SZ$f-~}yb{Zp6L=U^z*lwD903OxRPm#*GaD65xHM2;jB4u0U z09q2jr_5ern|k@3Fq{q|heIk&jT(~r)ehP{IW!F!=4OWpJa$#1Hl+lAND42H)gOc# znS=j^>08AJI=lMdl37{&$ln$3zQsI`-FJCT25}8trQq#9sCE{AkEDcFF@mPS1co~@ z3qj$?a315EFn#+B$|gnZQy@nbBOILzpVdS~Q1RelNcJ{D1P(JnJbBp-`)}@+;;te) z;KT&`Zm%>u7vnWQu*rZ+FeKy9_jHsZID`dUHxiT@!7N%oAu>K9h^>DI4sD{j<8f&lzir{; z^A+B?+|K$%;!HlzYUjU0#j_NDg@iH<3Z2b0-2w1$MUe%Q=r37|Yd zHt(?wQ_5OwgCI_j13qQ5RRCd-yJYdU+s_!}On=!1<$%fVW_!sQYgW30$@;*qps0RdjRBBUy z+AI;k1-!V0eBi+&TA|oMS~7NEq4B+nZhmh#i^9{ruQS9UK0A zScIQ890c?yTjQeS2 zu|(bcpuLbt=p{FXHmhaHv`Y6SY>wD~id013qI#?|D$iC~LGAC#i!7E)FC z#?8YrLp4G0Q61EXQXJtHlJf1v4{2tqQzp%3$F*{|%+9qi+m~cd?iYj_8gey}=l%~N zhn4+`1D?%mnQqkD`vlJKk^_5|6`9-;-@)+AY(**4UCQGscmY-`qq4RKAas zsU(AQ!?DdBWAkJfAJJ`TCT{$z%q2_?Luzv?20;HDd4#~r;SShf$uPra>_J4t&R5WW z9D1&5lbwu_v4e)?5x)EEaQ!rSDm=d4fUbAvAE`f4uAQ_EzjVC+e#-F7restgI-rLP} z9S{cmG~vAaDBA7q!B5FcuQ>nqR<^Jv17D9F=RHl&H`DNPTFA||0sVith^^n}rjZI@>`T)WNqGBm5r%15rR zhJpVihH+Z0^kV!Y`oaCK+3@i^xEOHg=7JVGJu`H&x2v?2yh^1Hj zUH3;mLX~hv^J9-XTgcwerA|OS2xSh*slPO5JAC7V>H=D3&o&puZWkdQEq=V5F*UUgR(1z&{(#G}+(!&S!XVP(KO_yJBbJD6|Ke{Em~lmJ(#u|L^@4$2WNd zFp+JlCH>ViohDXY5(q8wM-%u108Bi%p3B7E8EgJA|I@}>%J`%9w_dnCPp&NSO@iEj zMh0;-)zsIEkeVOjezrhyYjydNy7$bo>WWz2B{;x4k#oJc{U}pY#3vc;(W6*cJMc$zkNmUl%5aaIpuUIAS9+pozyx9c?JHYI`x>gn%d%4R@n|C~ zTEMCM6?vvXbB~r;s{-xVSjD-wwoK&l5m3a}V};^t6~yhCf*VGPoKacS=ngvFtZVrK zGiA&1XZXfa58m}RBDrV+t>JW;327VFbN#vAr$P^m7H=2y|KJPvJjvyUWA`x@t*^xP z_lZb=aSE}Od;or<`}Xa--MO@VK^14;+HFw}`Xl2)MJ%Jg1@RA*L189{e}+%}zy2v! zuw;m0I=&29sm`2-y%1({0@~m{z4I8q-U_V0(RF$_?bQ2k+LW^-i@J0<>%k_Z!r#~zFIlEx5m?Fy0PO3xM+bcTt5uA za_R8a(zuwEqiOetYAP!uH+b+G1>(r%*PSAH?=EL~@1K9PZEe^0w|$#G^_E3WkHdUZ zfD|Xgks6bFz3x!Iu7RUQdNtn($>Rxqx|be0hfgQ#RXRbRhwb_&d zwkIzFV*8}MwQYQIVda&QSpxaNU00J8=u`M5&$^hk5l-0E7?s;+ zN`OU(Yr#>7^zvBPVembnKWP8_?^|IwbGu@KR*P;Q{3q50_UbXKB4PQ?S6HSUH}@zEHOzh`17a_r>h6cCZ!f(S7iv9XNfz?sIf;Js(CdJzhL^ zo9gtwPj*2gU&hre>|s`;Jcs9~kE62g<5>0VSI3SLowuC%)q&qz*pctsdy10+m*x`%ov5-#0GQ223@r%OoO0(*_%vy2It z*AeIMG>Ka^weDIAFE3b2hxObrLPQvwTdD3|x^VmQS$%TgX0NPLyzlJWX=ZL*op-Q$ zkO@>u=9J+MVDav~My`bf^;pl?UC}Md2cplmVGj~6i?X76Zo4QFASOSH5YJue`S54S zM*1_WQiw9(4*8|yT+0UvFfspvTnp2VN{iC#tfjZRL>iNSxb3r*GU(nhvAl$u&eJ@kfsy|Q{Ol~{R0uPBt#^LM3_b2{kJ0vIN8e+-XHKrk6@)hIBAbgO$3Z%s zhS8AR%P?I}O{mhb%9_|}jsV+($64faWjs!$TIO*mTq+kf{shNfG!<+gJAJZ#z-Vul zEMTX79Qg0Pu_O|g);=72DP;{_uCQN30mP<^%I&M`jJ)KE+#lSx8DNXj0#8sc-!fcC zQ(J*Q|B8XNiR)Nw85SM0=3YIkTe;N%oH;_j`$)N8Pb10`%0*n18x+Qoe|Yykw2`vy zBF4h@Y6@#8@Z=TLsNMgwXGpgq7z?o{F6ugRi)qh*0sfea)c$s*Ay7}`_0d&7J%6%B z&!Kz63=!Z8UwxZ;%fs!dk}RvJ3EKf^Nh`pA1_4Ep9_oW_nW&s?%ZLL*a713LEQU=H+3K z-`!e$^h?urRqnOtI-1S&myi3J#DEtr{+5jGd&sOJ%OImEnsFKPo zXm@dj3d9r9tPUtFGG?b)Qbp&yO&F)`wkh(yw&*a^XK*dAk-sZ;LPi{+nxA8`b|+ z-sGu}r7G4r?g#5C(%Diu@0GW~jB?CmKbELdW;0W_yjld;Cfnl>?r~2~>XojX)5^mb z{bjY)I0AmQb)aishx=@F!-+2c23~&daBNN9kA)iN&3*scKA!;bCLj!0Ek&V`rK$Vi zEVng>*T17~=SxUFI`h~2cKI#XQ!c%~?JhUL9ABPSPBI7mXsg7F0I7CQ0X215>-d*# zZ8fmt=XVxy)=Vp~x9f!YH5q9ei)sHi2yiz_TwUyYBNhhxxiDyw@lc@9PfWWVa z9sSa`ja+TdAE#f=emq!tW8*%ux-ncy&?GQlCvxuU{5@{~nGU@uBOjQRmFfCgda4Fa z+F%_=lMoOXc{W7Xa47HpPD)_k*tYmD*P7~H6|ap~maW486NlTJGcM@`73L=UHO{^* z-G;`C7n?DckIQ0we&Sza{s4yN*k!l{(X{MbTCP0)CC+bSbL2c@-rhR2NM)w3G2y1s z=mdOeNX`F`ONg)j+a;1BP>P*#N&UYR`Pg7tmv4NsGT_6is7Wq(oj4iJ3(Ds-az(q@ ze$2MC03=QRmnt#xh$;$V>Wr>k=MRz}JW}2k`7u=T+oZX0QC6@!sq#_qbu z1}-$^xR2+;j@8A(joFC7K=F|xeU+DfH?kt^wkkcavm-9@*3|`gY=`J>6@Hc&M?5uj zlQ7(R+wiZ|l5NWDA&akdmYwLH89c>%2Y=4bf$3<@H%F|nG$1a1YnTGimDv~CsZfl< z!kr+IIBX)UdB(|fBlF5!Zt~sN&$cmu;VVQNpB4-hDK_YL6`x~5j0Bq#|f`q z%N-@UZ1D^3>GHk2fz;kg?%SeAkmk`gFlrAuPaU2S4et0t_`KBs;n-1m4&c8B?KRC! zf?Q6SGlu3U+|@^&*0tQ|yQ@QYUu>%}xY>?-kLdoK{t~{vpvd4pUxR{Vdr8!>BkaqY zKT3`rb++Hq29SJLNbsq90#7`!0C+>A;PH}bIQCh3p4-_C^fs@Dm>$Qf9hD7kkHyx& zri$l5R7&xCoOVm2id3bytpI#f_UC}R0S!=rhq2gj1cuknfwxoa1Lv2^=)?d=+ij}E zS^pKteSar1J$PF4h6^MW?FZMR7$~Np0J008B<^EwgM`{o0&9*gNPv zI8J}us`{i|edT_<&KAPZxD3ez18pbYB6$h0gzw3L;dMyCy=6SXigl}A<|z4>Es_I1 z$o{XGB0G5|<29*V3ue|kz5VkW+wfKVt^TDTodY@*nX5>g&@T{8t~x#E{%vkwqq@y8 zD!TtGsOSrDP@_`*@1TCGoxpZ5chOmjCN5KtLnf?G6XSBBKQLsxohfU9}?U=v~oU9>clo<^%y3{Z6;Wo#gv;1=f+|t zsd0ltYpvMkMqErtnE6n=MVEt^F;sWCa&SyJO>mbH-tT+wuKc!Ibf(?pq{hMLMTB&d z7-NW!xNpE8V2P4d^2*dbgQ6G@&#oM;548Hfc% zKoRLB5kWyfKmnzV4G;vRcbLSd4$>sjn@W}5+t5ZqP=TR?v;jeS8G48LopX(G?!522 zf8_b#a^{?U_FjAKwa>jn8WyvdJ_)yJ0X-c{zIDAYdvX5iFZD!cTLy0&J+~Zx{D`CF zfps%TM_v@7A_IYX7Ld&=SKW^>*qj_FCFTU4QibFiTEtcV%MufR;+z}bk=g}>DIbP; zlgSrmV<@w6e#2MCq+xC$P$6MMoQcW1mc5L91-EPzH?A;Dg+oH1uWfADF0xyF#TKT3 z7ll{QO{Ja|Ymwtu+D~Ksrg$J(GPbT(CsQ;oHB5SFez_afWw)-XYcIC{5;*r-Pdwni3Q-PC;>rQ3+-{bNr8x|k#QHK)>hA1c z!#x-0VIn2uK!+heZ5-+bFOmB49RXi58O@K#%ji3m#}iiG+*BF)7q%~}qwsXh6za=Z z)F#B*`t$OP4F{-!e2X&j4;Rrz2aBHyw8-D9Z~Y{Sy6+LX<>)$IgnlMETbR;DIV0;^ z1z`D<2H(Gjh}=f&xd$vQ8N`iPhPWd0zneW89o1lA#amGU0Vm5AUC5sBm}@JuQ6zDt zDmI1^0pV%s8?lmdYglS3L9_OWICPuSd_ir=moz=a0IkT{+ZL^0hzQU1AuH57fR^lo-C@3&xN7>@igZd@CY9m-tlL}0l(9+KZY6nC#?W&` z8So>msKWdD$Yd`~W|kKxp^5zZU4J3QOhq5qE_*V{4Rz#5t%GMn&jRMXa42Z1T@eDuS%YfvQaN#hp_zgxG_1SEyHlo%X9K?6{Y6rikO3)fUMoXx;9KHGBraL- zC$VWz@`MB-ka5MJ`Nr8E%{S!*GxGdHwG4oRcub_YX>fZ~8rLPhMROTHsszbSqFSP4 zmbodWI7Aw0&2&Q#Gn+ZmgnExY2{^E`GrCq~wR=%suIVb`=c_~+C@QjJP*vb5W?rUN`!!z16&7Tpw!3O7vAP`(S0FlTaiuvhs-$EgIL>)q^SKRtGi>pucdK zpljqXX^9**{+kaILHm~S0yRN!zJR;qbGzvp!zamMLNt^%{b-H#3qBc>oBWC)7lPV$Yl>*~G6y`oNUl3?tUMNp0mUb%TrM?zMG($$e zmmCnyw;HL7?$+2)fj~KmYOei1ToN1hIzk$&zF>p?815ao2t4x*l5?3*$@7MGX|zV| z(rBGHF=fZE%WM0s)M{#XLDbw-kPMVlvhvgK(=nniyo@%(}tFuWs8%D-R*k-Hc@7@i? zR~Yp#*wKX2sBar#o=4@9EGveh@jn+Csm0B<#?gMk)*mZaU>n ze&F011O6bDht8h?AyH0pxw@u~?&S9nlMnGx`g%N@U#gdbU`}N8#HYow2`g=ecDMS_ z)>i^7ckrWXXP4wo4vp`?%`)`P5#*e}TY3BagLmpJYRWH50S!Y1Eq4?ywnSc+54Bxv zVq^%H)%|%>+6InD zB~^PFy<~>wuNLT}E;eimu}$Ge)JxLhy}b=mqd%@acsKSpqeWy=(wAeTTxY+gwX82= zpP|Upse^1hZao=619gmlz!gHz6+W3(@l|BV`Wc-Jh&CgM1jl22KL>g-*4{`!?NO}^ zN>9FJy$6cp#i$AU|4|KT0YsWG15+X6R&6O`L*Q(jXF2pk!6Z~35lnLMTiTUswKc(L z!o~(qk%Wy7AmQvnk=7Q*F_|23FYjndRNr&JvHlsE{=96Rp7Y-fn)KFIPf2dcB&BZm zD`G}dRrQmz#xfVr9IU81cI?Doie=JHJ9WpVdrFGz!#i!dC}|8d+(Uf0;N&=+B%gQD=Tog`czDC+ob$%_ z4ZQLdrN(Htq(3M+hQCj?)6CES2D%QaS?+AU9k=KmH1DpMhA~3UwNSpPOmY2O)MAHG zAuKD3DjC@kwRmAYg=l}5fvzDst&4+qC!33l^Yq}*A?O1)JC!Uu2IGR?F3t-Kcrc=$ z-cMuH@wGVK^05^5eAQ53Fk47_$qKKmy~c+$r>H!EUMUPAfTWH$q`1_ticj^F_H^?~iV<*mE`W!?{5!Y{lKkmN`J?Vw8 z+S%*R-wAlg@hLGzL8EB9lDc?%WI8H5+&`@~25y!(CE3Oq-RDa*7BB=;`{z<%s~vM{ z@O(QugdUOsaqAzt4g7AcI;7X7H<4B-&nv0MSj4kjotV|VZdxSvpd z|NUVNb*=-+o&ZM58Ev@9f4;{{kbC{@IXlxlI8E{{NI3vsy)d5~dUE)dQ{n~duigr$ zrNFB)%icB}aq^4VLA~mXGUd^``O(oGx+ONcik^2EonWntzwJt=ZA;JSb4Yy&BU%Em z|KD)OHgR#-T->Yoo79RRwfK3hX-|)oPEUOZ-_Anlj$YKRUpg<4u+BH|meK4S97!Ww zULu{7t!R+tewlc3L!Q%TuE%@>d5oLS8s#7`vg27jr3U3yY%m}d*xn~o@6{_kDZ^za zG6?O+j?@U-@Zb0E?(-osCMe|51^=M!Bm|@e{0dww{wg@|lz2SQDuCF;X!DtSwpDuS!O}-Kqg|m#JVN7N zN6jPA?wa~oHIai+JwSxG?ubgZxEQ9`)BK|_9VH~~FXhx^TdJB}oEPdWuP?)3 zBjdyFD`iO^#*YXGOqcgRj7zgq4ZRogiOx2RVXSutC=Wf- z`MC~8&@gLgxvPG$tTV#jYB_`J6hlJ}LH^SjRx(!m%ugLX!n0Wq21bsi%e52>+II2c z_!(FDA}e2Du71&EVh%FW1!2IIkfMK`x9$#v&THv zn*-5lu)t|>h3+bpKUMHDXQ}qYy$$Xsn2NRC zdme4q!->meL~&%tXK8`vVwNS}%{y>AT{RM56ST}U$7LnS)}N)4(NP2oLx2wFLtbBu?NB+<`66Z>mraGvFK?wwcUeOnR>2ygGFd(>VyyIp7BEXBV=g2g zQpN2JRw0>M#4S=GbS&(KhF4Uq0;dFaNDgHxR+(W2-|celaI@uNIOQ=U2#uU@Q}<|# zrU%6DGbR!j8TSbPF3m59t(|jf3flV^+#mAO)CPN@T9}gCG1mU|svoiJs}BajG5}9( zimCRKa7Lsg=YqzdyXpK#e-@J#w6ab^A96ew4`FKW)F$q(1*0AMzmJ!Z z=NarC9&SdvhC1*q4}@QBexGmpiF1CGo$sb9=Ju7(MCp>aTfA}$V+&>IbkM_W=Ux;{ z%r=b=tO+Yul`!rLa`ecMbCzw_!1v;Yi?NPyEFE~li?9vFwd)t1l&TsS0|-&qS!)m& zn%`aLM>m9a(D6ra*Xi48t&Jlsu;6A%m<0>0*NP>(PW#z$R-mvMd;^#Vuh14jp9pR% z9k#&D#xZUt;m&*q0ITV9Zb!FBFhA6y`-!9&uYG1yE?mohH#?3QKW9BM!AfqV(IIln z4LW!TBu<2F+TB!7%lw1JKE!&=@W1>$m>twC`6V6zrwREI54A}Jx$|r0V$*C4(jrJU zAPe&MiHqgV?1c)y9!h|AR^6VT(YRW&I)R(b!OSH^LNsZ5M~n1zYgnq0=g^*wgu^qx zc24d1Or@#=n5kUtPznBM+ut=S4}}+Ua&izjlGfjPueZ}h`EYXwLuVRrhg7v<&Smv~ zSSmpqM&^qEwW)j2x?{tc!&s3xjTt%9lA=mVN1w%{b6_E>wXmJx0H*X>F0Q z&_e_RP9#Q50fiBKMVcLYuGsmkWLxA^Dqm8q3V^78uN_B{`ecio7M|e*Le;^_!y$An zL`5CpoJ!S>H%w6d_fCZHXa2}!{jE?6CD97{?iTuhuI;W*gwyv!x-2B^edh@*DjmVZ4%N8BO9XCE&k zjS47gnH{!K&m?~3A)QEmlrV>CJKs*Pb3zi>u`JR)NPKLqduv_xwSuefw`PYr~!$<3qFwHy!DJ5j)wFh{-1Aavwhp8+}Epb%qBS+=ejPOY2)~Cy!poX-vSgm5rYr^0-ZG8n8qLr-mGobOEq&a)ZX z4gUeKp71-Q4*2g48r|(HtEa2G`4XHkAE9T`r*}|tPL3bkR+|ay3w-03n`K-}7^-Lh z=w)T3qOAa{!Wc&9qj-pte<`g|%v1BD8^K0kt!u?-^@9QBvyOKJT-}aF5l533NX&Eq1!qA10EA0Er-QOQ}@qkA6 zgtVjow^nl(ONZF`b)1bSW^`&`gY4;>Aa=i~3lhIWhwW@#{X?;ou>*%F(B9J|a}w=R z0c;WWLd@*{?#q~V#}bMd`vIWHSFxc622$7yCn*yuNnnNOqi;3Iopt=d-V}F5%oz*h z1>3y?^5_f{A$myc2I%2vyZ&gOjV5NMo`HPS!m;(}$jEvb2tY4*;qA^S*c{!zG;(2) zF*_n2M{8L0i|zWOb6wP+e;c85c4;*)zTTU6|D0mX@!oGm0MeMLRrQ$SS_R_~RVrq< zVC5G>?PM3g^bA0Ah*xeRa7hh@SPa^;Z}dTnM0+`QTsH=lSc8H_LSwipRvKUCT>PTv&R7X9=Vf|>LRAR-@ax6#Gm6fq;NctKJ+6N`{Du&SEAln; zXbbLdXCncyrA)EOHg8>0T)qggWq(UrDV(<()D4*i^!qjViAYf5!Sr6q zW*Yp-zgIu6s(|MZxo5>X6#Q5Z)&$35t8m!>cQQ7H(@A$ zyVO54ajnL#%0^B@=9h&E={qbZ{Fn4k1Q$v3oyAb-{wwiG{57jA%l@*LNnj!ga3VX~ zKVO=t4-T4s4<4Tb+Ty>L-hPdQeIwjqoOBb2e8G6|8;%Pteh+iRgIlGEvip?DIFa>0Zj?Tm(WtxiX@H+AJzw=+8>rLS<7#Xqcqi8{3VKO>s6I54)dpoQU3z+|Pkr!y_5ygt2$;ECUBjG49eRN-cUx zn$Cb~AoQ*;FH%}l&ka{j*%f^bH#?8n)KN)mLxYN0AAQFW2Z#dd@R5rbnE(sB-cNxu ztc(Z806wK`#HjVrdJIyB%t6gX*n0!aWfbVsN2Mx4`P(o+)Hn!ukW^DACr~s2$PU6} zGs>x5Pq9|S!Up0o_;+&knzMM#1=1gZQ~YatC5AyI>u71OXWuAuipK&`&Pj~m9;3`+WB?^@jY6s2NMBN81j z<8mBR);{djPtK1lzYe#71-g(c1!`Zm;?sVZvmhXj6vxKit(HD;tEte04o5cycaI7@ zlV?$grIYJcA=H1$9#hTsxDh46Wn0!_2KK(-(oaB7iK==|payO_G$wg?n=HH=vf z@$qSu-m&SuYfJ^q7DfyDR4q9rGP*u^T+z+z$p)(VfHA&YGpqt-ZUYzG`X=u=da)pB zQfzw=e4FgT%$p?s=62{j|6V{^j$b>+R+uT&yA45KphQkd5x-u+BS6<019vz3HCozyNQe>1{6l9$_)TCWyL z?BbuZg_WKZGKy^o;g_Yv@g@i3F6b2?bXlS1N6rcR|9C~#aV^*7s=%f4&dy04Ht?hn z&oAI^=h06OHI(DiF;oUGHgsX}F^`q8A=p|DR_OiOD3^)fP{rK%f*2$x*EzajKE{f? zphF6y;1y|Z?>O}Cxd3peZ&w2NNmO6%m=nalP1riP-wfLsPu#)NU6{R4U>j9ZZvn}> zJ{05;^w?~F{H3#O6-S3YOyRN%7;8{u;b~m&t0=G9m?n8xhAhAWpZsHFjO0d3?-iFr zd`cL^P{_Q9i?$jsxAU|b(15?$dvSN=Uw6DZ(FcimzQ3020r>i9%a9qpJ2^pD{f`Sa4H0- zD^t$}g@&XHEZy$iLT`pF#R%5>KzOWYYIlJ17^OBgn~zqVD8piKCRB)|&f8#$vct{( zi9Xl{eu7?&NffWK%ILlmKubYS?~>=#Jz-;^cm-nuGIH&Mq-8W9Fz^JO z0uAP!4Spa9oAT>U`@G}C>@*o!Gb-d9q1yJY@Iof)3fo%!2hbpOoEOKuwg8MHl4a{I zes#c-Ww@I6H~>LZr6J3IX=)p;#SxvaVmKqmcD9;qF?pvMJI*arXkl@5JIX!{^!9NF zj5jkL@(07~)SkHc`D1jb!Q5v>^lrExu^{wHl-oBv6*q2U2R|<9Ir;9wVmnk1z(XVo zE+9zo@4zFqAAqvsC)q5CfpGkVGP{=L?&r^=>#erHeJ-p(Ltk%?+f@e7=)`ngw{|7JWUoMr;JrV{O`C+%)6!{F0_S}(_G zZ9j_qgwmGDlQ4`1fXE~{eh4n){V2U=3SF}87Wm9Z7d+Org#*l&1Ni4oU|a(c9t|`% z0$=&EWaSJqaF!GbvTZgnP1-Jg)Wsm7Lf^;IppbHd?!^^&upAG+ho123Wgwj04R#Pu z_@|Y=VZAiHc(J7A+Jrd|oluP1*%@KYdx5pacZ-Rn-8AG&iH6jLB}=&ID!*9mW# zIkF&G1uBjpFFHEbEt{yc?)X&C@^x#$-)ml0O}CaT@>=8X1iYi`KI;z%|9Eq%tFZOj zqA1Shx+8;Nhh&-a2vsvU@55QYV+1s$y^ZaxzFUWhGN2rlU=F^7&gp>?{_%j@jD#DR$W$~CYcVW3QnCY) za5xMsFCivPDpOBhyv(u0U;=_oyRfE^Y?1X`$mAZR|1;dMUkmJ(-<$`>$J2=<$&&B? zwHA1_sFNU{k%w7dE6wyVXwuezU$G{0_pVpOwGP{XH&0-XW~*&Fi9bBT6pvSsZnZA52B?AQcz znfaH&YqN$WMJ6d{HsB0IZOD~ew_X)B(DJ2#6CeB04#)-<*? zx|5M8lKWF}(c#kr8h3y#YZ`3X5LRzsU408bV+v*y9;x`fvX;%WUaN#7?nOt$n^?`> z(HsDfo`>DsQJIgzL;1=}>RURFKOi$JfbWnA-7Z6$4U>iS;H4ASfHd>%B0o*Bv2JM( z z$V}1Q6l=B(bH9<+#}US3_T$xHmi5Nzdr}9 zMu$+k^BtvlU3fHf$%$`#7;CoA9{egEZ7<7O3Qd5od7-{Wj4q+MxmMh@_9N!zG721o z?Af;9oQ;7vw}y>c;K+w!-|t2cJ|nN8zDrAyOM4m5u>b+VcqGqZKs$Q6BN2cE0!+o+62*C_ z;*0OWia6k5-9xV@-Dxgj(N~sI zC+>oc6H$i_OiCV#kHKSPM}n z4*?u-GF3*%MaMd~AtJj?N_?!-#H@ZCWV9-IW=y#%a`#l^nj(lDUnyYMtZFIU#hC7; zi4ne=$FT;x9Yi$Jj_|RjmJIoTpc452XL>MVN=U9)spp_rOn5JYLWtadvUT&EzR|)b zHZ|%qV1u|6Xami*srH}ptCcY_D#Aa|&3iq$@LmNeCIsFJUuuvR__nL$ET2&zCTy~v zl$);U(av?^5Rnx0^TWc8-E|e~OfmSJ_NQU4-7dP6^mar^6a8Gfv5hy&;+mc(`MNNH zKoHB(;-@-0_q84c&WaC$B;o3rZo`d?>w|23H>EHpz@G$upy=}cwZ}913Gf>wcob3Z zaCGl3(*m_(F}|2!j0v*Tw@QPGM*FGB74^Hf5i}bC)R2#jI!-()5KzV(>p(<|VsM*9 z2`$N-a2ET}S!C(4%kN>vjV!9UcW9x$TSXYKOB@*(Dk?U7`c1`?W7f485WSG+=2*U5 z2@N#~QG+$Nvv}QDTXjB}81@d6rY{t5sm*tt>#$tC2fTpw1n`3Ue@p2K$t771+TpTK zVojjX({X0;JWEF8Rtt<9C79G%<7zX?oy=qX0vV!8AdZfR&hH9U4vNHv!lSC`bL)v#@BG1ezZ>B1{agH}H-(Soul5op zWU))Tz-6(v_zO$M^Q}s_w4ETx`z7o>oyU@=&TV${4cx_~67Y=#soBj&&ZCb+rzv22 zfA4_X`(grY@6yYyK#X*R+&@k6HW`ZR&df-<^BCL(bD9P|dnv<@7z)$jw~ICXXW{TI zB^n7ddeN^q=(nk(2pe$Y<}rBzIhR?b?_}?0-2kBAcb%La2>x=tBYQ~k`sfA(sC6NN2Bp0||VW!bX6yu$NLDH7pNs4hFv8J}Q>rJ_)%RNT~Qm=)20V?%cdP`-tfJyCXP|_3uS~bzC#X zOR3lP79a}%LEuX+$(41Kthh;2=Wo>uxHeud7(f{erW^ zf^*oYc)pP>p1zO-a|nFpDS`O$RK*H-*_Va)#|TVFikM7WM6AW`=uo5I1L6T>JN*X>^ch+7fD&P|nHO#r~HX94jhEuX^HmwV@b@#dvA z|B=W<&yAc^TJ#62ZG?Oi;0!oj)%C_i;}n25LX0-<|J-`8;hJ2*r)uK$9DM|T5*jYP zzHZS|kk9iNc5T|)eAJ>_8Os@fSm>#SSRowOM0HP=Nv&-f2N2I+psi4zYRc?zd?NjA8oIZiD!kJPz=Y$PAAn{*-GOCzR>a z)!!kH;9MV3|1fklJ~=xF?9FgB8}y`>(Vuc}Ly}U^(Za@rCVj74Q7|h%WSqX3{&-oV zF9<-&QK%H2vv9N;>$yHY!pwt_oo~crD{N<9P84oxf?z=3Ov;)NZC&A|?^RrUlCPW} zySabPv2%)7KNL5VcCd!`zkMh~q~;Agu7&Bi3l? z@|=aexNKRhfBm^g3NNMx+))OlS&q>T^5yVi^Rc!j8r@Yf54#Dhd7dXXryeg`ZC(PO zkG6$a{lZU_Z>68gc6U>Z!cq|OrUsqd2tlC;G^Q9y=YxktXN_ez!KL-fI@3kZjlaLmW9^@l)(kl=wdJLVmr&dmoG z?_+)IT&mK^P@XRN)g}-L&N46(%%q3eD{>Wk_T#jf7M7oIz4koVHctUCQ65z|(SV`3 zTKc%}&$HRsFd!#)Yel%C`T&4D^o6T<{7LJs4IkWWDb{6_6#Zy&aq`8&APjh*Jh-zN zhJo0?No+p#4byU>)Cp5eO%ZaO06^v$dUvtgr&v#I&!c?mSYZSIn@4W)rVra>pQ{_# z1equ}tcvOKn{Z2QIq-fdEWg6Xd$Yn$7!*W=|k@GKyQrU6rSaL2htWp{uKE3G<-YP$s4hJkZ8F343 zfAtvaWc{?ZS3}L`){n{q@F)@$w?K+;aJqMnwnMXa6>H)d4vHnO zp1Uc^8jKprrZEW zbyQEBu=&))nK)gydmCQn4A?l|$53bS^sB_y(S%Rg36_HwMj~8Yfs+ls22-CH`1pv* z5*sqlWU23>yXCT0s307x&jAd_FMurOsF?g1ONIO6gIzm8$VuE5T%_a~@zoZdYOt53@P5{4wU7fxMH$6V36Q%9wM+2r_8OV9rPI;STlA|ED<> z{r%4Co%);8yEV55B|AW^kKvURN057-^;CPxK5)N|EPEX7hM0F2(d zjutF>o|WDK9({uAmIEoEAoN(pekzV3wf)mFHSR%uPCklohG4h-t zB{zVYP6R5CGyip*B3Vyl|1`yWzN*j^qY05`1iU&grOD9AEQQoi!|h}|>ICk6J&o=n z7%?0nUrgz1H?~?b(fw!GB9mb^>r_n>Y&_%NZ8p~R3`~Qt->DDhdcU5s9HYy>B@%0e zrO|{>y5&X|2F}j(&!IW02*)M3u@CNcWRQ}TWcx946r!WrYY+j>ECYBf`40V-Rf4hu zghwdeVVI+D(80c56n9vWosc`?XFx4SHHh;(gSD#CRe{;W2X0B8hf8)4UIX2Vpd3~_ zFwu8#Z!LJ4hbdM&BmYp6IhGma)xTzG4C-q9eF%}P{<_o2djZ2?d>s(j3-a~ucIz%w z*@w4+nC|D51+svKa+N9;Bk`9?(|QY5_5$o-^@rGl4-20tJFT*5jk|FQY~8o3U8ACP zF5;)&c)|@ak-S`80WJOaly=RnFzP z-8USyP=V*KDl%di!i+dy@-j5HqrTqM-;x66Tx@|O$C%&kaxKG>We#W4j^+v>>FtC? za3TutJ2@&;9v4*f8+MiwLe^m49CG;)J$XPp35!j|Da$%&h;?EIeN2JFss z90Ui&?XXxv(01&o_Oqd?b*T4(LYv%W20TemI=_00X*=Tv^m*JxmO!D9k~n&9LP!L9BxoIw$Nu8NHDX*aPg%5pdbC-!dUw=*6X3ft4Q-J#ph}V;%GU zM)I5a;C^*OP$rPa^{!bhF}(W^OqGy5pXYrfqu&2Z0&h>rAovoNWLzff`7m5N6$CP4#)OQbqqmXY=MHQaiT_7~ z2ZvPzu+hZ9QDa_FIy1BQj1IwRFVr0G4@gCmvZp$BVCf^`9Iuuz)%Q<^MxO*a_o}yR zeT*m}jEyM{h5V>Kpxmqj9;0pmu%y4rfaEqikmwCG0IaxyaOlPW9EJbIA}x0wW{u(ir#|z9}@=r<=4jISSKB6%?b{jDH8^q8;SYJ za&?4vtMRien6FGZobS>0ORa1SUrGSCqW`nZ(Cc7VLqPR4;9e0Tr-UfM|Kl%}sfwjG zH9c?iK_+%~hn`*29$rE}us31#+5gletYr@qD{QHMP851bg5@j2&6*iqnoL&Hk1%F@ z!3+5Ow7MI$w7y;V zRR_&ljmgfkPhOxLy(D!`n{b=GY@U;og++&YP*Ve|Cm=`KfGV?gr3_mZ5om*pZW(L?wi*Vvras7s$zOh?)(6Vru-^bLCC4Y{d$wYCh{N`1enK&5=i!?{tA}v$v}kwV z!G!7eSR9oQ%)dkfCa(Y(a_K*Ss)oE@&|j-5)Lz^LzVdBf`5?BBr`&+OdY=?$KMC&b)fEEAHDkL*+)!E=AR*1=B^ilw0!9= z5R@X*CPJR0pUqgncLklo=37KLR%tRaMcdTt=5kjF2-xatAd84hn@bnT`TqMJc{l|E zPKWO-+lM##04WD40Ote2!NfyVcco)dd+vawgw;%q{lXk@GH|#1^*fR%U0nI)SlXI8c z-KPuz7^7Wr4)LisZ>+FP5MO7RroF2J7}J*%?Bf2W_D-sPY?TI6?iS4dc{U|IcOA;S zBI=+3CKs)&7C%dR`uIIxZTe%nf*sC zzO&-Hc69*U^W6nM|8@J+y6_X?b3hUpFFmV-Dhm^nb$yVas(%Myz~Rt6>{`=y5VX{0 znKu0*k6u%VsMiSTCu1N!aNL1@{wh^0<0qz-=WrK_jLQAZy-j4C3sma=(H~iB!OhxX zb0yMg9u%IQyV(H@;+q5AErn`-m-g`i%b*X=<_~OzLcaXUrtd|&=rT2HEE2Q~;$Fd- zUS;7uNf*E_94Swz^43;cz3;daH0nUn6=ycFL`_w#;>Dh^0PWuEgQixUWwXm5H7UUe z*Jxho5f{&Q7~h4nF=zVxr=-I0amw1~{77C9;v9$3rQe-sy?O(SY%>p{dQP6v1!{(G z1YDDf&__A?lOrVg-F+I2W+xogvKaGR3o(qOO8{uQ!jZL|E76C#>gV@h#|dk{S4np; zWjEqW^m2Ee8SVUvt!NwG_sQ$H6B%c)KJTpMX=YinR+z(&D4mB^`kuXR(YU>JZEU6& zJni@Ga?T(b2Z(wHMcbZNDNMnslePe?D&5itdw~ zeF@O!284Ikl6;5CAtoc-KNC})8s@auzH-AGIym8y?8-*@ML}#OLK0>7%5$t}cjq))T;`%L5!$X}bIabxbg3qsd2^ zcGxrqbe=;8rWX!1;~wcU%fU>(n+{C-8s?JMZc8~?BHk0jywO!lA@Hup6(`&o^FmTm zh0*g>iA?c)s)I96+jO$bY6=p&N_ZlPqnEhd9zah)xA@Nfcb=_7C8sPx+tOW=7u zrlu@{|Ett>;vRhwkgCd9xHk{RRF`;L&JKaf`&TRj$H%r7WnOEFo_%j2E*}=X{b@S< zD=&>{uZF6Hw?m5k;v*4kcyJuiZpxER zO0ob2>eJWYjYE9V&KmR_qAQaug!B!ap9-Ot0GpqN>mE8QTS6PNyldr0bYOx-cj2K= zCL$8+&%~{^Y#o0j+d?l6(LJf1F!>)WG7^5(>2S2P^H5ymI4hzFu<^);x_k72gG0YC zVWZ5;(1v?7&|LVAY-_vtT^L6TElfUJwzYRZP9IxyBNBpatouJ4aFZ|pv<0Ga2yy_y zP{$khuW~Rxb z;4jO@oI1p&-0AH^XA^7yAhq{2X&z`ZKu9 z>pAzftX7!kw7Lq)yiEMoLUGyHLv7$CzqVQJb8qw=t&2c&1D_1FGu5P!gAS(5OL`Ej z);htL!jki6_7EVv1tumVpgA3YJ&b~6Ntk={KJTQ`JAj#0-#*-n7qpC=;MTPO5_b&~ z&}I?M-EWB;Yv^8|{b|`W2@x!S>_VV5!~Hj=L{qKdeJe?)^#owiA%B4I(Yq&_yEz}* z+VEd%u(RJTa#2b`h;C1*Tcs&5(0*-bpfICV3Mu8xB8k~MO%p;~ry~0dbiv_SK^Pp_ zIb#a64hz2)rd`srZE(5$c0(BO3&A78w|CsSwKhNj14|Xwqdf0ENK;Pp_QO^A{yC0ZyKi~!I9n5EYkgQ1~l4XIDCUDN1_v^po zaIq%kIZeKPV56+ag*{LLdR;6)S?n#f7~BEyO&Lmj64$|ZB|T=s1pMFJ9S*a90^f|g z3VhSQx?pM(^wPWzmYaSvB>2~}49A3xsw79t6>x5gzz>`8T*vs14rIIa~lGka;%~O6X8bO3&k|MVONvuN3e;3qN0WLH$-O_Y^nfV z3B}E1%kFh}e%m<*2F0`4E+1N7R)L`dXk$iUj=X?2c8Oco0C|4Nb5dX)nDcQeFsJkB z_WV>YQ6}GXzL|9Pu?}4cY|%4KV9?zi?W$|0!HJ%7{{x;PKkrwuq?EZVuT{JUhT?+E z=2LRQnZ*bu@93XVYil;#t0|lElkazMQ6jlz^bn%+U8Y6xj~H9^QcFanxA)&K(%H^h zwyUq)TD1_oaST_(By5QMU0$%(*k3H(n|BAC;vus&gAJ7leErA#pUfZrE_&wOljLP! zQJFwMtY#h9x;NPu7qy$VKJPK>+u!cV@?(HM}c#kSV=! zm7R@n9P#IFE8ov?UG6fuku)E(3aBsBQ2~U5QsG+2nb3$yV0u^qr7a@KeL$zq--fT7%AgRbu`s4x%bS3iGj z4c-{UaH+!#bQ5`Mn3OrR)&b3JADyl|x2 zVHqg(ii!}B>1l=>2EQJf2KIVo>5KmF5l zQ2oLhCNXK^!x2&{Q)C{06PW$=EI`=h1S46<{!9_TzTzXhdMX6@VzB4Y5%TR6oarQO zt>S6#w#zv?2=5)6CM%P6e|Q5#NV$^l8ElFW-e2Wgb7+)vYVezw2B!;-=mK24RPejq z=mRG9rI2$l``5&sx}bn~20Q)FEdJdmOzRJ+eCenrNz;}V-*9pKK_ndP6aKWCMn^$= z(GjNjm@Z-D0`k30)4{PWIoqN-aB zkNcTv-=Axk^bhj#Oug2?LZp+W`yuJ?!URDei@5CO@jb!(**9xiGs?kHsW2Hpj>81m zDbv!0C+bZrxBbj$ALNlfyV~-AthBh75EzbYXA${yO2UbHu}|HAf_}TmGZwKHazAUz zzWYg#livW}c`tejd>^DIQ_BO{-4gH*EQE0h`6IOhu}+@12K&iRr1=KonF2`Sp4hZS z2ba|5UR~a9@W?{7G2EL+50!Pxk20@D?6A6lMAkq@jwse!{G(ehN}65ftOS)IPC~(4u*>> z+I6dLiE5F1f-nmd3&O0}<}@iWng+g@m{}Pk#OVywrm|T{%qK>E_;Yd}UIzVW^AWcS zWxh}#iV4Z~7+3Lc@ z=eA~-EB4_cnRp8RfQ+7s%*e1IC-1x6+o~Z?@eO#eYjKk)9?73SYQ;^z^GB*-Z@aqk zVfTpf$Meg@|5IGz5B${C95wH4IAIOqObI%X?_(iSDwA?bc;B+y-07<0cOpChF#Wp# z_W)n2#ngF44!y4}G;DTL1GlY#OfAv{E#qiM2Zy!NnB4cm!t%PVwZwddp&<|aV2CWf z1ZJz~=$D#M@g&M$5kpnO4PRpTdF_@<_otD^}8jR@2@W3U)dX z?zCaPeJE3rifrWi)xWe-29qSgNk*6mxy(eFbu~OZ$H(Bhpn7$F&~;{nnq#+V447tI z&3$$WzJxs8ht}XdI1HD2Qo$IB4LpGn_uiS^xf$w27T&xKSP6-6;|jmgS)iikc5;(P zK_(-cg?l;~wosO>eTd9L2D$P0>`)tvc$7W#=jIIex(gNJNPg$TkG zaxnYG%iW%!-sIp05XkYQ!>COB3u;tnFQyneynQnhM`sWuj&s90u1#bj7IvVik7;5N0~JDx&( z6sGPi;nebmqc*+16Gy%eeR9Tm>g}?%UU%A>R*(d9cpV{k@bJj2P4-pHu6Tmn%>|9^ zoMx%J`2<_VB7%{7+tt%c1%YMYnNg12?DcZ)<1bjJeP3BH)e88(WPaYIokUw*=_<)N zM{tLD%0)U|)PvPSkdWSpuS|(P7|GSMCYA8`czuL*I zAjAT6qx$-`U-GM&MF<5&-484c-I_@`(gc~^2>H8-^Ry}4Y!p-00I%hUacVA`4+Wy9 z3jm#`gZ0*)_viooWvWl9%7#fRA=8%^9T#7kdJT-ij*|kt*QRNoSYoiAqt} zCmP@v^BlCXD73DWbXyMj-Emje0{mc?OP1l!#h4<#NsEtS1rjcJd`d6?8t1D(qxwI} zH8K<5JAXOci^4l8wfYH!{9PFG%@!jg!psFT$JL~?sdnQC?rnnbOo(8*rCr&exnG43 zQH^;Q1Cw#knAkpBZL6%d6Cx(1ze-&@lMqHQ2 zKFb5Xp&>BQpKLNa&|0aI2WS^p(X@4&U)`Xpk)g%D1OigtAG z*Ze=Oz5}YMtZO@1V8#N@*ac)16a@sNLxA8opa_DBp-5GF?*ybI>Z^<*ARwIpiqb+6 z5ReX|(g`3jF#YkEpNj=u$DpQaCJQ6TK)c#`hUu+9w?~ATs^pt6OZ3JbaJ8z&`6&WvCzv0OHe;X3k=G8O&@r6|4X^is`>35 zX%6^$O`k@rBWA!_8dcA8G|HbNap_wLexo}24IcIuW!sH%ufe&yPA(~b?#j{>e>>{Es*Q_gG?X=%Oi9xGyoWTNY_$_CLuM$_lzP;m@MFi$aPmNm z_wCdoR;#$@_w`}0k*$G>LOR2l7N@^*qZh_=Na42@;cfQ!8k$qhA_LDZUS?534SWnd zEPlWG=|8Vt?SBR1QFwdhYrg5%{St}y%-xTUs*%^_29LqrKU{Kw51KpbIBzJ+W1~!6 zTE-pJ`cjX|WFDGM+5hVq4Car0s#VyuIvS03?S$vin?43q0%@tmwy@s~K{W${ggY#AMeJ^Tfe>DB7 z>bhBQR?;!vtm-XukfuhMUTvufTAB2ya3?k#nrI5Ip)Y(U+#UE26BHf5M_*dI@j6X)~vh-yApvdnk%2;i{}@acDT%58macyKG@LuQP&c)Tk8oenQw6w^JE zxbuWi3SkSw&wL(-ZY>DXQuYvHs^*7 z#+Awo(#$efN0u)^xUtD~5V%{4PR_&Vqo+A5?qu~|Kc=1)6K5dhOMMYclP_ffg8$mF(|!7@j0*KLTUSn@uC?@>eZr-S4I6bH%0bh;9u)M4 zRI)&T4{?VuM$-~ERG*hw<*ZKiW1)b`MFYgr`$rP zyBy@uR-!plQe{r}MI#JGfCH#}->wW8XUAyJzcB&`;4!qG!(sD|*`#D#FkARiO@K+z z${UXg0C_iY|BWMO`MEWIOU%xoD$wJ*flytzL8^u0uO5TyUzcRTMYBR z@Kr4IPaMJEbWlO6`)EVmk%{{4nv(>Q_HB-waoX`?B|o;39ShA(OzHdLt}hoS^451e z<3lk6Zy$Na9b!12{Py~+@M!DXxKm(n<@Ou8O-~>0=uFno&3TmG?A`4&P49M|5kbI> zQ2?d-voFLdTWP8|hqL3}4eJ}I6vZ5la<}0IfV`C1dOo#bmXW;4f$RUN5Ucwlqp-SCF^jG(EH)$&nE;^_rGz{)DzmuJVx zShwN9wy57SxRs2DUo^^IBU8`E*^2R<$or3gKH_M(>hemA`jAyNnj5j-j> zD_Vj|J-*$u;y2qVUHT9yk249~4vy9s?;3O`KzbY8RvQjLD`#aT?BXo0|6#AZ+>~Qn zZ85a+n%b$PJ>y%=p7`NWiOTb;)jx&Ha{(Cf<7uRn`M1uu;2*QQ4ukrYcbaY8q`<&o zgQPWEr;-Bdy((wNH;wwJV~WRMFRxXms;`#=Tw1mp-SnUk>d}|AYAiV~Y=AY2nar&E zFuq?zGbU{V`mwv1HeJ=bF(MwGIOf35eM^$<?!)jAQHXj?sKL1r#=B-OVaIAh*$*(nqDX=n zN85ECjyS1f?6zwTn)gt@tgNT_^T80`O)Ixkb?h3VXA$zoW2Q|O_<7RPa|oH?JKqh_zV|C{d)$ySMRAT5(vmrKN}@FIzGz2+ z0tAP8$KsO}`^eE&M##1XbT`F~Fqj9K*m;ZFVnemQ7sNB{c(jV=0U`k0ssKJYI^NX` z1V*97kx1?)YZY#06D%GQ*vji#z;$Rt1z=M1Au=n(1H21W)}G1e<1i+f@)Zp z=+hu}y2+6?SDDkT!HADJkXvfK$UI1lxXXQS|x8JF>vCj2#?&4d;f=Om(NB zgD*B_Mf)!vH9FW#bwjo9*iz3%NwLm0dBWZpMc%Zsp``pei2M>A83NL)eEZctLFQta zpKfwrLIP0k>8ZR~s)>LDVVPV62PEu#XGFTP%@%r}%0q*gtZt9l+AV7qN=PVTd-4~#pm(}h{ zMozy5{sS2k`1fPMU*!GEJ3Z+kGX}-qz;U|NR3+2t-3{=x;WG8{UV+o01*td9;lmYm zsgdStRm&^`2{!B|V}EE|{JE7zSF>WIlDKXHsWi{t zKm{)-w>@w)@xW|F%?PhO*u-_|dZ)$}v`DgYWlWH-pjnLryJ30Q+`gm2L&ReN0=t@?w&(tMyHF$7f;#F6Q8ArPLzL3HD4F<|VTdo91ja}yOs$gGnYjmwSiUZ$` z0wyz$7g>RW2mKvk#6e)GTc-&W&jBpwPP}BJQjF||f5>$hTq*THFKC#|K z*1EnN8)bF^>|Y+h^_~?3@x7avxX@55FjVS4`|s(-g6LK1ttXyZ=?DD-;-)TgK!}qN ztkk`*h_iDioNTPD+P_z0y0lWA{_X5nc76?qluyjRj-38P2e5kwveFL2OY*cN9fFzu zpCUWO!E4Fg(F0hpJ$&xtC6TqumY7?fVd1$yKM;&WrrO zNpV)-EMkDbvqVxlvi|Dq*Xn9Pj)?Vr>(1Hb zkM|(k*Hk#zPtI|XJa*m})P0m>&S?Vs`JM5TkgS%?pS ztaw#-Gx?nKZ>K8v_3r+Uf4CHUg@4*6{W3TR~_z4|bl#nJAV4?qMP} zT!m|I4pyrQHWEj9dXQLrHODv_gz*(zH}(khBH?10+Js9z-Rc{BiVq2k`K4*{K8~?7 zKc$N^C0EJpl*Ab=H5l`V)TND=z9zCf* zeQejD1^AMlaqy(0!T>y#frIP;a~d^7opLPV$Sb^SCm)ixta(Ye*l^!x&aiPK&*hcw zyNW8N(?^dVoNlm2JX~RWi|fL5aa*eVvj2BOR|Td-QUnM!`d-ZWw}u?;(O63&d1Ap8BHaH?&&SP=i1 zehen77#U?e%oN_wqcq;vmc(@ltx|f-lw&$8+5f5Jvs+Ib2s}N-Dc2%v^YVW}HF3~M zECNJY+o0sW#CWsnPn{E)_Z=8laq+c3-acX`vM)2pJZ!e|G!c&yV1PQ2wj9aJ7`zt3 zGaVJyv4Sufnc#>nBcjh+Uw+8ub9Mk_>^np(=K~gtIJWEZ!H;EvvWS^Bgk+!2yOP@! zZ(>|1JkXjg7O}uBd@d+@dWcGzyjHcg@vW?uoaj@-=9r1-0CRX|YG(_h!9KYnZyTU;+*`scu(_6_Mh_WK5 zA+W#M(EetLm#uX@okT+hFsE1Ma7@*Gp7n?=Zz$utbeUIog6*snXHxI*2b!5dJIy#F zsvDL5K@2eU@B3w(PO@^AZwgA4`e-M|OSS`n+JuoxV|{H{!I3I5-k_cp=`H2Of$E2Z zA9QPB`g1W65RDm;L%%frw)riinAb6y@<|-&{eVj+zg{f_&vS6k1!$a9Rx!1kzZjWT z@)o*!TF9N`e+GgA?_mw79f(TF=rDJot72tw2MkO>v=7Z4xS_cMm-kt}t=ZTlK%KKC zjFsGH|A~Ps`IWk&kSGo#kS(b|r6*ObGZrI4{lm2o&LH*PaoC)TsyxL>hA??J5Sy@{ z*j<5+1x^lM^XyZKnm_YMc1#Z>@=s@pj0ew!FWrzkg!=$aeYcYdV__!IDzLR#CF(y_ zk+mz2jjIWE+q>)zv(vxHCbxK zU2fuQQ~H0J%Npxf1I{HMTZDvlI&S%0jwx{1#w)WG zz>RUy1z+vh7%Y-9(mxF9Dinj$I}DYCdJY-7_U-X3Uf9!sI$3=+)B2Oq-fOLb<14Kz z-#@+yj_bs6eOpC^V`|RH^2Q2f)Q@s&QSSZNJw{f@bIV&_ErV>fRe1k&5IdQ|v9(4J zd^Oi8lbt6vO^*tBL~DYW3J4zv2aM5C`s`sOL6;+PUmmr!s2Tqi9ZG&o@XyggI6)iy zR>OVn_ycbKaQL#TR_3y7v3ZM7;hws_oPE{t10zd0CYs^J&QvAhV53 za4)pMe}bK{8z0jdEOI^v2^)0~3+a25vS8P3#o1w4rsI)hgs6O&Qrk9w*suwYqe48z z+f~;bU)%OkZpu}1^TY{j$rpCLy7qYWtj_$t6xEH_a`tAZqqmT4#q4iIZVko2ybhd8 zzI-1@qkmuiSwzT6%H)BYwChLv-3vIBS{PNn7GE<`#cuMD*oH)gWqMc>2`4pXiZwM+ z?7rV^ns`9F54js{^j!5#Z)uSMp zH|^NJW19a$f&=)FbK|>uDTjR!Y zYs@Jjc%AB2h1fDMv1~O|!Gvt^PB%gmS61n79h=3)GE5kN)cuB1WdJ4ya47&%^(Q4% z_4hTbZW4wc8j^YhlG5#F|1$#!`QEOy+tW{m4mdItM2@@}@~>&zQdV$kNeof_Ofj3ud`Z15wZx?BVhc%`zS?`*_17>PC6)z(!%M^(F3$XNirVhRT$Q6Hb`U8$a zR{2h`>|u+Zo}^U6yZ+)(4kKao9qyCka87aqtIp=JNVa8Xq%zR$TRl+eX5h6bPQBH z{(vL~1w2UEm4souJFv7a@%-vF$bxLBl0Kd5%@f^X^c|q=d>_(2{7UzO2nezqgq<@lK=CTUU!3P!>wpOv-(1tOy3qVc%=f$$7%RMJgD*HM5<+`< z!1T!8(8=DGYBTgT_@bw)$ zeUb~;zh349$t4j6Vr^ZnFK5_u|IS>j9-mKFHMGI?IrY5f^M3(jV3Z#bya(7-aA7nyQV>fO=+pKs_t4lA;a?o1`D*{_I|Y?ncJn`U@TR?;s*Xy&Oz+6*ILvA9|JmQ38$SJ<{e9k*j^x<1 zSEJ}%EpB9b6Sq-W>D%%wpt*U0D{MNg-0~~lh{YJ$TLTFT#b$kN^88g#J$o*6@i#wj zQT7=;*_9UbP`)GKwR833gCQb`7D`F3VXi{7$d=fb=TD~Po&}i}4p7g=6~xM={}Y;Y zXvpCYd2z*K!)+!MH^8aH~xjg z)nHp!+I32&U&{gF>Ps=}0-0-Ne% z_%LMO)+CfLZ=gPwu_^*6<72vxLL$15``X;dqh5EM?KCPvqf0;qBk4vh;@9)vL4e4J z+Ut+wmMX8XHTh#zC2{7!b7x0KhU;qb;T$YnFtQ8tB}FNV)4d26W#d0Z>^(de z=~<9Xc8?rOo&Hp94p~5^NoVS4t12!YGD81dRoG#DV<4GTMXLqsle3T zD_DThjdx2?HZ9%R5?tEZGxT2?_WU7|6qsnC_R4iIa;n~2ye(amW7?B1WI9HV6Wsr6(>M}cNpvM=7v!Ku2VyKxfrzm|O6M}O?{Zt#|vt5>x(L%O`4 zJ!76bq*5C|0YK1f;89nHO>Ovwr)c~P!(LlQ26h|rC1-M= zYs^0@2eRbE_na@=tzkJaVHMTJ5_!1VWOZ)lNH%MvWmp(Vw@ke4`HD?2i>n(z*65_DIu z<^Nl~XMWABwD6hNDl)4C!Ef&TaGYJ>+ZTX-BV~4C5+>1^;*k9Ti~@ytKDpAecFR;X z4o-!*!l9g;EA5-S7l%7kMG?u<(SUQb;e{`q$Vp^{D5?Z6wXa^O8&ey00qgZ}ipu*@DNX3B?o>`~^D6cEYdlvm_YU5Ki z{q2!OnMd~JvCa3b)c*zvAy8Prdya%YlCq_JK zBQM|r9H$7_tB6cs%D=-wYdAZtsp+gpwZnHuYnwZxm+#DgB3#w#Y=B1%4vSaO+yx9D>7JRge?=Eht7-+@CI7hWi1bUNTQa3K3Wpb0Z-IR|ou z6#roU9gIXSmG-9*#>c0})`PRPOy1<4i*+ zPpBm=XiUNF9AnK6$AS@Ofvp&hm>1na{;x<UZUfoV_c0z{z(I=_9j-)Dk;q`4vJNyHY? z{F+g%mv!4YLh2McP#?KEOwXxmitXOX$&UpEOfz&a-1;67FB%=NXaI$=Otu?E{qow! z#bTLe`X7Aj84xI)jI^6>;pPUI6fEfQDv~}@m)251x%)PXU&}CXW099CQZy`I59LCN zXH-E4aPIM%IoQg2 z{O+m{ORIBLStFSx@vYST46D9VU1U&b2jx;rh$1!~3E1{WE36f~^E$eZ|8dUM$v-Sv zvoS;2xkbgCf+>d8<8n^YL;)&3k+6i$f@JB%T})Z!uzIWjiYW!x8ok!K zW^|Wr!4)uW^yTD^0A6!3%>ks6oY2|WztPQ>O>kv*(?tw}Ru$f2m0c&H3?e7KMpzs{`h!)@YNWupR?h<_T4W6-h z7QCDG-=k-sD`cWIMnFkm^V~_jZz;JFFc^Q132V*J zf$FL&T~xFC{1Z^)PC6hR+!04Qda?fQPdQpvZUGPrahYSUJG7Tl&SF^WGqd+9cbR7NG2?4Y5$Bmcv}TH@x@J_eV}XLPGU*qF)lvLCg;fiej8S6F+yJY!eDaip55?#z z8)x8}?M#-?>ZV(x%Vp5i)!tR%Z%`7zks-~?LbRdML*;4C8`#74`VvpD7tW#Jy#O2| zTd(oRxm{4p%939$g70~leC_sR_=OsJB)8W)0YAWhL^U)hxxCwBCQUxox$4`#o<6Is zSYsB|XuEW(&HKQ~m*<8Pzv$V6Hw%5kSu5FWiDdE}{P;f-Jq(SnQ3}`uYre45BPzjUq9o-*>=_m?$;C)+Bskszt0b}Zwdu~AK4e;Qg+2O7O{MEJlWRsaQ zIh!-ph?By^GlgQ;Ze9nh|F9F_7_5oPaHEHHyBptux5LGod$^LCQ%9?IC;=nn>Ii6` zR310q2}rP_#bi-H%j#kL8;7kc)sfbElOzbdGObTC_>$DDsHMiNO&OZKU5m=Nv`T`V zb?l?(`Mba)ytNBZzRGhx`OUmGsKnTlQ;Y+ai+noBKc$H=9&oPJXd4BQ+G@rb8F;D~ zy+%2#rXB36-VDJ)kIB74yBV-g5b`NpWy6e`bBab25e*)GA>j&fLK+aZ>tmn^fhHn0 zCVL1D)BhDD#AfV%Im{@o7KHDi^sjn9`HJP^vXL=&W7>{#$bxGvQ9JbeU zocCUvnPe*9sFFC7_>&6j0fHP-qDbrY1-jt9LsS|2T0H0JGwoT(T4 z%%whFfv+R&X6C!pNy%Mlz7FzzIaL<>dIU6Ai8^a0=n~J6@Q<-VoB;OnGf2|VTj}>B zm@r0TRE&i3_!$0py?O$Ont9D7qY!Jwq?h0>_)x`*up1j-$)WG)gG58+hFC6pZ@laG z&ts?_HWNgulnYMa;lYHhWfh-jCGK?9F9~+@V@kxbba}-u01vxLjXnMmBsuHP&Ez9$ zxAqo7KkBSV32RonDQjlGEoh^95S$?)g{mhd1{!oriztWY6e*Y{S|A}F%)jQQ(2lmH zaT!6<3Eybv>0y%M+GA1$7*EQg2*F%7OQM&$5KO}NEq>?ost-BPx2MpU`UchAD%7z9 zV~jizK>7A{kwZ2kY=hPpxfY}Ur(wX0&3_h)H5hF`#6&O}gRwHo-q^3p<*_!gsh2IL z%>ao3JEM0z@nYw0FmV-Ot?>%Y+Ai@^n^Jj)wNq%D*rUw@^SYJJP6Nyx2DRSPyjHcO zgXmgHp5*Cl^AY;kP1}>hW&>CVj~X8(6ZF>#b;H0s$=o^0<0jOUu1mJvhUiw~6{mk`0ewQCu|a9jfbyvZ zo9f|A%HAM@7q@T_uxF}%F!{1?@5ZvsCa7rCy@jg&v7vp>#_w_ACFyQTmmP?c1*(vOKvt~@!aT?*nR2%o;J zpu*0S`8(n;zGWKP(QuGBcKUxYhHuWYLFu)T;l)KfI7O4bEc-fZtH#&)8n+-4 zyD9@ap(mGO=XDk&VO#eNtc^iCVB(b!m^AsBgi(7$2_dT;lg&=uwxtO=Nd|a0-$&O zh9^o2TtnqgD^~0yz?qVE9qaU*h8oJy4;WOenvAfeFCA~De&IL#4I;4p?$fLjb^x1vyY!TD+;lz!XM$#(14J`@di6k zg@T3O1Z7ojiyjeV<^!r;9$P<5J?aaw0W}ox9(Wi=^Y+o@>!1}L+I{IVWBjP+$snuv z1$loI_#0?Yy}gb%wVGA!c9{XmPO@g#IXzfZtxQ-ER$wPwV+!FEAO&Kmihh)8HPjf< z0Yu_=7^ABd&%rfPg8~QF^0`4MyOv}@yH-|z3$>@e4gPU17@3diCqV1;ctZMTuH7@+ zUUC5QfVpr!j3%vMEj76zGv?aqg{b9B%M$QC(1Pz3ISKM2txFF03)HuyO3u%Qr{CIB znew%0<(D(PEzLo~9D10uhSRk|LTfF4oO3O1@FBGu4Afl;;|x{s*MLw4<&7i&q%UVc zc4G&dJHy^Ww@_Qy&dXZ@DZ+YS!Smk%OA=^s1VyH*B=Gja+XbD z4QjtwFo|W}19%Kigkrz6t+^31&)v1vU5-I>64fOST z<~;hOF#AfGEufi=dz=;HKn+c2wsSM-FsyD_kXS&iN^PcgX9#vc$s0IO3ZxUA%^;Mw zZ48|bMT7OiA@LIPhl7H-eR!LH4&0RS0j0@*O+Qdt1fx5veY~8Sm@$%w6`cw}5-EUB zgNHbzRT==mV|1tHvR*(fUFZjlXSE^5WfNpV@~|4gEkT9Qnwjj6rwFq$VssQ>NWx>n zSu#6cMgxS(JgqClPZn{CNj7pIF$496stKkslpZJeN5J%bhS<@)%&!?_L7M77+Pf1; zm_LAt8y{)g9#>48O7G2u?}hOX&pE}*5JvEh4YCO}O8!4}>XjLA@POSUdON!8G-#AY zeT3u;F9{ux5#zRKF;_p@go%Q(zYY&Ov5s zV}VyKbB5&f1P#LxMF{iSmD6*nRe~*4Fc~v5S?s@P0A;Cj{-3vX)&|9fKybKr55S6$ z^Kol>Pmh@f0lh5O5@UNvg73w5-(a4?3A<(V?SZ#B| z{No2Od1+r1*k$8URfrX=S4kM9xaIV5XOA;;IwesQW*bx&+!G~cxcJSasJ7IFoU238 zE&af0&S9)7ekyhi?>YP3_LM&f*7zF@w8z@Il*?QGS3n{&RoSq^H+^2_4s1QqQ}gyr z_J%FJlhj%uMtfp9smSLexUk`C9oD^=DCVB^1~zr_KQM z`97lK$YA)co)#-s{-ft+un&@LX{#c;VLgUX=|&)20S}%-TyY%rNi6`P`(U|4K&8hnNkR3E zs+o!a)=Y$L)lN|WI8~pM9=Y7Q+mL=2op9v*U-SFNC$)*6mM+1qti+&+9I&RA3^b_+ zftz->>kL<=T84~o$47(M!L*m`%qFq27W4s_79vTruvMhqQRV8@)2_QP%Nt+fkeY#? zCR_fU1=#*t!t6U}OCPaSf`ozXyw9zcVSN$lrf*lnC$6s){l?IVsmA#w)Hcvv z1u$-$9uy#d(3cHc*^RBtPNwfa6*T?ETk{qo<()8U79_BZYZ-k|lhn`_zjPLAfPskh zM`~q&&*w;6`dB3SC1vdg9IR)vfV)#G`g|{JeJ`qGZhxXReY)(^U!CxR%8cRG8y(!tN&kLd&QVo1=+y$CDm`~PmJjnh zptpmUs+@7UV{Y8LUe(iZQ-;SY9Gs?U4Mwg2w!zM~g28~F$zVOhOF3ibhbfEh3+T2g z-j!1-+K}v!YeOacK%CwG5`6G*q-YTa`y2&J@m)(#}6(J-qX^n6c!c^n_8Xt#jx|c zOtbt{(uo>^m4kXf2PNr5cc5EeLeH+)fe1qErKjgA6Dh{Hf!~o@NQc58`Q_x}X1|CX zvNN_HjHAtx4&U~c_Z;_~68wutxjQJG?Oe-X=)}LoGOLHLKdg(hR*oBQ>n0W&hb@$C zxmwd+7|YN5qpNYl1y(c*9P<6Pe0P^NF5VCBxwG9^GUdE#eZQp zo6Q;*<$m)xhxLdrp)AePj@s(hSibK|Cj=5bx;;KF2jD)Yh(|k%V-4aBB%M(X#H>-( zs-XHfg_JT>wVQ&2NYFqYYt6Lk!4^xkUhdXJ{N&yiLos=I|0u(AeSNy`rIs%dL_62zR#$8(|@7Q=p3?*{=VnpWcwh_JW#5?lW$;fx)|mws0(bV$GiOv*%n zJU44ALVgWi|A+O?>DRUf|q zS*-@d_C}0o83N(+5kDD+K$BhhPv;xeJd(WXP+&5X?K=8i9%f_aq7*ARPHaEA>^U>> zMy)$EE5k8kne=q$JSW8Hjb~4h+xTLcgl}g)oRAu@`D*})G-TbGhX#`|bQh3#TaL63 zE{@O}?F$v$5A4C5n{r=vnmtY&?i2~}oLwK!HSker%YT~tK-EdfL3yR2)R|qLx@J-s z=Yw z$^RSX_X?{a{EL#Og70`>X({Ed`C~!m;vx;@amyhnHEYH_1bfrGZ(gQR>M!UHwW&DW z9a?Pr-)=flILDXowgU{ukVtyYdnlg4W?eorbUbRav8hGQqym3~QJ%&-8*uhRHFlph zJb>YO_ncYAmk$~Cjs+(68~GAA6BDyKpUp)i&T8l3M!ty>l_V}mZ+WOGvMa(fKSNpQ zkk{6A?DICYxNz$o->p`h^-zM5_o-8n)5Yxg_~DOD;b&o{FU|`L1+gl(>D09y=0rE| zdnnO_S>?F&kD{kM3xl%#_@q7>&%;a)Amgnsa&od2(woLbvbVTOaM@RL#{H_(-+2Kh1sn+F0_WHPSw$wtZ_sr`gbB98I2O4d8GY>J2W) z_zKC7jlT~7Fepb37GjAqImHKlQ3-j6pZx59-dbL0BA#STX8|*~7M*;e5hvYHV84cd zN!`bpAggv}4LlmE;t*Rh^7LAAnQGT4EpQ;PIh+#jTmE z!CV!GrI$}3iyEr2(c?Y%XB)?=b~k>YJF;naS-tGAAM3>27`sr567vUYWIJHh&{VZY z*HZINxvPWnmm&*qD!m+OT$o$xP%HQ4*NG#LiO*d1j}l4_RS$G}C3-D3QQ#nz+60Uq z&k9<7uhtSJctWja|f{&t1RP`!HV6DJtK_X09G+tJ^pY` z%^B}k(}A%iPji2Cz1#p+U2GOg^{$P9?s_x2xTw_QrYJBLuo3TP_DM9pHLrRQklSt{ z1h*mqwbQP(;tmAlsM{v9x}t4?1{euR$LsoG{^h#n1{-qhXKbY3V$k_}-su$iX>t32 zNx9GBO>7$40}34hpCeo8|9{ z1H_}Xx*UnWXJr3XNI7|z>=(#VrY{}lg zPo1%?lUN+Wj*T@`#B3}&D6bbITsN!A29@OMt8aV`IR~@KB7iw-H@m)OWwa$)O;zD? ztDekI5Zwlw$X~Da$Hdn}2fjVE>ps}SM%jC$5|ENOi?uTyaG1^A0^wpGk~=nJDZwC& zO}t6kZ%rn_iC85+s1KxKG~(~dDAQ&A3EjQ%X?eNR%&~|m`Ib?lVQID>R5bXYUT)sT zM;rox2oGAWNddl%(cUDoXKd*-VwxsU{5jRdb)ti5frYn^EjvXbRY?i571yC!#@K9R zWP$0V+=n;~j0?iM_BUN{*J+;kYr74yEEw#_hag)~^I}&L zhyZ4F?GB1CQ|StHZJjJQnk+8uy4#j8C0gF%yx6FJZJ2nBk-dUS>d(d#5O>fw}#2j?&kC)|u2W4C!w zs>)K)+soN&?@8HI@-qH49;)N%3~jBi4%+InNFcNvD$sEdTOycOip#B9-!UO2a{BuT z;rTbl*YFM%R>U@>h|~M~qJl6fxIdP;K#H0+M1O$686&!bSk|aib^zS0G9W;dU0n{I z`7+wEd%~_(L{_+Y*cFhdqA+H`{QUGvjGByy&~ytQWW!0qM}Sh71wcfUi4&X(n|o5o ztO~V-l)8(x-pvbWa9BOFJS-~1^t?zIxLu6=d~}!}WdRj3Gw;GfnT6Sx-{5QfGf7B) zEU|qSnj5!SEj(FVx&h+36%qfeY>B~#nJLJRHAf7#5qHd64B1@_-RxLD19qXozycBp zXp-F&Lqc#!x%7T${LMwd;ZJX3HXM;=mmPc&u(TJ(l4dp8?IVg^79o>@4YObFVt307 zs;+$dgU_mZn72Q_& zFz4JH&L^u|kN{*bx3sXwH@o?H1Mjn!XfpK*t)2Sw?Ueznsz_!zJHUSa0L4n4E9vKB)Grtt+NNqqKnW3`BxEBDB*wkvO1qiA#RngF30mfG8&K&hUH`pcNRBuTx&wXO$8T|3SvXH>&QuK zcdPR-FBbq>@?Zwc))rZj*4H|F3H(E7oh=ho-A>bi{xhXqGa3eS9M6vj6vA!x$9`*e zS#t7l7YZ?sXob>|7McFC=xsg#V1M-aZvE2lCRRE2-E7MXyj9lSg4l{T^z-d*sR6PZ zfJl(sPGj}y&qK`$n|a*Al^s1@O-r>s2JuJ#I#6h7XyCEX-H%RtXHpGSg->W6xBlL_ z=}xu?MZ#}R?d8GjT{({4aAI||Y0r@jN`v%7NmycQc2}g^h}`z4Aiem=)KhsD?{~v= zzQknt1DbLL{0u*W$t;OLfW;h+=2Z=QuxU^yQdJsnJtA-X=?FOP9L*Ge!g2EvPeam| zyOwH@Bb!!7A(7Hsk=BBUTj2hlzSllbxJ?scbol2t+^vTA+KJO-V_+}jv5InRgtSuv zo(HDWnGu41m33_)E!04C%GKf-I5oMl+Q8~z6+W6KQ0jd(K63G<%^uh>{1-c{j0Um$ zc)ePDqLmWo5wSqg0pP6-b&TTIMHr*|GrwJR-X<+jQl{e2X?DKzP?g_i{@;AZ-&NeP z(EkRfH3Z(A-tSNC0ym%Rn8S?>kR2u@AW~I7G2RlHT`u{4zjT`5`~V&*wupgPGQgTRAIF~FEdTUv zau|!=us~|md-4tHvuWKPSVprvi&-}F`;uh9Tk_Os6l`tY?ICLkPCZQO(i9Fi7I+g3 zw0v)4l%;J#F%RqxenE{sTbZ-gS!P7vL^<9dLBD-^fVXNhgNa=&PNZPyPVxL8wd&uH zN%VmJm=FavX?k`MUPTcl`;EMJg?jgPjwkE#Kxl6IbRP1r=?P5nW7 z`_MN19}@-$HklkHcsX=-_CG-}XN!w>J_FsE0JM`8*~r}JK)T=yV-hQbTX|-3C9X z`upL;!n6%(t9Omng!u0B&ToIGHn5z|0n@UzKsRVq9%G-CA4{t(OCGK8r#_-p+!_A) zqU*+8HFJ+00ucS3btwO}_+p5;uKP~Bzryu*9%S1{UP-)wIGuQ-veCj+sq0lP4jX*F zA#wV+ULquDgeyp?7jXBWGzmZa?EIu9AJ&14-3+XYeDag?)Ud>QAdC~(5l54@W563O%o!V%KZYTy9la)*9nr^36QcKL$ zg0{bQaXbP1ekFm?*XGGi4Py}X&A=^pF$B?O%E6k6{z6Nm8Q?F&ptpKdGA)+tc{U2nRRLZgZZ>sH znK4h}YR|J!ZDhXxI8%hZxE1kUZ-V3uoKM+kXdq749pt{CPM5d8+jAOJd!`p8N1c_p z{}dzdp-Xz#C?*ut1ut&? zr9rojOXG%!q#7=_^%xy&n@LPYa7N8wjZ|;uU)W+c-jDV5cny`_%BS+UvO!~R zl>#(aKIPwl0H;I7bw+?4c)mL%FQb@kfRKOk4H}}=ioNT<({UNRIi~%ETf#fwBH&P= z4X#ahS328@j)M7!zH+i3+(4d-5RIwBfDTwQT@a8nXI)$5nAC?QMc$2YRxi!&^ z!V#j{f;jYW2vl}5O@Wvyd32;|Hb3B0XEM*fWfovsHoX)`ovZ3fo=50^ljZp8|ca=OlP3JLQt~VGAo>)?;hmVZ$BJa zuSOQpZ%I}X$J$iQPyNsJ?7*b!Ok%kY-M*07!dB;4_i~u8+LJ3B+%{Dj>6&NNi=p%U zeyKGE9%JSDGnj%jGmn#IN;$eV<3iS-8F+xsX@0!HnV+gmUIC1dIhe?R3N&d+`5d2a z^jZ1m&G^E8)(kP%;5GjvlaD}`u7#?aL1?ZQKERKUwO&##FC$kQjFA7;=7(Ch@$apl zY5r@^qy4Ef#T#qp)+z0Jd*@ErZx`>PX2f#vjvRQo~dk}{!<4|EYK zQFoB<^*H(i=lYq~<+o!i{YwEha?)xveY8dH#Ooq(Da>z3lZ@v)FsU>DkE-jAi|Xjw z*VjanSA-CaqBJ8-1O)}93&uj|3Q`n-6%ml$d)b6nK~d19g9|9VH|f=&;7XI;7wLWJ zz3ex0?*jSGAO2+aPCIkXbIQz}`>OfC+zX-`qsLiNFzV#v#9eCyMeI5pBWYh*!tp&R zATWAl1qXP1P?vyecB`um#091A?SCl!2inQ5pZP#(<;nJ$yDpR2dZ!wW(Kti+FqC20 zAk*=qH27Ux#JgHO{^#=y2qS8Q~7Gc7ME}$`^xiC@V3e+B= zeC3y7>OiAXnjqT&IAo@JqcUFkOf-5D5Up6tHv;RyN5r~BN}mF&JxZC$m;nWqXHH7m zoCyf^$A1Fj#Is3G8l_D0p?*TGa)J6tGU!9>I`o49T^~5=WWRX$#1)vn0$0VQq_`W^ z_;(AEj~Tm&e!kq!TFy_pi4C}@h^h`QtQlUSUFJ&fXT<3;Ij;xSksH(%B3v+krApS5 z_)pqgLSagZjCwH~T}Y%NnOt{X)KLL;0BO;l-1W+R(%%w9WWYa^_rCSGk^l2a;N+~% zM7e7bA{CrKd8KXhjHb&%lU_;+nh^m-*5@dt>4Bg*0d(G+i3%RI{x!T8`1(FB7$L|_ zjaMIy37x1LWBko~)js!eV9Ot%9w4E#lyhC1)`CRG37EEE7S~9qmcjTc92rC~p2VoL>X`+q<1lL;%#8S60N|k631?O@J!JkQ?ze-yf zziho=kAM}m@M{q10C7G6N#9bcbb2$~q!hZJ(ygccLJ0UpmNn$i3rU24Pzor=j~H~6 z^_h#+J~<8k0>rGL5j^ct7#hs4^dlVYkM^tHB>_=dfW0+etr`m3W0vm%4nPM%n}NJZ z(F9p=U374;#Bi!z(`BukCJo%_;VBiF_CM4HfQrKV!7;=e~eBS=G19xsm*PZt)3gm}w2I_B;Ol-H+`WXl} z?p>?KV=DpUATZX8t25&Ej|u#WsPHD~6#erzcC{Sv!ZVz`_&IiPsUTemg3lL>GFhA7 z=@jL%+?fG>sK>kJ&^imCOdIuer=X94CvSfnVqD2F>UFpd{?Pu(J0&~Q{$Q;S=!{8n zrThaA$pcf&R$b3~{2iW!dxJb{4mJ=#V;EcR%vX}iaI4L4W(UUpj{5G)8mMf8 z0^HAC+qVUWQg!73xZqnfG?o(;MYE*9B;S{KH4Yz1UW`Jmv(Q&EHA*vM(;DV)QOf!R zUf3OZLoCAtZ)tM4Z}sX$8|4XxThRdgiY2+ zT{?Bd&FCKZD05a4rC&1p_hgxSsE*v~f@rXlw#V75|4Glw3J&RZfH$I$?;?FAL)oNP z@tp9x_gP7YNEEInV_tkC**^vnsYXCabl^Btu;Pjo%Wkx2-z17Cc3-SrnD{I~?Pf%7e$ zk=dGflMd#ftLd9-GI?#;5JeVdjoG!QMwUg{>bnZZd}(M%!%@1)WBIuRX`V}vM?5S} zKLNUE&*VA1J>prIf#aKXmc7?wsg#R@AGI5?Nqq_{SDO{9!ePV!==-q;Zr3HXJmQu& zIFz_u#7TRpT_ z(;+qidRttxvXWz}v0N?lR^`&0u4{>hafq9D;3VzR3M<>0WFZpW%q%&mH@w zA7Ax)+9mFakI-;?M(V;Gg%Vj|!b2M1q9Z6p{e|+Drwupj&*qS8e<-#FB#C=RIateu zNkufh`EZ|<$ibr6@`Pq3a0ebZJ(AS&EL?6EObcXHv^C8317pPbwzjRO&y#u-jfGr6 zjQdeTVzq$fVJ?f>wCkLd;Geb2}Q;N#gOb9#gM?qQT?PQjf)||OCX5(vp z1*_kC2pgl=>Y82<%X|Z}ReP3^(`csnTuIb;!^~#~!t+3oPy$Y_dH?!w?TKK2+y|gY zf1Ac-3-0IvaRC3lLI7FAX4BvcH0ik2v@Duu_t|IE`I;>c>CMf0P>z4t{3WI+(f)_n z&$ld&*8yH6W-R`RVlne&r`~Ro;Db)goPy3?X7NT%KORXjwG_M>5m%7}Qx8H?lTz7_ zGMkf>fXzSwgr8p$DVS*l4W{OBGe}mGzK1EZyau-$2PGclR3MxH5}*?W?=a*rei&UDyhh;ki-1CMJyxX* z;9hJMSiesmCA|H?!x6OJ^R1?a2?e5imaq0pl&X{P70vpY&vJoE=S`u-q4!IdTv0AB z0UY=UTDYMx(jq_VoWKZva^{b`B9b$dp|S^H;ayqTZ#LN@YVy94xV&%HLI%ETVr?x^ z6csuJ@bd$DVn9ts8-tab8r&sL%gs{}c{GFc)}^4AOyZt31uG~l?=OIjz(<17iu$1M zJn`ckz=)Q1DJdIOf&(Ulcg;)6iK`6`7hz5TQ00G8Qw(Q~-JUp&I#*_Msr%i7j@tE@ zuN#+Z82WW3ya$Xy6rP@v+856PegNA@GO1q=MqgSx3Tq?C*{Qd7EbFahi-nHjZ{qYm zz!U)Ue>E;=jfJ!rftn-b(nl+_wTd!OPx9ppIj5CN?WubbIP9-#Z#&-;Vdpk~8hqpj z5bk8Ex<$|Yr+46F46g7bQu*Y`-7exM^i~~hL`%O5?&hP020r~KK_rq?-niWSc8DJT zR%{*eB_uONW2C8>iC**|BKFvAwSC6*wJtXMV`=yAjSOtMf}IeIJik6Yad}~0)qd2o z(va}+{Rk+oBxohN8qAW5b&I_RfXkI=ZeYEZakoniTZE6-C5!I~>+KD}nW#$csCOA_ zw3%4nokLMd&g1t{y?TIsuz|FUoD$UJzWiHJ@X6>#0P_MC5hDW1Gmbf{xn&}w#T#2U z2tyeA6?Jrbyla!e;;H8>X2*_cC0kuUaj`0+Cpl+q;9ov!W#g*9Vnor%N<%MWn9?O} zbOE%RQ_dC4x=)X<$4fG+973!WQZ&7sXf6@6qa?W11o(a?7z^<6R%00|SFFN^mg^-* zpD+wjYgaNGeFJ#Nn_3%Q08%+D4yOV_D4+)Zq0_+ntKNJIcBd~`1IXE=p7fltma@BT ztc+m_w(b{E5aUbb@Yjhsw)bxF-vb69h-jWuCO=1c z!sXS2Jc0DbQ5*_MX;_LO1E(LYe_P98K^r|;!fYg}+tc7i?%Kma>u&b`j@mWn%LOMo z!r4%8s%?yliy9LAhJ%~@RNzi?yU1ZEs%ch}Dm9mk`LCdF{EykLrC+@R8ir1dKj*5! zFfb&pxPg0hmRJf-TvP!h8{HE@`rI1!@y8?ot-@|KMDR^E+wG1Q+`P;vbV@uY1+dA> zFITebjy8ab!!RgRom8bQoCApLA2_T_9WR6P21Nh7FPf6j6FDTbw8!~o^${{%ltf{M z{h=xVf}?R>@5#Yn_W;7{vnJqD9c5h4JB3z9n3Y*XFE1o-O4!NZ&XMLZ42(BPi?Sr^ z1J>aX#7<4CEfzx`ZE0s!u*}4vz6)4wAbu9blE8~G{bR0A8XOME62aHlV43@al}d^?hXC8hW`KTH z$?U_=n;~8bz3fgOe(vL%oPtK6@L9jvfBa5$?aV{<1ESw#3(9b$lXu%F%|`@04k2?1 zjx!rgU(Xd4V6qphN^YtzGM3y%R~d*I$7*jsY4rSJp^8Mfp%GU9c`}8%M&`&ktNXFp z=tl{wlzyG;SQSmo8+m94b{O5a+Fg3PXl>wrfN`LELTF0F&;bYVWiLRL3t2{wHOaaX zf5+DYzxA%hST;5V^HZ-3`#H-*B6m|5NJFV&e@~r*Xg<)ryM&{DA#j-#UzC-U{&o;q zD{`E^>TIJsQj9Us+!EZ3P@rqL3e$&xvfO7}OC#qmx1sQpYXVJpmSJmh{?)lpwI@O- zIFR?jN2lJ?2;dE`xhD#K#esuRtG!)&xrE!TDQ&<%Boj9ecysyC#FtPV)8$%d|AS)a z0i^UD#2@)8FDY0%irp(F^tVT&6SM_{eqpG7Q^e*0UU1PC27eNh8`*LB<6)wPVD-j9 z{QNCHt{mG5rVm`LClHuByJ}DD^EI3?F<_7_^6H((1@7D=qyUeC3_U=B9r?a5w{F zo)V=bHSpCG(Udm!wR=4>WRm2CCk@;9A$b*=?j6yfpcw*1Edd{hC5eMy z7d~F~zUj{u>1M^2d+6IKV64$ofBT&(8lt$+Yeti%QBRoJVr6MTA|zo^-BIeQjXWV0 z%Tr_(TA1;k&=-sDxr_CT2&hJPch!rJ)j#@qb3QKWeklw2shnPamSh7a(U-6$o?ZN8ADNO<$ z7T{(%+Zzi$DsxFwqVZ09lR)p6A~kig2_~Q>7(y6;@IKF_8rr%MaFNdVl$@aM|kOx)A9>*#ysu3MP=B!dArS0 zhSMAt3t4FEhRBR;M0OV~<%|N&k+-!+kqOFfn%E4L}OyJN#;NC2$ww4g;>|XMK z)&*oLtRD)4Ew?@05o!hJM+ZrI-HSzAt|Fu*0~lY*-YE+YA8lx65;$@QdCip!Sc0m4 zR_oWb|*m@Hs$rpGz)Sj25%>*vZ7GTq;6w=eCl@;|_A!vXrO1(Xo?AR^8=xHjqwy zhALlHkgkIZKZmO;vQbw!Vb7Etr3GLLwa_*Aoo$ z<0manh*G^)DCs(1CuKKxE}NBf`uY;i4qmNJdVZ&uhr$&63jd$O+NUjly-x7F#Smpx znON83vE}IGTKY(;kLkD~Q_`lmkc*^z$ve}&JfrlKek*!L<5$$%QZbWJ9YiNGb1N|R zC~5x`&lRor0GutZewRsbznFdo6ek&2&$x=~O8yPvQGu)k`wOj>pcH>kLt$Z}>!CvO zZbX$OM(OJzH64A#keA6*BpwXIfu#2@PdVXFgn@Gc4x_pJ0lf9)-7u^dN+o;Py#}w{ zweNK;#v#C%J4U|9?qIdB{1bQvsq-V~3s5H)9_0xqRe@-3GHyM|5o%yv3QG>8*JwW|uJ7%vN+h7Ckh?U(CCMrfn=W2f4P zRyb#9N$vu|fXC9*L(86v)zUt92yMwwn<{U)S&s|`hnmS{%>&N8kBmK>2O}rk@nu(% zF~^1YP7&)o6O z67T7vo(^vC5Tx9}`hrcD!Nk6K23?hAB~%)(Xa)+`QcJqjB)wmaJYV@SH?M2uT41jx zdQFH?J)@(O?bckFl|R-3f=f}5zgkupL=j^_L<7^5Qz84Ww9XJyQ)k=!agR3FyZq{1JQi=nUejVJX>80IVszK}d z@TP0m>fKC7n9YLJKRDcV&5??$tLe{FN`&xuMU7AV!$Q|2qnT5d4QPSTFkZ!F31ha( zer5)Rs}I=sLSrVS%vni*jmlNcEf(_DF{w`%e==h z+<(gS7P@9b)xI+OSn?D}pz7WEQ~fq|D>F5-Ed#d!M_?&&f;Rel;uq`ud#YW2-PMzO z3u}RWTZ6$n&OYUTF0^56dlXbn9QY9j-VD$!oa5+;5UIh~mgYSC(UQ!%`a5k82Qg}R zs(&Qcp(ku;Hg#9aZizW84OUpCvwgHbiGk1p}j!^4mi-J`<*Bjec5`si&Yu;HDJ3QQUv40Eg7)YPels%!*vm!{X zTCA0;=n{GmB#h5WklHfYm&X~#eh{&nHY&2Yvcm$@SC%k5l&jcP{P`e6K}d_EZ{$k4 zs48Bi*E@iUp=z3t-ce?=Xg~8)Le0ork*22U3GiU0fb-;YJw4ZbaKZD5yFCnJldNWa zS`lF=g35VVMm5`@ixGlTNqP_@+bR4qj0*TY|WAg*Yg27f?Wq~wY2;>u<%l)x;~%UeX@JeDv9 z)r!Vso)PmIsK!Ya9c|LS-#vw&g_yrF&9$7rF9~q>a&Q$=OqO0y}(xRgW`rjL?0Bl z+AFjObWlJ!KBAa794oAtx0?}4!aYeIu2QYpsxOqceO%WBowf;==MbqlTih|-7-)>S2U}q?*^X)B#;uSM;RI0bRA+VjvDsE42eB38!|gjmV>)b zey9zcvr7nUQouO(WXzwy=uf|gE4RCNqmQ)A2Dpry5+Yl`ok9qHV*F+A`6y8!pI_d| zh*a^2-@(?o*xEJhykh(wkOudaB?fxWz7jtz^RgbOsc!e_k9a$8Pim{kS*`)}1b)u-e_&spaaR2})L~Tg^y;ncO!h+;Krh z@u>A}ZJyz(kSGYcG-?Oaf{^Mmdw!O}F}zb&J_#!V`aZk8(54sVo+3$px3}W=JK|it)}wbSX7VIWd=dx8KGh3u z@)FFGQ5$%T4xLU*%G#lg4(oxcZPO!le@(?Ub#axU@{-jg zK^$%gjt7X=h|V1V(7bt2I$Oa0#}fqW&s>D4)<$b7)W2 zJ8#fzei#d~eu<>jau#G1@S0_gln&~$?95N?HAp3o=%iyKHy`FT#iqYyHk#7(;->YF zlX9D#9iF*a~tY-qPc`*!@E=gIDpq$5eIjaR0$0a)82 z{p{&g-s}lonh(i6FI74$akht$D+TI#@If4BUw+x}(&o|9zi18vvU81(R1qJ(uP7dmKQ$hkZ z=$kFW*^4K%yfjO^Nz6!RoWj=$)LY4V!(NyfD5@X+{T&=1q&0@b#v{2yD;I0Vt$^W1 zO@PVg`q6}vFOfljXUTl>Ds36yLHw(w`S5sq_dwdXWoz>-1jRQ8thc<)4zI7dvl?jlN_&D3FrLcJsRQ~2K z*RZou5tYpLaSgEgkNBXLJal&;mVSfu_4&`_58xq`3X+0`hZ>*p4Uxwx02n@jXI3gV zf}0(9U5;KtvL-~h`FPE=z@wG7#66wEN+?UXeSAsn*+K6>TIc33iB3VRGUCkC@1gP;1*l+8X+|`F z#d!&p!gfNfMgEBjO|RyLRf}C7>hHU>heyB6U!!yhe~ewx>b8O-Up8%it9;7panB9F zurt&Jt5gsl6`)A0q>~uvZtt4BhvSEnIux&N*^BLb1P%^1@#QC9J&XnQJl{DUDrf-x zU-~+3kJ^vUpR6jbe%W^OfbX0_l4aYBnjM+&D1)kT$y6E!rtR?}pV>x~KLsvDeu`IA zPKXSr#VQQ&7P?R4+ zLL)8ZuVV2~%gV%8wc_%0&?qF_Er_S1TR`3cv|u$QL=rg7& z#$0S=LFta#qXFwzX^|wpYhgoYTWVqahYI6N?xHTtmL&{Ra?F-Tx=*^x97G~3&k|`e zA8}}VxR>-ZISlI@yi2dCu#no%p#C+C4*FYn;N$`)L^z#7L=PN9geilc6Z8p;s3EKr zVUrZAqeyxv(^jw2+;vT^uXN)Uka~UYqIO!>e2H+nGxX(=yi>-#WA!5k`HCmPTJxal00u2T!F3D*-$eB`&Xdb2m~&-_##c>sU1gYR(>YQ>dWd} zGVnUf0^CRG%C{LwMY2BoOE2pn!*mp)!v0J=NzCZ0bP`5{sxIi6Zzu;2VJdeY8bd+K zR9geBHeSbeeEhTj@&PXe|_4{M_!7xpY&M^S|%dhQjPV*m}_ z?gC*+%Z!RO^j#cbxcD-WYgSNDG;pgvk-PY&(=H;eQSuj+ zgjBv1huzEDd7(>X(h?F6d=_5!pub5IU8&j+qKlJ)k`sq$`bNkQO2I=Ueab3z&>odxDWk(4Wq%s?>{p4h&}Dn3~y z5?MXX{`T1o+;B(l>76v(v^e^5NMCV516?6&MFqavJeD;#AeUc?`qQowhu@%h@-4xR z*JolCHEUoPNTt0+kDl$|(*F*wgOC^H)b|h(Wp>HMu3!)*&w-E7*S)@Dw|D~ubd#1? zMyJKW+_LVIuri>m-(k>7-sE*wqTZqj*Y}VhLLlhe3UvM_-)AZuXx%F{5ckom@2gWM zbDw3-LX&k)6|npH5s)bb2`@{B-JdZdVNAxJcI!3D3pX%6*QN?CFMhe+x8Lo%6#$Fs zjZ4)som@rTC=$6>BuLqf4n}h%6F+uX0;+3=)jO800P~)BykVDT(#SF`n!Jp*{SE-LtF6}`_+1kJmuH0UWW8{QuIXy^ldaFkd5 zi9zJ$RWmuD{+e&oV1SHRIFIjuBw@Dxo*Eea^Ktc1k#XY>0W$%#oTYgT&u8M;NgNWB zGt!^l7diYH^ZfPVxj3TP5`wyS({@5E;A*xlUI2GqZ-#H7lb!R>)7?pID>0K302>X# z%a(dFZ$7o5xwx{>sHu@`4u`$KzEa6$<*A>2|%<*Jqu67zmUHFH{JK>-yD z?aV5=LtP$;nY+UHJyL28$D3K+6+Jx{Ok1Eiwg}P2?VU!a)(maKsJhIg9y5QQ3CuTI z?zGV%&0qK46Dy&XhPNC>g?FoE#1wKc`{o|$X;;RY%$EIy9%*$bb%cyg>qvf7Wgb3! z09pY^+8{C&5VuVOf|181s)L?2vT6$&WU#+^2stP2I^SQwGa`!(IzZaVDTf;TGlvRR z7wnP4q?zPw7|syfJxP=0NbhL(W`Q<;?Yp3Xu6A=T(I@$|L5q3WhFKQufvh=$q9S)K zKQv1~`>}Ph$oFb1DXnn)^!^fZTM?MVqo6OGG)xL_dXo2&5lG}$7P^h1*}s0~7}2*t zZCZJKl6vpcj8BN{kF~YRqTEDF_eA$A545Q4yU^cS3admm2Rk#d{TDkcHCegz_)P+QT z!FGS`8(`8V&8(Rywg*nG2Da4D?FEK7^^&>NhsA;BvjG4o(O1x@>cTH1n|@-uN z%lCrVs`K4`^d5HDxPdYEv10i2oN38<@W|W|cHJW9b>2MAb8gBqY zjzcpYJW&M+Utzb|K;WEJ75n5RO$x;rMHNyYXZB^80B8FH4;oQ)22s`@^3v%=&b_0B zfyj3jwrw0p6h&CS^a5rdJv_BV9JE||CX8hL72;LkXw^KOie?)E#hm`1MAU_TJT0Dg z>FxB~S<-!MrU80ubAxSerg8$m9zMm@9ZDnsJ1j&X#=^ za5{*m2DJv2g$y9Q<5S|{fsPpb!}1WgM`ZUBpuAJ^85p`!EBs5ES*nk2v3&o=5%Exs z0noxRVCTRzWyY^S{__vvpV0SG?aYKh&^vNC**fQ061O>4w|cLjH@;;G4oY7E-0b z{rl&{ZCu5=26#xOm~@<|r;`^RFkmbA3ceOWEOTCe%H@V-nbSAsIs2rjFMD{54pbSge7_n$T%TgA9BMFelSb2ZlMa zy7eH`Z?&Brah`eR0urWQBY5PnP&eI`GNA`N_kulR{d)MR{?fuww9=a7&N7!iCROsh zvu!G2PKS^Lll4I_vOXai0~(#C2`*!@eof@A7UA2|-9PyEFKB@vEgp0#+Z>eG=#`&e z;8-mM9N(LLcc><)6)M!oq~=7Ixw+Hc(gWL8!@R2Yi_?bzL;;+^#Nu&lkxQK8C#l7| zRFU9n4n5G~m8aKa#Mj9ZWM=RON=o%b0X`Fsyi%nhnLe;2hCB9+WNQm>JryoISPQU_ zC#Ru$TQKF{%f5o1ldYH}lyF3O>l%KMc zer=eHy3Fp;7CMR`z`DI>@z)rDDWDJKVO^!3AuXdSq;0N~|2XnQvg-2#_z9Ox)PnWC z0BPMEkDmWA?gkkMi@_Khw@<(dFBRXmavu!)bS!H!Q7DrhWJ=W)NbgW-n)7g+5pdaj zwU3S8kF!c&{4yiS%eoGdC>Y!b1fQ``w_YiTmWiY#q~|;u+=c3JY=Tfz zP`c6(a-N$*AoI~URe_L@2Ytok_tYtpi#@5TZ4F^^V2$7Lfz<}(_*uJtz@CNod(xN{ z&MGGMrEgWq`8Qn9upc&EL**fr)_I;bF^gTY*&1ET@V(25c?utrx zd+P9KbRSXj5fB5Du2-X@Zt|FqvUY)=w_~0MohtYzCPj@99MC@BL%mOkOdkOyS%nf4 zFB#hX!$1nX+bIrR9rw@^(K91WKD_R`J`o~xl-(;Q(l}~LdFOyuj~PG&++UX|ng#WU ztRKVnyOTUFshC7WTJnl}xU*U9_J|l&e|`E;A$)EQ=8EnC#i%@EN^k=ChHF5e43Lp0W88sYks4Fcx}yh?^Y_-xmy@{|F*vre?O7qj z&SnhNzsPZiA3cDA2LLi}Y8= zzC(iNbDj0R=Gc36p!Prn$mu|DD9hQul>zN8YilC7kI&^Dwmi_2`4<`^Egv2$lCqCZ zIbW;XlL%)$@zqV4{yUNe>_D2XW%jeGG^eA8K^-r5lXO}Cyq~GY9W1pod0pa|ITTT8 z>IQuifw$y(mOdvlxw?aZUnUWw*4SiujQcr&d%t_csq)r1BjKp=Au!WCF8#a^C>Ve9 z#fz(zJOsUJCytCHLa z`?tO9upnqn{OZpy$lZnQs_!&?eGZRdfTvJ0k5l2jcUAQ5)h5mbz2ExD{V<1w-Z*NHgEWkYj zX`_XC2Z6O+iL!e%^3UmbC1$lRi^e2sH zrFV*VeMc@v>E?RBifN$n`dmd__o0(@I9B{_2~OCK6ZZ#n&y^Qd(4b;1RZmdd#&F*Z zg#Dh_$k;NIF?3K&^1S%M%D;N7@{eXUtZjEFeej*80{;WYayAxq z^Ej_?9z>2ZU#>5ip9Sp0pR}3&4*ak5Av!2@kZ=@>iuB>R?44l_Yfj*xLr4~)7WXxG z>4UYkeeUs}_#ki8w?8fKNI5IMHY(xycGq|vuO4{hZC+u)CU~-NR~B8gBCh8hh5bG% zwojgjBT3SReO2sIopqr<$0$t=@K3WH%t&stj676)q`|{PK}=d%E-yo0DJ$$O)kO>s~TeXO($XL((AkA|jOE@U9yM zsIR#a{f{)yqPs6}%E*<#0X5Qmpf^b-Mn0z~AN6%@jHYhMY~hsX~>k5W`lq=3;$qR}ENP`Y})Hn55dmAE-czZGIHe^-A4k z6wkLQ?%C*5X|vZgd!9gXq?DDyXdsgcT=Z+G=4b2m0bvBgBq!CfRf`96ss}TZ?+t&sDF_na1T$fj7>{+&92(;tz5f;y<>(+eKGJ@Y?UH~pMTq9e>G`dO@Z z#-RU$oeCK%$g2=_$Ao{T&CoMgjiJ@DQvl5I@53i{9_bK5v4Ivwt=|(2xLWF;w;TE3 zt>%|<%cOROC887y!woT|8&zBEUZ7g$w`O$G!#1XL@=MW|fJwkM-zzH$(C>s_qb_&4F8A@vVI_qrvq zect_#z}>#@)DUNM9wHzExg!MnxP6n4M2eky(77u|g+Ce#(yM=!xQaVZN=k=lI$ED( zW4x)!jI6QOR_K%z$g^icOIb;MJWGxkK07P&7qvg-t0__Sr(XumWwlQ$p8nlFt423*u1Qc308ccl0>HgR=^{(?BYwOfR|BHG5&I#uypRcTHJNTii+Gs`+$7A zYjX#mnK7Q=d{27zJNQxR&BxP&CqzdTI%o}m3~i>T@QGy7(WO+T?2uHL;Fk`3#@KOO zA=Cso_A+rQe(}(c6^c|T*Z;iOxIPI@0i?9(6Z-6*vIApz8Iw2-xOLb-*+%uu3Zw1K zxw6S)cXZx>0$ksbLrgLiS9Wjf0q3r+Rjjo=h-*EKyL^Uy)D$eOY@@){;(^f;$j9iN zmW6kJW+&Q1Y&L2v3e=eH8#3FSZq|;Tv&}EODq8h_ge=+vR>wF+>2HilZYqYF2#5aA zAFC3mh`!Gx$+WJN% zm;%?_Joy$=K}JI`%;=)@OU0TqYt=(<{HFdk6d^CGok^7#K%*KLJiu(d1Y-WQ^jE_h-*xL%S%2JgAv&;f&GNM;uZp@3r0X^Jmn z#>?H?NkFdBio-+7e<15xWtDGXD7uBLa2h12|pO=U|@fr%at<>A?Pfp!y*;uKaSW;z?M*=MuS^CSYz*a z<9(QHM77{%x9i{+-hzr=-QpW8V6>WMeoOidyA}LltfpuD$4r5XvnW2|vP&;}TeLoo1t90t#UOL@y{w@$8&fOjh z?-t9#kv<~ELHsmX&g9*{V zra*D zg|6>j)JLlA3r2uNO~bLV6D;Lx-z{&XJx+#-UK1}-G{18S_RKTkjvk(0>aRY+m!W6A z#wi9T3`q7`fv32?O-l_&NbX&z+o|k=r;0 z7vj&(j>-)&i+a!-h%3TarP!jXuZcJmuZY&A=kZ=dExMrOORY6cB!;aJ@;aTA9N~yFm^3OL&G< z&Z6a=7YFdZ+Qr*rGfXyd*idJ_K0TLjp}fDkhPem+3aZA2jDgxlZ_0+Zkx3VMyoB}V#4~D54-%rw3^cjWy4RcbaSF&$H92wRDAswQt7=p@y8m> zS|1WM@q;%tv!A}#w0NlUPTZ;l?M)J^1 ze1CtJdhsoJVQJ(xBfFjewlWcsiZ(;d|I%9rC$lH4$rF-CX)|?e{(enbzxW2M_gYOt zzZmEuvi-q1YYSn|dgjp4Be_shXXaXeS{hv1frV!C}03YA)Iq!O-^Z~Z0xz_nF zW_lua{@&|U7hDkP8(Sk+{|65+AZVw>Bg?8@o1x)l2ctm)4^P!CEx-}C+p15&dEqzHDD&zVSexb-&ARr=VF+ zo+vp6?MD-Y#Ec})3n7%-UzHdT_XSla@{40`3MioJt8kE7dm@L(h1E>?V9`TAnLV;R8JFw9NQIPMZyS2-{+Q?3A4Gz&a-c7r8qYoU> zLhzJ7nZ^{H&OYR!L)21?7XkoBE0NsB#V#VQ>;qMJG2usaUly_V>-GJymNHI!B^2!}jJ_by%@tb1F4nF|8n+1xeza zFvq&Bt>-^^d=e}iO0JYDeIw^;1MV}EqZdJmeU;FWhG0q-*~k)#A0+^c1WeK0?AWHB zS)s~q_%3u190Pa}T}qx4_mjVoW`v?IUEDF@Rok^L7KB-;At(d1ChOH(9Q6<=A4a%a zy<2Cia*y*f-4O*>+#oUAlPBH9x0H?`?(UnJnKy|*y@0sjJ)MVmt2(K-sx(|_HSs4G zcAnoUol~n)eB=@}VW#ktU+PI6m{UcVsV9Q;8ev__x_~})2KqOuI4Vut6M&^ZnY6N+W zOs|54KW>z&p=#N;`j4Hrn61gaqa>;slB z2_HlPorP#nGPlTL_vX~j&h9aFq1u#lgWdHui!s5zVInAZ``AAX16iAT{Ol0YT!g-O zHeN2>NI$st=FYy;KrC>Mf05pEs{ASNciIFTz_d)Vj|GMo{T3Y#6xzUOCkYfOHKv;l zG1t`YeCv+$cr3e z4q$oK%9I@u3*pd0qr)cO-e*||xMqCZC{&5q&J2p3Tix9NL%L=!e-nuQNvp;@SWcV{uC%{M8s28{TdL~OnHr1QkDEv-}h&yLv?qpw{S^TqqJgjVm% zP~F=|j>pbMkItW=TtVgCWAd7WMsbzMGPIno+clsIoU1?Usn33mtJ`M6kQsnvH^Cm# zOHnfG6~_DiG^m{+OnUaeUR@y!Oma*X`8sD}t1{tTdopBrSGAqbbjZ}rO;>a6_NP1f zXU!Pu*@uOY84&Y|%>quQ>~~mQV`}-sX}9xLFQl+;5kz%(`)I7QrPZ@QpWsm@Q2L=E z#F)DD`C~J8LVN)*fozGGz(-y!jd*x%7c}v_A!?sq>70xj(Dw6f!=zpDg?+KT&y$H6 zL{)RRuo1t;VCZ)Z6EbYnf%J+gslb7g#E;!mgZXERWwrb1Q9nKvsjrN7NHW}e>9u9Ga{H7bm8KWGFF6{VdySugzOvZYloOu79wHZ z5t6K^MQ_mH;7E$gH{gAlv4f?Pb!#>A)*}b4E~mW<^%4LNB^Yn!A2U`lT+80wd&Q?^ z^s&laZusQ`0leUj;M@Onkg@s-HnXgYVX6Wt9@!WatETK8FhuSfZ~7lI9u=1AoEJJn zxr|B;+hmZdi#oaF0AAJ7t4Q(;`7Am?N@wBkpP%Mt?A7g_gn`O%Azr)TH3T*OINt)9 z?T!kHKp$rT`3Q33(}eGz=sgDC*g`>=^r1;h9!?DqKHt@`@w7iX$7M!WW~S8$RLKA9 zo#!(FguH0k5{b#!WsIE0%?EnS`_4}#W8wOp1Y@a?#ZRE2+vFIZf{`*7#Fu^N4fs1O zYB4djGyD9$>s-mWMw+S;v$pP(8h?1B*9zsNi-SU0$@$qfq_Rz>)$YxpHKvSJ*1yvb$GCB;yr_TT}UcTz{bnH;B`d6kvt{rSBI#<`$I% z9UnBHUEVYEhJyXp^)m7rrm4WG0WmA8J#%JR#KR+d3gO@|J$!a$y55?>M&=AVX6w>| zHXI(2V-MgZZnE(z6o8sBES3UB_y6AYu5h{_E7o!K%hGg>LKKvr|4w!(j=F)}oTWym z6}cCQm;<@3=kEE755voSFW~#nL|x|3?H0){-^zToG10u!cwu|RuR}5POFX#Or%Jvr z^)X~c!dP{@O&om%75WO0Zddm{c%i73D)q1yY`uaDii|~+%8D+}f?eF!rbrohSg9q~ zOzuUXobdMA?%uEL#n6mbkE9xYu@^nVa}sVzo=u=MrMrO3W7OUX=mOcpuaww61PLJY z5?=5-f{5fOcM&e2Ngb7veS_Ui6i?&R^bB_RKEoijZEvs5$%Hnpg;+ zNO3Z+AaQnUq>6*8&3Gn07PG{b9fF!@0u?@j2yu5<`Y-;F{s}Xq5{dp|Om`BSr6VRm z>`Dc>&mN}ibQH6@r@rgNI*-KD^UtC+!9O3GL9*4^QT5r;=U|Q~B4+KVee#D`m}wu7 zAR&WfX{!2%!qlK_NnhdJVCaFORCx>tTxh1T>n+2}>_@;fk#FL$ckFjoN*6&0Ymz8I6|TiAn!9m`s(lMVe*s}Dh9h95e7N{w`(HE%9$ zW$ejJNxj9NAP*DFYc76fQtA$PCN1{bs#T+;G%`0Ovo)6Q+o_NGoiiWIj9(m`eY|n! z1UgK>>h==XN33mP*S`VFW(>su=g~Ity?K`Ep*V3$*&cWRITBLG*{EKi0?rlY*{rou z`++tv^%!7kVuPXU!%w!TVzswfFX4vXG;>FcFU`A4GqYpa499LDe(Npao^^ZTC!FCS z<{xzF2kDndvslNvZFihD4wbbWMDBFdpfC|bJU*7%`Qc)XU=eM+h&{*}ilNSGL^ecQ$L}Z> zL8x?GFuHHO3pg>k8U1xj^dtZpwMW5}D>t-RUP`$6kwKXJCs=;Sh3>JLXojJY6D6At zd#fR(@-}%exsOk^6T_)?c^|7LNjIi92G*shBh)>%VURGgn=MBqEW}-WoyDVzrJ zXxKS5+L!8;G^P;h{40?a`IFzt|JDr+Omv`UtoE$m3<@)(ai4k}wYTEY6Hk9loi~9I z3;se_PyWV8NxY)ebI?8g)CSONQ2wDdq@J&VwQ=duc~}urnazy1l3+00$G8q3nKJmL zi4+M3-O5yhIYPP@qEZbkFVqO;p*6riOQfhWZ|AW;6HX}Z`o-OX4vRcxfk0xM7OMdC zp=noe67?A5| zM3+D4NC%l;cfiI0n0uAwCNvx~3E19zHs8(vuUOus2;{vw%Q;7W)>X64w=W`;x6?y(;mdtkKwY$MEtQ9+&rUlrK2-`%;|#FwWpU zR1(5?fV;ySEVAl6xnVq3pdrsw*N1*{iZLKlbLM zWUuT^_TGE{U+0K?fB*O6kq4*u`@CQ8*Lc3h`+d&&HjMG+#?1IZk#jLbxr(*kKQ~*I?=#SvL-wH6yACz}F}8FTr~3=6gbv7^Sf2l4nQ;K^)9VjWqg!i^Wo3?^`L-Jwo?Y5a@@`B(>HApdD)l}~ zNG5IRO6ms!)$XBzGp1%&^Q?f6Ca^Xknp*12-i`TC*U@jsfzL(ePXomM#>M?gFP*}2 zOsNKPzKRy!fJsw>NGCTx5i=*iyaM9KW-y;Apr|YPRmSUg(89!HTeEw2u3uxq}{S_g`4Q1J3Lq`)S1)wWq!)0j*eJsvfwam z;r<)Su;xGeJ1)1}2*V{2t3TSeq7P8&Y0Kmt`Xi6ztN|wS@;G9Si9|w}!ul4$D3+>c zw=`v%#PC=}VGrY-;N$473+{noQn6H;Y#4!x1zW+ro4qwrVw>+;h>*w(4;L!U-AzYr zo{hz;J)A5D`I2XDK~}8NdU6jx*)R2w8rjB}zouwdhdQh(1tXT`n=*ytDWe+p!E-cE zRWizYMj@I+cCUaUcPV{ZUW5eeB}(r2M!Ql}U>iDkmy`SfPh z#!m1@E&(HBT7Hgz&0pB}`(-~GLX$YVi}*tJYU0cbKjHJ8Fo~L4?>JUwPNAoC+^uI# zFoW)o#Q$t&z4Ewp7D0m&VZ0oil!K>_5FR&Hm@$8?en3Xgbhnrv2A|H@ZE5wat42 zCf~klmg>sOEeOKhzN-|lbE@PPujnly0&x>oVph;iV{6Jr=YKi*E$r0CkiE5JQFfIU=gCYo!%?l_0=C#6FSft5`X;WotLld&6OjXr+-nbqQOocmJYtlA!hC9d^-RK_Z zOgBX|vNwmmxEe13aV&S3m}R`Ae`P_lE0+A==!99rZYK=7gD3g%T6RTPJzq8VTbAAs zJdOOa7>m@B9npQ)>BqmSScrYRSZnFpS2(GlRCpVv4HM_Rm=DEFY+T%goTCC<6fX-T zj)1zruXG#f9WVOwXwrdi;E&Q>a0{!BjN+I|Btu-el-5vuVYxz5r=xOjA2O-|t*oOe zNvt_2$L&qvt~`b3#*D|#^hR48L9&cmWg~y?#!U=Nak$KB)>@cDC#(g$Fgqz*{p_C2 z*Kt>c8qD$fh#tpEP+6Z3cTVs{|Rg9ihU{b4Ct*&~B-v-zC;T)WX81cj<9H;Hqz#=s9-g+zH6a(R35Q>mj zy>66!+8H*NZv(yW<94$(=?v@%&rQ)UQA>65YCpHZpNk!9oo91A1o0 zx!ulsFmy7XA`Z)`pa?4$z=CLEE`x>x@bg_Sd@yjuHr5a1a=zRa^wI;tZ9l`ZmIuHM~$c)imAgX=p+A7H_*cs@6^IQ zmr9aCf9>2u0NFSqlwu=RI-(^vkNT$B2$`3vRd9;R^+^RHkZ}4876lb8GSp^i{)Xx* z)}kT(DG6MoQ~v>F(OroUiTPvzSMR1jMy^IJreS$Rz}o`5V{^;F2l5DwxC?jy$I_x^ z>`S(rA2Pf0vow*bpA1VbqcQdxW3BG?BlI~ztSLR2Ir*|}rST1OW%iyi*b{OkTtuxf z0`}j>0}WL&ZrPH|XP3hL6+K+JFih#CDhcb|tm+M;RgG8$v?fwY`4@;2a3rbKQM(0q z$C}fH_&C?bg-hXqv2Zp31M9-xf()6><$_hDsN=(?3v}D@Ea0B-nz+|^WV56~{DO$o z`)p>q)NJ?v&`PW5KRPcjG9{$G>h09Ie35tbxkg)n``U5%&SLsh{3VVKGcC#Z<_M+o z%30@s1EH6XX-mFh9>r1*4 zGW*2}w|a|GX$#%J60lL{UD)55F4`QoqzcQwVgE`e?J0`>Mj5j;)8TxEW=9e)AdwOy z62TK-PY-$;G>PT?xSkooAG=LyDNTKmGU~;1<+ENV(UZ`#akTicWE6ztePx>Rd)ocVJC} z(td8{gnD$!E=RJ0dJj91O=Y6Xc+gU+&vE98_yLNjzg9*Vl5KtXVH3o0b}m;1TMk?J zQG|J?GrU&l+gN4`XxfK-=J4eM!V-UD$kE?U;#}AC)XxKh4!-rFRvb@zOMl{dB(gQn zs#6Ihlo72=7gIB$N%ZoCztq zyFNd1yz-c#FGgc;`Ix1$7!3LIY?hJ=O5O`{yyd|6FHHxT$B4HWDAqb!*E%Wm%@WhX zZE1az3x&Rio#gSR#I$^RTId9o8~q~qsr>|`=-aqCWmw@2`_i8(fuk--bnU9V|2pv; zvRQ{)9hSbE-&)!MBi~z0nbI(+PNx6T#(*d4+xaB1gQMjVck^j6ri62^Q*7IsrFb|i z(<0@uInAZH=-8E^#;-Mldkchz4Z`*Mm%9zyzbB@mvD0R}`40oLk`UW#XeRJ%n!zu+en;1)Cwx^51N~G zO~4cnT9)WTvuCBm3ea)~)>xv{HWQ2w6-`iV!{0Zi8eKz53r5>$*c=xKJJ#1J&v@9O zM^Gzm=dx#A?(L3&8pIJ2CU%o4p_r$mI_)T0P*V1n<2IKlnBLmer;s4#++)kxtpL&= z5?-F9Z6UYp{Dn^9Q6%c;3+=VIDNWna8&XoTWtGB1&nJ;}uhMN#Y>@E(#f$*a3CTQ@ z(Fb1^I5;WUcQK=&`-09unHuuW6wTz308?gi62q(e*vx4|ZSoO3O-AI4lE4kvjDu!@Kr8wQL~48xvp|{OATI z){4k-P11{?=g9j(LqxGedE__hKG_YzUBnun{iNfKkg%iv*FGM9P!)>zB!Rxs@k2`=GQ1EU)UHA38a{S!$+ z!-~n%3$@TC!0f($DHj!g%VDRce|HzQ+;1|5_xMR9!b0fb59;qJ-q%wz=8`EBCJq?j zTDUvFqTkxBlj9`rDexX^PMjLTLt?U=MYzrNazwrp{w_fD$@fnZ|7A zCEfQu@v9B|xiFzYwly$h!pNRE=0RPSXp#sF7f@s-UpWAu)d>${g0mg6l-bQO2U5gi zAbq(rVYBT7BE5+25h3Cqsb-?G)z=3o(ZA3(OQL2kyXyVc@$OT9^gRRt^0b=AP9mo3 z<|=3b`ax~llGA}Zwye-smIkve==bD*qf}PS}FO#^sn~5WA0*wp`iMal~w@ zME*R}L>nCi$~@eB*;!5xt*8`nlUrqlIp@wEFH1p_fuVeBmA;q1RwGB^7nE(E@sQn| ze%A(_I2U`W@H=B)Z(o2(1>DTd$R=RigW507=i-TS54bFp<0rz~$ArI0V3gW4O>t0o zYF)uJJHL5d^#8cH;mXo9wMAR!I~*rRfK$~Gx55I~QqCcRWLkP??dL#0t9bLQQP zzq&)B@sLM>);>Ch;%uij6^L`V6rJG$V!vfEJwzt2p9I$gF1e2cXQwvl{R$I{!floX z@%E!~Ybey^yc;N8kk1*Pa+f`c6nYrph3-0Y+=tmk?F##rPVZ4iT@z~8ecR+F7}0Cj zZVZLY`ila4acMGU&*P55wq=?rA9Owna`HHUtSoxcZq}O#U)#fK<}v8HDj3IgM?C}i zfJbkwLDyB#?Lp*u!SIiLD{`}5)@GI-8{kDFLtW65>gTac$URQJq(I1i1TNLJ(BJxZ z&$to65boY@8Kj}9AGciFXfgF6G99|K4m5qlX6V0S!(39p-F+bN$}di1rdOFyk;N3? zOjp7swJhW+E!sW6+*97Jo^@wG&mw-dWx{dcf;4IZqq}f(q)`!>ts=mVrR!}qdWa^S zZiXcVqaQcMnv;mtsIi+%ymQ_9plcfgM$&PKE&rYEGUAM{@#m3A%lWd5R1nUMfv>{% zRSMe<3WpCM_^URS5F^Jj(};Jd-pzG_KX==^f1|*!Nr-;fB3arE|owPoMBp zs{JHycSz*>_zVtk z>{{8%b@b|_WQpQB-BARuHbhOy)LIU9sbMbMBR01-byTZRkv z9zS5tvHQ7dR3w;;cy4a(i?wmQSc}%MJJ$Hv6MEk|)QL#pgS+Wimt+CiEYRHnMEtX7 zEt|=j=GeN?-eejfVLbQ;Nb;q#IrdPapK9_wDRW^Vk2n4P~6reV$o~vEh>vMw7JL z1e+=RW@&OhTzgxckN3S4B3X%Kgqi}gff^t1kABfw0STpEM( ze5){iwD*zWVY z)wPh|imSZbvrq}K1VzlmWH0C)r0+bBjZ~lMyD6|$Pf*T)>#?-_%IY8c6Ya%NS|SwH zrv+mgmznmaak@;-A8*e0B=5h}AkR}{BlBrXY$p)6pA*n{g1g;Y1oCk<*INa5F&=6Ct-Z!2aFru%avhB#`V7PxREc$fxlcFH&%ivd`~fSQh)!pXbOmwZpu^z2PmbXQT~UP``PU&1?(JmO>}8ruDdby*t%q!FbG9=IfAwqQ#m5zeqa zz6V*L>t%IzLw7dLraa^W(9n<@bcHd3F#@KKF%u^qM1^DfYmVIiqdw_YgZsuKo*v)IZ8B|Nzd=dJ+68wZ z6^A7{61%hX7n(TdTuz=f`5=Qvuf^Q+YHr+FbZj>Jjs$>S&pGW5o~r*ohH{sTXR~mG zHL2KSQ(wazs|*DcOsU$zX}A7z+SO5Ib+#5Svc|u`g2eNhx(lS~;uQ`FRBly8r9%IU zHKlQ5zpzSPw+;|RKgK>86HQj7mwQbI2|ZGN7K?1Civl0sSIJZ98`$5lWMOLwm&v{x z2|gY(oM_dcZ%`oFjr)I7P#+T#eKv#M3~NssOB>a04MhuWH_JJT1A}P&Bf1hCzR2g; zN2#Fn7b~exAJj1IvbQl%X^OF*mG~(Y@f^*xe5Aic3?1|c)ZgrcrMq(E`^4)F@8(wwnSm)r z%a3m_WQkpW;dTy*q*kZ(0tpt)8mdfvizOCRTfk_9A5NE2wj^|i2jDP03{+hE|Xae=SN$KuI0O|mgNtkWL*(Ffdu_G7$(-Z z9ZIda^v^-GA=Y{HS4na630?Q~vuhTZ+UWUGNlF|N;2)vCZVGq4SUV+|JNKpj1Y`Hl znUJC;Wt{YgsaLw}byTbAqRt8GOuM6taZ5i7omfJae7Pt__qsccSwVpO*6~5#3$Lj? z(xl$1JRUB*cSv9`Tjm;AvD5P<+p|Rc@_U02Bwsa#IA#6w*Gmy(yS1`EX&W9x0j3$Z zwQPQuj5Zm3BJ#?3M}p%FMcnt=eH*HNvlLUn^+nl26Xo^yy%X&6vfkP}KreRKpo!<9Xe!c{K zPEC()fd7}-8vsE{?>KyLQTXS=#aQPj9bR{2dMW=7T`qP-45^vZy*JrMi?oS)A-u#a zgz8-N(4mpalgEy~;d42J(xhkIBMd>GoxVIvkkRkoHyoW7=P2q6%reuNP z0M2yZJ9+iANo-9ApFArSyAGmo3OAj%hBC6}A|EzcLh`aywy|; zGRXHabNrim6m^T+6{h|N4+4Zd$*m@So4I>8i5PCn!YFNJ6?tjX>ja{ih0}{fbHIz0 z5ksPffCvu@dNF$~2WxZp#$k$#WjSV;IfNw0>!bEuooN0jRgd~0FosQS8 zj-gNBj(YDXv*h6@#+!6B7k{a2rx0uN%Mp<3*0P(7Ro>IO&i^c40*$@Q?@d7#zZ*tL zjMTBGSQj=3@4H-$q=aWOxo^-zT?k8=bmcQN;|IYofW;SSwD{9I81Kt+xHh7!`(EsS zXM?e-+wg;0lQ|c~&5x&4k=by<_Vm-c45v0w{=QUpXnSV2ck~6`0ejma`Zawkm&Mnt z3CsaJzr(zB zygPOMM7*5drfIh((_pGohEx9>3?*5I>j%^#W&VP_VKw=36wwan)nBr`fP;z1Y(`tq zbso!F{~+DS4!>cIB}*bi9IXmUtjdL=al1(CUEC5w)d&` z?TtblDwxS10vglQk3!}hZ^>YFOYr3zC%a! znST2YLr9Rw_x`UO0O6dzB=CK1O8$i~1w@`vtE)Z|p|drZt`HmUQuQhP)$SZSOw1Pj zlVg4Az57%xr)Elxd3%StmRo#+wNkgCbKHNoxq-*wZcB$;w3LFb%QN-Gq7*IrgB+7{ zd)%W-d9QO8GNTL%V2)AWR^_`@{qjyh(3NQd;a0U7Ts{RMR5N-!>1T7wg>ppya7-vy z-!2+ZD~vm=l$AUpCyPU_#%z~73IpBIV3B9C=wGb3oPn0IcNp7Hg*-0YzeB zmXtp!q8u`R6j1gm=vu{Y$U$efnB3rUYp=UgcyeaF`+GWPBiTw+$pmQUAF!?!t6mSp zQlh5!(%{TSmi4o^0~N{q97&e_gL8dc zzv?1FDYG?Y5XU*;asR1mvN2^k&cAUO`7u|%AZZ}*As zZ$XkgSn>~ic^%Q%k(;sV{Iz4pG6Lotrqz)|f}*U5={WAzDC-dtI@ zy<5YP*NIKx`}XO#XWJ^aF;6ypw>H-CkbnfXk0o$j%>8}{uj*I?>Zh<)gvhnftLmhZ zp2bhx1=SPxrY?Pe{COw+6#REGKmGq$Bs}gdMsA{KJBn<*$23?bdHn+^ZAJkg)oyd5 zh)1`P{rYIRaa&_hSNl;b| zqcVN~Tho|dyG2O8tms*Xp-}WS}o@9D!$`UcZVs!ji+ml%+gV&Pxq<% z4|&q^xU&(a>ra$xW7Q4`?CvKt$j!*>m+ljFW3aI^)OzM#RIo%Q6(zRjC(5F1Cz0JH zc=zyo_m^fIWRi7^1WkX>OHuz&2;pPVu;6>4N(}Nto=|z5s$}j92js9tl8QOK9<>_H z`vf70*4aw2s3_x6Q3_N^6xat6O|Fz}kh8Yy6>?IX)%(l{!km?(U!iyWbKke#7@gjd zSX|~!z4-yK+ZU~Rbu@oV!Exp7P|Q3e=?i|{-?XCdnIAJ5HeX&46RStT4#}}F6``$DmrJAEjRbQ(Xs#yDA+$V=!+>wkb`8zsVA`a6$LAGx-itltd6`h+m*@VJ^{DR@Pj*2MFMXf z-}RT)i0X!$+N+}$!=e@Rz7lG>yIHa`6f<8tA33l;gq)h})6Y`d#p`23j<9vQ|`_Veuy;ohtI~;oXocrYMAM21**5_is`C46m>{xB2yF@)c-W}rNC zrT}&8+a<+y^p30OlCXC1<#GD+b^lC3;79_A_V*Wem?~f};}{pDt!e@GrBa5eSE! zLNJ?zu4*Mj2k%^wD3Oo5)%-`@Pt5vonsce@JUo*Zcy<|Iw(?!DVDO#%d#Mh z4*84FhkvSX7p}1WMNf0g@T4b?KMb8E^RgO8u{`|;EH)i~*y-HvDTd$CeT0FDgXaVu zG(A6ZHoQC0ikWK(-$%g@f-C-cUeZysj(78u-lI-TO&7MR?P^zM)?PYm z^@hH6mGDCCyZYmi0@pgeIi-Dttd5SLh|IPv=)V*@Wm^vvXfttwD?oQxuqLoE&1^N{Jkx}&DQ4S{E3egPnE@%UnGX94dTgd2x1x7! z+gHi}gh>Aa0*4VMZ0F#=2fTy-1Grvr2Y$ECi+-Jr69xi*HkM8%HU0j@K;AN$S6REV zQIVbuYoFk-gUEC@Yl!s3TlW9Yb}k}gHS?&XN;-2w5JdAv%%>qNZDZrJoS0oE>JVow ziTLoV|Lk*3<3*SHbkj*VpB9W!q?I}{xgB;Cxj#MAP6_>sI(f6>_b39U6NPt;qxImP z!^)Vdm;N=gN)~ zCM$9Woo~A4oF*~6D$wq+_B9OjX#Ik9R?z~0c{_?-)rG-OD_k|!-`^N3+R>dUjJU=< z!QF>5l64UY`uyAPf8Gm9kU~N@OAn=~O{&tg(xhpa{hkp`M>4=@xCZ@>EpkqemX)CfzwIWz5M!0tPx`s4tZSmd?QV<5upQpdWHQ(`R zf(wpt2+>aMT}1mVn{TFM@C;-h(N5gAoNB`*+tj{ATML>e*JD%-8?=n z+HQnZfbDF*=pET&+8?5!Wc|gRPDN6dT2Ic(8vM(NsVo;9JRUu?-3WSxv^55jf;Q~6 zYZYV6WcLcx`u@0lo*Xj#4_q5leZ4qDAY})m%2JVqP#)(KACmaX@;NUs(wWXzo@kYU zIyr0~L{t5a+%95fU|za z;NsH$AOx{o2_ZI6Ed2C&`Zx5dQ(#Qn&19{T!or+7#7RkCSpFfZ&y#86k+v5Y6O6qv z4}y}Zag5GwFrAgIOC>5eQntGf?jFa|RQvbFdJo?bq%yT_1kG5JV_4Z`ZvV57wJa|~ zw_mum%Cp7uf?$ds8$|Kgs`qy4A_4_nR{H3D?YIsk8b$v~@Fs>mr}I}}qvL_PfWXn^ z)+z!}c5MURZvsU4Yk9^FDb}_1&i*27I*9P0JdSM%)TRfmjtBfzS^Ni_#x3E)0q>nu z)r^&V>zmNIu*TY}rz@9V8z(h|u7SF}eq+6KJM(kbF8v@JdhzJ}Fel(>t@R@~VOXP2 z1bktM)$i6?UQ2Y?mJW2-M$65-#l?axA<}c-FlUb5zvz_J*E9pp;kKNCr=WxQRvgBuLE7c^Dgps7_d+X?Vd=^RrQvK(UqwU%XuPL3GxSJ^YKAZqH31xW`N^o2(+Ceps%a(5@ z%H=HZ>D}_K_qy3_*zn}NURL-rx5v#p#dZ>(nmNVI=cOy5km%*URLEBkL%rrf%WygxR^9EaamkPT*lghoz`cY z1)nd^DNkOYhI&Ox<0nDE3k>P+KyW(l7BMZXx8J7+oe%xs8!5h63}iQ|N|9?KMf7S? zEf0Be5^}xanoglExq4NKaO=7%$RL?Q@+o7Qwi$;qyMKFbM)h!66;DdW%F^2@?M!|} zosH$50Ugz)CC~c3nK>EuB?>nk zR(KOwn)bqTQk_>W?qp^vURrMxhXSX=rZr_8lp|v70Ae?N4Qxky)rP*4fL=WRBkW%K(C7qnL0- zJQH&DET%o@UgG9yl>O}|wc6Jgjl}b>J-tyDsceJ#Yt|0E2@6QSi)8fJeKw}Y2B*36 za%OrA;Twvri#wxK-R~RI__Z5uUDlq?i>Y>4ndG&3h^HwdldnpX7-dW4*~rP@8Tn=_ zVQtB{WJ}=&njh^UOg=pvmY18eGHp2B%lXQ7cH6MDRA=RC9E06o$36L5DkL4d+9x)I z8JXr2i1lqs(`>b3NBHnzBVh_vQtn5=z>8!!2aX=$oT2gnlfP#wgE^uAhMK;PzbpPZ zhMY1ttDX!)Pw3vhx$w$8flrVFR8Z#8W8pwI|EGx4W)zB^nc@Fq|)_r;FIW_no z%*W%lI}p}(E-cxaeoeFUV5s9v@$-?09kHpyYg>oC0wD%GgU>*0+vVkKWlBu1>(Q)q zH5+VFTuM3olv2`=e!+)g=E|95dqJ-eo~$q+*l#3MrcNZL$#n7W3_e*vqO{Jrx`d%s z-KP2PFVElKHup*QJ|$;{x*vG=(}l8YIa6bGk{6NhjA@^ex4}DVgtsIn=^B4M3#ZDA zZvc(c+}t@^Er!$Ci9Vf16Q~-|F2$00NzmkMBpFT@8nk}RnS0>mBi~}yP-!cns92X4 zrs~f57f`O4X-I1}A;|^9d!}l+b1#vyx^hVeQ!uBk%~>XOr%&WWRk?+ji}KQhO4n7; zPjG6>GA{fUe+Vgx1e`gt)*&C<9QxrbuoS-4Y`l0^Qlc$MdUC)8E{t+I6inlQ*JPm* zrggwqV^x~0uC7iKlgBPXzOl)6H;T0V)4i`PjF52JXfsYok^)v2MEe~ohBPifF4J&q zN&z=uG1WEiBQZ^of6^h-o*Px|nPfO3ET83bEkkL(npj^kBR6a*=JeyK*d+!vhChLf zGi77CEejcVIqMfE(olCpEvBeba<@)0```Ek->Q>7cj4NG`TDvoK@2#2>0{^p>HG+v z3H;RHD}zqpgM?C|qkKtref>=icxLhOJ#U)@w*)oiy4aXjv+=PbHp^!E4oNW6a9E;p zB`k`YL#4CAqctl{JIz_8Q7|jG%Sw`CrMvN@9KGA%zq%{`ZDtQqs|&JNI#oxEhTg}u zrq-XIA|lbdMR$22-N)QpVHn61*UC`xlU&^VW|#e5QBDudELhwAsQWxLdOk=4M6S-x zuQnV+kzrPxG1X=5K*ODBAQwnmT3V@+7aMB8k>PVI)m+i*p%r^-h~==r+tjq{aL-&h z`kb|B%cRbxiqowbW;5O0j{e{Np{p9~u>&&;(_z{cy~*+}K}EH0z44godf-yX>Za|9 zVkjB}eE;zvb-Kxx{n=A_D{mq1qnNY$;c8L!huu2ODdYwv5C~LBDD#{6L2<5HRy%NW zaan?WD>?K&X=lzvOpvUOJ21$8rZW-!*Q8%T8$ZsuAb14(*Vq1{9v)6HerETnI@)7O zB`qa%0zdZnskm{+)9;2f{Dmn#6uoT~x_n*?>QaMmNR~?O0+&hFHqH^wp@=zgP0GEB98WVxaC#rYdsy?YFikAs60cC zoS|U}!<-zSg*t=5wgG*c`nuDDy0}MIY4GXsz&5gSDk3Yh=JQjVvz3;Hgbbes7X6ma zP3yp_!k$WPbt7%-?DF--@wLEkit>{N4+|%OJC|XC&fpN}Rq{bFFw+koU|V1}Deh`k&Fen<|R> zpfQuA)p(HYF&c8n--;4s{3;Up#|G_s4Ts{YI@=3XvrgDyEMU?bN)=O5%*-!m&bMY^ zcC63{+sIcUh#i3)`Ya2vK>EVg$`wLmZK##`y6Tz62e3?2Gt}-Y_#M){PV1f;^mnvj zVcu+ie(Lm69v3i5iM00fNP|0Ss)*S`ulYX@BbAyqQO)pY^@A9EE1YyH>Y6Qb=-&LX zF=fBQoyfDO;q0CiV3GNh3FTDIY*h`<#J@_8+y2KE#F#IYo0OddU!bw9&+c=d|LF+2 zhTQv8=8Icq?*J=iNJ7E|s%> z1*I#MI83pMTaA$1s|{EjnYZv(f@#B+-XE70`uAyinWtY~Q1b7H9a&q#u?G-`Ge15J zA-*nnJ_?nd+9(n>@O%Ic#bmSjKI3Z{{-=jQOjnDG{ool?mW}+rW-0)Z6UDJ4*A!*2 z5dW=!?o!&@%eGq+?!45Y%R#5DOK{fn0qX*5-SS9_5 zl$ZK;#+Up>j^k#a%Z~maTc2UEaD(B-ohC?Dj)?flW2qX|-}q+5NBa%BG zI|Oo`j*EiO0yri3E%1LqBwl@+h_|gKi|N@=uzz~0gI)WKX}|z#;+;lQgIYV^%b9n^ zH5?bRj+<4d1VPpwzz0zo7?@f8(HbyU=RB#e|FjhrR6DC14u3isq)7M}roQFzakILP zC{pJlXvL{4NI3bnB+rL^2#xfKRO>@Cv@?xwpKB_5ZyiS>8T?~zM8{F1j_1*KK4rYb z%_Cr?)fQVBQ!1-Na)#NNq0+tljn(CEZ<64m0`cl?)h8WwuI_BApVD4Z(qe&EDco4RQP8H?X`1FATE}O zkX)e^sHL-(wJBhrTcWNvJXba;Q&DX`awXJ$mN(RXdQ)e6jc~CVpKpHS&Yi8K6Hp5t zFXOPB_hn``>yEY*Exw`i0dg9Yi(<@%s5-MS?}UB~nVnQ3R2@c~US{^ac|Hya>b3b) z5QkoLm?^$zyMSB4jlo@n0j}^qRnW~7fxwgip@6?ySEYPmTlF%HLtEYCY7noRs1T) z9nQJ6;T&M}wgk7b9o+DQ1|xb<4snVhOZ((E;F)m; zFuJkTr?XPUREnO&Au7=83g3XPWk+UW_1XxVX`eq-PY~nBl{a&Sg{SQM8f&^tf=h8a zF{$FHPc~rBJc^2oia}Lw@ZXUpQ-}q|B^utq42Z@$ZPkz@PJae*qO4j(w-qK+ABC1Y zfW=65hBKIbAqmPE?3cT&#n+{4c#-IE_9}hN=JL#$p;k3&2xy#MKJ=?7jqg~Sq#=c% z;smLv#^rY2-+!PUm9XPd%-P5J0)Gfz#(OXx(%COUoIfMxCdwBTf41SU;++5QUvV5|sYuEwNU)fHI7c(v?(0`})f!ea^ zKS2Ft=jm39`7xaS;M-2FEvBREpBQ}TnTpdV zTl{3Tf7Hb;<$+G!^G;CXe%IGW=^^C2pt1Wc%P7#k2!eY;4fz=j7ql2!8U~zst}-<-7XJI~C&=ODb8hUsF_AE544OfeME4 zXE)Os(ElTd_t5ewV9Y4zv(Ri^z?+Fz6I^S9Ia(0YUEb-_cWW3VSK-D?7$qI{j~?Z(W+ zaKX&Q8V=^zk=|_=8=L9Za`T6fYMmM#Q2(H{N|NA9S2DK#Ad3@01p%upt{n9z65LS-nw3 zZ?c{#2YNbMGpG}i193Y$r$*9QX_PdDQOdsz$twP7)>gW0Mgz6cqOCa5|+JR{BW8bgk!IRQ#==;Fg+1+jP3xT{+ z3};r3(NXl0$lR=l(?cas#P+hx5E|cj?hF{e|II|vA5L(@u6$80aikr(sM1vFbeWj34U z^srxOklSA5ud5o*fSV&apGp-1>%w}gTMIkH%UDj(WsJE%rlQJC*s{B`=1<@cL91H8 zSCwP{UU>0gu85L|N-waz@ta@Ea+C=9l^t78Lq7>FvFLnCR5kQp3PGAh$Ic}^+!+33 zxWPSm%yL8ZboCVgks4ApUT<){UpDIr6typ$1qot@ksnu8vtmO%H&ww@H2*yMFsfag zZzopAadyjcdjJ>e&o)v0@euMLafx)C)-95Oo=1cgmAaE&1bdre2pk4E7iwyvm{tTS z`HxjC1J30Da224E7dq2ZLUEgUDLmT>zV!Z14zyK+sramUh`QHMyK-08^re6ufJ`mB zKs2XF6{G7q^q)5T@#%?S5B#MHOkY-FiWSY@XS{-fgI2wipoG06uT@WdEE-6`sE`k;@ytnrTu|pMiZz&2IgALfp`pL0{bw&o^}x1S|4HfGn!coc+(%w+ zI{&(e)yUtKp`JFCEsWZHt6?cB7J}Tk_3#nxwG*cSb{cC|2;G%7J8k7YoxgoHK?Ik{ zgzqm}t6Ngs@s+fz6`P?2-C9vjRKY#t#%)rJ42?LN{3s%T`*C@+^~&uCq9np4!axj; zA^Q0z_GIuA9}CLCb?km4;1dH0h4Cje;y%-sT&oF2Of9cS-J758D`}tZRWB8K#H_)Z zcxN?nJAK6MkLmcE zFrdx1-k0(;U(~51L{?0i-p96{llufyamNB*iZDdnv9HZ$Bp3*APi z2PJnFjNkH=UWIU=B4az>I4zh$paY_kbw;_i6kId;Y}fQ8S} zc3mN^U}28Iq^8tzyZ@Dh;|!5=EW~L!a*46J#w>anbfAzG`6tk~;TykmOI69=Xgwmi zG2O4n`Uv#&I}Hs#A?)aahX-TBTjR*Ye}N zNbv?Egl*3?#mp{LYm2i$Yxx!`+$4c{fZ1m%C+i0Yur1dQN4q^;G{YmHFxmPx;25;2s0y%zw;g)B>Az#8CV_iS@+VT{_2&onJCjeBnO(d!SuStK zxOcy3_P(Yqo$0N~qmbC0Rk@rDPS~nY`xaq2^~+`+|CQR=WEhCJM9YEE<8=pQ&#Mh) zHU_&S>zsmMC*sqMWk`pj6>eq>0b|9PW0LBNpb+vApg!0?bAHbAR>PA~r9jJLY4Nn0 zSD}vNwqDz5eYI${)^8w-&sNhQFe{ubNZnzq_L!fInhZ=dzP*uav%@WHwi4QSZS1wG zr4a)~<-^k~NwzULl(d#azm4kD{Vfx|(}bq!9KB5y;RI8)Fe~W-LJ647KmvD0KjIWg za*v15fo_CNO19UK^KMJdJXItEo^w9!)^~pkNMPNW=?gaOq1{-jmzqIdko0~o+Qp_m z>ZbCk$$ZB0^e2x|ZzZO*R^iFLwy?v=OvBf!@E_!dh67re8@zM4DcZODW#h38m6JXZ zemw!!JTi&CJ*%-^YDG#EJjUuA_^m3h&1w2q3wb;GH`wyxL45C8!r9;Tlst6~!Zr#P zWu+$D2MEH5Kp;cr88{gn5dT(9t!l1J=^6O@FF9lD5`~DKL3RU(r^(LA$9C(I~>V5-Vg_7#qsJ6TXmU9@q?kPX^V~B<=QjN@aGa z+5$qIx|{p22R zBT$44dt1aOnjV3pnPA;_07W3&7Aw2F6e}Ou`XQB}qJE5x_SB3$xwqQD&ez2kh#!sO zyO^3+vLkLY8T0bEzr7*ukf{0N5TfIXI#+}3m3z}xp-mJo$2>ycN*FP)Ik%QqBLjW5 zVvTkl;*YX>{A#p&X2-o$W}SzdLjHu(1Ux_VFgd9ziWa<%r1tXYT<Y_LkA4`MZrga|FEB=2x_dJtOPGW@r5mCS7Mjr6H%flY z8P6b*BhE8?h=RsFsO>k-NDse#z8JLSDFO7U;i?|JA{EEmXbXB@k2M#rf+E3;W9JhT zi=}r?AS}YqaH-XuJuE>d3%{G+za^_b=B&opYomPe{tj88?Xo>D<2~jNc*@=#33|L; z^F7$CQ|=Z4MXHD0#rbMoS)Ove>n0+QTP)Un58o77Yog1E5fWHRadxNKh5~_8yHR%# z?L9cssZk1+`GWb@!g88WnpR$tZ{_(hwsmGP{1**Jx@RmJXXw07#gNdMnA?6t&VSS5 zU+S3?nz;hSP(YOK{B>p_Q>Yp_`rqU@6`4g*eQv6)mh9HM9)pR|MKy!-N8`F3bUEQp&~J}Y38)S27qv~4q~id!I6WI5{ZWUY$Tffy*ZDp^&04t=BYws?_Qp*y7cq*}?Gsj{8&j>ZS4KWHd>T()bG~=M@i0=Y25QzLe0ipC>Mlaqd5ba5^5`PUR}8GEA;eIl6a9Hql-bmy;@g3Gx=z9DTlH` zDlq*Onv3=p8r%xsd7t zln|7X#*2b9(#)J#95+ZXu{1{G>I)Sse2M*=|Nfc?v8nj#QSl^smO*Fi(FK{w z)GZJFD4CNPHyi&t##{Vd8Wj%<{PhB!{r!4Sf7jMy_z{G%!%HeA@hi2n7iGeXRa~`R z%brf6UN630|3ki^1P|R=_XWen|At*pnI8kXP?%`Rd`!?N7B%+x*$v-Wqs_Y$!Eb$` zCxmg)E%pd5a)R2o)ZXsP=88S*L~~wVyi&&J^(b|XpNgSP@{%(zk@rg`?*Hcgwl(Z& z7;L3&o=)4Mg?Ck-UZLQOQ9qNegk5-s*Bd%k+A!iu7{S6`EV1;_uP?kR=roIFl^(%sCqRjBTcD zrn_E5@ZO)k>|T6&P`ED?W_hDfNowQD)>!p(4VnP?te1c4H@aC# zI`d4JvBpZZHR%}95X73k2fk7cQw%O&k0B;uXfvqCQo6u8+UAYSossS8>y;)mH%>%7 zH@7r!IZi}xa@#dEBxddN*O;x3QnI#CQ+4baQ+8Orbqd z74HCC+BH3x_45fw-O_xY!6aucWBtTv;d4`!)2Y3A`Mi~}9Z!k|MNeRSC^H{hLMhtT zZNn_5zb|fR0CIIS5M9eD4oqop^Y;8%o68y$SnE3(=sx4^Vy8wad}8cRF7H}Zfpn*Z z;!_w5Y`SULt4WW1NV2O0NMFDIIE=iGQT!sJe4#uJvd;+ip4@bwe?YHirrM>;+=nxz z9M%+EM#P><%7ig%2iF)>Q1R%9R!)Xa%%YvG`TSdI=Hqc6@psgUXGW`IsM^O3O;Vf$ozN-pITf5nu=E4vOP*xN z{2_QbC|F>8K2C{hzCH*4cEo#EPU0b6*)0DQY0X_(i%$me=m}K4n0s=J$f>+u{BT&S zYMX}r6cKhN6(W=6#jjqAssVu01>GH%`{F|N&*>fPE;PxmIrQB}(8d^@Ay06&?!UnM zCO&q}Zk~H;D>4Hz^30&Zs@XRIyKkOD!vb7PzR5GujR8MjO2CovD$jDkxxyR$`Tc*E zYakl?vHz@no9eu~#~IwU?Iu<_LA*$SGt@lWXPB0RJ$a!I)D5PcbG`Bv{v!P0UcM*% zVbd_AFI<0DKE8G~fl3-PR0eOcr(!y(8PQvURI~nrqOv|=bNT|G<_q%hBe(U?MyKM) zvW0LBL($4GTlmC>=%^=(v{c0Re&)RgpV@?RK-N|r6sT~p-g87OD$}=Z(e)NjZ^ioa z&zByKi_^bfsg9I9(dhQ~x6R0QRJ+J}0z~H6Qe$Y0&nk6f9ilT+<#S=bMu?D?@J|F2 zs9o)Gisd<|#3dgOPgdLAxpt9K1?h!r>>bhf^Po5w_kH~z8d7W;^?|1Z0$Zs@!5%A>;_FOs(%;wh25_LXB zs+&El1V_#*|MDN~FY`5x@fVP=UK9N5Vcf=hU_TlmErmr33(n}krzzCEf^E)88UYV16fPjjw_~PRfjE;y z=giq#yzoBZCJzDq(R$rO6W+udQFy9)2@eW(IY;Gy2HZ8R4j$t-G>H}nWY5p>u&dcb{8`-b^@;I-L9kMa;MIhBo^ zTioFbRUs3&!_mZ?!~4QZUTbDi&FME!BN2^KF6&Wv+fwcE`D@?^$IPF27_lYLu669` z>V7yl%(fmi04f3}Q|KySezeKOvPa?jE?0ars+j39H<1JmfCvDz+Ne;~4+sS!F^WzR zxK^pxzHrz(EOWW^@w9+<Twz zOff+e1VL#g4jH@>e~zH@sF}pS;IBHrV^>Y?Cuor{eL!)$MXaWaHsJ1(+nSk8#RyFH;;fuk z8$4dUW>+k{9r7(h6krNxvq_i*ZSatnfdw6Z4ybQjaN#|UM1=Zy8L=+8@0khpxG=`N zl+pNknn<2(BS|ajfIn}@OO+LsgU%&7Vk9J~{ifq)w3K73ei4tzP3WdRtM0YJT@aGE zES(t{bCA-$|F=%;CNUBbKuQV|1`6LpI0>>j;dcMA;f3TumAsjMX5k}8Pav^{cZlP_Cb#==n0V;ZO;-5QX0*-7{b!E_Z zb8O#uN_u2tbNR<%4=4w>b5Bmj7D@(7KNQ5*CVPX7jivjSR8p#s&nyI{njcTe)$wR% zZ|tx%aR+E9TytHblbhkBLhi{A+o0Ze62=7puMa3bRnFxBnL(#)JGf^+x%bu>^_~>b|d6J^7-&(dzzsjgdD@5=P84+!dU9VN|;6(2UCNWt(xsKz{i1}Qjz;%a+d*U|JH-}qN(S~(?)ak&}H zp$O%rzKwNLvCkht@OfyXomy->>Ph^pOersM7p4dxN#5G5SCvYvty$MVJeXk+1-vHG zImOuL8<<$8g;^y~Hf1Nv^5e)S^b$XqnkhE6{|IBM!pl^|FqH(}PZ)v`=m$e6HK5kX@RO{Ob{m6IW#2;A1TZEo;5MWGCd`G~Z*NElsC z=f3#o@9Qpw(W78e4c);UjjF<3Vb4~n7%w+c^bS0SQb;FYl0yqwoyx5Jur8EwKOuY( zbeEC@0%@nc-C;1$eN?!%V_~xZa_T@eRM@JyhYy+w*4LJO5yaf^r6{d>0*$Kx=S>%wLDa|J*T0H5sF`RHowQ_csk@Wx^)Y^>KcJX>kT5jr+#NNlm(V6Q*d!;$K`ylQY`X z2FT;duW|lva4D&G-*y0*Ou1g!`Z$awotfIFG*a$%NAq!*Z_YLlK2B0$^Dpd!bZ0JH zf<%z~NYq8!Y1dnYs(O~7vUyKlys|Qcs?wDsxhhnYBB@x*J8kqO;;qRf$X5Tycy017 zddPq~wowpcfL4@`@<%~F3lZc@@}qnv;x265=k*^Fq)?ruX-r`(+S7-!+UuDl)mbRA zXNZ49cTafwt0fK}JIs}g{)ExcEzgg8dTP=QtiTH$TZYU@A@TD^XR5WQb+Q=SwO|f* z$0_~TimmytP8<6~xEN^Ck5>C~z+@fNLsG&$f}cUQqkn=syDOMOp{%AJl2i`Y(PwAi z*ykxuGqsAlpW=UQuHg%r6DE+o5u(6{?~Wg2LuW8S=l^h?vS!*W(zU{zSIMe-AOC6C zWrsAPP2wYmTux~fL3FNs2=2n(ek$$Gp{tcl$!kdb@Cp}^^Zh&8jniQFmG(?Q;*;={ zA~w>jx$M@XW*cVvQi$Bt($hF)T}Tn8iG80QP;TYI!b~fFD9&_3ggsj2$g$PuZVhKh zmhsAm3c@eCwNdmIt!WSg+9rn_YxB*G$^i(W zipH0Hdb9itMoK#(W~)@n$Ek2j6^U3t2MR$2c$4G0q_G zJC~kH>lo%%Kq6EREDgS0|k$#TH6e26OL7e+#Qv`?M=q z3;lDLUxm5OTM_a+n;<NR?=&>=drAqh(nB8?4hB+zRIP~)Lq5k-KU=7J z0l}PrYLZ$~^ixelqCo}Shubn+-yH3c%CG$FA(Yz&7JM}CQh@HgJz-g~iiBLz|enalkslaY3@(w!biwC!lMR1Dk&PXkm77r3E?vd&_}Bh^TGe{^L5UNWqb1oPz9F zu)?I>26)^*+g?|`(^glj0`Vmhv58J|i1iV?ttm-WKkP`Mq z9`w|`HsoBAT9iGS@wbiqPK7>O^$U7G@v*K9W?uk_ZU{G2%wouI-N1M49+BP3U zG?X4962aSEFwdPP@sVI>+~pKh7X?@P!KRUv0u3Jb(S9SE{yTN$cxo2GjM0aPWApHq zi(^Y&9r~Py-5YfL$H#4g-d2J^K6l4A0S@CRqs_v&{h!tqcdJ0MJa7$;5CybjzTV+W z1?nebhKUhb0!Gg}uC7_q&8T;sNmGwIWlTtGC zN>OaDzI6DBG9|Nil>T5GT-LgPvQje9oK}hmk=Je1ydbz6aqBW~84HAa8On=SV0x}3 z_ZJ*Q4YN_dftE~gK3;Ql*eoY^q8-Ua#qc=$tqX_W95F^@N^478o}vcwavP3 z5uWtHdb^EP*|Z$I7Ob#*_R&}-_%rC+hi^Ldo^aVmI}DZrn(Qfu)su}1M_DU1{l*)% zDmkcC`ygtxh7`&DlD_59#Vkn2sUa`2OU_qk(j|K5D%g1>3;fCYO|v()`F%8w3YUPeg#2}W&zH; zv%IJrp4Frm-p7?Mk`SP!mUEHkde4%86eXF_Jt>h~iyWFe_|{`4S!F_NhWL1VskY)% zHaO_zPsu`p&J~AqcxiZ}sz4+Y{s6DtT3h>^GDl6u=KXKq1l18A)2LiuQ$K%gBw>89 z!kb6wz{D^2BJVzxQ=4X0=||UA1-Uv+d)37xSLdX3qAOQWm5xB=O|lWBR_wS&7aHS zZ8DaY3WtOE;<$8xHf&4jj&dxCz&AS=E62ki*zA(xM*N|wOHbptKKM(xCuXOEle6$1 z39_6nvR5u+gCBVw_iuWz7t1TWpW=-g+-}>e71_iuwSv}Ni25ZpBqI7c#hjqT% zZMyBVRup)ya7yCk`rEmDJA1j=sqJ72vC9j-{r_chas6Ro(|v&l8m??_TGP4zW>z&s z5dBVBB8lMl1L%wK^6uSU((YHc<-dU<4=zDX-C;Kgn1{{TnerX_FWQva&MsNe!RR!e zq|$zJ#(uG^l_CsL9^g?@aF|*kFJoC!%1?DVfwkm8CFq-DYNQ%Mi%5ij(?IePbX~#W z_=Ke->O05kpccw~Qvh!rOR|^QaR))R-$*lFnM&Q_9NVCllMy>#gO^zHn)9UFshK0! z8X!g(zPgmw`|efeCTaiF?(mjz38y4lo{8~xjItdndrT0j{ra|w%aYCS(~+nGVBo&G zj+`=`I0#+gMxhD0;%{9erx6@q>GJ&$-(AMJWTS7naF!xj1o1H8RXl7IH>jT^b}2?A zsJ$i{=>)eHi52nxJJ6hC>p`N(;ha4P4bfBYtxxaV*k|NbxEqN#0`~lR%(szKW?^x} zHFU%2z!aIPeZyYI-!G2S>7_s2W}L3ae8Oz;;co0P2wRY`I-Ma#-x9$JUm|S^sCY}X!U3ArTNJM zwtCYj<5H(H*oE@Bs^%E?+U|!)TiDuE6kJiSg(Hrul-c}5NtEXeH>>Zw&dmuAgub?V z@i%oOufK&rymIo0x@IIBflcED0ve?=wzH^69<3gFDjaUik@J_RFqht`cTg8PiIeA5 zSfw)5ZQXrE$3c`pfnQ_nDR6QB-ZMPh4=Y@L!`kwGZR|!4_Bb;AywgxmcDVNOU2#0{ zh$bT}rF>SXyQSkk>|`<_m#SZI3TeA&xU))3nKSgkI2jbD-(zct7c%UPhX}WA(EigH z!vhCBA*pf~mVQH_W4L+m4MPEk-+!K0Qj;Ll3B#Tl^gC?gM+s_$0KScrvnY( z&<(<50Zp!w3zaxX1~UMYo9d{R2AlkI?^T{a)*PN?*K6X(wmNvy3HyD!gA+ABS>6A>haU9P8W3Gho8bj( z%P~dApeFz58V>%q<4EqLx*iDjsG0l%X=-itxzk`9XOQG!y9Xv!eMWVV(y`Uh+ zlAtx*^TVnW%iqhKP9xZtTiLl>ePaz(OyzQ~k%($d!|2ICPkw+m?05IWewoEePrsC7 zVIf0jYVf#!w(D|jjlGThMnXU@+GeUP(-BN!EI=Vb{v_EZMf*02hnP!>@p`foxT`Rb z(R$zmB~P7%@1aMk(H7^scPKUD<*5T^bh_3pX8!J|0P#7BX}h4)J5>w|BJrOsEWMU*rqx;W|Q^MePLje3E%r zKRq=atqCJ9?2h0l7!cLOz}@^lsisEoJQo9T!h6%W*uRIbrIL*hiKR++m#D$2@~a_4 z>cMouZUIyr2_T?V&0Zc94wdDB;|8%nI}f))p^Bz%-39oqhjqGQAY(S_LbSAO<6QYeW1UQD{>t{-b25VbZnYpAk~>;v z0H3b+wEEm_u=Opts(F7&F24Zua`kXwkIsEA)||kcnVGPZ3n=7Y9rQ*aH7Y|V zCsTgI5>8a;%D1L)Q@^v zQ!Rfr@HC2I#1E-mMkEHSwp}?dBJV?P!UPji^jTJ8);I%I%IU&RR^452_PF@%O#%M= zBK~E+)(Ivu+1JQ)5jl1A{vLy5yzw#Y!rlQ-h{*18iPQU?jC{WRr9x30>u!rRU8$4% z7`(U~5t@8OmpQav%vsnygR?$eGalm( zI9}_uppbzA@p_|C^_8h!B?>QZ1Ur{kHS$+@^s?LI7Kh*i!l%YjUJHZZpb>=QQ>Sll zhhTwya7wH+$g@V3ncX?$=;^*8ddY%U;)o7ZdT89RmaP815HlrH(C(h`jYjrdqb30GHZ!wDH4 zeMzGpEAu`Ori+x9O$AFitsWXvk!&;d#2^$bv^QHjJ%qq5kGXXj6#A{TbuAqRvq`S# z?TlxKa>niuUCvnY@x7thL*~_Z2k|;p?BmFjNMxIs&syICwz|78AKkgXe!uexd{@x9 zEP2gD(g#9Aq-jt#R*Fmj1ZjvW&4A<7LUgH`xy%U&+>QLCc!$+Fm<~+fa^Tj8t;1-m z-dS>_?Ntw4L2DHX#35c5-Lm@0gzCV0$4m&P_j@Ab>L`AzIZOY_^wp^&O*q{+pcBG4 zV(NAr`)gw$vr}Y$OhRc#v!C`bSB{M6a@gSFP}6R$#3cN=8MaKIpyuK&-3xp?b9rs0?t5qk#7w_S$E6eXO3ct5)?;mLl4xe{ zmar<)5jA~(>94T3Gb1tj9Tsm&?*!Z5hKJM;z1J+->8j5l-~zjxv)@gcdkMU@+uP!I zoM@0>)!bxmXFtwOJx2%671wP@Aslhx1`&TXtLei7?=S)$hEWo6>lKd{MzYV5cvF!f zZP!v2i`V^>LGuth@31+R07V<1)zxJ&%i(XH3@3th_rzDSZ0*}6u&TN+_3MMY@`g7; z9*dP=P^ul~iupTF+wWu&93iIfw!Y13%^vCQZAv6T5@cx>eEQoBpfw`ZA~{C|I{x76 zrn**yXYtRTj0 zFK)M++}6J`ws#NW7(t(>w;HV%>^Fpg_;@HKX@)8}LR^E75gJi}SFqxUg?)4CD_yCa z%p48TI6I=;b8)n3XNw{i$-7*2z!h!&s$_maKEE6+_E(-ua((R9>2-J`w}dpfAdR3x zr$c#^Ez2|6T?*rGZlEn)RI?|Sik57Qd4CqvmggK2wY_Vk?N2n&ly0Lh7-#kHPaM7%DOp2f*NNYGZiR{`v?J zrTL;lz6xl?pWS+rSDMJ>oF)7oVry<7o1csFweV~E->P`3Wd;V|tJm*Ip}oywr<2Wy zAq*lSj_SQKdT8}$y`g@bvxtiX;YjdYqMc|6^`kJ$F-CplQ-1#FA;;?97m-&}3&kn! z>%aZ-|ED#z$J@p|{=V`WHcc&|_|D z(Lk2tKK7)B z9XVZ>ET^!DU%}<9WQNRhG7w|McMpf7%}F=Qz%tlD5mv6#=GFp%mKxp8MPh@X6ze}e zzHoL~>@p%nxTzE%3EwjT(LA#|p5W-Se1ov)utRV=lcYHc`7r{N>*%%+M*qr_5^uAx{jO}+Kp~(Q? z=X@^+ZMqticq_**G;N_`mrNpce@vQ07lyrro{k=}2^?6;xn%pG(aw;W<~M)bO*p$ ztTY`nO`9d^|8oe5t3+;$P!1}oD+V4T>gPoJ?5H8zAV?=x5Xj)15RdU)%ps>SpE zi9WD@cOs!?vBDHHM+sULBQ)G$QX+G=9VJok1&exYw$TUpXKb;hX{e-tu=fezr+A4q zhV0GOFED|+1N3;Fh}O*@(Yq~kxlp-@hz(^b2Y)dZBC`7Po^6$ALLnKFa03<7KT!(f zFk*n?OH=8!KXwkB(c5w9xomwXSnzBt3U}_Weulifpdi@T6(yE02vV|yI#Ts78q8?c zi1;=;MGZNRra3`s^lQmZr>K=gyfMhWG-J-nyB7S#bcJf2u9Yq+qIGp^ShT@d z1@uu(h7vMoT%lRi-;q7QtTyr7Dv{=;c$x+lw)zpKMu=7HIDIz#ANL4Ep$RkTvuDiO zqCFj@ytzM7y=qU&2q_VVvBK%&sG~1{y4DunO@dWnlWC>kY=Xd|ui2+|Y#3O5O{J@C zSRl8sT>pSHQ5(5tPxStu$Gx>M#yC)~t3#U^$rM?%22n#oT}GF4(V`?E77)xT?*Ilc zU=;Lz4Gdt2)&vyQ6~+JQ^Duum9n{?X_j^2r*|LN03;>7@IASX3d|1{g6}jEEmZ*FV zJoVz0QD-$z&j4PI?GC$1hPIBRRiB2&z~Wvzmh$wHe}gXeO4*hviH<*Vx#G1Cf5X6p z-={Rd>_n#%h*&nYVdURrO%{SyHN52~M@YNaPe3Rl9opqg{~DCbV=U}Erw_1N>x^wR zUvnfYnZplbW?j(I^%kC1#nl12PGH?w)ajfD6j+0@r702}sHh2zEnCFKmg~@Fub}U6 z-=3QllF=6eCgKboXG>7L*50cZP2?phE$IM#sy)VYu1A5*EZ{Gq(?v$J4BN9KE z3Um3(^+2c`A3#3Ro0<`PUfLSkA|^9mrEA@n_K}=0?h<0|6KF_2F^)d@e|*X=W7UwU8@qAiaZI@b{3V9ShEsTGR8vGoxM6hLxmRGnw?#i@}Z+2k-X=_`{7z+ zq_1+&sOAn(5YJ7=N=5U?>uwl`~!defT!}x}aH37}Q8+9OaSa!TPfoh>zHj zoNfwYw3|JPU3A}=FgI|sK?FFKj#S8G=CgENX};LM)R4oJ4!6Ax&mt?+JQe!?`@i0c@t?TbwKY1Q& z<2F4-(kHo~_(xqBhv8FLZLA|x-aU!55gC@0w!~F(>TB?%%dY_sePvXESVaP{XbKV$ zYbY+(lI$-k{xF}X-T|ewGjxMRDJBxt7#eGqp!LcJ*|KO!7nxl6EbUQc0I~1`b>=#y zo&}LCnLnne%CDq2JH3K68C>?wtlvxH>tw_#AptFVC~;R^-)Y+JU-{E6g#C?1G8Mep6%3e672m0K*g* zsByz1kWmIU`JB(On!=}wLSAVtfuS9@AjkXNZWvhbb!4sgJEIj)Rl)Ps zvpYK9Saq2p{rs1VamL*qrpu&b?x`1Vaf|c2oxy zQ&8**=755SMD!Jpq$x{kq;eB-Un_X3^(%!sA#H9;5w8$yW;Af6hdyb!n6GNA_nxjr zSM<*ZRKQC6C?T2FT(rLM>Imf`OPtc{BdbQgR1|~I2Q~*s1J=GDkH1TFbNqW%c-n$Y z$Dfxk5vLliE6y)Dpo#+a^T*hKs%QUSP@Tg>a|Z7x5P?X?-h(%p!l1XvKJMPQSZmI_ z;upG8nBVfL^<0c|Ys91yhWaIKf73_T-6%2&3WJC-zeTpE?*&|e{McI9KI508rKk^j ze?XJ8V7IFwZ1*@hD}#MlQ{3g6$ejdNMN=V!S#;AlsP_(n4ZP=*|H}lOi-SUp z<=yO%dv|~bPA&CDM?}7@tBu?&C3VTw>_hymgcKnE2OA$i1hXY4ev7 z=S|0PR}f41`yBja8W-ad^#mMB_@;Tt-CRCJPktQf%Q32(+q}YWu>=vl1eg4r)y7L; zs#C*CBBzf85pp@Lo@u8!8Q7YJn~f(`LSQ!gSQG6#iR`BK3CR&x$va$hYz@Mb*$ zg>&hkVmH44&=q7XF$(ZQJr`C@<=|qKrYzhh0!UAYbGHaCY!qF<>MIh;E^Wurz~ayy zoNv>pQ>lV>eDiJoIV`;OiH;DCgtBk3T(~k(}KHo^dOyO(zAEgGQ`66*!ZapRG`m z7?bQ2Dmn=S*2UZ#cq#}gVhLY|rjCgYU|0+AZTWGXrmmF|De$cq3gpcNqTUDPGbUc78^XLC1MCC_xhb zHPJ~;_t@QlAocPWXlXjwrK86fnX@LsEuw`Fcx54a8Mb5BplFv$a4bZSZ4akf1l%{A z>)=x9qVc}Bms-Cb@xQA}#;F3uLHlV;Y$yS?b{F8zdMMwk2-R+Y_Cxb-qscKOD|_eL zNu1Yu5rRuB3h;%>HT|8<~n*na+ze|A0Gn7=VsR~NZ% zf9PvkWRrUg8+0d<$uw?eoS00aH#=9reKP$@&K>n&eU!pyN^xion#UjwE!3{bEx2wE zeH%!bl}_qg%ew%GE%#iKe)Sl`%X>U#1w`rfWB}_Rig8vFw}cW!|K4zC$osvLpYu%` zAjAFRTot_aq0Z8f;N|o-1pXcSeW|rzW90zi63Dt@jdcit9wURU^8`C!n&`pcl}iXD z<&VMK^|zV|MD@lY`b}+Jck=F6MVTNF$;#N)$ z^8H7hIn$b-g#R_YpEv0*~xY3LdXsS9I;i%XP$_>jR#oYhAD1M3~&*8atJT~K|U zLS<19Fz9&!ys-XJ`CCp5Un=CeMW}+U52%`YxUnV4qU8%@H^Dr3RCH>M1u1ZxkPQjn zbK}Vuy@2#i!(~yRAP)0CRXnMpYySn9|G+}is}S{g<|=$3<6u?ztBAn4lpq1k#YcZq zuOhwwErcRX9ZPXh#vR4U$+Bn{0NMTXGMu%)&q@|T&gpDG5;f})^Uj(ow5!^a@%VqW zG^Zc!H#m!+j(57N)0+dab7V&1e{{AA9h|_;uRBl`^2l}}B_>e2-I` zI{jBb$w|uC{URMW%C5x2U5R9{E#Rbj4>CxM`9p zE9D#lH3#VB3{_RCi+LKMeHDq^jm60ZHk+JdV`U=Npm#Lepm*}A$*Nwmo61nPn=*(o z{+o0Y!8r@Ne6d-2(#d4t2UYujEL8$#lU8-8;Wd^}-nyh4OoWhTxE@D@gTJ|HkYaz^ zfkP`;UXP5+W>r5jS!rn7|7aA|-GZq6Z{ORn)}lzbi3EGR_x)^b50EvDHIkP1AwsO` z(1u0JplEqnM{_8mml}@et{(_Z0Zj17ab>m;PK2aqE(Lfuw(C7vpl(z0)ndsn#S29G znXf)AC*wVoIbmvy;A?c_+%rtc+%k`lEH|a|Z$Gt1(I!#bEz9ueidB`?9 z-U4STB*7@~iXlY&N6V?#mnhN>qf)R3*xZ+Zph}{3Yk`#O1v_HZNzSDNU7dtF2+f1d zMtUK2GO#0fgiCsS8JS(D;GEbmE{kcaFQavi*5eWzO|1`w z$PzPX;8SQiA%Hl^a&0NA6PAKXZt>_s|1Mhb%#_v@8SQxhV1RJsu{EdJpqK9;$U7ZT zy;Od9W2xOR1iMtZ>t-h$Zh<^uIVcq4_$#*mY3=zK3y0)B##MNg8MW&IBj7creSw+=QN~@VBv&EIi|})tiuSVme2aku8|SgIbA>{p=kXU( zoP5Pl>bb`dKnOY|wX8b$Q}ND#8z9e=sdWxbQK|#D#u5p6Bu%)WR_ea;@(M)`Q+-Yc z`0ID!c(eqowDjX8%TiTmqIcKg(XR~_+R<~~k&~kYol+jfkW+oav_pZ+{0^RxwS`d5%02 zH34$~B?S4^HwpMlNovyG0*yH zrl<}H(e!(2!|BIBEF``7^N!xDs}x)RGQXmx>O2@#2}XFJXU0xtZT@^r%Vf_*l9ZvU~{HKQH_dp5%$%r!16R1x^%l{br>?;~TSsp_rje)k} zpHxQp4%*ukdkJi6FZ&FF5!@d8Cj=@lM?CE|l3NhXdW#-MOG4pp#vCufjIO&ZWvrIA zMiG+$HxnN_Y;HiWx3?DBOpdFwmZI9^MAQFj8ZOqC!7wisGC9`W>#6nzO#O~@V3F5| z0*ZtjF+wP(*x{eZJ1wxI47B+)oh#6)$g@yCFYEG&62U1~?rid&FJMRX5_|Vl=uz|$ z6xx$g>XC$MzK(S{g8PXIF@|L$Eyuze1BOJC`C8}jGJpklC5>KsNETWTQ-;>Q?$Wxk z!m)(3m3!_}*>PDkaEyq=-qHDb4^Y=ZPxmt-=Y${r{4X3ZsuD*2WTFmB`;0M z6&eU0)v^-anD`jnx1?(i)E0Zk0t!0iS&~)tUa+B>pIKnrhsrRQK{%LeXy_@41mnmv zI9maKhAJUGYS0qxGPwwWND6 z(j%zlSlVzMF#K7!dVzsJw;Ia(wz5|5l$JPAb+kc`4hYbhdfGj5W!43w;+95LN(X49 z>LCX$|MoY_8wPHjbwvkOe+h_Aza#^PmS)j2XI}8_u@L-_=cYkbynhw~P)tjuaC5B( z)hXn34!pRec!a-%7-zV(YbmP56^6=Aqhdpms^=jGb?v1fx|=^ z7{~Fhcx2`~ynLzcv3e-Iw)F~e%nV>0bpJWj<>s7uP(X)QhS+S_`7=sD<#c+Z*Te2d z4QM>)UBEzAl-@qcZkaF`fWbT_oKp&PR2R;<^MB_w&zSKLZ9bAfM(D)f$!HW5t?IOa z)@4@6PnKm`szzQoKTSqY{T3`5w@I(95AGt-g%LRYsk19&!$Z383rdPv_jj%?ZHt{f zG6dI#_DIDydIkvxOQH5mLw!!(quY8`4$msVe?WViGPlT!sHKFU3ls9Qp&K4LL8vw% z*+L#a;pOHym-qZ3SZl?{1nj2bOKDkY z!WBWwI06%2hokdV(}gXgdXXr)Izx7urH{HWUndBG*)16iZ-7LUaiwdbZmpmSPhM;4 z-bT20;OqXF8|hKvi~K$Qs87383t^m1#b-8@wY@FzOWR`&vcX}kWiUS+Gq+27QsV4X z>juVK`3tE8(bUM?cUmZKJ(1SXtvX@awKxt6zR9O)diX#7JG3#uXr)W#o?@Nt9U5us<9Q%%uW+y7{+qOV}V7FxVc*fK_BVR(gR`IDU0s9VE|y8vrp+f|9UL zk>irfJ|+jM4X1X-ouX{l#W;I`VPmXwff@Q=MQ@505AS(b;yTO=QNdNnvz_@D_y1OIsnZf~t=!4sJZ&Rc6H+BvK>1tx<3w9YO4S+o7Uyyf#JDpBg zTXJ#p&U;Oq!2Qqy)iq=1^kK5VK~#;}%7QK+M;>oS*rAP23O;vU)T^WVn}c%s`rg<- zb-gmkyL+P(-sm$;r&Nwm{#>dEsq!H8@H^hK~NS^gl?9#H|5F2#S zZq7c3xL}({Gl#d-A-QJm1=z)@@&rO|f*LGKj!egIrCQ+eCU3Vi%pyPv3I}w3P4EMQ z$+xNaX%EQ~@)|7}3|NV7e(Cf~`zdw``)3|Ch$);O8yThAf|%3)RIbZhi~~tK@R%ne1p<-kh2kXl}F+L4_BH+bOcRyaX%cmy8{ z<~c3Kpgw5Gp$abjlBh;Zs%ALN}kU5~eE241t|K+pcT+VL#s2!1^ z?$v7a_YJuPF}scXHDZd5o3f%_|;x-u!taq%2nBK+%f^k3EaPkl=)j>X}h0DEyk6$ejI_!}pUZshw zf~YS$8>`QbvUlz|_(F!f6gUEAkdo1S$4W26_>U{7%4rpK?{7##soGsg-?_bB+oEw6 zH+gJjr9&yGeP4c6dwbzI>~*2?*E+H)Feir8hi-J7g!>C@@gOD}GxtRC)u-s@Y3WgL zVcBdZ3?(5j_4z-edSREIS;G$IG5sc>8NN3i+_Lx?M#c~1@3Kb`WSc9K%iyy-U-5I%VQoXEL^Og9}*xX}}u2EDnT zpKox+2hkN1Y?47?<0EvTAumC2BIvkhEy+>DP+T=)JkJLc+Xtv$yG$&Y)rh0wzYn`f_;6OoL6bpC{^N<9aFs{%5 za4)C(KS%2x=0V#_IYdU<_K(hO^mIwUz#v*zd&Xx}$0h1e*V|P4y@(vy4}=TqzDHVd z_-Y|-^Lo{K{J?l_wQ^VW(v?>PJGwvpw>k7J#D>!sAYb-UW8Fd{Ca3r4iL8c(T!?V@ zWXQ^?AXS_zu5wtZA;vZfh(kvLZ8yCTDBgbzbC0;%aj@rFm2=)oFs)=f`|Spz%My|_ z^Cv$KMbQ0QsBRV5Pun$`PDC;JfN|qK@Q&hNN9QtWk|Q>ig;7lXH^K2Cmy;w7mEmu> z*+XQuSTt#&?EXKlI6X9dO#|M0`Z9{W1@_CzegzKt93MgBa(Z=C`0Bffv6;82PoW&@ zqdwF?Z8u9^$jvR$0SZM7Jd0xoQc5c2_ZAe4!AnSTT=j>f5pvh73Iv&4W=6=^$i zN|C~8@Fy4(A;AiQ1KGFTT+HeZo|QkpUcBiv>Hhxw_sho;P7og>I&qEkiH5&dw|!wU4z2{>?z8+eLlMORy76jYuvzp4i56(F1h_Y(p+FTb$b0bM{FVgl ze}5jH`1%KajVR~v=(2$eX!z#Ixpms+w=)%%v;$)QaF=MU{gDw)#t4z~S1bpHEBa$ts z2!864Gr5&%xj_lKrIz^Sn>cdS<`JsFH*0`$1WC5gW5_|jpEj{`3`b47C2uwmMTu0k zE&hc@1J12qPjzuT8d5{5Y$|IJ?!(~!UiQ6gxb}MdnAa8Y;_|K%rs%>n_E(}^vraenGu|s zoWh*J8HX4ANT&Cq`lns^0`v z@2@dxUcA*&M~2Qj;bvlwzFf=4D|GoZmegWs?HtyMz)LUWYK{P&bBO=i+ z6#FJ1J4%2UxPjoN=NQjGef0yXAlz9{wS|r5Hfhz~XF}}wYSx)1|jm!K%_=k!A=t zcLky7o|^=nP-u^C5PhMm1p_b=)cX|-i1Nz? z9vXgT0&5;c55(?mH;Uu!AFh1ISFG&4>1(`u12iw|1T2~+l}Jllxk}WgT$wX@5jlKV z-1}kbIo}01=gg7r4*+w37cJfKhrHgK6NWZgkCVQ<*|rWuEoc0hrz-OexJ1-LmBL)_ zZCeGggb^Pb=HY>Kg()BR`B-9{Qy22$8YL@aQXf76w znF3p^W=Khpv>)?&FNCCMc`qU*?ep(nUqJ9r%WkzEADl#ZKLJq^d;<$_0?Ov5H?Mz5 za|L5h;1$@|9{m<|(?$kN8@c>*Ges6sZ?>jZfwarT_f?6obj<>{PZ=?#b0Kjcw>X*a>3>=OG^ zM5t-+QXnOv@I~ybReb$&PN63L1HkYto7olH;r;MGA@I@VA3d)Wx#1+u%>qeRi?4Me zSlwp6B~7ZhK&)KJQwdE=mY)`Q4X$BFNQuXW(1N z>1URb7eT_IlTl}o4=Csc@CwWk9mh4(eg)S;8Xdio1zR-iO0f&YMv*P_ia_qB{O-cc zI33={(NqzArv==>9Mg}gk#h3ROVSH}`7x*9Ud|mss#}OnQQNNPTt1DNQ1hSdlec^&tkjo84=%TXC=2pkBa0CxUV!MK0 z%&nxzy?2275`{%A#%Za8nZBSQ7%h|%mrmL1!>iyTv7OV-H#9D&f~i?lolMm{BE|i_ zATspS{_C~YSFd2A$p*p#xH-Vo9Vsy}CsOGutn0hR9Qae1|s?Q=jl$t@M3>&R7tnvuGi zWL|su30~Z4<#Yf3ZG>KG{1j5GqqS~@U=y2K+%$khb5B-Dg<+ec@5+1>t0Hhg=m4B5 z$O%^@fch{sYnv*f6r|K=C*r5X8n62rNsw%I$+Rm<2 z!>y0mC4vxUB4fPh2Wqy?3R9;LdK2e<$8*?d=kl}U

gVyr`fuyDw6~r3V@C?D;H} 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 L^EcMFk^l35b;u$} literal 0 HcmV?d00001 diff --git a/assets/social/github.png b/assets/social/github.png new file mode 100644 index 0000000000000000000000000000000000000000..d55cc4266e46f5f856ea39fa0e20678d017b0f3d GIT binary patch literal 10191 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 literal 0 HcmV?d00001 diff --git a/assets/social/npm.svg b/assets/social/npm.svg new file mode 100644 index 0000000..56fa729 --- /dev/null +++ b/assets/social/npm.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From b23ffa4b607573270d02084cdc5c8d6f66dfee2b Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 10:13:55 -0500 Subject: [PATCH 15/43] feat: added social logos to readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 90745eb..873ca51 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of a soothing warm palette with 22 eye-candy colors perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers.

+Discord Logo Github Logo Npm Logo +   ### 🧠 Design Philosophy From 6805cee76fe13c25a854aca3e368e6277d9bae78 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 10:14:52 -0500 Subject: [PATCH 16/43] fix dimensions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 873ca51..28ab7c5 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of a soothing warm palette with 22 eye-candy colors perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers.

-Discord Logo Github Logo Npm Logo +Discord Logo Github Logo Npm Logo   From d136f886bd811c4fc54498ebfb13ea7c41989ed2 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 10:16:05 -0500 Subject: [PATCH 17/43] centered logos --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 28ab7c5..1f9db21 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,13 @@  

- Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of a soothing warm palette with 22 eye-candy colors perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers. -

+Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of a soothing warm palette with 22 eye-candy colors perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers. +

Discord Logo Github Logo Npm Logo +Join our community! +

+   From 9605f8f3b8a8fb635827bab27805916fb292ca16 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 10:17:36 -0500 Subject: [PATCH 18/43] centered text --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f9db21..e3a205f 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,10 @@ Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of a soothing warm palette with 22 eye-candy colors perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers.

-Discord Logo Github Logo Npm Logo +Discord Logo Github Logo Npm Logo +

+ +

Join our community!

From db9ba6d5f04d72132ad5136dc4642a460ba49a13 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 10:21:52 -0500 Subject: [PATCH 19/43] added links --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e3a205f..9e802f4 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of a soothing warm palette with 22 eye-candy colors perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers.

From c675f7ccdc325cf6ba228ebb53fdf4eaa40aace6 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 11:34:53 -0500 Subject: [PATCH 20/43] added macchiato showcase --- README.md | 2 +- assets/palette/macchiato.png | Bin 0 -> 490 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/palette/macchiato.png diff --git a/README.md b/README.md index 9e802f4..095ea3b 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Join our community!   -### 🎨 Palette +### 🎨 Palettes **Catppuccin** constist of 4 beautiful pastel color palettes. All the details can be found below.
To make the best use them please refer to the [Styleguide](https://github.com/catppuccin/style-guide). diff --git a/assets/palette/macchiato.png b/assets/palette/macchiato.png new file mode 100644 index 0000000000000000000000000000000000000000..db3b9d401adfa6a142cef677e5907767c98cc5fe GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0y~yU{?dOWjNS?q{{Of&wvzXfk$L90|U1(2s1Lwnj--e zWGoJHcVbv~PUa<$!;&U>cv7h@-A}dg?-qXb~q=ND7&5d48j1p}R|9eQX96h-9 z>{>;s-S_nt-_FR)%;@OwIOr%6cyaZQY4@M+?D;NxZNB{SMSBnbU-jaBm9_q_>i=@x z|K#f9yZ^P_%)NO3?2phd+pA}Z|K00r?pkmEd-|gNFP|)Yk-t%<>)*S7C6l~A*u;tc zy?egTwSF=a&`ChRVXVdoW;9qN3xOF79V0==nmI0A^gt!wCs&ZCJzf1=);T3K0RY=5 BdSU Date: Wed, 25 May 2022 11:36:12 -0500 Subject: [PATCH 21/43] added macchiato asset to readme --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 095ea3b..43a32a4 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,7 @@

- - +

From ae233f3a8154b0bef32ffb277842189a57d56c5d Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 11:36:50 -0500 Subject: [PATCH 22/43] fix: macchiato asset --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 43a32a4..1c03ba4 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@

- +

From ca5e2c6b1e5b4e05a152a4baa89c64910559d544 Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 11:37:19 -0500 Subject: [PATCH 23/43] fix: macchiato asset --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c03ba4..d759382 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@

- +

From 00e5344b2b5a7bf504540395e47600a28312baad Mon Sep 17 00:00:00 2001 From: Pocco81 Date: Wed, 25 May 2022 12:13:35 -0500 Subject: [PATCH 24/43] added contributing --- README.md | 3 ++- docs/README.md | 6 +++++- docs/contributing.md | 39 +++++++++++++++++++++++++++++++++++++++ docs/integration.md | 0 docs/specs.md | 0 docs/style-guide.md | 10 ++++++++++ 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 docs/contributing.md create mode 100644 docs/integration.md create mode 100644 docs/specs.md create mode 100644 docs/style-guide.md diff --git a/README.md b/README.md index d759382..830cbc5 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@  

-Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of a soothing warm palette with 22 eye-candy colors perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers. +Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of 4 soothing warms palette with 26 eye-candy colors each, perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers. +

Discord Logo Github Logo Npm Logo diff --git a/docs/README.md b/docs/README.md index 68bde6a..4a4c822 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,11 +13,15 @@

- Documentation for Koy, the human-friendly data serialization language + Documentation for Catppuccin, the soothing pastel theme for the high-spirited!

  +

+Catppuccin is a community-driven pastel theme that aims to be the middle ground between low and high contrast themes. It consists of 4 soothing warms palette with 26 eye-candy colors each, perfect for coding, designing, and much more! In addition, this repository tracks the development of the actual color palette, organization-wide assets, resources and code samples for maintainers/developers. +

+ ### 🎏 Koy Lang Koy is designed to be a minimal, simple and intuitive data serialization language; easy for you, your dog and your average 5 year-old. It has a small set of symbols, not too many rules and only one singular statement. Its lack of complexity makes it the perfect language for your project! easy to implement, debug and modularize. diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..e779a1d --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,39 @@ +

+

🤝 Contributing

+

+ +

+ Creating Catppuccin ports +

+ +  + +This section covers how to properly create Catppuccin ports and how to submit them! + +### What's a port? + +A port is basically an adaptation of Catppuccin's palettes for an app to use. Think of it as a colorscheme for a program that styles every UI component it consists of! + +### Creation + +You can create ports using [this](https://github.com/catppuccin/template) public template as a blueprint. However, you must **not** create it the traditional way (by clicking **Use this template**), because this leaves a _small_ tag under the repos' name that says `generated from

-Discord Logo Github Logo Npm Logo +Discord Logo Github Logo Npm Logo

+ Specs + · + Conventions + · + Cheat-sheets + · + Style-guide +