Index: frontend/node_modules/es-iterator-helpers/.github/FUNDING.yml
===================================================================
--- frontend/node_modules/es-iterator-helpers/.github/FUNDING.yml	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/.github/FUNDING.yml	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/es-iterator-helpers
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
Index: frontend/node_modules/es-iterator-helpers/.nycrc
===================================================================
--- frontend/node_modules/es-iterator-helpers/.nycrc	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/.nycrc	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+{
+	"all": true,
+	"check-coverage": false,
+	"reporter": ["text-summary", "text", "html", "json"],
+	"lines": 86,
+	"statements": 85.93,
+	"functions": 82.43,
+	"branches": 76.06,
+	"exclude": [
+		"coverage",
+		"test"
+	]
+}
Index: frontend/node_modules/es-iterator-helpers/CHANGELOG.md
===================================================================
--- frontend/node_modules/es-iterator-helpers/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,279 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v1.3.2](https://github.com/es-shims/iterator-helpers/compare/v1.3.1...v1.3.2) - 2026-04-09
+
+### Commits
+
+- [Fix] detect missing early-error `IteratorClose` in native implementations [`7de2a9d`](https://github.com/es-shims/iterator-helpers/commit/7de2a9d71f763989aa3f165289975143958cb521)
+- [Fix] remove invalid expando properties on `index` files [`8416384`](https://github.com/es-shims/iterator-helpers/commit/8416384fd097646bdc26ae0e0bc5557588d6f4fa)
+- [Fix] `IteratorZip`: remove errored iterator from `openIters` in strict mode [`53f4b4a`](https://github.com/es-shims/iterator-helpers/commit/53f4b4a6e8e71301f7d466d257c5599a96cb2ee5)
+- [Fix] `filter`: add early-error `IteratorClose` pattern, fix counter increment ordering [`ef39451`](https://github.com/es-shims/iterator-helpers/commit/ef3945189b53067f2d9a7f10909d4d55817614da)
+- [Fix] `flatMap`: add early-error `IteratorClose` pattern, fix inner iterator close semantics [`dc122cc`](https://github.com/es-shims/iterator-helpers/commit/dc122cc5db159f3b40ebfa8419990d9bdc1d0fc1)
+- [Fix] `drop`, `flatMap`: do not close iterator on `IteratorStepValue` protocol violation [`8761fe6`](https://github.com/es-shims/iterator-helpers/commit/8761fe635d416f6b51cd8669d662cd12bb2cd357)
+- [Fix] `drop`: add early-error `IteratorClose` pattern, fix validation ordering [`f5cc006`](https://github.com/es-shims/iterator-helpers/commit/f5cc0068a14655a19ac25d68c1694c3d1bba990e)
+- [Fix] `take`: add early-error `IteratorClose` pattern, fix validation ordering [`fb5db74`](https://github.com/es-shims/iterator-helpers/commit/fb5db74726eafe6ac4bf0d4929377b0893ebbbef)
+- [Fix] `zipKeyed`: use `Get` for property access, fix missing `IfAbruptCloseIterators` [`aec8d80`](https://github.com/es-shims/iterator-helpers/commit/aec8d80002b0660490de914c392ca659dfab53c7)
+- [Fix] `map`: add early-error `IteratorClose` pattern per latest spec [`ce222a4`](https://github.com/es-shims/iterator-helpers/commit/ce222a498e31f066ce03095dfadd94f3ea173084)
+- [Fix] `find`: add early-error `IteratorClose` pattern per latest spec [`e7cb5e9`](https://github.com/es-shims/iterator-helpers/commit/e7cb5e98e2c7f88bd3f98d0aefce5dadb5e0cba0)
+- [Fix] `every`: add early-error `IteratorClose` pattern per latest spec [`64630cb`](https://github.com/es-shims/iterator-helpers/commit/64630cbede1ead844689560bf920fcebf8b38c96)
+- [Fix] `forEach`: add early-error `IteratorClose` pattern per latest spec [`beb0650`](https://github.com/es-shims/iterator-helpers/commit/beb065015f981fa3bba7691d3fd0f61f6315386c)
+- [Fix] `reduce`: add early-error `IteratorClose` pattern per latest spec [`14225ab`](https://github.com/es-shims/iterator-helpers/commit/14225ab8e08ed6371b2b293af2e936e6ef363245)
+- [Fix] `some`: add early-error `IteratorClose` pattern per latest spec [`3bf20c3`](https://github.com/es-shims/iterator-helpers/commit/3bf20c3e527b0168e4a7379883f0d71e8cfc16d5)
+- [Fix] `includes`: allow `Infinity`/`-Infinity` for `skippedElements` [`8eddc9e`](https://github.com/es-shims/iterator-helpers/commit/8eddc9e375c45e3449cbf6fcb6309b5a537c2422)
+- [Fix] `GeneratorResumeAbrupt`: pass `ReturnCompletion` to `closeIfAbrupt` [`55dc985`](https://github.com/es-shims/iterator-helpers/commit/55dc985c66f7054655ea1b3a34e318eade6e2e52)
+- [Tests] `zipKeyed`: work around V8 4.6 (node 5) `ownKeys` ordering bug in accessor test [`309cdc1`](https://github.com/es-shims/iterator-helpers/commit/309cdc1de94cea526b2284a529301edacf4c6bf8)
+- [Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config` [`9694b21`](https://github.com/es-shims/iterator-helpers/commit/9694b214c6b81512656b34dae3f61b76072a80fa)
+- [Deps] remove unused dep [`1089a80`](https://github.com/es-shims/iterator-helpers/commit/1089a80cbe2a464f1fde99f46d42eb2f1176d5d8)
+- [readme] fix markdown formatting [`1545d84`](https://github.com/es-shims/iterator-helpers/commit/1545d846fb21d30d1b7fbf35b57e74f11f12160f)
+- [Deps] update `call-bind` [`45897c7`](https://github.com/es-shims/iterator-helpers/commit/45897c74551e5f4f493d5f07c3981a73e1c857c3)
+- [readme] document `{ next: null }` Chrome bug and affected versions [`eee929c`](https://github.com/es-shims/iterator-helpers/commit/eee929c14d59dc7c9b245baf819fa8020df48da5)
+- [Deps] update `es-abstract` [`7bed3ec`](https://github.com/es-shims/iterator-helpers/commit/7bed3ec4fe52bb73ea7c6f2d8dfb1a46b8d4cca2)
+
+## [v1.3.1](https://github.com/es-shims/iterator-helpers/compare/v1.3.0...v1.3.1) - 2026-03-12
+
+### Commits
+
+- [Fix] `includes`: close iterator when throwing [`5b2ed34`](https://github.com/es-shims/iterator-helpers/commit/5b2ed34a032711250fe4f0923df81939a5db978e)
+
+## [v1.3.0](https://github.com/es-shims/iterator-helpers/compare/v1.2.2...v1.3.0) - 2026-03-11
+
+### Commits
+
+- [New] add `Iterator.prototype.includes` [`554f43a`](https://github.com/es-shims/iterator-helpers/commit/554f43a323e2817c0ce06b5a01e7334e569ca896)
+- [Dev Deps] update `@ljharb/eslint-config`, `eslint` [`f61fcfa`](https://github.com/es-shims/iterator-helpers/commit/f61fcfaa1c2880ac429f13b7167952d237f19561)
+- [Robustness] use `void` [`876d259`](https://github.com/es-shims/iterator-helpers/commit/876d259f89852ed1bb482079679b71a1288fb013)
+- [Dev Deps] update `@ljharb/eslint-config`, `npmignore` [`07d3e98`](https://github.com/es-shims/iterator-helpers/commit/07d3e9874cc29c42f6e3f49ca30eeff23e46c172)
+- [readme] update spec URL [`132faeb`](https://github.com/es-shims/iterator-helpers/commit/132faeb555c60be67be547b018249f881f2e66cf)
+- [readme] replace runkit CI badge with shields.io check-runs badge [`fbd6ffe`](https://github.com/es-shims/iterator-helpers/commit/fbd6ffee76f28c0aa1f99180d6971caa6a36f39c)
+
+## [v1.2.2](https://github.com/es-shims/iterator-helpers/compare/v1.2.1...v1.2.2) - 2025-12-13
+
+### Commits
+
+- [Tests] joint iteration: add missing & passing test262 tests [`34258f3`](https://github.com/es-shims/iterator-helpers/commit/34258f36f9b346fe92ac5c001ba75784568665d1)
+- [Deps] update `call-bound`, `es-abstract`, `get-intrinsic` [`e05660b`](https://github.com/es-shims/iterator-helpers/commit/e05660b9e2197f27ee428f1739944f49b3ed0f7c)
+- [Tests] `Iterator.from`, `Iterator.prototype.toArray`: add missing & passing test262 tests [`7831bd6`](https://github.com/es-shims/iterator-helpers/commit/7831bd66b07dcee905e06506ff9f9d352971a388)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`35ecd14`](https://github.com/es-shims/iterator-helpers/commit/35ecd14f2d26a8664a6b524bbbd85c270c1c610a)
+- [Fix] `IteratorZip`: return should close all underlying iterators [`5bcab73`](https://github.com/es-shims/iterator-helpers/commit/5bcab73b01369f13b9f379c804a7f7f7b7995e32)
+- [Fix] `IteratorHelperPrototype`: throw TypeError when `return()` is called re-entrantly [`0acdd41`](https://github.com/es-shims/iterator-helpers/commit/0acdd4107c075f6b6b8822e0ce4a2a799ca476d0)
+- [Tests] `Iterator.concat`: add missing & passing test262 tests [`9645f4d`](https://github.com/es-shims/iterator-helpers/commit/9645f4da1052674ec2c7b5809ec8c164d8adda1a)
+- [Fix] `Iterator.concat`: prevent `return()` from being forwarded multiple times [`1271d61`](https://github.com/es-shims/iterator-helpers/commit/1271d61cc35606a627b8412609400a11e6d5f797)
+- [Fix] `Iterator.zip`: strict mode should return sentinel after all iterators done [`f4c8b99`](https://github.com/es-shims/iterator-helpers/commit/f4c8b99ca39dea551d38b17ade315b03b64e4a46)
+- [Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `eslint`, `eslint-plugin-import`, `has-strict-mode`, `make-generator-function`, `npmignore` [`acba233`](https://github.com/es-shims/iterator-helpers/commit/acba233094b3ef70d8d20e41c4ea084a6b47447a)
+- [Deps] update `es-abstract`, `es-set-tostringtag`, `get-intrinsic`, `iterator.prototype` [`06515e7`](https://github.com/es-shims/iterator-helpers/commit/06515e7d1f5d5e7c98777eba6aec50d1cdaf6a4d)
+- [Dev Deps] update `es-value-fixtures`, `for-each`, `object-inspect` [`2afe7a3`](https://github.com/es-shims/iterator-helpers/commit/2afe7a38fd08ca98ca173070350e370535caa325)
+- [Dev Deps] update `@ljharb/eslint-config`, `eslint` [`18fa1c1`](https://github.com/es-shims/iterator-helpers/commit/18fa1c1ca56070d68e6f4db37a365e1f98d27a53)
+- [Fix] `GeneratorResumeAbrupt`: set state to COMPLETED after return completion [`10e5e21`](https://github.com/es-shims/iterator-helpers/commit/10e5e21fd1ed9dc156bfca7644843f4a11799543)
+- [Deps] update `es-abstract` [`3469d15`](https://github.com/es-shims/iterator-helpers/commit/3469d1543a0730156a95bb90747efebfe46ba1a0)
+- [Dev Deps] add missing peer dep [`a0d780d`](https://github.com/es-shims/iterator-helpers/commit/a0d780d64a4742004e316ee9b70f445711b5a4db)
+
+## [v1.2.1](https://github.com/es-shims/iterator-helpers/compare/v1.2.0...v1.2.1) - 2024-12-20
+
+### Commits
+
+- [Tests] `Iterator.concat`: add most of the tests from https://github.com/tc39/test262/pull/4326 [`2e340da`](https://github.com/es-shims/iterator-helpers/commit/2e340daf021139ea41dc828c7f99452114db8561)
+- [Fix] `Iterator.concat`: rewrite implementation to match updated spec text [`1a70fd3`](https://github.com/es-shims/iterator-helpers/commit/1a70fd33ab81738ad2b748812a431d51e0c4d758)
+- [Fix] `IteratorZip` AO: allow an empty list of iterators [`265e566`](https://github.com/es-shims/iterator-helpers/commit/265e5664dade59e2faa5d7d2e203b92cd0af5c35)
+- [actions] split out node 10-20, and 20+ [`3cc9db0`](https://github.com/es-shims/iterator-helpers/commit/3cc9db03118e2b4b6432e262e7936a7e2f3074c4)
+- [Fix] `IteratorHelperPrototype`: in pre-proto envs, use same `.return` impl [`da02ab6`](https://github.com/es-shims/iterator-helpers/commit/da02ab656dce1c4f73355290a3bd9e4c25ccc3b6)
+- [Deps] update `call-bind`, `es-abstract`, `get-intrinsic`, `gopd`, `has-proto`, `internal-slot`, `iterator.prototype`, `safe-array-concat` [`e9eefab`](https://github.com/es-shims/iterator-helpers/commit/e9eefab99fb496f9a4600193126c69c321394d42)
+- [Tests] `Iterator.zip`: nullish non-function Symbol.iterator does not throw [`c6b0705`](https://github.com/es-shims/iterator-helpers/commit/c6b0705e2b601c1c8d412679eca4fe4618051d8f)
+- [Refactor] use `call-bound` directly [`92afc5a`](https://github.com/es-shims/iterator-helpers/commit/92afc5a7ed014b5e2b52db1b1a6a99d16f50d5d2)
+- [Deps] update `gopd`, `has-proto`, `has-symbols` [`7f8a1c0`](https://github.com/es-shims/iterator-helpers/commit/7f8a1c0049dfd649bea9a707b9c451ba7e9f3b0e)
+- [readme] add missing info for `Iterator.zip`, `Iterator.zipKeyed` [`dd80b2f`](https://github.com/es-shims/iterator-helpers/commit/dd80b2f1718092219e94e24afdc1737f062e3df4)
+- [Dev Deps] update `@es-shims/api` [`1e9857c`](https://github.com/es-shims/iterator-helpers/commit/1e9857c497f8f4e6053c9adb7dddb98b6800c628)
+- [Deps] update `es-abstract` [`c8157da`](https://github.com/es-shims/iterator-helpers/commit/c8157da5194372ddc968e0f512d0740544752d30)
+- [Deps] update `es-abstract` [`256de0e`](https://github.com/es-shims/iterator-helpers/commit/256de0e1aa45d6d0ad12a19ef04491816bcb7288)
+- [Dev Deps] update `object-inspect` [`2f8544b`](https://github.com/es-shims/iterator-helpers/commit/2f8544b7baa80174e7368d475a4e3fa577418938)
+
+## [v1.2.0](https://github.com/es-shims/iterator-helpers/compare/v1.1.0...v1.2.0) - 2024-11-04
+
+### Commits
+
+- [New] add `Iterator.zip`, `Iterator.zipKeyed` [`d11073f`](https://github.com/es-shims/iterator-helpers/commit/d11073fd27fcdaf696c3d9b00634b6a5144f75b1)
+- [Fix] `concat`: add missing slot for `.return`; convert singular slot to plural slot [`cc4b586`](https://github.com/es-shims/iterator-helpers/commit/cc4b586cdb0ad6ba540043077c3d71ff79d528cd)
+- [Dev Deps] update `@es-shims/api` [`dd14f1b`](https://github.com/es-shims/iterator-helpers/commit/dd14f1b9f06c37f3bcb0a20bacd6e7f031c0724d)
+
+## [v1.1.0](https://github.com/es-shims/iterator-helpers/compare/v1.0.19...v1.1.0) - 2024-10-09
+
+### Commits
+
+- [New] add `Iterator.concat` [`1c07c21`](https://github.com/es-shims/iterator-helpers/commit/1c07c21d42fa6f3de516191a2b7fb848679314e7)
+- [readme] add ESM and CJS examples [`ae0b60c`](https://github.com/es-shims/iterator-helpers/commit/ae0b60cae42a5e6174809859e29d16085042e3b2)
+- [Dev Deps] update `@es-shims/api`, `auto-changelog`, `es-value-fixtures`, `eslint-plugin-import`, `tape` [`bd34766`](https://github.com/es-shims/iterator-helpers/commit/bd34766d527cc625dcbc242297290a793f21b055)
+- [Dev Deps] update `@ljharb/eslint-config`, `mock-property`, `object-inspect`, `tape` [`2016080`](https://github.com/es-shims/iterator-helpers/commit/201608082a32bc1fa114c012eeb72744e1bf5bfa)
+- [readme] fix copy-paste errors [`799255c`](https://github.com/es-shims/iterator-helpers/commit/799255ce358f9f19ab54cc2377aafb404463d917)
+- [Tests] replace `aud` with `npm audit` [`4c48a77`](https://github.com/es-shims/iterator-helpers/commit/4c48a77d90a6894863ad160fd0f88b3fc76653b6)
+- [Deps] update `globalthis` [`14d9e97`](https://github.com/es-shims/iterator-helpers/commit/14d9e971f976da482cbb7ee76b583db9ce17e056)
+- [Dev Deps] update `@es-shims/api` [`15d84bb`](https://github.com/es-shims/iterator-helpers/commit/15d84bbbe1864dfd028f30f98251cbdf19e74908)
+- [Dev Deps] add missing peer dep [`34559b9`](https://github.com/es-shims/iterator-helpers/commit/34559b9a263dfbc3551fd0ff586639692c04e514)
+
+## [v1.0.19](https://github.com/es-shims/iterator-helpers/compare/v1.0.18...v1.0.19) - 2024-04-24
+
+### Commits
+
+- [patch] remove unused AOs [`698cef7`](https://github.com/es-shims/iterator-helpers/commit/698cef79757378a74500690d5a5dc2a6b86cd304)
+- [Fix] `drop`, `filter`, `flatMap`, `map`: rpatch a v8 bug when polyfilling [`3670395`](https://github.com/es-shims/iterator-helpers/commit/36703956321c201933c4c701c78304669a46947b)
+- [Deps] update `es-abstract` [`d2b47a5`](https://github.com/es-shims/iterator-helpers/commit/d2b47a5f46d3f874aad67375346cb58bf8c9e8b2)
+
+## [v1.0.18](https://github.com/es-shims/iterator-helpers/compare/v1.0.17...v1.0.18) - 2024-03-15
+
+### Commits
+
+- [Deps] update `es-abstract` [`6b45f15`](https://github.com/es-shims/iterator-helpers/commit/6b45f150e939cfbf93b816431a407c0838250e85)
+- [Deps] update `es-set-tostringtag`, `has-proto`, `safe-array-concat` [`6350106`](https://github.com/es-shims/iterator-helpers/commit/6350106c9e5c18a67754ced3fd90465b0032f1e3)
+- [Dev Deps] update `tape` [`5509b40`](https://github.com/es-shims/iterator-helpers/commit/5509b408791402d2f7d7882f905741e5a5dd805b)
+- [Deps] remove an unused dep [`78e34a5`](https://github.com/es-shims/iterator-helpers/commit/78e34a5452e7b7ef3dc239a62dd8a7324fbb2305)
+
+## [v1.0.17](https://github.com/es-shims/iterator-helpers/compare/v1.0.16...v1.0.17) - 2024-02-13
+
+### Fixed
+
+- [Fix] avoid use of internal `assertRecord` helper from `es-abstract` [`#5`](https://github.com/es-shims/iterator-helpers/issues/5)
+
+### Commits
+
+- [Deps] update `call-bind`, `es-abstract`, `has-property-descriptors` [`e563ee7`](https://github.com/es-shims/iterator-helpers/commit/e563ee7230897c41f7f3623a11fc0ecc6862ee1c)
+
+## [v1.0.16](https://github.com/es-shims/iterator-helpers/compare/v1.0.15...v1.0.16) - 2024-02-09
+
+### Commits
+
+- [Refactor] use `IteratorStepValue` [`aa62d72`](https://github.com/es-shims/iterator-helpers/commit/aa62d72c52d86218942b4792c7131f72d939b733)
+- [Refactor] use `es-errors` instead of `get-intrinsic` where possible [`05a25ae`](https://github.com/es-shims/iterator-helpers/commit/05a25aeccd0523df86b401c771d88fbea06558c9)
+- [Deps] update `call-bind`, `es-abstract`, `es-set-tostringtag`, `function-bind`, `get-intrinsic`, `has-property-descriptors`, `internal-slot`, `safe-array-concat` [`6aeee43`](https://github.com/es-shims/iterator-helpers/commit/6aeee435ed5956b7c5ee66a51b86c26827874eae)
+- [Dev Deps] update `aud`, `eslint-plugin-import`, `mock-property`, `npmignore`, `object-inspect`, `tape` [`0a21fdb`](https://github.com/es-shims/iterator-helpers/commit/0a21fdb4a59d25c248561b7f476fc9670b411855)
+- [Deps] update `call-bind`, `es-errors`, `get-intrinsic`, `internal-slot` [`5b10625`](https://github.com/es-shims/iterator-helpers/commit/5b106251dad4252a744b2e0aa0d1be4c1c62b779)
+- [meta] add missing `engines.node` [`1534039`](https://github.com/es-shims/iterator-helpers/commit/1534039eca062429c0df68dcc3459ce9ba7c69be)
+- [Deps] update `get-intrinsic` [`37da5f2`](https://github.com/es-shims/iterator-helpers/commit/37da5f201940c78526de647ef9ba84d9152349c1)
+- [Dev Deps] update `has-tostringtag` [`a7cac51`](https://github.com/es-shims/iterator-helpers/commit/a7cac51cc027e6274918cb1ea0cf1fa1a194fcd9)
+
+## [v1.0.15](https://github.com/es-shims/iterator-helpers/compare/v1.0.14...v1.0.15) - 2023-09-13
+
+### Commits
+
+- [New] add `Iterator.prototype` shim [`c4a6203`](https://github.com/es-shims/iterator-helpers/commit/c4a6203a0ac87bf0a33835e775c207ff1911225d)
+- [Tests] add passing tests for native generators [`57bae8c`](https://github.com/es-shims/iterator-helpers/commit/57bae8ccbeb27ed0e6c449f35cddbda6cf6757e8)
+- [Deps] update `define-properties`, `iterator.prototype`, `safe-array-concat` [`56ca087`](https://github.com/es-shims/iterator-helpers/commit/56ca087f924dbefee47f0a1cb3b8468de76cd234)
+
+## [v1.0.14](https://github.com/es-shims/iterator-helpers/compare/v1.0.13...v1.0.14) - 2023-08-26
+
+### Commits
+
+- [Deps] update `es-abstract` [`477b123`](https://github.com/es-shims/iterator-helpers/commit/477b1233acd36fdbbccd79fbb69cde325bc3e6a9)
+- [Dev Deps] update `aud`, `eslint-plugin-import`, `tape` [`e4ea414`](https://github.com/es-shims/iterator-helpers/commit/e4ea4146feffb72fd828e5d883e960e0ad589a35)
+
+## [v1.0.13](https://github.com/es-shims/iterator-helpers/compare/v1.0.12...v1.0.13) - 2023-08-16
+
+### Fixed
+
+- [Deps] add missing deps; add eslint-plugin-import [`#3`](https://github.com/es-shims/iterator-helpers/issues/3)
+
+## [v1.0.12](https://github.com/es-shims/iterator-helpers/compare/v1.0.11...v1.0.12) - 2023-07-14
+
+### Commits
+
+- [Fix] avoid creating string wrapper objects with sloppy mode flatMap mappers [`db16b34`](https://github.com/es-shims/iterator-helpers/commit/db16b34aec554934ec2bfd62629fb66cebc311f8)
+- [Deps] update `es-abstract` [`f002147`](https://github.com/es-shims/iterator-helpers/commit/f002147f0afbb2cd7c2d2e1207685f52e33abf0f)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud [`42064e8`](https://github.com/es-shims/iterator-helpers/commit/42064e80e0cc37f5e4676c2133dacae7456e313f)
+- [meta] fix tidelift funding identifier [`896fd4f`](https://github.com/es-shims/iterator-helpers/commit/896fd4f2e4b419945bfbd85024a2c96248323151)
+
+## [v1.0.11](https://github.com/es-shims/iterator-helpers/compare/v1.0.10...v1.0.11) - 2023-05-22
+
+### Commits
+
+- [Fix] iterator helpers are not a constructor [`8a7f999`](https://github.com/es-shims/iterator-helpers/commit/8a7f9996ba3600ef30f3a9c75f9f994e88d075c6)
+
+## [v1.0.10](https://github.com/es-shims/iterator-helpers/compare/v1.0.9...v1.0.10) - 2023-05-18
+
+### Commits
+
+- [patch] remove IsCallable check on NextMethod, deferring errors to callsite [`bbb7efa`](https://github.com/es-shims/iterator-helpers/commit/bbb7efac8349273fe17c86194ef13af45bcb8e24)
+- [patch] change Symbol.iterator fallback from callable check to nullish check [`ec3e255`](https://github.com/es-shims/iterator-helpers/commit/ec3e255dfe30ea6650d8a697e6c4f16fa393e923)
+- [Tests] add test cases [`5117c47`](https://github.com/es-shims/iterator-helpers/commit/5117c477348407ebdfc9410dd437a68634c39a8e)
+- [Dev Deps] update `@es-shims/api` [`9fa13a0`](https://github.com/es-shims/iterator-helpers/commit/9fa13a0739f353536de58b2b648aa9eacfa49479)
+- [Dev Deps] update `@es-shims/api` [`b74b0ac`](https://github.com/es-shims/iterator-helpers/commit/b74b0ac2bd7e920f760bae7ba7c6c5310f5123d8)
+
+## [v1.0.9](https://github.com/es-shims/iterator-helpers/compare/v1.0.8...v1.0.9) - 2023-05-02
+
+### Commits
+
+- [Refactor] use 2022 AO instead of 2015 AO [`75ee5c4`](https://github.com/es-shims/iterator-helpers/commit/75ee5c4dea0037f02a61c240114bb6bd8c8b48f1)
+
+## [v1.0.8](https://github.com/es-shims/iterator-helpers/compare/v1.0.7...v1.0.8) - 2023-05-02
+
+### Commits
+
+- [Fix] `flatMap`: close the inner iterator when applicable [`4dc94e0`](https://github.com/es-shims/iterator-helpers/commit/4dc94e0117e34b4c99f9ed96c4fe306896c47da1)
+
+## [v1.0.7](https://github.com/es-shims/iterator-helpers/compare/v1.0.6...v1.0.7) - 2023-05-01
+
+### Commits
+
+- [Fix] `flatMap`: properly handle yielded iterables [`3a78767`](https://github.com/es-shims/iterator-helpers/commit/3a78767e86394d45b212a225e4253745f8b1dc8d)
+- [Fix] `flatMap`: only increment the count when iterating the outer iterator [`955d0b0`](https://github.com/es-shims/iterator-helpers/commit/955d0b00f5660db0d9febef2a16426dfc32e8be4)
+
+## [v1.0.6](https://github.com/es-shims/iterator-helpers/compare/v1.0.5...v1.0.6) - 2023-04-20
+
+### Commits
+
+- [Refactor] `GetIteratorFlattenable`: remove hint [`781fc7c`](https://github.com/es-shims/iterator-helpers/commit/781fc7c28615aaaef139cbcd9e6ade513419bea1)
+- [Refactor] `GetIteratorFlattenable`: use `GetIteratorDirect` [`026118b`](https://github.com/es-shims/iterator-helpers/commit/026118b8c884adaee5ab0eb12de838ef9abdbb6f)
+- [Refactor] use `safe-array-concat` [`1d985a4`](https://github.com/es-shims/iterator-helpers/commit/1d985a449be212523f05ba4a359a162931ddf3d3)
+
+## [v1.0.5](https://github.com/es-shims/iterator-helpers/compare/v1.0.4...v1.0.5) - 2023-03-22
+
+### Commits
+
+- [Tests] add passing tests for 4240029 [`c2082fe`](https://github.com/es-shims/iterator-helpers/commit/c2082fee3e73dc1998a67fbe0014e3ebdceb8ec0)
+- [Fix] properly allow subclasses of Iterator to be constructed [`5cebe2a`](https://github.com/es-shims/iterator-helpers/commit/5cebe2a5767393696d0ce4e9325edf78c300f938)
+
+## [v1.0.4](https://github.com/es-shims/iterator-helpers/compare/v1.0.3...v1.0.4) - 2023-03-21
+
+### Commits
+
+- [Fix] validate arguments first [`4240029`](https://github.com/es-shims/iterator-helpers/commit/42400297454909ddccc899a012dc55bbd403eb8b)
+- [Fix] close underlying iterator when helper is closed [`f5372c7`](https://github.com/es-shims/iterator-helpers/commit/f5372c78cafff64bfda5849386538f806916049a)
+- [Tests] `Iterator`: remove an unnecessary call-bind [`7d0ba59`](https://github.com/es-shims/iterator-helpers/commit/7d0ba59f672e690b189f91e0348f6b5e00f934e1)
+
+## [v1.0.3](https://github.com/es-shims/iterator-helpers/compare/v1.0.2...v1.0.3) - 2023-03-17
+
+### Commits
+
+- [Fix] `drop`/`filter`/`flatMap`/`map`/`take`: properly IfAbruptCloseIterator [`ff643a0`](https://github.com/es-shims/iterator-helpers/commit/ff643a0b7c4e5c2b00e794ba9b988b47e783f235)
+- [Refactor] use `NormalCompletion`/`ThrowCompletion` instead of thunks [`68fd937`](https://github.com/es-shims/iterator-helpers/commit/68fd937b53c107481a9f868bda5b2bd5cbc00142)
+- [Fix] `filter`: IteratorClose needs to rethrow the error [`200474f`](https://github.com/es-shims/iterator-helpers/commit/200474ff289dea77c696c0c025f4602405cf3fff)
+- [Fix] `filter`: properly increment the counter [`14aa2d8`](https://github.com/es-shims/iterator-helpers/commit/14aa2d8b75fd16378c2be183fd5b008712547ed4)
+- [Fix] `Iterator` can not be `new`ed or invoked directly [`6fbd68e`](https://github.com/es-shims/iterator-helpers/commit/6fbd68e778dd455c4aa63f4e1f39e0b583610509)
+- [Fix] `Iterator.prototype` should be non-writable [`1080288`](https://github.com/es-shims/iterator-helpers/commit/108028858067e40ea56dca9a68dd6cea4966e904)
+- [Deps] update `es-abstract` [`b7913da`](https://github.com/es-shims/iterator-helpers/commit/b7913da9cddef1ec40b4827821c6069019b79093)
+- [Dev Deps] update `@es-shims/api` [`0071bed`](https://github.com/es-shims/iterator-helpers/commit/0071bed9e13231317d2cdb9ae0ecb6603784ad1f)
+
+## [v1.0.2](https://github.com/es-shims/iterator-helpers/compare/v1.0.1...v1.0.2) - 2023-02-09
+
+### Commits
+
+- [Refactor] inline 2023 impls of Iterator AOs until es-abstract is published with them [`b9c80c5`](https://github.com/es-shims/iterator-helpers/commit/b9c80c5aba0deaaabef7e650fe7ec231fdc695e3)
+- [Fix] ensure calling `.return` does not invoke the next iteration [`9e28ed5`](https://github.com/es-shims/iterator-helpers/commit/9e28ed5af44a660a0d2e80684cb9a4bf3d86e09a)
+- [Fix] `map`: pass the proper index argument to the mapper [`125e3ca`](https://github.com/es-shims/iterator-helpers/commit/125e3cac192ef650a88f774a5a2dd9afe395a5b8)
+- [Deps] update `internal-slot` [`43351b6`](https://github.com/es-shims/iterator-helpers/commit/43351b63545e3698f54daf5dc0652a7b2fb7cb28)
+
+## [v1.0.1](https://github.com/es-shims/iterator-helpers/compare/v1.0.0...v1.0.1) - 2023-02-07
+
+### Commits
+
+- [Fix] `Iterator`: throw when Iterator() is called without new [`a6fc7e7`](https://github.com/es-shims/iterator-helpers/commit/a6fc7e768cbf4d43117365ec2f1bd300247d8dfd)
+
+## v1.0.0 - 2023-02-05
+
+### Commits
+
+- Initial implementation, tests, readme [`650713e`](https://github.com/es-shims/iterator-helpers/commit/650713eecc9d4dab28d5ba3dc5afcbdb8ff99b5a)
+- Initial commit [`2379dfd`](https://github.com/es-shims/iterator-helpers/commit/2379dfdad70f64efb31e342a4a7779b1140b2481)
+- npm init [`f77411a`](https://github.com/es-shims/iterator-helpers/commit/f77411a443f1a103dbb92a69210228d4fc1e6d04)
+- Only apps should have lockfiles [`313dcf5`](https://github.com/es-shims/iterator-helpers/commit/313dcf5211e99569ad275885728b5ac7af30f4ec)
Index: frontend/node_modules/es-iterator-helpers/Iterator.concat/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.concat/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.concat/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.concat/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.concat/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.concat/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,103 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var AdvanceStringIndex = require('es-abstract/2025/AdvanceStringIndex');
+var Call = require('es-abstract/2025/Call');
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var GetMethod = require('es-abstract/2025/GetMethod');
+var IsArray = require('es-abstract/2025/IsArray');
+var IteratorCloseAll = require('../aos/IteratorCloseAll');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+
+var forEach = require('es-abstract/helpers/forEach');
+var isObject = require('es-abstract/helpers/isObject');
+var getIteratorMethod = require('es-abstract/helpers/getIteratorMethod');
+
+var iterHelperProto = require('../IteratorHelperPrototype');
+
+var SLOT = require('internal-slot');
+
+module.exports = function concat() {
+	if (this instanceof concat) {
+		throw new $TypeError('`Iterator.concat` is not a constructor');
+	}
+
+	var iterables = []; // step 1
+
+	forEach(arguments, function (item) { // step 2
+		if (!isObject(item)) {
+			throw new $TypeError('`Iterator.concat` requires all arguments to be objects'); // step 2.1
+		}
+		// var method = GetMethod(item, Symbol.iterator); // step 2.2
+		var method = getIteratorMethod(
+			{
+				AdvanceStringIndex: AdvanceStringIndex,
+				GetMethod: GetMethod,
+				IsArray: IsArray
+			},
+			item
+		);
+		if (typeof method === 'undefined') {
+			throw new $TypeError('`Iterator.concat` requires all arguments to be iterable'); // step 2.3
+		}
+		iterables[iterables.length] = { '[[OpenMethod]]': method, '[[Iterable]]': item }; // step 2.4
+	});
+
+	var sentinel = {};
+	var iterablesIndex = 0;
+	var iteratorRecord;
+	var innerAlive = false;
+	var openIters = []; // track the current open iterator for return() forwarding
+	var closure = function () { // step 3
+		if (iterablesIndex >= iterables.length) {
+			return sentinel;
+		}
+		var iterable = iterables[iterablesIndex]; // step 3.a
+		if (!innerAlive) {
+			var iter = Call(iterable['[[OpenMethod]]'], iterable['[[Iterable]]']); // step 3.a.i
+			if (!isObject(iter)) {
+				throw new $TypeError('`Iterator.concat` iterator method did not return an object'); // step 3.a.ii
+			}
+			iteratorRecord = GetIteratorDirect(iter); // step 3.a.iii
+			openIters[0] = iteratorRecord; // track the open iterator
+			innerAlive = true; // step 3.a.iv
+		}
+
+		if (innerAlive) { // step 3.a.v
+			var innerValue = IteratorStepValue(iteratorRecord); // step 3.a.v.1
+			if (iteratorRecord['[[Done]]']) { // step 3.a.v.2
+				innerAlive = false; // step 3.a.v.2.a
+				openIters.length = 0; // no open iterator now
+			} else { // step 3.a.v.3
+				// 1. Let completion be Completion(Yield(innerValue)).
+				return innerValue; // step 3.a.v.3.a
+			}
+		}
+
+		iterablesIndex += 1;
+		return closure();
+	};
+
+	var closeIfAbrupt = function (abruptCompletion) {
+		if (!(abruptCompletion instanceof CompletionRecord)) {
+			throw new $TypeError('`abruptCompletion` must be a Completion Record');
+		}
+		iterablesIndex = iterables.length;
+		innerAlive = false;
+		if (openIters.length > 0) {
+			var toClose = openIters.slice();
+			openIters.length = 0; // prevent double-closing
+			IteratorCloseAll(toClose, abruptCompletion);
+		}
+	};
+
+	SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
+	SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
+
+	var gen = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 5
+	SLOT.set(gen, '[[UnderlyingIterators]]', openIters); // step 6 - share the array reference
+	return gen; // step 7
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.concat/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.concat/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.concat/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var bound = callBind(getPolyfill(), null);
+
+module.exports = bound;
Index: frontend/node_modules/es-iterator-helpers/Iterator.concat/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.concat/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.concat/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+var $Iterator = require('../Iterator');
+
+module.exports = function getPolyfill() {
+	return typeof $Iterator.concat === 'function' ? $Iterator.concat : implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.concat/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.concat/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.concat/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+var define = require('define-properties');
+
+var getIteratorPolyfill = require('../Iterator/polyfill');
+
+module.exports = function shimIteratorConcat() {
+	var $Iterator = getIteratorPolyfill();
+	var polyfill = getPolyfill();
+	define(
+		$Iterator,
+		{ concat: polyfill },
+		{ concat: function () { return $Iterator.concat !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.from/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.from/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.from/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.from/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.from/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.from/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var GetIteratorFlattenable = require('es-abstract/2025/GetIteratorFlattenable');
+var OrdinaryHasInstance = require('es-abstract/2025/OrdinaryHasInstance');
+var OrdinaryObjectCreate = require('es-abstract/2025/OrdinaryObjectCreate');
+
+var $Iterator = require('../Iterator/polyfill')();
+var $WrapForValidIteratorPrototype = require('../WrapForValidIteratorPrototype');
+
+var SLOT = require('internal-slot');
+
+module.exports = function from(O) {
+	if (this instanceof from) {
+		throw new $TypeError('`Iterator.from` is not a constructor');
+	}
+
+	var iteratorRecord = GetIteratorFlattenable(O, 'ITERATE-STRING-PRIMITIVES'); // step 1
+
+	var hasInstance = OrdinaryHasInstance($Iterator, iteratorRecord['[[Iterator]]']); // step 2
+
+	if (hasInstance) { // step 3
+		return iteratorRecord['[[Iterator]]']; // step 3.a
+	}
+
+	var wrapper = OrdinaryObjectCreate($WrapForValidIteratorPrototype); // , ['[[Iterated]]']); // step 4
+
+	SLOT.set(wrapper, '[[Iterated]]', iteratorRecord); // step 5
+
+	return wrapper; // step 6
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.from/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.from/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.from/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var bound = callBind(getPolyfill(), null);
+
+module.exports = bound;
Index: frontend/node_modules/es-iterator-helpers/Iterator.from/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.from/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.from/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+var $Iterator = require('../Iterator');
+
+module.exports = function getPolyfill() {
+	return typeof $Iterator.from === 'function' ? $Iterator.from : implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.from/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.from/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.from/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+var define = require('define-properties');
+
+var getIteratorPolyfill = require('../Iterator/polyfill');
+
+module.exports = function shimIteratorFrom() {
+	var $Iterator = getIteratorPolyfill();
+	var polyfill = getPolyfill();
+	define(
+		$Iterator,
+		{ from: polyfill },
+		{ from: function () { return $Iterator.from !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+'use strict';
+
+var $Iterator = require('../Iterator/polyfill')();
+
+module.exports = $Iterator;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var bind = require('function-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = bind.call(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.constructor/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+var $Iterator = require('./implementation');
+
+module.exports = function shimIteratorPrototypeCtor() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ constructor: $Iterator },
+		{ constructor: function () { return $Iterator.constructor !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,99 @@
+'use strict';
+
+var $RangeError = require('es-errors/range');
+var $TypeError = require('es-errors/type');
+
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStep = require('es-abstract/2025/IteratorStep');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+var ToIntegerOrInfinity = require('es-abstract/2025/ToIntegerOrInfinity');
+var ToNumber = require('es-abstract/2025/ToNumber');
+
+var iterHelperProto = require('../IteratorHelperPrototype');
+
+var isObject = require('es-abstract/helpers/isObject');
+var isNaN = require('es-abstract/helpers/isNaN');
+
+var SLOT = require('internal-slot');
+
+module.exports = function drop(limit) {
+	if (this instanceof drop) {
+		throw new $TypeError('`drop` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	var numLimit;
+	try {
+		numLimit = ToNumber(limit); // step 4
+	} catch (e) {
+		return IteratorClose(iterated, ThrowCompletion(e)); // step 5
+	}
+
+	if (isNaN(numLimit)) { // step 6
+		return IteratorClose(iterated, ThrowCompletion(new $RangeError('`limit` must be a non-NaN number')));
+	}
+
+	var integerLimit = ToIntegerOrInfinity(numLimit); // step 7
+	if (integerLimit < 0) { // step 8
+		return IteratorClose(iterated, ThrowCompletion(new $RangeError('`limit` must be >= 0')));
+	}
+
+	iterated = GetIteratorDirect(O); // step 9
+
+	var closeIfAbrupt = function (abruptCompletion) {
+		if (!(abruptCompletion instanceof CompletionRecord)) {
+			throw new $TypeError('`abruptCompletion` must be a Completion Record');
+		}
+		IteratorClose(
+			iterated,
+			abruptCompletion
+		);
+	};
+
+	var sentinel = {};
+	var remaining = integerLimit; // step 10.a
+	var closure = function () { // step 10
+		var next;
+		while (remaining > 0) { // step 10.b
+			if (remaining !== Infinity) { // step 10.b.i
+				remaining -= 1; // step 10.b.i.1
+			}
+
+			next = IteratorStep(iterated); // step 10.b.ii
+			if (!next) {
+				// return void undefined; // step 10.b.iii
+				return sentinel;
+			}
+		}
+		// while (true) { // step 10.c
+		var value = IteratorStepValue(iterated); // step 10.c.i - ? means throw on protocol violation, don't close
+		if (iterated['[[Done]]']) {
+			return sentinel; // step 10.c.ii
+		}
+		return value; // step 10.c.iii - Yield(value)
+		// }
+		// return void undefined;
+	};
+	SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
+	SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
+
+	var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 11
+
+	SLOT.set(result, '[[UnderlyingIterators]]', [iterated]); // step 12
+
+	return result; // step 13
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.drop === 'function') {
+		try {
+			// https://issues.chromium.org/issues/336839115
+			Iterator.prototype.drop.call({ next: null }, 0).next();
+		} catch (e) {
+			var earlyCloseCount = 0;
+			try {
+				Iterator.prototype.drop.call(
+					{
+						next: function () {},
+						'return': function () {
+							earlyCloseCount += 1;
+							return {};
+						}
+					},
+					NaN
+				);
+			} catch (e2) { /**/ }
+			if (earlyCloseCount > 0) {
+				return Iterator.prototype.drop;
+			}
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.drop/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeDrop() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ drop: polyfill },
+		{ drop: function () { return $IteratorPrototype.drop !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,63 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IfAbruptCloseIterator = require('es-abstract/2025/IfAbruptCloseIterator');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var NormalCompletion = require('es-abstract/2025/NormalCompletion');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+var ToBoolean = require('es-abstract/2025/ToBoolean');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function every(predicate) {
+	if (this instanceof every) {
+		throw new $TypeError('`every` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(predicate)) { // step 4
+		var error = ThrowCompletion(new $TypeError('`predicate` must be a function')); // step 4.a
+		return IteratorClose(iterated, error); // step 4.b
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var counter = 0; // step 6
+
+	while (true) { // step 7
+		var value = IteratorStepValue(iterated); // step 7.a
+		if (iterated['[[Done]]']) {
+			return true; // step 7.b
+		}
+		var result;
+		try {
+			result = Call(predicate, void undefined, [value, counter]); // step 7.c
+		} catch (e) {
+			return IfAbruptCloseIterator(ThrowCompletion(e), iterated); // step 7.d
+		}
+
+		if (!ToBoolean(result)) {
+			return IteratorClose(
+				iterated,
+				NormalCompletion(false)
+			); // step 7.e
+		}
+
+		counter += 1; // step 7.f
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.every === 'function') {
+		var earlyCloseCount = 0;
+		try {
+			Iterator.prototype.every.call(
+				{
+					next: function () {},
+					'return': function () {
+						earlyCloseCount += 1;
+						return {};
+					}
+				},
+				null
+			);
+		} catch (e) { /**/ }
+		if (earlyCloseCount > 0) {
+			return Iterator.prototype.every;
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.every/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeEvery() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ every: polyfill },
+		{ every: function () { return $IteratorPrototype.every !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,82 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IfAbruptCloseIterator = require('es-abstract/2025/IfAbruptCloseIterator');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+var ToBoolean = require('es-abstract/2025/ToBoolean');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+var SLOT = require('internal-slot');
+var iterHelperProto = require('../IteratorHelperPrototype');
+
+module.exports = function filter(predicate) {
+	if (this instanceof filter) {
+		throw new $TypeError('`filter` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(predicate)) { // step 4
+		var error = ThrowCompletion(new $TypeError('`predicate` must be a function')); // step 4.a
+		return IteratorClose(iterated, error); // step 4.b
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var closeIfAbrupt = function (abruptCompletion) {
+		IfAbruptCloseIterator(abruptCompletion, iterated);
+	};
+
+	var sentinel = {};
+	var counter = 0; // step 6.a
+	var yielded = false;
+	var closure = function () {
+		while (true) { // step 6.b
+			if (yielded) {
+				counter += 1; // step 6.b.vi - deferred from after Yield
+				yielded = false;
+			}
+			var value = IteratorStepValue(iterated); // step 6.b.i
+			if (iterated['[[Done]]']) {
+				return sentinel; // step 6.b.ii
+			}
+
+			var selected;
+			try {
+				selected = Call(predicate, void undefined, [value, counter]); // step 6.b.iii
+			} catch (e) {
+				return IfAbruptCloseIterator(ThrowCompletion(e), iterated); // step 6.b.iv
+			}
+			if (ToBoolean(selected)) { // step 6.b.v
+				yielded = true;
+				return value; // step 6.b.v.1 - Yield(value)
+			}
+			counter += 1; // step 6.b.vi
+		}
+	};
+	SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
+	SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
+
+	var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 7
+
+	SLOT.set(result, '[[UnderlyingIterators]]', [iterated]); // step 8
+
+	return result; // step 9
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.filter === 'function') {
+		try {
+			// https://issues.chromium.org/issues/336839115
+			Iterator.prototype.filter.call({ next: null }, function () {}).next();
+		} catch (e) {
+			var earlyCloseCount = 0;
+			try {
+				Iterator.prototype.filter.call(
+					{
+						next: function () {},
+						'return': function () {
+							earlyCloseCount += 1;
+							return {};
+						}
+					},
+					null
+				);
+			} catch (e2) { /**/ }
+			if (earlyCloseCount > 0) {
+				return Iterator.prototype.filter;
+			}
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.filter/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeFilter() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ filter: polyfill },
+		{ filter: function () { return $IteratorPrototype.filter !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,63 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IfAbruptCloseIterator = require('es-abstract/2025/IfAbruptCloseIterator');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var NormalCompletion = require('es-abstract/2025/NormalCompletion');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+var ToBoolean = require('es-abstract/2025/ToBoolean');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function find(predicate) {
+	if (this instanceof find) {
+		throw new $TypeError('`find` is not a constructor');
+	}
+
+	var O = this; // step 1
+
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(predicate)) { // step 4
+		var error = ThrowCompletion(new $TypeError('`predicate` must be a function')); // step 4.a
+		return IteratorClose(iterated, error); // step 4.b
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var counter = 0; // step 6
+
+	while (true) { // step 7
+		var value = IteratorStepValue(iterated); // step 7.a
+		if (iterated['[[Done]]']) {
+			return void undefined; // step 7.b
+		}
+		var result;
+		try {
+			result = Call(predicate, void undefined, [value, counter]); // step 7.c
+		} catch (e) {
+			return IfAbruptCloseIterator(ThrowCompletion(e), iterated); // step 7.d
+		}
+		if (ToBoolean(result)) {
+			return IteratorClose(
+				iterated,
+				NormalCompletion(value)
+			); // step 7.e
+		}
+
+		counter += 1; // step 7.f
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.find === 'function') {
+		var earlyCloseCount = 0;
+		try {
+			Iterator.prototype.find.call(
+				{
+					next: function () {},
+					'return': function () {
+						earlyCloseCount += 1;
+						return {};
+					}
+				},
+				null
+			);
+		} catch (e) { /**/ }
+		if (earlyCloseCount > 0) {
+			return Iterator.prototype.find;
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.find/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeFind() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ find: polyfill },
+		{ find: function () { return $IteratorPrototype.find !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,127 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var GetIteratorFlattenable = require('es-abstract/2025/GetIteratorFlattenable');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+var iterHelperProto = require('../IteratorHelperPrototype');
+
+var SLOT = require('internal-slot');
+
+module.exports = function flatMap(mapper) {
+	if (this instanceof flatMap) {
+		throw new $TypeError('`flatMap` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(mapper)) { // step 4
+		return IteratorClose(iterated, ThrowCompletion(new $TypeError('`mapper` must be a function')));
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var sentinel = { sentinel: true };
+	var innerIterator = sentinel;
+
+	var closeIfAbrupt = function (abruptCompletion) {
+		if (!(abruptCompletion instanceof CompletionRecord)) {
+			throw new $TypeError('`abruptCompletion` must be a Completion Record');
+		}
+		if (innerIterator !== sentinel) {
+			var backupCompletion;
+			try {
+				IteratorClose(innerIterator, abruptCompletion);
+			} catch (e) {
+				backupCompletion = ThrowCompletion(e);
+			}
+			innerIterator = sentinel;
+			if (backupCompletion) {
+				IteratorClose(iterated, backupCompletion);
+			}
+			IteratorClose(iterated, abruptCompletion);
+		} else {
+			IteratorClose(iterated, abruptCompletion);
+		}
+	};
+
+	var counter = 0; // step 6.a
+	var innerAlive = false;
+	var closure = function () {
+		// while (true) { // step 6.b
+		if (innerIterator === sentinel) {
+			var value = IteratorStepValue(iterated); // step 6.b.i
+			if (iterated['[[Done]]']) {
+				innerAlive = false;
+				innerIterator = sentinel;
+				// return void undefined; // step 6.b.ii
+				return sentinel;
+			}
+		}
+
+		if (innerIterator === sentinel) {
+			innerAlive = true; // step 6.b.vii
+			try {
+				var mapped = Call(mapper, void undefined, [value, counter]); // step 6.b.iii
+				// yield mapped // step 6.b.v
+				innerIterator = GetIteratorFlattenable(mapped, 'REJECT-PRIMITIVES'); // step 6.b.v
+			} catch (e) {
+				innerAlive = false;
+				innerIterator = sentinel;
+				closeIfAbrupt(ThrowCompletion(e)); // steps 6.b.iv, 6.b.vi
+			} finally {
+				counter += 1; // step 6.b.ix
+			}
+		}
+		// while (innerAlive) { // step 6.b.viii
+		if (innerAlive) {
+			// step 6.b.viii.4
+			var innerValue;
+			try {
+				innerValue = IteratorStepValue(innerIterator); // step 6.b.viii.1
+			} catch (e) {
+				// inner iterator violated the protocol (IteratorStepValue threw), so don't close inner
+				// but DO close outer iterated per spec step 6.b.viii.2: IfAbruptCloseIterator(innerValue, iterated)
+				innerAlive = false;
+				innerIterator = sentinel;
+				IteratorClose(iterated, ThrowCompletion(e)); // step 6.b.viii.2 - close outer only
+			}
+			if (innerIterator['[[Done]]']) {
+				innerAlive = false;
+				innerIterator = sentinel;
+				return closure();
+			}
+			return innerValue; // step 6.b.viii.4.1
+		}
+		// }
+		// return void undefined;
+		return sentinel;
+	};
+	SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
+	SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
+
+	var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 7
+
+	SLOT.set(result, '[[UnderlyingIterators]]', [iterated]); // step 8
+
+	return result; // step 9
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.flatMap === 'function') {
+		try {
+			// https://issues.chromium.org/issues/336839115
+			Iterator.prototype.flatMap.call({ next: null }, function () {}).next();
+		} catch (e) {
+			var earlyCloseCount = 0;
+			try {
+				Iterator.prototype.flatMap.call(
+					{
+						next: function () {},
+						'return': function () {
+							earlyCloseCount += 1;
+							return {};
+						}
+					},
+					null
+				);
+			} catch (e2) { /**/ }
+			if (earlyCloseCount > 0) {
+				return Iterator.prototype.flatMap;
+			}
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.flatMap/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeFlatMap() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ flatMap: polyfill },
+		{ flatMap: function () { return $IteratorPrototype.flatMap !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,53 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IfAbruptCloseIterator = require('es-abstract/2025/IfAbruptCloseIterator');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function forEach(procedure) {
+	if (this instanceof forEach) {
+		throw new $TypeError('`forEach` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(procedure)) { // step 4
+		var error = ThrowCompletion(new $TypeError('`fn` must be a function')); // step 4.a
+		return IteratorClose(iterated, error); // step 4.b
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var counter = 0; // step 6
+
+	while (true) { // step 7
+		var value = IteratorStepValue(iterated); // step 7.a
+		if (iterated['[[Done]]']) {
+			return void undefined; // step 7.b
+		}
+		try {
+			Call(procedure, void undefined, [value, counter]); // step 7.c
+		} catch (e) {
+			return IfAbruptCloseIterator(ThrowCompletion(e), iterated); // steps 7.d
+		}
+
+		counter += 1; // step 7.e
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.forEach === 'function') {
+		var earlyCloseCount = 0;
+		try {
+			Iterator.prototype.forEach.call(
+				{
+					next: function () {},
+					'return': function () {
+						earlyCloseCount += 1;
+						return {};
+					}
+				},
+				null
+			);
+		} catch (e) { /**/ }
+		if (earlyCloseCount > 0) {
+			return Iterator.prototype.forEach;
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.forEach/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeForEach() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ forEach: polyfill },
+		{ forEach: function () { return $IteratorPrototype.forEach !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,76 @@
+'use strict';
+
+var $RangeError = require('es-errors/range');
+var $TypeError = require('es-errors/type');
+
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var NormalCompletion = require('es-abstract/2025/NormalCompletion');
+var SameValueZero = require('es-abstract/2025/SameValueZero');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var isInteger = require('math-intrinsics/isInteger');
+
+var isFinite = require('es-abstract/helpers/isFinite');
+var isNaN = require('es-abstract/helpers/isNaN');
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function includes(searchElement) {
+	if (this instanceof includes) {
+		throw new $TypeError('`includes` is not a constructor');
+	}
+
+	var O = this; // step 1
+
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	var skippedElements = arguments.length > 1 ? arguments[1] : undefined;
+
+	var toSkip = 0; // step 4
+	if (typeof skippedElements !== 'undefined') { // step 5
+		if (
+			typeof skippedElements !== 'number'
+			|| isNaN(skippedElements)
+			|| (isFinite(skippedElements) && !isInteger(skippedElements))
+		) { // step 5.a
+			var error = ThrowCompletion(new $TypeError('`skippedElements` must be an integral Number, +Infinity, or -Infinity')); // step 5.a.i
+			return IteratorClose(iterated, error); // step 5.a.ii
+		}
+
+		toSkip = skippedElements; // step 5.b
+	}
+
+	if (toSkip < 0) { // step 6
+		var error2 = ThrowCompletion(new $RangeError('`skippedElements` must be >= 0')); // step 6.a
+		return IteratorClose(iterated, error2); // step 6.b
+	}
+
+	var skipped = 0; // step 7
+
+	iterated = GetIteratorDirect(O); // step 8
+
+	while (true) { // step 9
+		var value = IteratorStepValue(iterated); // step 9.a
+
+		if (iterated['[[Done]]']) {
+			return false; // step 9.b
+		}
+		if (skipped < toSkip) { // step 9.c
+			skipped += 1; // step 9.c.i
+		} else if (SameValueZero(value, searchElement)) { // step 9.d
+			return IteratorClose(
+				iterated,
+				NormalCompletion(true)
+			); // step 9.d.i
+		}
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	return typeof Iterator === 'function' && typeof Iterator.prototype.includes === 'function'
+		? Iterator.prototype.includes
+		: implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.includes/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeIncludes() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ includes: polyfill },
+		{ includes: function () { return $IteratorPrototype.includes !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,76 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IfAbruptCloseIterator = require('es-abstract/2025/IfAbruptCloseIterator');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+var SLOT = require('internal-slot');
+
+var iterHelperProto = require('../IteratorHelperPrototype');
+
+module.exports = function map(mapper) {
+	if (this instanceof map) {
+		throw new $TypeError('`map` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(mapper)) { // step 4
+		return IteratorClose(iterated, ThrowCompletion(new $TypeError('`mapper` must be a function')));
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var closeIfAbrupt = function (abruptCompletion) {
+		IfAbruptCloseIterator(abruptCompletion, iterated);
+	};
+
+	var sentinel = {};
+	var counter = 0; // step 6.a
+	var closure = function () {
+		// while (true) { // step 6.b
+		var value = IteratorStepValue(iterated); // step 6.b.i
+		if (iterated['[[Done]]']) {
+			return sentinel; // step 6.b.ii
+		}
+
+		var mapped;
+		try {
+			mapped = Call(mapper, void undefined, [value, counter]); // step 6.b.iii
+
+			counter += 1; // step 6.b.vii
+
+			// yield mapped // step 6.b.v
+			return mapped;
+		} catch (e) {
+			return IfAbruptCloseIterator(ThrowCompletion(e), iterated); // step 6.b.iv, 6.b.vi
+		}
+		// }
+	};
+	SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
+	SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
+
+	var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 7
+
+	SLOT.set(result, '[[UnderlyingIterators]]', [iterated]); // step 8
+
+	return result; // step 9
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.map === 'function') {
+		try {
+			// https://issues.chromium.org/issues/336839115
+			Iterator.prototype.map.call({ next: null }, function () {}).next();
+		} catch (e) {
+			var earlyCloseCount = 0;
+			try {
+				Iterator.prototype.map.call(
+					{
+						next: function () {},
+						'return': function () {
+							earlyCloseCount += 1;
+							return {};
+						}
+					},
+					null
+				);
+			} catch (e2) { /**/ }
+			if (earlyCloseCount > 0) {
+				return Iterator.prototype.map;
+			}
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.map/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeMap() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ map: polyfill },
+		{ map: function () { return $IteratorPrototype.map !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,64 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IfAbruptCloseIterator = require('es-abstract/2025/IfAbruptCloseIterator');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function reduce(reducer) {
+	if (this instanceof reduce) {
+		throw new $TypeError('`reduce` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(reducer)) { // step 4
+		var error = ThrowCompletion(new $TypeError('`reducer` must be a function')); // step 4.a
+		return IteratorClose(iterated, error); // step 4.b
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var accumulator;
+	var counter;
+	if (arguments.length < 2) { // step 6
+		accumulator = IteratorStepValue(iterated); // step 6.a
+		if (iterated['[[Done]]']) {
+			throw new $TypeError('Reduce of empty iterator with no initial value'); // step 6.b
+		}
+		counter = 1; // step 6.c
+	} else { // step 7
+		accumulator = arguments[1]; // step 7.a
+		counter = 0; // step 7.b
+	}
+
+	while (true) { // step 8
+		var value = IteratorStepValue(iterated); // step 8.a
+		if (iterated['[[Done]]']) {
+			return accumulator; // step 8.b
+		}
+		try {
+			var result = Call(reducer, void undefined, [accumulator, value, counter]); // step 8.c
+			accumulator = result; // step 8.e
+		} catch (e) {
+			return IfAbruptCloseIterator(ThrowCompletion(e), iterated); // step 8.d
+		}
+		counter += 1; // step 8.f
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.reduce === 'function') {
+		var earlyCloseCount = 0;
+		try {
+			Iterator.prototype.reduce.call(
+				{
+					next: function () {},
+					'return': function () {
+						earlyCloseCount += 1;
+						return {};
+					}
+				},
+				null
+			);
+		} catch (e) { /**/ }
+		if (earlyCloseCount > 0) {
+			return Iterator.prototype.reduce;
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.reduce/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeReduce() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ reduce: polyfill },
+		{ reduce: function () { return $IteratorPrototype.reduce !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,64 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IsCallable = require('es-abstract/2025/IsCallable');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var NormalCompletion = require('es-abstract/2025/NormalCompletion');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+var ToBoolean = require('es-abstract/2025/ToBoolean');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function some(predicate) {
+	if (this instanceof some) {
+		throw new $TypeError('`some` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	if (!IsCallable(predicate)) { // step 4
+		return IteratorClose(iterated, ThrowCompletion(new $TypeError('`predicate` must be a function')));
+	}
+
+	iterated = GetIteratorDirect(O); // step 5
+
+	var counter = 0; // step 6
+
+	while (true) { // step 7
+		var value = IteratorStepValue(iterated); // step 7.a
+		if (iterated['[[Done]]']) {
+			return false; // step 7.b
+		}
+		var result;
+		try {
+			result = Call(predicate, void undefined, [value, counter]); // step 7.c
+		} catch (e) {
+			// close iterator // step 7.d
+			IteratorClose(
+				iterated,
+				ThrowCompletion(e)
+			);
+		} finally {
+			counter += 1; // step 7.f
+		}
+		if (ToBoolean(result)) {
+			return IteratorClose(
+				iterated,
+				NormalCompletion(true)
+			); // step 7.e
+		}
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.some === 'function') {
+		var earlyCloseCount = 0;
+		try {
+			Iterator.prototype.some.call(
+				{
+					next: function () {},
+					'return': function () {
+						earlyCloseCount += 1;
+						return {};
+					}
+				},
+				null
+			);
+		} catch (e) { /**/ }
+		if (earlyCloseCount > 0) {
+			return Iterator.prototype.some;
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.some/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeSome() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ some: polyfill },
+		{ some: function () { return $IteratorPrototype.some !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,97 @@
+'use strict';
+
+var $RangeError = require('es-errors/range');
+var $TypeError = require('es-errors/type');
+
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var NormalCompletion = require('es-abstract/2025/NormalCompletion');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+var ToIntegerOrInfinity = require('es-abstract/2025/ToIntegerOrInfinity');
+var ToNumber = require('es-abstract/2025/ToNumber');
+
+var iterHelperProto = require('../IteratorHelperPrototype');
+
+var isObject = require('es-abstract/helpers/isObject');
+var isNaN = require('es-abstract/helpers/isNaN');
+
+var SLOT = require('internal-slot');
+
+module.exports = function take(limit) {
+	if (this instanceof take) {
+		throw new $TypeError('`take` is not a constructor');
+	}
+
+	var O = this; // step 1
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = { // step 3
+		'[[Iterator]]': O,
+		'[[NextMethod]]': undefined,
+		'[[Done]]': false
+	};
+
+	var numLimit;
+	try {
+		numLimit = ToNumber(limit); // step 4
+	} catch (e) {
+		return IteratorClose(iterated, ThrowCompletion(e)); // step 5
+	}
+
+	if (isNaN(numLimit)) { // step 6
+		return IteratorClose(iterated, ThrowCompletion(new $RangeError('`limit` must be a non-NaN number')));
+	}
+
+	var integerLimit = ToIntegerOrInfinity(numLimit); // step 7
+	if (integerLimit < 0) { // step 8
+		return IteratorClose(iterated, ThrowCompletion(new $RangeError('`limit` must be >= 0')));
+	}
+
+	iterated = GetIteratorDirect(O); // step 9
+
+	var closeIfAbrupt = function (abruptCompletion) {
+		if (!(abruptCompletion instanceof CompletionRecord)) {
+			throw new $TypeError('`abruptCompletion` must be a Completion Record');
+		}
+		IteratorClose(
+			iterated,
+			abruptCompletion
+		);
+	};
+
+	var sentinel = {};
+	var remaining = integerLimit; // step 10.a
+	var closure = function () { // step 10
+		// while (true) { // step 10.b
+		if (remaining === 0) { // step 10.b.i
+			return IteratorClose( // step 10.b.i.1
+				iterated,
+				NormalCompletion(sentinel)
+			);
+		}
+		if (remaining !== Infinity) { // step 10.b.ii
+			remaining -= 1; // step 10.b.ii.1
+		}
+
+		var value = IteratorStepValue(iterated); // step 10.b.iii
+		if (iterated['[[Done]]']) {
+			return sentinel; // step 10.b.iv
+		}
+
+		return value; // step 10.b.v
+		// }
+	};
+	SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
+	SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
+
+	var result = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 11
+
+	SLOT.set(result, '[[UnderlyingIterators]]', [iterated]); // step 12
+
+	return result; // step 13
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	if (typeof Iterator === 'function' && typeof Iterator.prototype.take === 'function') {
+		var earlyCloseCount = 0;
+		try {
+			Iterator.prototype.take.call(
+				{
+					next: function () {},
+					'return': function () {
+						earlyCloseCount += 1;
+						return {};
+					}
+				},
+				NaN
+			);
+		} catch (e) { /**/ }
+		if (earlyCloseCount > 0) {
+			return Iterator.prototype.take;
+		}
+	}
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.take/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeTake() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ take: polyfill },
+		{ take: function () { return $IteratorPrototype.take !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function toArray() {
+	if (this instanceof toArray) {
+		throw new $TypeError('`toArray` is not a constructor');
+	}
+
+	var O = this; // step 1
+
+	if (!isObject(O)) {
+		throw new $TypeError('`this` value must be an Object'); // step 2
+	}
+
+	var iterated = GetIteratorDirect(O); // step 3
+
+	var items = []; // step 4
+
+	while (true) { // step 5
+		var value = IteratorStepValue(iterated); // step 5.a
+		if (iterated['[[Done]]']) {
+			return items; // step 5.b
+		}
+		items[items.length] = value; // step 5.d
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	return typeof Iterator === 'function' && typeof Iterator.prototype.toArray === 'function'
+		? Iterator.prototype.toArray
+		: implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype.toArray/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var getPolyfill = require('./polyfill');
+
+var $IteratorPrototype = require('../Iterator.prototype/implementation');
+
+module.exports = function shimIteratorPrototypeToArray() {
+	var polyfill = getPolyfill();
+
+	define(
+		$IteratorPrototype,
+		{ toArray: polyfill },
+		{ toArray: function () { return $IteratorPrototype.toArray !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('iterator.prototype');
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+
+module.exports = getPolyfill();
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	return implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.prototype/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.prototype/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.prototype/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+var define = require('define-properties');
+
+var getIteratorPolyfill = require('../Iterator/polyfill');
+
+module.exports = function shimIteratorFrom() {
+	var $Iterator = getIteratorPolyfill();
+	var polyfill = getPolyfill();
+	define(
+		$Iterator,
+		{ prototype: polyfill },
+		{ prototype: function () { return $Iterator.prototype !== polyfill; } }
+	);
+
+	// TODO: install Symbol.toStringTag if needed, once https://bugs.chromium.org/p/chromium/issues/detail?id=1477372 is fixed?
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.zip/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zip/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zip/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.zip/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zip/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zip/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,123 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Get = require('es-abstract/2025/Get');
+var GetIterator = require('es-abstract/2025/GetIterator');
+var GetIteratorFlattenable = require('es-abstract/2025/GetIteratorFlattenable');
+var GetOptionsObject = require('../aos/GetOptionsObject');
+var IfAbruptCloseIterators = require('../aos/IfAbruptCloseIterators');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var IteratorZip = require('../aos/IteratorZip');
+var NormalCompletion = require('es-abstract/2025/NormalCompletion');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+module.exports = function zip(iterables) {
+	if (this instanceof zip) {
+		throw new $TypeError('`Iterator.zip` is not a constructor');
+	}
+
+	if (!isObject(iterables)) {
+		throw new $TypeError('`iterables` must be an Object'); // step 1
+	}
+
+	var options = GetOptionsObject(arguments.length > 1 ? arguments[1] : void undefined); // step 2
+
+	var mode = Get(options, 'mode'); // step 3
+
+	if (typeof mode === 'undefined') {
+		mode = 'shortest'; // step 4
+	}
+
+	if (mode !== 'shortest' && mode !== 'longest' && mode !== 'strict') {
+		throw new $TypeError('`mode` must be one of "shortest", "longest", or "strict"'); // step 5
+	}
+
+	var paddingOption; // step 6
+
+	if (mode === 'longest') {
+		paddingOption = Get(options, 'padding'); // step 7
+		if (typeof paddingOption !== 'undefined' && !isObject(paddingOption)) {
+			throw new $TypeError('`padding` option must be an Object'); // step 7.1
+		}
+	}
+
+	var iters = []; // step 8
+
+	var padding = []; // step 9
+
+	var inputIter = GetIterator(iterables, 'SYNC'); // step 10
+
+	var next; // = 'NOT-STARTED'; // step 11
+
+	while (!inputIter['[[Done]]']) { // step 12
+		try {
+			next = IteratorStepValue(inputIter); // step 12.a
+		} catch (e) {
+			IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 12.b
+		}
+
+		if (!inputIter['[[Done]]']) { // step 12.c
+			var iter;
+			try {
+				iter = GetIteratorFlattenable(next, 'REJECT-PRIMITIVES'); // step 12.c.i
+			} catch (e) {
+				IfAbruptCloseIterators(ThrowCompletion(e), [].concat(inputIter, iters)); // step 12.c.ii
+			}
+			iters[iters.length] = iter; // step 12.c.iii
+		}
+	}
+
+	var iterCount = iters.length; // step 13
+
+	if (mode === 'longest') { // step 14
+		if (typeof paddingOption === 'undefined') { // step 14.a
+			for (var i = 0; i < iterCount; i++) { // step 14.a.i
+				padding[padding.length] = void undefined; // step 14.a.i.1
+			}
+		} else { // step 14.b
+			var paddingIter;
+			try {
+				paddingIter = GetIterator(paddingOption, 'SYNC'); // step 14.b.i
+			} catch (e) {
+				IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 14.b.ii
+			}
+			var usingIterator = true; // step 14.b.iii
+			for (var j = 0; j < iterCount; j++) { // step 14.b.iv
+				if (usingIterator) { // step 14.b.iv.1
+					try {
+						next = IteratorStepValue(paddingIter); // step 14.b.iv.1.a
+					} catch (e) {
+						IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 14.b.iv.1.b
+					}
+					if (paddingIter['[[Done]]']) { // step 14.b.iv.1.c
+						usingIterator = false; // step 14.b.iv.1.c.i
+					} else { // step 14.b.iv.1.d
+						padding[padding.length] = next; // step 14.b.iv.1.d.i
+					}
+				}
+				if (!usingIterator) {
+					padding[padding.length] = void undefined; // step 14.b.iv.2
+				}
+			}
+
+			if (usingIterator) { // step 14.b.v
+				try {
+					IteratorClose(paddingIter, NormalCompletion(void undefined)); // step 14.b.v.1
+				} catch (e) {
+					IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 14.b.v.2
+				}
+			}
+		}
+	}
+
+	// eslint-disable-next-line no-sequences
+	var finishResults = (0, function (results) { // step 15
+		return results; // step 15.1
+	});
+
+	return IteratorZip(iters, mode, padding, finishResults); // step 16
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.zip/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zip/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zip/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+
+module.exports = getPolyfill();
Index: frontend/node_modules/es-iterator-helpers/Iterator.zip/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zip/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zip/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+var $Iterator = require('../Iterator');
+
+module.exports = function getPolyfill() {
+	return typeof $Iterator.zip === 'function' ? $Iterator.zip : implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.zip/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zip/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zip/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+var define = require('define-properties');
+
+var getIteratorPolyfill = require('../Iterator/polyfill');
+
+module.exports = function shimIteratorZip() {
+	var $Iterator = getIteratorPolyfill();
+	var polyfill = getPolyfill();
+	define(
+		$Iterator,
+		{ zip: polyfill },
+		{ zip: function () { return $Iterator.zip !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,119 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var CreateDataPropertyOrThrow = require('es-abstract/2025/CreateDataPropertyOrThrow');
+var Get = require('es-abstract/2025/Get');
+var GetIteratorFlattenable = require('es-abstract/2025/GetIteratorFlattenable');
+var OrdinaryObjectCreate = require('es-abstract/2025/OrdinaryObjectCreate');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+var ToPropertyDescriptor = require('es-abstract/2025/ToPropertyDescriptor');
+
+var forEach = require('es-abstract/helpers/forEach');
+var isObject = require('es-abstract/helpers/isObject');
+var ownKeys = require('es-abstract/helpers/OwnPropertyKeys');
+
+var gOPD = require('gopd');
+var IteratorZip = require('../aos/IteratorZip');
+var IfAbruptCloseIterators = require('../aos/IfAbruptCloseIterators');
+var GetOptionsObject = require('../aos/GetOptionsObject');
+
+module.exports = function zipKeyed(iterables) {
+	if (this instanceof zipKeyed) {
+		throw new $TypeError('`Iterator.zip` is not a constructor');
+	}
+
+	if (!isObject(iterables)) {
+		throw new $TypeError('`iterables` must be an Object'); // step 1
+	}
+
+	var options = GetOptionsObject(arguments.length > 1 ? arguments[1] : void undefined); // step 2
+
+	var mode = Get(options, 'mode'); // step 3
+
+	if (typeof mode === 'undefined') {
+		mode = 'shortest'; // step 4
+	}
+
+	if (mode !== 'shortest' && mode !== 'longest' && mode !== 'strict') {
+		throw new $TypeError('`mode` must be one of "shortest", "longest", or "strict"'); // step 5
+	}
+
+	var paddingOption; // step 6
+
+	if (mode === 'longest') { // step 7
+		paddingOption = Get(options, 'padding'); // step 7.a
+		if (typeof paddingOption !== 'undefined' && !isObject(paddingOption)) {
+			throw new $TypeError('`padding` option must be an Object'); // step 7.b
+		}
+	}
+
+	var iters = []; // step 8
+
+	var padding = []; // step 9
+
+	var allKeys = ownKeys(iterables); // step 10
+
+	var keys = []; // step 11
+
+	// eslint-disable-next-line consistent-return
+	forEach(allKeys, function (key) { // step 12
+		var desc;
+		try {
+			desc = ToPropertyDescriptor(gOPD(iterables, key)); // step 12.a
+		} catch (e) {
+			return IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 12.b
+		}
+
+		if (typeof desc !== 'undefined' && desc['[[Enumerable]]'] === true) { // step 12.c
+			var value;
+			try {
+				value = Get(iterables, key); // step 12.c.i
+			} catch (e) {
+				return IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 12.c.ii
+			}
+			if (typeof value !== 'undefined') { // step 12.c.iii
+				keys[keys.length] = key; // step 12.c.iii.1
+				var iter;
+				try {
+					iter = GetIteratorFlattenable(value, 'REJECT-PRIMITIVES'); // step 12.c.iii.2
+				} catch (e) {
+					return IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 12.c.iii.3
+				}
+				iters[iters.length] = iter; // step 12.c.iii.4
+			}
+		}
+	});
+
+	var iterCount = iters.length; // step 13
+
+	if (mode === 'longest') { // step 14
+		if (typeof paddingOption === 'undefined') { // step 14.a
+			for (var j = 0; j < iterCount; j += 1) { // step 14.a.i
+				padding[padding.length] = void undefined; // step 14.a.i.1
+			}
+		} else { // step 14.b
+			// eslint-disable-next-line consistent-return
+			forEach(keys, function (key) { // step 14.b.i
+				var value;
+				try {
+					value = Get(paddingOption, key); // step 14.b.i.1
+				} catch (e) {
+					return IfAbruptCloseIterators(ThrowCompletion(e), iters); // step 14.b.i.2
+				}
+				padding[padding.length] = value; // step 14.b.i.3
+			});
+		}
+	}
+
+	// eslint-disable-next-line no-sequences
+	var finishResults = (0, function (results) { // step 15
+		var obj = OrdinaryObjectCreate(null); // step 15.a
+		for (var i = 0; i < iterCount; i += 1) { // step 15.b
+			CreateDataPropertyOrThrow(obj, keys[i], results[i]); // step 15.b.i
+		}
+		return obj; // step 15.c
+	});
+
+	return IteratorZip(iters, mode, padding, finishResults); // step 16
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+
+module.exports = getPolyfill();
Index: frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var implementation = require('./implementation');
+
+var $Iterator = require('../Iterator');
+
+module.exports = function getPolyfill() {
+	return typeof $Iterator.zipKeyed === 'function' ? $Iterator.zipKeyed : implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator.zipKeyed/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var getPolyfill = require('./polyfill');
+var define = require('define-properties');
+
+var getIteratorPolyfill = require('../Iterator/polyfill');
+
+module.exports = function shimIteratorZipKeyed() {
+	var $Iterator = getIteratorPolyfill();
+	var polyfill = getPolyfill();
+	define(
+		$Iterator,
+		{ zipKeyed: polyfill },
+		{ zipKeyed: function () { return $Iterator.zipKeyed !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/Iterator/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+'use strict';
+
+var GetIntrinsic = require('get-intrinsic');
+var hasPropertyDescriptors = require('has-property-descriptors')();
+
+var $TypeError = require('es-errors/type');
+
+var $defineProperty = hasPropertyDescriptors && GetIntrinsic('%Object.defineProperty%', true);
+
+var iterProto = require('iterator.prototype');
+var callBound = require('call-bound');
+
+var $isPrototypeOf = callBound('Object.prototype.isPrototypeOf');
+
+var $Iterator = typeof Iterator === 'function' ? Iterator : function Iterator() {
+	if (
+		!(this instanceof Iterator)
+		|| this.constructor === Iterator
+		|| !$isPrototypeOf(Iterator, this.constructor)
+	) {
+		throw new $TypeError('`Iterator` can not be called or constructed directly');
+	}
+};
+
+if ($Iterator.prototype !== iterProto) {
+	$Iterator.prototype = iterProto;
+}
+$defineProperty($Iterator, 'prototype', { writable: false });
+
+module.exports = $Iterator;
Index: frontend/node_modules/es-iterator-helpers/Iterator/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict';
+
+var callBind = require('call-bind');
+
+var getPolyfill = require('./polyfill');
+
+var polyfill = callBind(getPolyfill());
+
+module.exports = polyfill;
Index: frontend/node_modules/es-iterator-helpers/Iterator/polyfill.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator/polyfill.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+'use strict';
+
+var globalThis = require('globalthis')();
+var implementation = require('./implementation');
+
+module.exports = function getPolyfill() {
+	return typeof globalThis.Iterator === 'function' ? globalThis.Iterator : implementation;
+};
Index: frontend/node_modules/es-iterator-helpers/Iterator/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/Iterator/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/Iterator/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var define = require('define-properties');
+var globalThis = require('globalthis')();
+
+var getPolyfill = require('./polyfill');
+
+module.exports = function shimIterator() {
+	var polyfill = getPolyfill();
+
+	define(
+		globalThis,
+		{ Iterator: polyfill },
+		{ Iterator: function () { return Iterator !== polyfill; } }
+	);
+
+	return polyfill;
+};
Index: frontend/node_modules/es-iterator-helpers/IteratorHelperPrototype/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/IteratorHelperPrototype/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/IteratorHelperPrototype/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,54 @@
+'use strict';
+
+var setToStringTag = require('es-set-tostringtag');
+var hasProto = require('has-proto')();
+var iterProto = require('../Iterator.prototype/implementation');
+var SLOT = require('internal-slot');
+
+var CreateIteratorResultObject = require('es-abstract/2025/CreateIteratorResultObject');
+var GeneratorResume = require('es-abstract/2025/GeneratorResume');
+var GeneratorResumeAbrupt = require('../aos/GeneratorResumeAbrupt');
+var IteratorCloseAll = require('../aos/IteratorCloseAll');
+var ReturnCompletion = require('es-abstract/2025/ReturnCompletion');
+
+var implementation;
+var o = { // in an object, for name inference
+	'return': function () {
+		var O = this; // step 1
+
+		SLOT.assert(O, '[[UnderlyingIterators]]'); // step 2
+
+		SLOT.assert(O, '[[GeneratorState]]'); // step 3
+
+		if (SLOT.get(O, '[[GeneratorState]]') === 'SUSPENDED-START') { // step 4
+			SLOT.set(O, '[[GeneratorState]]', 'COMPLETED'); // step 4.a
+			IteratorCloseAll(SLOT.get(O, '[[UnderlyingIterators]]'), ReturnCompletion(void undefined)); // step 4.c
+			return CreateIteratorResultObject(void undefined, true); // step 4.d
+		}
+
+		var C = ReturnCompletion(void undefined); // step 5
+
+		return GeneratorResumeAbrupt(O, C, 'Iterator Helper'); // step 6
+	}
+};
+if (hasProto) {
+	implementation = {
+		__proto__: iterProto,
+		next: function next() {
+			return GeneratorResume(this, void undefined, 'Iterator Helper');
+		},
+		'return': o['return']
+	};
+	setToStringTag(implementation, 'Iterator Helper');
+} else {
+	var IteratorHelper = function IteratorHelper() {};
+	IteratorHelper.prototype = iterProto;
+	implementation = new IteratorHelper();
+	delete implementation.constructor;
+	implementation.next = function next() {
+		return GeneratorResume(this, void undefined, 'Iterator Helper');
+	};
+	implementation['return'] = o['return'];
+}
+
+module.exports = implementation;
Index: frontend/node_modules/es-iterator-helpers/LICENSE
===================================================================
--- frontend/node_modules/es-iterator-helpers/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 ECMAScript Shims
+
+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.
Index: frontend/node_modules/es-iterator-helpers/README.md
===================================================================
--- frontend/node_modules/es-iterator-helpers/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,112 @@
+# es-iterator-helpers <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
+
+[![github actions][actions-image]][actions-url]
+[![coverage][codecov-image]][codecov-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+An ESnext spec-compliant sync iterator helpers shim/polyfill/replacement that works as far down as ES3.
+
+This package implements the [es-shim API](https://github.com/es-shims/api) “multi” interface. It works in an ES3-supported environment and complies with the [iterator helpers spec](https://tc39.es/proposal-iterator-helpers/) and the [iterator sequencing spec](https://tc39.es/proposal-iterator-sequencing/).
+
+Because the `Iterator.prototype` methods depend on a receiver (the `this` value), the main export in each subdirectory takes the iterator to operate on as the first argument.
+
+The main export of the package itself is simply an array of the available directory names. It’s sole intended use is for build tooling and testing.
+
+## Supported things
+
+ - [`Iterator` constructor](https://tc39.es/proposal-iterator-helpers/#sec-iterator-constructor)
+ - [`Iterator.prototype`](https://tc39.es/proposal-iterator-helpers/#sec-iterator.prototype)
+ - [`Iterator.concat`](https://tc39.es/proposal-iterator-sequencing/)
+ - [`Iterator.from`](https://tc39.es/proposal-iterator-helpers/#sec-iterator.from)
+ - [`Iterator.zip`](https://tc39.es/proposal-joint-iteration/#sec-iterator.zip)
+ - [`Iterator.zipKeyed`](https://tc39.es/proposal-joint-iteration/#sec-iterator.zipkeyed)
+ - [`Iterator.prototype.constructor`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.constructor)
+ - [`Iterator.prototype.drop`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.drop)
+ - [`Iterator.prototype.every`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.every)
+ - [`Iterator.prototype.filter`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.filter)
+ - [`Iterator.prototype.find`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.find)
+ - [`Iterator.prototype.flatMap`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.flatmap)
+ - [`Iterator.prototype.forEach`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.foreach)
+ - [`Iterator.prototype.includes`](https://tc39.es/proposal-iterator-includes/)
+ - [`Iterator.prototype.map`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.map)
+ - [`Iterator.prototype.reduce`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.reduce)
+ - [`Iterator.prototype.some`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.some)
+ - [`Iterator.prototype.take`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.take)
+ - [`Iterator.prototype.toArray`](https://tc39.es/proposal-iterator-helpers/#sec-iteratorprototype.toarray)
+
+## Environments where this is needed
+
+ - node < v22, Chrome < v122, Safari <= v17.1, Firefox <= v125: not implemented
+ - node v22, Chrome v122 - v130: has a [bug](https://issues.chromium.org/issues/336839115) where `{ next: null }` is not properly rejected
+ - node v22 - v24, Chrome v122 - v134: missing early-error `IteratorClose` when argument validation fails (e.g., non-callable mapper does not call the iterator's `return` method)
+ - all environments lack Iterator.concat, Iterator.zip, Iterator.zipKeyed, Iterator.prototype.includes
+
+## Getting started
+
+```sh
+npm install --save es-iterator-helpers
+```
+
+## Usage/Examples
+
+Using explicit imports:
+
+```js
+const map = require('es-iterator-helpers/Iterator.prototype.map');
+const toArray = require('es-iterator-helpers/Iterator.prototype.toArray');
+const assert = require('assert');
+
+const iterator = [1, 2, 3].values();
+
+const mapped = map(iterator, (x) => x + 10);
+assert.deepEqual(
+	mapped.next(),
+    {
+        done: false,
+        value: 11,
+    }
+);
+assert.deepEqual(
+    toArray(mapped),
+    [12, 13]
+);
+```
+
+Shim using `require`:
+
+```js
+require('es-iterator-helpers/auto'); // shim all of the methods
+
+require('es-iterator-helpers/Iterator.prototype.map/auto'); // shim the “map” method
+```
+
+Shim using `import` syntax:
+
+[](#preventEval)
+```js
+import 'es-iterator-helpers/auto'; // shim all of the methods
+
+import 'es-iterator-helpers/Iterator.prototype.map/auto'; // shim the “map” method
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/es-iterator-helpers
+[npm-version-svg]: https://versionbadg.es/es-shims/iterator-helpers.svg
+[deps-svg]: https://david-dm.org/es-shims/iterator-helpers.svg
+[deps-url]: https://david-dm.org/es-shims/iterator-helpers
+[dev-deps-svg]: https://david-dm.org/es-shims/iterator-helpers/dev-status.svg
+[dev-deps-url]: https://david-dm.org/es-shims/iterator-helpers#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/es-iterator-helpers.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/es-iterator-helpers.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/es-iterator-helpers.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=es-iterator-helpers
+[codecov-image]: https://codecov.io/gh/es-shims/iterator-helpers/branch/main/graphs/badge.svg
+[codecov-url]: https://app.codecov.io/gh/es-shims/iterator-helpers/
+[actions-image]: https://img.shields.io/github/check-runs/es-shims/iterator-helpers/main
+[actions-url]: https://github.com/es-shims/iterator-helpers/actions
Index: frontend/node_modules/es-iterator-helpers/WrapForValidIteratorPrototype/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/WrapForValidIteratorPrototype/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/WrapForValidIteratorPrototype/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,47 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var Call = require('es-abstract/2025/Call');
+var CreateIteratorResultObject = require('es-abstract/2025/CreateIteratorResultObject');
+var GetMethod = require('es-abstract/2025/GetMethod');
+
+var isObject = require('es-abstract/helpers/isObject');
+
+var SLOT = require('internal-slot');
+var iterProto = require('../Iterator.prototype/implementation');
+
+// https://tc39.es/proposal-iterator-helpers/#sec-wrapforvaliditeratorprototype-object
+
+module.exports = /* GetIntrinsic('%WrapForValidIteratorPrototype%', true) || */ {
+	__proto__: iterProto,
+	next: function next() {
+		var O = this; // step 1
+
+		// RequireInternalSlot(O, [[Iterated]]); // step 2
+		SLOT.assert(O, '[[Iterated]]');
+
+		var iteratorRecord = SLOT.get(O, '[[Iterated]]'); // step 3
+
+		return Call(iteratorRecord['[[NextMethod]]'], iteratorRecord['[[Iterator]]']); // step 4
+	},
+	'return': function () {
+		var O = this; // step 1
+
+		// RequireInternalSlot(O, [[Iterated]]); // step 2
+		SLOT.assert(O, '[[Iterated]]');
+
+		var iterator = SLOT.get(O, '[[Iterated]]')['[[Iterator]]']; // step 3
+
+		if (!isObject(iterator)) {
+			throw new $TypeError('iterator must be an Object'); // step 4
+		}
+
+		var returnMethod = GetMethod(iterator, 'return'); // step 5
+
+		if (typeof returnMethod === 'undefined') { // step 6
+			return CreateIteratorResultObject(void undefined, true); // step 6.a
+		}
+		return Call(returnMethod, iterator); // step 7
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/aos/GeneratorResumeAbrupt.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/aos/GeneratorResumeAbrupt.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/aos/GeneratorResumeAbrupt.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,56 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var CreateIteratorResultObject = require('es-abstract/2025/CreateIteratorResultObject');
+var GeneratorValidate = require('es-abstract/2025/GeneratorValidate');
+
+var SLOT = require('internal-slot');
+
+// https://tc39.es/ecma262/#sec-generatorresumeabrupt
+
+module.exports = function GeneratorResumeAbrupt(generator, abruptCompletion, generatorBrand) {
+	if (
+		!(abruptCompletion instanceof CompletionRecord)
+		|| (abruptCompletion.type() !== 'return' && abruptCompletion.type() !== 'throw')
+	) {
+		throw new $TypeError('Assertion failed: abruptCompletion must be a `return` or `throw` Completion Record');
+	}
+
+	var state = GeneratorValidate(generator, generatorBrand); // step 1
+
+	if (state === 'SUSPENDED-START') { // step 2
+		SLOT.set(generator, '[[GeneratorState]]', 'COMPLETED'); // step 2.a
+		SLOT.set(generator, '[[GeneratorContext]]', null); // step 2.b
+		state = 'COMPLETED'; // step 2.c
+	}
+
+	var value = abruptCompletion.value();
+
+	if (state === 'COMPLETED') { // step 3
+		if (abruptCompletion.type() === 'return') { // step 3.a
+			return CreateIteratorResultObject(value, true); // step 3.a.i
+		}
+		return abruptCompletion['?'](); // step 3.b - throw
+	}
+
+	if (state !== 'SUSPENDED-YIELD') {
+		throw new $TypeError('Assertion failed: generator state is unexpected: ' + state); // step 4
+	}
+
+	var genContext = SLOT.get(generator, '[[GeneratorContext]]'); // step 5
+
+	SLOT.set(generator, '[[GeneratorState]]', 'EXECUTING'); // step 8
+
+	if (abruptCompletion.type() === 'return') {
+		// due to representing `GeneratorContext` as a function, we can't safely re-invoke it, so we can't support sending it a return completion
+		SLOT.get(generator, '[[CloseIfAbrupt]]')(abruptCompletion);
+		SLOT.set(generator, '[[GeneratorState]]', 'COMPLETED'); // step 10
+		return CreateIteratorResultObject(value, true);
+	}
+
+	var result = genContext(value); // steps 6-7, 9-11
+
+	return result; // step 12
+};
Index: frontend/node_modules/es-iterator-helpers/aos/GetOptionsObject.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/aos/GetOptionsObject.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/aos/GetOptionsObject.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+// var OrdinaryObjectCreate = require('es-abstract/2025/OrdinaryObjectCreate');
+var isObject = require('es-abstract/helpers/isObject');
+
+// https://tc39.es/proposal-joint-iteration/#sec-getoptionsobject
+
+module.exports = function GetOptionsObject(options) {
+	if (typeof options === 'undefined') { // step 1
+		// return OrdinaryObjectCreate(null); // step 1.a
+		return { __proto__: null }; // step 1.a
+	}
+	if (isObject(options)) { // step 2
+		return options; // step 2.a
+	}
+
+	throw new $TypeError('`options` must be an Object or undefined'); // step 3
+};
Index: frontend/node_modules/es-iterator-helpers/aos/IfAbruptCloseIterators.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/aos/IfAbruptCloseIterators.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/aos/IfAbruptCloseIterators.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var IteratorCloseAll = require('./IteratorCloseAll');
+
+// https://tc39.es/proposal-joint-iteration/#sec-ifabruptcloseiterators
+
+module.exports = function IfAbruptCloseIterators(value, iteratorRecords) {
+	if (!(value instanceof CompletionRecord)) {
+		throw new $TypeError('Assertion failed: `value` must be a Completion Record'); // step 1
+	}
+	if (value.type() === 'throw') {
+		return IteratorCloseAll(iteratorRecords, value); // step 2
+	}
+
+	return value['!'](); // step
+};
Index: frontend/node_modules/es-iterator-helpers/aos/IteratorCloseAll.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/aos/IteratorCloseAll.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/aos/IteratorCloseAll.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,34 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var IteratorClose = require('es-abstract/2025/IteratorClose');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var IsArray = require('es-abstract/helpers/IsArray');
+var every = require('es-abstract/helpers/every');
+
+var isIteratorRecord = require('es-abstract/helpers/records/iterator-record');
+
+// https://tc39.es/proposal-joint-iteration/#sec-closeall
+
+module.exports = function IteratorCloseAll(iters, completion) {
+	if (!IsArray(iters) || !every(iters, isIteratorRecord)) {
+		throw new $TypeError('Assertion failed: `iters` must be a List of IteratorRecords');
+	}
+	if (!(completion instanceof CompletionRecord)) {
+		throw new $TypeError('Assertion failed: `completion` must be a Completion Record');
+	}
+
+	for (var i = iters.length - 1; i >= 0; i -= 1) { // step 1
+		try {
+			IteratorClose(iters[i], completion); // step 1.a
+		} catch (e) {
+			// eslint-disable-next-line no-param-reassign
+			completion = ThrowCompletion(e); // step 1.a
+		}
+	}
+
+	return completion['?'](); // step 2
+};
Index: frontend/node_modules/es-iterator-helpers/aos/IteratorZip.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/aos/IteratorZip.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/aos/IteratorZip.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,158 @@
+'use strict';
+
+var $TypeError = require('es-errors/type');
+
+var CompletionRecord = require('es-abstract/2025/CompletionRecord');
+var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
+var IteratorStep = require('es-abstract/2025/IteratorStep');
+var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
+var NormalCompletion = require('es-abstract/2025/NormalCompletion');
+var ThrowCompletion = require('es-abstract/2025/ThrowCompletion');
+
+var isAbstractClosure = require('es-abstract/helpers/isAbstractClosure');
+var IsArray = require('es-abstract/helpers/IsArray');
+var isIteratorRecord = require('es-abstract/helpers/records/iterator-record');
+var every = require('es-abstract/helpers/every');
+
+var callBound = require('call-bound');
+
+var $indexOf = callBound('Array.prototype.indexOf');
+var $slice = callBound('Array.prototype.slice');
+var $splice = callBound('Array.prototype.splice');
+
+var SLOT = require('internal-slot');
+var iterHelperProto = require('../IteratorHelperPrototype');
+
+var IteratorCloseAll = require('./IteratorCloseAll');
+
+// https://tc39.es/proposal-joint-iteration/#sec-IteratorZip
+
+module.exports = function IteratorZip(iters, mode, padding, finishResults) {
+	if (!IsArray(iters) || !every(iters, isIteratorRecord)) {
+		throw new $TypeError('`iters` must be a List of IteratorRecords');
+	}
+
+	if (mode !== 'shortest' && mode !== 'longest' && mode !== 'strict') {
+		throw new $TypeError('`mode` must be one of "shortest", "longest", or "strict"');
+	}
+
+	if (!IsArray(padding)) {
+		throw new $TypeError('`padding` must be a List');
+	}
+
+	if (!isAbstractClosure(finishResults)) {
+		throw new $TypeError('`finishResults` must be an Abstract Closure');
+	}
+
+	var iterCount = iters.length; // step 1
+
+	var openIters = $slice(iters); // step 2
+
+	var closeIfAbrupt = function (abruptCompletion) {
+		if (!(abruptCompletion instanceof CompletionRecord)) {
+			throw new $TypeError('`abruptCompletion` must be a Completion Record');
+		}
+		IteratorCloseAll(openIters, abruptCompletion);
+	};
+
+	var sentinel = {};
+	var closure = function () {
+		if (iterCount === 0) {
+			// 1. If iterCount = 0, return ReturnCompletion(undefined).
+			return sentinel; // step 1
+		}
+		// while (true) {
+		{ // eslint-disable-line no-lone-blocks
+			var results = []; // step 3.b.i
+			if (openIters.length === 0) {
+				throw new $TypeError('Assertion failed: `openIters` is empty'); // step 3.b.ii
+			}
+			for (var i = 0; i < iterCount; ++i) { // step 3.b.iii
+				// for (var i = 0; i < iterCount; i += 1) { // step 3.b.iii
+				var result;
+
+				var iter = iters[i]; // step 3.b.iii.1
+				if (iter === null) { // step 3.b.iii.2
+					if (mode !== 'longest') {
+						throw new $TypeError('Assertion failed: `mode` is not "longest"'); // step 3.b.iii.2.a
+					}
+					result = padding[i]; // step 3.b.iii.2.b
+				} else { // step 3.b.iii.3
+					try {
+						result = IteratorStepValue(iter); // step 3.b.iii.3.a, 3.b.iii.3.c
+					} catch (e) { // step 3.b.iii.3.b
+						$splice(openIters, $indexOf(openIters, iter), 1); // step 3.b.iii.3.b.i
+						return IteratorCloseAll(openIters, ThrowCompletion(e)); // step 3.b.iii.3.b.ii
+					}
+					if (iter['[[Done]]']) { // step 3.b.iii.3.d
+						$splice(openIters, $indexOf(openIters, iter), 1); // step 3.b.iii.3.d.i
+						if (mode === 'shortest') { // step 3.b.iii.3.d.ii
+							IteratorCloseAll(openIters, NormalCompletion(void undefined)); // step 3.b.iii.3.d.ii.i
+							return sentinel;
+						} else if (mode === 'strict') { // step 3.b.iii.3.d.iii
+							if (i !== 0) { // step 3.b.iii.3.d.iii.i
+								return IteratorCloseAll(
+									openIters,
+									ThrowCompletion(new $TypeError('Assertion failed: `i` is not 0'))
+								); // step 3.b.iii.3.d.iii.i.i
+							}
+							for (var k = 1; k < iterCount; k += 1) { // step 3.b.iii.3.d.iii.ii
+								if (iters[k] === null) {
+									throw new $TypeError('Assertion failed: `iters[k]` is `null`'); // step 3.b.iii.3.d.iii.ii.i
+								}
+								try {
+									result = IteratorStep(iters[k]); // step 3.b.iii.3.d.iii.ii.ii, 3.b.iii.3.d.iii.ii.iv
+								} catch (e) { // step 3.b.iii.2.d.iii.ii.iii
+									$splice(openIters, $indexOf(openIters, iters[k]), 1); // step 3.b.iii.3.d.iii.ii.iii.i
+									return IteratorCloseAll(openIters, ThrowCompletion(e)); // step 3.b.iii.3.d.iii.ii.iii.ii
+								}
+
+								// if (open === false) { // step 3.b.iii.3.d.iii.ii.v
+								if (iters[k]['[[Done]]']) { // step 3.b.iii.3.d.iii.ii.v
+									$splice(openIters, $indexOf(openIters, iters[k]), 1); // step 3.b.iii.3.d.iii.ii.v.i
+								} else { // step 3.b.iii.3.d.iii.ii.vi
+									return IteratorCloseAll(
+										openIters,
+										ThrowCompletion(new $TypeError('Assertion failed: `open` is not `false`'))
+									); // step 3.b.iii.3.d.iii.ii.vi.i
+								}
+							}
+							return sentinel; // step 3.b.iii.3.d.iii.iii - all iterators done in strict mode
+						// eslint-disable-next-line no-else-return
+						} else { // step 3.b.iii.3.d.iv
+							if (mode !== 'longest') { // step 3.b.iii.3.d.iv.i
+								throw new $TypeError('Assertion failed: `mode` is not "longest"'); // step 3.b.iii.3.d.iv.i
+							}
+
+							if (openIters.length === 0) {
+								return sentinel; // ReturnCompletion(undefined); // step 3.b.iii.3.d.iv.ii
+							}
+
+							// eslint-disable-next-line no-param-reassign
+							iters[i] = null; // step 3.b.iii.3.d.iv.iii
+							// i += 1;
+
+							result = padding[i]; // step 3.b.iii.3.d.iv.iv
+						}
+					}
+				}
+
+				results[results.length] = result; // step 3.b.iii.4
+
+				//    v. Let completion be Completion(Yield(results)).
+				//    vi. If completion is an abrupt completion, then
+				//      1. Return ? IteratorCloseAll(openIters, completion).
+			}
+		}
+
+		return finishResults(results); // step 3.b.iv
+	};
+	SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
+	SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
+
+	var gen = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 4
+
+	SLOT.set(gen, '[[UnderlyingIterators]]', openIters); // step 5
+
+	return gen; // step 6
+};
Index: frontend/node_modules/es-iterator-helpers/auto.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/auto.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+'use strict';
+
+require('./shim')();
Index: frontend/node_modules/es-iterator-helpers/eslint.config.mjs
===================================================================
--- frontend/node_modules/es-iterator-helpers/eslint.config.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/eslint.config.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,182 @@
+import ljharbConfig from '@ljharb/eslint-config/flat';
+import importPlugin from 'eslint-plugin-import';
+
+export default [
+	...ljharbConfig,
+	{
+		plugins: {
+			import: importPlugin,
+		},
+		settings: {
+			'import/resolver': {
+				node: {
+					extensions: ['.mjs', '.js', '.json'],
+				},
+			},
+			'import/extensions': [
+				'.js',
+				'.mjs',
+				'.jsx',
+			],
+			'import/core-modules': [
+			],
+			'import/ignore': [
+				'node_modules',
+			],
+		},
+
+		rules: {
+			'import/no-unresolved': ['error', { commonjs: true, caseSensitive: true }],
+
+			'import/named': 'error',
+			'import/export': 'error',
+			'import/no-named-as-default': 'error',
+			'import/no-named-as-default-member': 'error',
+			// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-deprecated.md
+			'import/no-deprecated': 'error',
+
+			'import/no-extraneous-dependencies': ['error', {
+				devDependencies: [
+					'eslint.config.mjs',
+					'test/**',
+				],
+				optionalDependencies: false,
+			}],
+			'import/no-mutable-exports': 'error',
+			'import/no-commonjs': 'off',
+			'import/no-amd': 'error',
+			'import/first': 'error',
+			'import/no-duplicates': 'error',
+			'import/no-namespace': 'error',
+
+			// Ensure consistent use of file extension within the import path
+			// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md
+			'import/extensions': ['error', 'ignorePackages', {
+				json: 'never',
+				js: 'never',
+				mjs: 'never',
+				jsx: 'never',
+			}],
+			'import/order': ['warn', { groups: [['builtin', 'external', 'internal']] }],
+			'import/newline-after-import': 'error',
+			'import/prefer-default-export': 'error',
+			'import/no-restricted-paths': 'off',
+			'import/max-dependencies': ['off', { max: 10 }],
+			'import/no-absolute-path': 'error',
+			'import/no-dynamic-require': 'error',
+			'import/no-internal-modules': ['off', {
+				allow: [],
+			}],
+			'import/no-webpack-loader-syntax': 'error',
+			'import/no-unassigned-import': 'off',
+			'import/no-named-default': 'error',
+			'import/no-anonymous-default-export': ['off', {
+				allowArray: false,
+				allowArrowFunction: false,
+				allowAnonymousClass: false,
+				allowAnonymousFunction: false,
+				allowLiteral: false,
+				allowObject: false,
+			}],
+			'import/exports-last': 'error',
+			'import/group-exports': 'off',
+			'import/no-default-export': 'off',
+			'import/no-named-export': 'off',
+			'import/no-self-import': 'error',
+			'import/no-cycle': ['error', { commonjs: true, maxDepth: '∞' }],
+			'import/no-useless-path-segments': ['error', { commonjs: true }],
+			'import/no-relative-parent-imports': 'off',
+			// TODO: enable once it works for flat config
+			'import/no-unused-modules': ['off', {
+				commonjs: true,
+				ignoreExports: [],
+				missingExports: true,
+				unusedExports: true,
+			}],
+			'import/no-import-module-exports': ['error', {
+				exceptions: [],
+			}],
+			'import/no-relative-packages': 'error',
+		},
+	},
+	{
+		languageOptions: {
+			globals: {
+				Iterator: false,
+			},
+		},
+		rules: {
+			'array-bracket-newline': 'off',
+			'func-name-matching': 'off',
+			'id-length': 'off',
+			'max-lines-per-function': 'off',
+			'max-statements': 'off',
+			'multiline-comment-style': 'off',
+			'new-cap': ['error', {
+				capIsNewExceptions: [
+					'Call',
+					'CreateDataPropertyOrThrow',
+					'CreateIteratorFromClosure',
+					'CreateIteratorResultObject',
+					'GeneratorResume',
+					'GeneratorResumeAbrupt',
+					'GeneratorValidate',
+					'Get',
+					'GetIntrinsic',
+					'GetIterator',
+					'GetIteratorDirect',
+					'GetIteratorFlattenable',
+					'GetMethod',
+					'GetOptionsObject',
+					'IfAbruptCloseIterator',
+					'IfAbruptCloseIterators',
+					'IsAccessorDescriptor',
+					'IsArray',
+					'IsCallable',
+					'IsDataDescriptor',
+					'IteratorClose',
+					'IteratorCloseAll',
+					'IteratorStep',
+					'IteratorStepValue',
+					'IteratorZip',
+					'NormalCompletion',
+					'OrdinaryHasInstance',
+					'OrdinaryObjectCreate',
+					'ReturnCompletion',
+					'SameValueZero',
+					'StringToCodePoints',
+					'ThrowCompletion',
+					'ToBoolean',
+					'ToIntegerOrInfinity',
+					'ToNumber',
+					'ToPropertyDescriptor',
+					'ToString',
+				],
+			}],
+			'no-negated-condition': 'warn',
+			'object-curly-newline': 'off',
+			'sort-keys': 'off',
+		},
+	},
+	{
+		files: ['test/**'],
+		rules: {
+			eqeqeq: ['error', 'allow-null'],
+			'func-style': 'off',
+		},
+	},
+	{
+		files: ['Iterator.zip*/implementation.js'],
+		rules: {
+			complexity: 'off',
+			'max-depth': 'off',
+		},
+	},
+	{
+		files: ['aos/IteratorZip.js'],
+		rules: {
+			'max-depth': 'off',
+			'max-params': 'off',
+		},
+	},
+];
Index: frontend/node_modules/es-iterator-helpers/index.json
===================================================================
--- frontend/node_modules/es-iterator-helpers/index.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/index.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+[
+	"Iterator",
+	"Iterator.concat",
+	"Iterator.from",
+	"Iterator.zip",
+	"Iterator.zipKeyed",
+	"Iterator.prototype",
+	"Iterator.prototype.constructor",
+	"Iterator.prototype.drop",
+	"Iterator.prototype.every",
+	"Iterator.prototype.filter",
+	"Iterator.prototype.find",
+	"Iterator.prototype.flatMap",
+	"Iterator.prototype.forEach",
+	"Iterator.prototype.includes",
+	"Iterator.prototype.map",
+	"Iterator.prototype.reduce",
+	"Iterator.prototype.some",
+	"Iterator.prototype.take",
+	"Iterator.prototype.toArray"
+]
Index: frontend/node_modules/es-iterator-helpers/package.json
===================================================================
--- frontend/node_modules/es-iterator-helpers/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,211 @@
+{
+	"name": "es-iterator-helpers",
+	"version": "1.3.2",
+	"description": "An ESnext spec-compliant iterator helpers shim/polyfill/replacement that works as far down as ES3.",
+	"main": "index.json",
+	"exports": {
+		".": "./index.json",
+		"./auto": "./auto.js",
+		"./shim": "./shim.js",
+		"./Iterator": "./Iterator/index.js",
+		"./Iterator/auto": "./Iterator/auto.js",
+		"./Iterator/polyfill": "./Iterator/polyfill.js",
+		"./Iterator/implementation": "./Iterator/implementation.js",
+		"./Iterator/shim": "./Iterator/shim.js",
+		"./Iterator.prototype": "./Iterator.prototype/index.js",
+		"./Iterator.prototype/auto": "./Iterator.prototype/auto.js",
+		"./Iterator.prototype/polyfill": "./Iterator.prototype/polyfill.js",
+		"./Iterator.prototype/implementation": "./Iterator.prototype/implementation.js",
+		"./Iterator.prototype/shim": "./Iterator.prototype/shim.js",
+		"./Iterator.concat": "./Iterator.concat/index.js",
+		"./Iterator.concat/auto": "./Iterator.concat/auto.js",
+		"./Iterator.concat/polyfill": "./Iterator.concat/polyfill.js",
+		"./Iterator.concat/implementation": "./Iterator.concat/implementation.js",
+		"./Iterator.concat/shim": "./Iterator.concat/shim.js",
+		"./Iterator.from": "./Iterator.from/index.js",
+		"./Iterator.from/auto": "./Iterator.from/auto.js",
+		"./Iterator.from/polyfill": "./Iterator.from/polyfill.js",
+		"./Iterator.from/implementation": "./Iterator.from/implementation.js",
+		"./Iterator.from/shim": "./Iterator.from/shim.js",
+		"./Iterator.zip": "./Iterator.zip/index.js",
+		"./Iterator.zip/auto": "./Iterator.zip/auto.js",
+		"./Iterator.zip/polyfill": "./Iterator.zip/polyfill.js",
+		"./Iterator.zip/implementation": "./Iterator.zip/implementation.js",
+		"./Iterator.zip/shim": "./Iterator.zip/shim.js",
+		"./Iterator.zipKeyed": "./Iterator.zipKeyed/index.js",
+		"./Iterator.zipKeyed/auto": "./Iterator.zipKeyed/auto.js",
+		"./Iterator.zipKeyed/polyfill": "./Iterator.zipKeyed/polyfill.js",
+		"./Iterator.zipKeyed/implementation": "./Iterator.zipKeyed/implementation.js",
+		"./Iterator.zipKeyed/shim": "./Iterator.zipKeyed/shim.js",
+		"./Iterator.prototype.constructor": "./Iterator.prototype.constructor/index.js",
+		"./Iterator.prototype.constructor/auto": "./Iterator.prototype.constructor/auto.js",
+		"./Iterator.prototype.constructor/polyfill": "./Iterator.prototype.constructor/polyfill.js",
+		"./Iterator.prototype.constructor/implementation": "./Iterator.prototype.constructor/implementation.js",
+		"./Iterator.prototype.constructor/shim": "./Iterator.prototype.constructor/shim.js",
+		"./Iterator.prototype.map": "./Iterator.prototype.map/index.js",
+		"./Iterator.prototype.map/auto": "./Iterator.prototype.map/auto.js",
+		"./Iterator.prototype.map/polyfill": "./Iterator.prototype.map/polyfill.js",
+		"./Iterator.prototype.map/implementation": "./Iterator.prototype.map/implementation.js",
+		"./Iterator.prototype.map/shim": "./Iterator.prototype.map/shim.js",
+		"./Iterator.prototype.filter": "./Iterator.prototype.filter/index.js",
+		"./Iterator.prototype.filter/auto": "./Iterator.prototype.filter/auto.js",
+		"./Iterator.prototype.filter/polyfill": "./Iterator.prototype.filter/polyfill.js",
+		"./Iterator.prototype.filter/implementation": "./Iterator.prototype.filter/implementation.js",
+		"./Iterator.prototype.filter/shim": "./Iterator.prototype.filter/shim.js",
+		"./Iterator.prototype.take": "./Iterator.prototype.take/index.js",
+		"./Iterator.prototype.take/auto": "./Iterator.prototype.take/auto.js",
+		"./Iterator.prototype.take/polyfill": "./Iterator.prototype.take/polyfill.js",
+		"./Iterator.prototype.take/implementation": "./Iterator.prototype.take/implementation.js",
+		"./Iterator.prototype.take/shim": "./Iterator.prototype.take/shim.js",
+		"./Iterator.prototype.drop": "./Iterator.prototype.drop/index.js",
+		"./Iterator.prototype.drop/auto": "./Iterator.prototype.drop/auto.js",
+		"./Iterator.prototype.drop/polyfill": "./Iterator.prototype.drop/polyfill.js",
+		"./Iterator.prototype.drop/implementation": "./Iterator.prototype.drop/implementation.js",
+		"./Iterator.prototype.drop/shim": "./Iterator.prototype.drop/shim.js",
+		"./Iterator.prototype.flatMap": "./Iterator.prototype.flatMap/index.js",
+		"./Iterator.prototype.flatMap/auto": "./Iterator.prototype.flatMap/auto.js",
+		"./Iterator.prototype.flatMap/polyfill": "./Iterator.prototype.flatMap/polyfill.js",
+		"./Iterator.prototype.flatMap/implementation": "./Iterator.prototype.flatMap/implementation.js",
+		"./Iterator.prototype.flatMap/shim": "./Iterator.prototype.flatMap/shim.js",
+		"./Iterator.prototype.includes": "./Iterator.prototype.includes/index.js",
+		"./Iterator.prototype.includes/auto": "./Iterator.prototype.includes/auto.js",
+		"./Iterator.prototype.includes/polyfill": "./Iterator.prototype.includes/polyfill.js",
+		"./Iterator.prototype.includes/implementation": "./Iterator.prototype.includes/implementation.js",
+		"./Iterator.prototype.includes/shim": "./Iterator.prototype.includes/shim.js",
+		"./Iterator.prototype.reduce": "./Iterator.prototype.reduce/index.js",
+		"./Iterator.prototype.reduce/auto": "./Iterator.prototype.reduce/auto.js",
+		"./Iterator.prototype.reduce/polyfill": "./Iterator.prototype.reduce/polyfill.js",
+		"./Iterator.prototype.reduce/implementation": "./Iterator.prototype.reduce/implementation.js",
+		"./Iterator.prototype.reduce/shim": "./Iterator.prototype.reduce/shim.js",
+		"./Iterator.prototype.toArray": "./Iterator.prototype.toArray/index.js",
+		"./Iterator.prototype.toArray/auto": "./Iterator.prototype.toArray/auto.js",
+		"./Iterator.prototype.toArray/polyfill": "./Iterator.prototype.toArray/polyfill.js",
+		"./Iterator.prototype.toArray/implementation": "./Iterator.prototype.toArray/implementation.js",
+		"./Iterator.prototype.toArray/shim": "./Iterator.prototype.toArray/shim.js",
+		"./Iterator.prototype.forEach": "./Iterator.prototype.forEach/index.js",
+		"./Iterator.prototype.forEach/auto": "./Iterator.prototype.forEach/auto.js",
+		"./Iterator.prototype.forEach/polyfill": "./Iterator.prototype.forEach/polyfill.js",
+		"./Iterator.prototype.forEach/implementation": "./Iterator.prototype.forEach/implementation.js",
+		"./Iterator.prototype.forEach/shim": "./Iterator.prototype.forEach/shim.js",
+		"./Iterator.prototype.some": "./Iterator.prototype.some/index.js",
+		"./Iterator.prototype.some/auto": "./Iterator.prototype.some/auto.js",
+		"./Iterator.prototype.some/polyfill": "./Iterator.prototype.some/polyfill.js",
+		"./Iterator.prototype.some/implementation": "./Iterator.prototype.some/implementation.js",
+		"./Iterator.prototype.some/shim": "./Iterator.prototype.some/shim.js",
+		"./Iterator.prototype.every": "./Iterator.prototype.every/index.js",
+		"./Iterator.prototype.every/auto": "./Iterator.prototype.every/auto.js",
+		"./Iterator.prototype.every/polyfill": "./Iterator.prototype.every/polyfill.js",
+		"./Iterator.prototype.every/implementation": "./Iterator.prototype.every/implementation.js",
+		"./Iterator.prototype.every/shim": "./Iterator.prototype.every/shim.js",
+		"./Iterator.prototype.find": "./Iterator.prototype.find/index.js",
+		"./Iterator.prototype.find/auto": "./Iterator.prototype.find/auto.js",
+		"./Iterator.prototype.find/polyfill": "./Iterator.prototype.find/polyfill.js",
+		"./Iterator.prototype.find/implementation": "./Iterator.prototype.find/implementation.js",
+		"./Iterator.prototype.find/shim": "./Iterator.prototype.find/shim.js",
+		"./package.json": "./package.json"
+	},
+	"scripts": {
+		"prepack": "npmignore --auto --commentLines=autogenerated",
+		"prepublishOnly": "safe-publish-latest",
+		"prepublish": "not-in-publish || npm run prepublishOnly",
+		"prelint": "es-shim-api --type=multi --ignore-dirs=WrapForValidIteratorPrototype,IteratorHelperPrototype",
+		"lint": "eslint --ext=js,mjs .",
+		"postlint": "evalmd README.md",
+		"pretest": "npm run lint",
+		"test": "npm run tests-only",
+		"tests-only": "nyc tape 'test/**/*.js'",
+		"posttest": "npx npm@'>=10.2' audit --production",
+		"version": "auto-changelog && git add CHANGELOG.md",
+		"postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+	},
+	"repository": {
+		"type": "git",
+		"url": "git+https://github.com/es-shims/iterator-helpers.git"
+	},
+	"keywords": [
+		"javascript",
+		"ecmascript",
+		"polyfill",
+		"shim",
+		"es-shims",
+		"es-shim API",
+		"Iterator",
+		"helpers",
+		"from",
+		"map",
+		"filter",
+		"take",
+		"drop",
+		"flatMap",
+		"reduce",
+		"toArray",
+		"forEach",
+		"some",
+		"every",
+		"find"
+	],
+	"author": "Jordan Harband <ljharb@gmail.com>",
+	"license": "MIT",
+	"bugs": {
+		"url": "https://github.com/es-shims/iterator-helpers/issues"
+	},
+	"homepage": "https://github.com/es-shims/iterator-helpers#readme",
+	"dependencies": {
+		"call-bind": "^1.0.9",
+		"call-bound": "^1.0.4",
+		"define-properties": "^1.2.1",
+		"es-abstract": "^1.24.2",
+		"es-errors": "^1.3.0",
+		"es-set-tostringtag": "^2.1.0",
+		"function-bind": "^1.1.2",
+		"get-intrinsic": "^1.3.0",
+		"globalthis": "^1.0.4",
+		"gopd": "^1.2.0",
+		"has-property-descriptors": "^1.0.2",
+		"has-proto": "^1.2.0",
+		"has-symbols": "^1.1.0",
+		"internal-slot": "^1.1.0",
+		"iterator.prototype": "^1.1.5",
+		"math-intrinsics": "^1.1.0"
+	},
+	"devDependencies": {
+		"@es-shims/api": "^4.0.0",
+		"@ljharb/eslint-config": "^22.2.2",
+		"auto-changelog": "^2.5.0",
+		"encoding": "^0.1.13",
+		"es-value-fixtures": "^1.7.1",
+		"eslint": "^9.39.4",
+		"eslint-plugin-import": "^2.32.0",
+		"evalmd": "^0.0.19",
+		"for-each": "^0.3.5",
+		"functions-have-names": "^1.2.3",
+		"has-strict-mode": "^1.1.0",
+		"has-tostringtag": "^1.0.2",
+		"in-publish": "^2.0.1",
+		"iterate-iterator": "^1.0.2",
+		"jiti": "^0.0.0",
+		"make-generator-function": "^2.1.0",
+		"mock-property": "^1.1.0",
+		"npmignore": "^0.3.5",
+		"nyc": "^10.3.2",
+		"object-inspect": "^1.13.4",
+		"safe-publish-latest": "^2.0.0",
+		"tape": "^5.9.0"
+	},
+	"auto-changelog": {
+		"output": "CHANGELOG.md",
+		"template": "keepachangelog",
+		"unreleased": false,
+		"commitLimit": false,
+		"backfillLimit": false,
+		"hideCredit": true
+	},
+	"publishConfig": {
+		"ignore": [
+			".github/workflows"
+		]
+	},
+	"engines": {
+		"node": ">= 0.4"
+	}
+}
Index: frontend/node_modules/es-iterator-helpers/shim.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/shim.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,43 @@
+'use strict';
+
+var shimIterator = require('./Iterator/shim');
+var shimIteratorFrom = require('./Iterator.from/shim');
+var shimIteratorConcat = require('./Iterator.concat/shim');
+var shimZip = require('./Iterator.zip/shim');
+var shimZipKeyed = require('./Iterator.zipKeyed/shim');
+var shimIteratorProto = require('./Iterator.prototype/shim');
+var shimIteratorCtor = require('./Iterator.prototype.constructor/shim');
+var shimIteratorDrop = require('./Iterator.prototype.drop/shim');
+var shimIteratorEvery = require('./Iterator.prototype.every/shim');
+var shimIteratorFilter = require('./Iterator.prototype.filter/shim');
+var shimIteratorFind = require('./Iterator.prototype.find/shim');
+var shimIteratorFlatMap = require('./Iterator.prototype.flatMap/shim');
+var shimIteratorForEach = require('./Iterator.prototype.forEach/shim');
+var shimIncludes = require('./Iterator.prototype.includes/shim');
+var shimIteratorMap = require('./Iterator.prototype.map/shim');
+var shimIteratorReduce = require('./Iterator.prototype.reduce/shim');
+var shimIteratorSome = require('./Iterator.prototype.some/shim');
+var shimIteratorTake = require('./Iterator.prototype.take/shim');
+var shimIteratorToArray = require('./Iterator.prototype.toArray/shim');
+
+module.exports = function shimIteratorHelpers() {
+	shimIterator();
+	shimIteratorProto();
+	shimIteratorFrom();
+	shimIteratorConcat();
+	shimZip();
+	shimZipKeyed();
+	shimIteratorCtor();
+	shimIteratorDrop();
+	shimIteratorEvery();
+	shimIteratorFilter();
+	shimIteratorFind();
+	shimIteratorFlatMap();
+	shimIteratorForEach();
+	shimIncludes();
+	shimIteratorMap();
+	shimIteratorReduce();
+	shimIteratorSome();
+	shimIteratorTake();
+	shimIteratorToArray();
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.concat.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.concat.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.concat.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,718 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var mockProperty = require('mock-property');
+var hasPropertyDescriptors = require('has-property-descriptors')();
+
+var index = require('../Iterator.concat');
+var impl = require('../Iterator.concat/implementation');
+var from = require('../Iterator.from/polyfill')();
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (concat, name, t) {
+		t['throws'](
+			function () { return new concat(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor'
+		);
+		t['throws'](
+			function () { return new concat({}); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor, with an argument'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { concat(nonIterator); },
+				TypeError,
+				debug(nonIterator) + ' is not an iterable Object'
+			);
+		});
+
+		t.deepEqual(concat().next(), { value: undefined, done: true }, 'no arguments -> empty iterator');
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			forEach(v.nonFunctions, function (nonFunction) {
+				var badIterable = {};
+				badIterable[Symbol.iterator] = nonFunction;
+				st['throws'](
+					function () { concat([], badIterable, []); },
+					TypeError,
+					debug(badIterable) + '[Symbol.iterator] is not a function'
+				);
+			});
+
+			forEach(v.primitives, function (nonObject) {
+				var badIterable = {};
+				badIterable[Symbol.iterator] = function () { return nonObject; };
+				st['throws'](
+					function () { concat([], badIterable, []).next(); },
+					TypeError,
+					debug(badIterable) + '[Symbol.iterator] does not return an object'
+				);
+			});
+
+			forEach(v.strings, function (string) {
+				st['throws'](
+					function () { concat(string); },
+					TypeError,
+					'non-objects are not considered iterable'
+				);
+				var stringIt = concat(['a'], [string], ['c']);
+				testIterator(stringIt, ['a', string, 'c'], st, 'string iterator: ' + debug(string));
+			});
+
+			var arrayIt = concat([1, 2, 3]);
+			st.equal(typeof arrayIt.next, 'function', 'has a `next` function');
+
+			st.test('real iterators', { skip: !hasSymbols }, function (s2t) {
+				var iter = [1, 2][Symbol.iterator]();
+				testIterator(concat(iter, [3]), [1, 2, 3], s2t, 'array iterator + array yields combined results');
+
+				s2t.end();
+			});
+
+			st.test('observability in a replaced String iterator', function (s2t) {
+				var originalStringIterator = String.prototype[Symbol.iterator];
+				var observedType;
+				s2t.teardown(mockProperty(String.prototype, Symbol.iterator, {
+					get: function () {
+						'use strict'; // eslint-disable-line strict, lines-around-directive
+
+						observedType = typeof this;
+						return originalStringIterator;
+					}
+				}));
+
+				concat(from(''));
+				s2t.equal(observedType, 'string', 'string primitive -> primitive receiver in Symbol.iterator getter');
+				concat(from(Object('')));
+				s2t.equal(observedType, 'object', 'boxed string -> boxed string in Symbol.iterator getter');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/arguments-checked-in-order', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var getIterator = 0;
+
+				var iterable1 = {};
+				Object.defineProperty(iterable1, Symbol.iterator, {
+					get: function () {
+						getIterator += 1;
+						return function () {
+							throw new EvalError();
+						};
+					}
+				});
+
+				var iterable2 = {};
+				Object.defineProperty(iterable2, Symbol.iterator, {
+					get: function () {
+						throw new EvalError();
+					}
+				});
+
+				s2t.equal(getIterator, 0);
+
+				s2t['throws'](function () { concat(iterable1, null, iterable2); }, TypeError);
+
+				s2t.equal(getIterator, 1);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/fresh-iterator-result', function (s2t) {
+				var oldIterResult = {
+					done: false,
+					value: 123
+				};
+
+				var testIterator1 = {
+					next: function () {
+						return oldIterResult;
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return testIterator1;
+				};
+
+				var iterator = concat(iterable);
+
+				var iterResult = iterator.next();
+
+				s2t.equal(iterResult.done, false);
+				s2t.equal(iterResult.value, 123);
+
+				s2t.notEqual(iterResult, oldIterResult);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/get-iterator-method-only-once', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var iteratorGets = 0;
+				var iteratorCalls = 0;
+				var array = [1, 2, 3];
+
+				function CountingIterable() {}
+				Object.defineProperty(
+					CountingIterable.prototype,
+					Symbol.iterator,
+					{
+						get: function () {
+							iteratorGets += 1;
+
+							return function () {
+								iteratorCalls += 1;
+								return array[Symbol.iterator]();
+							};
+						}
+					}
+				);
+
+				var iterable = new CountingIterable();
+
+				s2t.equal(iteratorGets, 0);
+				s2t.equal(iteratorCalls, 0);
+
+				var iter = concat(iterable);
+
+				s2t.equal(iteratorGets, 1);
+				s2t.equal(iteratorCalls, 0);
+
+				testIterator(iter, array, s2t, 'iterating over the iterator calls the iterator function once');
+
+				s2t.equal(iteratorGets, 1);
+				s2t.equal(iteratorCalls, 1);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/get-iterator-method-throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var iterable = {};
+				Object.defineProperty(iterable, Symbol.iterator, {
+					get: function () {
+						throw new EvalError();
+					}
+				});
+
+				s2t['throws'](function () { concat(iterable); }, EvalError);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/inner-iterator-created-in-order', function (s2t) {
+				var calledIterator = [];
+
+				var iterable1 = {};
+				iterable1[Symbol.iterator] = function () {
+					calledIterator.push('iterable1');
+					return [1][Symbol.iterator]();
+				};
+
+				var iterable2 = {};
+				iterable2[Symbol.iterator] = function () {
+					calledIterator.push('iterable2');
+					return [2][Symbol.iterator]();
+				};
+
+				var iterator = concat(iterable1, iterable2);
+
+				s2t.deepEqual(calledIterator, []);
+
+				s2t.deepEqual(iterator.next(), { done: false, value: 1 });
+
+				s2t.deepEqual(calledIterator, ['iterable1']);
+
+				s2t.deepEqual(iterator.next(), { done: false, value: 2 });
+
+				s2t.deepEqual(calledIterator, ['iterable1', 'iterable2']);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/next-method-called-with-zero-arguments', function (s2t) {
+				var nextCalled = 0;
+
+				var testIterator1 = {
+					next: function () {
+						nextCalled += 1;
+						s2t.equal(arguments.length, 0);
+
+						return {
+							done: false,
+							value: 0
+						};
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return testIterator1;
+				};
+
+				var iterator = concat(iterable);
+				s2t.equal(nextCalled, 0);
+
+				iterator.next();
+				s2t.equal(nextCalled, 1);
+
+				iterator.next(1);
+				s2t.equal(nextCalled, 2);
+
+				iterator.next(1, 2);
+				s2t.equal(nextCalled, 3);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/next-method-returns-non-object', function (s2t) {
+				var nonObjectIterator = {
+					next: function () {
+						return null;
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return nonObjectIterator;
+				};
+
+				var iterator = concat(iterable);
+
+				s2t['throws'](function () { iterator.next(); }, TypeError);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/next-method-returns-throwing-done', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var result = { done: null, value: 1 };
+						Object.defineProperty(result, 'done', {
+							get: function () {
+								throw new EvalError();
+							}
+						});
+						return result;
+					},
+					'return': function () {
+						throw new Error();
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return throwingIterator;
+				};
+
+				var iterator = concat(iterable);
+
+				s2t['throws'](function () { iterator.next(); }, EvalError);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/next-method-returns-throwing-value-done', { skip: !hasPropertyDescriptors }, function (s2t) {
+				function ReturnCalledError() {}
+				function ValueGetterError() {}
+
+				var throwingIterator = {
+					next: function () {
+						var result = { value: null, done: true };
+						Object.defineProperty(result, 'value', {
+							get: function () {
+								throw new ValueGetterError();
+							}
+						});
+						return result;
+					},
+					'return': function () {
+						throw new ReturnCalledError();
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return throwingIterator;
+				};
+
+				var iterator = concat(iterable);
+
+				var iterResult = iterator.next();
+
+				s2t.equal(iterResult.done, true);
+				s2t.equal(iterResult.value, undefined);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/next-method-returns-throwing-value', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var result = { value: null, done: false };
+						Object.defineProperty(result, 'value', {
+							get: function () {
+								throw new EvalError();
+							}
+						});
+						return result;
+					},
+					'return': function () {
+						throw new Error();
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return throwingIterator;
+				};
+
+				var iterator = concat(iterable);
+
+				s2t['throws'](function () { iterator.next(); }, EvalError);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/next-method-throws', function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						throw new EvalError();
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return throwingIterator;
+				};
+
+				var iterator = concat(iterable);
+
+				s2t['throws'](function () { iterator.next(); }, EvalError);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/return-is-not-forwarded-after-exhaustion', function (s2t) {
+				var testIterator1 = {
+					next: function () {
+						return {
+							done: true,
+							value: undefined
+						};
+					},
+					'return': function () {
+						throw new EvalError();
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return testIterator1;
+				};
+
+				var iterator = concat(iterable);
+				iterator.next();
+				iterator['return']();
+
+				s2t.end();
+			});
+
+			t.test('test262: test/built-ins/Iterator/concat/return-is-not-forwarded-before-initial-start', function (s2t) {
+				var testIterator1 = {
+					next: function () {
+						return {
+							done: false,
+							value: 1
+						};
+					},
+					'return': function () {
+						throw new EvalError();
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return testIterator1;
+				};
+
+				var iterator = concat(iterable);
+				iterator['return']();
+				iterator.next();
+				iterator['return']();
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/return-method-called-with-zero-arguments', function (s2t) {
+				var returnCalled = 0;
+
+				var testIterator1 = {
+					next: function () {
+						return { done: false };
+					},
+					'return': function () {
+						returnCalled += 1;
+						s2t.equal(arguments.length, 0);
+						return { done: true };
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return testIterator1;
+				};
+
+				var iterator;
+
+				// Call with zero arguments.
+				iterator = concat(iterable);
+				iterator.next();
+				s2t.equal(returnCalled, 0);
+
+				iterator['return']();
+				s2t.equal(returnCalled, 1);
+
+				// Call with one argument.
+				iterator = concat(iterable);
+				iterator.next();
+				s2t.equal(returnCalled, 1);
+
+				iterator['return'](1);
+				s2t.equal(returnCalled, 2);
+
+				// Call with two arguments.
+				iterator = concat(iterable);
+				iterator.next();
+				s2t.equal(returnCalled, 2);
+
+				iterator['return'](1, 2);
+				s2t.equal(returnCalled, 3);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/throws-typeerror-when-generator-is-running-next', function (s2t) {
+				var enterCount = 0;
+
+				var iterator;
+
+				var testIterator1 = {
+					next: function () {
+						enterCount += 1;
+						iterator.next();
+						return { done: false };
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return testIterator1;
+				};
+
+				iterator = concat(iterable);
+
+				s2t.equal(enterCount, 0);
+
+				s2t['throws'](function () { iterator.next(); }, TypeError);
+
+				s2t.equal(enterCount, 1);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/result-is-iterator', function (s2t) {
+				var iter = concat();
+				s2t.equal(typeof iter.next, 'function', 'concat() result has next method');
+				s2t.equal(typeof iter[Symbol.iterator], 'function', 'concat() result has Symbol.iterator');
+				s2t.equal(iter[Symbol.iterator](), iter, 'concat() result Symbol.iterator returns itself');
+
+				var customIter = { next: function () { return { done: true, value: undefined }; } };
+				var iterable = {};
+				iterable[Symbol.iterator] = function () { return customIter; };
+				iter = concat(iterable);
+				s2t.equal(typeof iter.next, 'function', 'concat(iterable) result has next method');
+				s2t.equal(typeof iter[Symbol.iterator], 'function', 'concat(iterable) result has Symbol.iterator');
+				s2t.equal(iter[Symbol.iterator](), iter, 'concat(iterable) result Symbol.iterator returns itself');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/single-argument', function (s2t) {
+				var array = [1, 2, 3];
+				var iterator = concat(array);
+
+				for (var i = 0; i < array.length; i += 1) {
+					var iterResult = iterator.next();
+					s2t.equal(iterResult.done, false, 'not done at index ' + i);
+					s2t.equal(iterResult.value, array[i], 'correct value at index ' + i);
+				}
+
+				var finalResult = iterator.next();
+				s2t.equal(finalResult.done, true, 'done after all values');
+				s2t.equal(finalResult.value, undefined, 'value is undefined when done');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/many-arguments', function (s2t) {
+				var iterables = [
+					[],
+					[1],
+					[2, 3],
+					[4, 5, 6],
+					[7, 8, 9, 10]
+				];
+
+				var iterator = concat(iterables[0], iterables[1], iterables[2], iterables[3], iterables[4]);
+
+				var expected = [].concat(iterables[0], iterables[1], iterables[2], iterables[3], iterables[4]);
+
+				for (var i = 0; i < expected.length; i += 1) {
+					var iterResult = iterator.next();
+					s2t.equal(iterResult.done, false, 'not done at index ' + i);
+					s2t.equal(iterResult.value, expected[i], 'correct value at index ' + i);
+				}
+
+				var finalResult = iterator.next();
+				s2t.equal(finalResult.done, true, 'done after all values');
+				s2t.equal(finalResult.value, undefined, 'value is undefined when done');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/zero-arguments', function (s2t) {
+				var iterator = concat();
+
+				var iterResult = iterator.next();
+				s2t.equal(iterResult.done, true, 'done immediately with zero arguments');
+				s2t.equal(iterResult.value, undefined, 'value is undefined');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/return-is-forwarded', function (s2t) {
+				var returnCount = 0;
+
+				var testIterator1 = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCount += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return testIterator1;
+				};
+
+				var iterator = concat(iterable);
+
+				s2t.equal(returnCount, 0, 'return not called before next()');
+
+				iterator.next();
+
+				s2t.equal(returnCount, 0, 'return not called after next()');
+
+				iterator['return']();
+
+				s2t.equal(returnCount, 1, 'return called once after iterator.return()');
+
+				// Subsequent return() calls should not forward again
+				iterator['return']();
+
+				s2t.equal(returnCount, 1, 'return not called again on subsequent return()');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/concat/throws-typeerror-when-generator-is-running-return', function (s2t) {
+				var enterCount = 0;
+				var iterator;
+
+				var reentrantTestIterator = {
+					next: function () {
+						return { done: false };
+					},
+					'return': function () {
+						enterCount += 1;
+						iterator['return'](); // re-entrant call
+						return { done: false };
+					}
+				};
+
+				var iterable = {};
+				iterable[Symbol.iterator] = function () {
+					return reentrantTestIterator;
+				};
+
+				iterator = concat(iterable);
+
+				iterator.next();
+
+				s2t.equal(enterCount, 0, 'return not entered before calling return()');
+
+				s2t['throws'](
+					function () { iterator['return'](); },
+					TypeError,
+					'throws TypeError when generator is running during return()'
+				);
+
+				s2t.equal(enterCount, 1, 'return entered exactly once before throwing');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.concat: index', function (t) {
+			module.exports.tests(index, 'Iterator.concat', t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.concat: implementation', function (t) {
+			module.exports.tests(impl, 'Iterator.concat', t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.concat: shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.concat.name, 'concat', 'Iterator.concat has name "concat"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator, 'concat'), 'Iterator.concat is not enumerable');
+				et.end();
+			});
+
+			t.equal(Iterator.concat.length, 0, 'Iterator.concat has length 0');
+
+			module.exports.tests(callBind(Iterator.concat, Iterator), 'Iterator.concat', t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.from.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.from.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.from.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,322 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasProto = require('has-proto')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var mockProperty = require('mock-property');
+
+var index = require('../Iterator.from');
+var impl = require('../Iterator.from/implementation');
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+var $Iterator = require('../Iterator/implementation');
+var iterProto = require('iterator.prototype');
+
+var getCodePoints = function getCodePoints(str) {
+	var chars = [];
+	for (var i = 0; i < str.length; i++) {
+		var c1 = str.charCodeAt(i);
+		if (c1 >= 0xD800 && c1 < 0xDC00 && i + 1 < str.length) {
+			var c2 = str.charCodeAt(i + 1);
+			if (c2 >= 0xDC00 && c2 < 0xE000) {
+				chars.push(str.charAt(i) + str.charAt(i + 1));
+				i += 1;
+				continue; // eslint-disable-line no-continue, no-restricted-syntax
+			}
+		}
+		chars.push(str.charAt(i));
+	}
+	return chars;
+};
+
+module.exports = {
+	tests: function (from, name, t) {
+		t['throws'](
+			function () { return new from(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor'
+		);
+		t['throws'](
+			function () { return new from({}); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor, with an argument'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			if (typeof nonIterator !== 'string') {
+				t['throws'](
+					function () { from(nonIterator).next(); },
+					TypeError,
+					debug(nonIterator) + ' is not an iterable Object'
+				);
+			}
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			forEach(v.nonFunctions, function (nonFunction) {
+				var badIterable = {};
+				badIterable[Symbol.iterator] = nonFunction;
+				st['throws'](
+					function () { from(badIterable).next(); },
+					TypeError,
+					debug(badIterable) + ' is not a function'
+				);
+			});
+
+			// st['throws'](
+			// 	function () { return new from([]); }, // eslint-disable-line new-cap
+			// 	RangeError,
+			// 	'`' + name + '` iterator is not a constructor'
+			// );
+
+			forEach(v.strings, function (string) {
+				var stringIt = from(string);
+				testIterator(stringIt, getCodePoints(string), st, 'string iterator: ' + debug(string));
+			});
+
+			var arrayIt = from([1, 2, 3]);
+			st.equal(typeof arrayIt.next, 'function', 'has a `next` function');
+
+			st.test('__proto__ is Iterator.prototype', { skip: !hasProto }, function (s2t) {
+				var fakeIterator = {
+					__proto__: iterProto,
+					next: function () {}
+				};
+				s2t.ok(fakeIterator instanceof $Iterator, 'is an instanceof Iterator');
+				s2t.equal(typeof fakeIterator.next, 'function', 'fake iterator `.next` is a function');
+				s2t.equal(from(fakeIterator), fakeIterator, 'returns input when it is an instanceof Iterator');
+
+				s2t.end();
+			});
+
+			st.test('real iterators', { skip: !hasSymbols }, function (s2t) {
+				var iter = [][Symbol.iterator]();
+				// eslint-disable-next-line no-proto
+				var arrayIterHasIterProto = hasProto && iter.__proto__.__proto__ !== Object.prototype;
+				s2t.equal(
+					from(iter),
+					iter,
+					'array iterator becomes itself',
+					{ skip: !arrayIterHasIterProto && 'node 0.12 - 3 do not have Iterator.prototype in the proto chains' }
+				);
+
+				s2t.end();
+			});
+
+			st.test('observability in a replaced String iterator', function (s2t) {
+				var originalStringIterator = String.prototype[Symbol.iterator];
+				var observedType;
+				s2t.teardown(mockProperty(String.prototype, Symbol.iterator, {
+					get: function () {
+						'use strict'; // eslint-disable-line strict, lines-around-directive
+
+						observedType = typeof this;
+						return originalStringIterator;
+					}
+				}));
+
+				from('');
+				s2t.equal(observedType, 'string', 'string primitive -> primitive receiver in Symbol.iterator getter');
+				from(Object(''));
+				s2t.equal(observedType, 'object', 'boxed string -> boxed string in Symbol.iterator getter');
+
+				s2t.end();
+			});
+
+			st.test('262: get-next-method-only-once', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var nextGets = 0;
+				var testIter = {
+					next: function () {
+						return { done: true, value: undefined };
+					}
+				};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						nextGets += 1;
+						return function () {
+							return { done: true, value: undefined };
+						};
+					}
+				});
+
+				var iter = from(testIter);
+				s2t.equal(nextGets, 1, 'next retrieved once on creation');
+				iter.next();
+				s2t.equal(nextGets, 1, 'next not retrieved again on next()');
+				iter.next();
+				s2t.equal(nextGets, 1, 'next still not retrieved again');
+
+				s2t.end();
+			});
+
+			st.test('262: get-next-method-throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var testIter = {};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						throw new EvalError('next getter threw');
+					}
+				});
+
+				s2t['throws'](
+					function () { from(testIter); },
+					EvalError,
+					'throws when getting next throws'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: iterable-to-iterator-fallback', function (s2t) {
+				// When Symbol.iterator is null/undefined, treat object as iterator
+				var iteratorObj = {
+					next: function () {
+						return { done: true, value: undefined };
+					}
+				};
+				iteratorObj[Symbol.iterator] = null;
+				var iter1 = from(iteratorObj);
+				s2t.equal(typeof iter1.next, 'function', 'iterator with null Symbol.iterator is treated as iterator');
+
+				var iteratorObj2 = {
+					next: function () {
+						return { done: true, value: undefined };
+					}
+				};
+				iteratorObj2[Symbol.iterator] = undefined;
+				var iter2 = from(iteratorObj2);
+				s2t.equal(typeof iter2.next, 'function', 'iterator with undefined Symbol.iterator is treated as iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: return-is-forwarded', function (s2t) {
+				var returnCalls = 0;
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = from(testIter);
+				iter.next();
+				s2t.equal(returnCalls, 0, 'return not called before calling return()');
+				iter['return']();
+				s2t.equal(returnCalls, 1, 'return called once after return()');
+
+				s2t.end();
+			});
+
+			st.test('262: return-method-returns-iterator-result', function (s2t) {
+				// When base iterator has no return method, wrapper's return() returns { done: true, value: undefined }
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					}
+				};
+
+				var iter = from(testIter);
+				iter.next();
+				var result = iter['return']();
+				s2t.equal(result.done, true, 'done is true');
+				s2t.equal(result.value, undefined, 'value is undefined');
+
+				s2t.end();
+			});
+
+			st.test('262: get-return-method-throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					}
+				};
+				Object.defineProperty(testIter, 'return', {
+					get: function () {
+						throw new SyntaxError('return getter threw');
+					}
+				});
+
+				var iter = from(testIter);
+				iter.next();
+				s2t['throws'](
+					function () { iter['return'](); },
+					SyntaxError,
+					'throws when getting return throws'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: supports-iterator', function (s2t) {
+				// Non-iterable iterator objects (no Symbol.iterator, but has next)
+				var plainIterator = {
+					next: function () {
+						return { done: true, value: 42 };
+					}
+				};
+
+				var iter = from(plainIterator);
+				s2t.equal(typeof iter.next, 'function', 'wrapped iterator has next method');
+				var result = iter.next();
+				s2t.equal(result.done, true, 'done is true');
+				s2t.equal(result.value, 42, 'value is passed through');
+
+				s2t.end();
+			});
+
+			st.test('262: supports-iterable', function (s2t) {
+				// Iterable objects work
+				var arr = [1, 2, 3];
+				testIterator(from(arr), [1, 2, 3], s2t, 'array iterable');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.from: index', function (t) {
+			module.exports.tests(index, 'Iterator.from', t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.from: implementation', function (t) {
+			module.exports.tests(impl, 'Iterator.from', t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.from: shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.from.name, 'from', 'Iterator.from has name "from"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator, 'from'), 'Iterator.from is not enumerable');
+				et.end();
+			});
+
+			module.exports.tests(callBind(Iterator.from, Iterator), 'Iterator.from', t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,95 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var functionsHaveNames = require('functions-have-names')();
+
+var index = require('../Iterator');
+var impl = require('../Iterator/implementation');
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+module.exports = {
+	tests: function (Iter, name, t) {
+		t.equal(typeof Iter, 'function', name + ' is a function');
+
+		t['throws'](
+			function () { Iter(); }, // eslint-disable-line new-cap
+			TypeError,
+			name + ' throws when Call-ed'
+		);
+
+		t['throws'](
+			function () { return new Iter(); },
+			TypeError,
+			name + ' throws when Construct-ed'
+		);
+
+		var SubIter;
+		var SubSubIter;
+		try {
+			/* eslint no-new-func: 0 */
+			SubIter = Function('Iter', 'return class SubIter extends Iter {};')(Iter);
+			SubSubIter = Function('SubIter', 'return class SubSubIter extends SubIter {};')(SubIter);
+		} catch (e) { /**/ }
+
+		t.test('class inheritance', { skip: !SubIter }, function (st) {
+			st.doesNotThrow(
+				function () { return new SubIter(); },
+				'Extending ' + name + ' does not throw when Construct-ed'
+			);
+			st.doesNotThrow(
+				function () { return new SubSubIter(); },
+				'Extending ' + name + ' twice does not throw when Construct-ed'
+			);
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator: index', function (t) {
+			module.exports.tests(index, 'Iterator', t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator: implementation', function (t) {
+			module.exports.tests(impl, 'Iterator', t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator: shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.name, 'Iterator', 'Iterator has name "Iterator"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(global, Iterator), 'Iterator is not enumerable');
+				et.end();
+			});
+
+			t.test('prototype descriptor', { skip: !defineProperties.supportsDescriptors }, function (pt) {
+				var desc = Object.getOwnPropertyDescriptor(Iterator, 'prototype');
+				pt.deepEqual(
+					desc,
+					{
+						configurable: false,
+						enumerable: false,
+						value: Iterator.prototype,
+						writable: false
+					}
+				);
+
+				pt.end();
+			});
+
+			module.exports.tests(Iterator, 'Iterator', t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.constructor.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.constructor.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.constructor.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,57 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+
+var Index = require('../Iterator.prototype.constructor');
+var Impl = require('../Iterator.prototype.constructor/implementation');
+
+var $Iterator = require('../Iterator/polyfill')();
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+module.exports = {
+	tests: function (t, constructor, name) {
+		t.equal(constructor, $Iterator, name + ' is Iterator');
+	},
+	index: function () {
+		test('Iterator.prototype.constructor: index', function (t) {
+			t.notEqual(Index, $Iterator, 'index is not Iterator itself');
+			t.equal(typeof Index, 'function', 'index is a function');
+
+			t['throws'](
+				function () { Index(); }, // eslint-disable-line new-cap
+				TypeError,
+				'index throws when Call-ed'
+			);
+
+			t['throws'](
+				function () { return new Index(); },
+				TypeError,
+				'index throws when Construct-ed'
+			);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.constructor: implementation', function (t) {
+			t.equal(Impl, $Iterator, 'implementation is Iterator itself');
+			module.exports.tests(t, Impl, 'Iterator.prototype.constructor');
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.constructor: shimmed', function (t) {
+			module.exports.tests(t, Iterator.prototype.constructor, 'Iterator.prototype.constructor');
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, 'constructor'), 'Iterator#constructor is not enumerable');
+				et.end();
+			});
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.drop.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.drop.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.drop.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,543 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.drop');
+var impl = require('../Iterator.prototype.drop/implementation');
+
+var fnName = 'drop';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (drop, name, t) {
+		t['throws'](
+			function () { return new drop(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(drop(nonIterator, 0)); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(drop(badNext, 0)); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		t.test('observable lookups', { skip: !hasPropertyDescriptors }, function (st) {
+			var effects = [];
+
+			var obj = {};
+			Object.defineProperty(obj, 'next', {
+				configurable: true,
+				enumerable: true,
+				get: function next() {
+					effects.push('get next');
+					return function () {
+						return { done: true, value: undefined };
+					};
+				}
+			});
+			drop(obj, {
+				valueOf: function valueOf() {
+					effects.push('ToNumber limit');
+					return 0;
+				}
+			});
+
+			st.deepEqual(effects, [
+				'ToNumber limit',
+				'get next'
+			]);
+			st.end();
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+
+			st['throws'](
+				function () { drop(obj, NaN); },
+				RangeError,
+				'NaN throws RangeError'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver for NaN');
+
+			returnCalls = 0;
+			st['throws'](
+				function () { drop(obj, -1); },
+				RangeError,
+				'-1 throws RangeError'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver for negative limit');
+
+			returnCalls = 0;
+			st['throws'](
+				function () { drop(obj, { valueOf: function () { throw new SyntaxError('bad'); } }); },
+				SyntaxError,
+				'ToNumber throwing calls return'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when ToNumber throws');
+
+			st.end();
+		});
+
+		t.test('IteratorStepValue throwing does not close iterator', { skip: !hasSymbols }, function (st) {
+			var returnCalls = 0;
+			var throwOnNext = false;
+			var iter = {
+				next: function () {
+					if (throwOnNext) {
+						throw new EvalError('next threw');
+					}
+					return { done: false, value: 1 };
+				},
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			iter[Symbol.iterator] = function () { return iter; };
+
+			var dropped = drop(iter, 0);
+			dropped.next(); // consume one value
+			throwOnNext = true;
+
+			st['throws'](
+				function () { dropped.next(); },
+				EvalError,
+				'next() throwing propagates'
+			);
+			st.equal(returnCalls, 0, 'return NOT called on protocol violation');
+
+			st.end();
+		});
+
+		var arr = [1, 2, 3];
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { drop(iterator(), -3); },
+				RangeError,
+				'-3 is not >= 0'
+			);
+
+			st['throws'](
+				function () { return new drop(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new drop(iterator(), 0); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			testIterator(drop(iterator(), 0), [1, 2, 3], st, 'drop 0');
+			testIterator(drop(iterator(), 1), [2, 3], st, 'drop 1');
+			testIterator(drop(iterator(), 2), [3], st, 'drop 2');
+			testIterator(drop(iterator(), 3), [], st, 'drop 3');
+			testIterator(drop(iterator(), Infinity), [], st, 'drop ∞');
+
+			st.test('262: limit-tonumber', function (s2t) {
+				// ToNumber coercion
+				testIterator(drop(iterator(), '1'), [2, 3], s2t, 'string "1" coerced to 1');
+				testIterator(drop(iterator(), 1.9), [2, 3], s2t, '1.9 truncated to 1');
+				testIterator(drop(iterator(), { valueOf: function () { return 1; } }), [2, 3], s2t, 'object with valueOf');
+				testIterator(drop(iterator(), true), [2, 3], s2t, 'true coerced to 1');
+				testIterator(drop(iterator(), null), [1, 2, 3], s2t, 'null coerced to 0');
+
+				s2t.end();
+			});
+
+			st.test('262: limit-tonumber-throws', function (s2t) {
+				s2t['throws'](
+					function () { drop(iterator(), { valueOf: function () { throw new EvalError('valueOf threw'); } }); },
+					EvalError,
+					'throws when valueOf throws'
+				);
+
+				s2t['throws'](
+					function () { drop(iterator(), Symbol('test')); },
+					TypeError,
+					'throws when limit is a Symbol'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: limit-rangeerror', function (s2t) {
+				s2t['throws'](function () { drop(iterator(), -1); }, RangeError, '-1 throws RangeError');
+				s2t['throws'](function () { drop(iterator(), -Infinity); }, RangeError, '-Infinity throws RangeError');
+				s2t['throws'](function () { drop(iterator(), NaN); }, RangeError, 'NaN throws RangeError');
+
+				s2t.end();
+			});
+
+			st.test('262: result is iterator', function (s2t) {
+				var iter = drop(iterator(), 1);
+				s2t.equal(typeof iter.next, 'function', 'has next method');
+				s2t.equal(typeof iter[Symbol.iterator], 'function', 'has Symbol.iterator method');
+				s2t.equal(iter[Symbol.iterator](), iter, 'Symbol.iterator returns itself');
+
+				s2t.end();
+			});
+
+			st.test('262: get next method only once', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var nextGets = 0;
+				var testIter = {};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						nextGets += 1;
+						return function () {
+							return { done: true, value: undefined };
+						};
+					}
+				});
+
+				var iter = drop(testIter, 1);
+				s2t.equal(nextGets, 1, 'next retrieved once on creation');
+				iter.next();
+				s2t.equal(nextGets, 1, 'next not retrieved again');
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns non-object throws', function (s2t) {
+				var badIterator = {
+					next: function () {
+						return null;
+					}
+				};
+
+				var iter = drop(badIterator, 1);
+				s2t['throws'](function () { iter.next(); }, TypeError, 'throws when next returns null');
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns throwing done', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var result = { value: 1 };
+						Object.defineProperty(result, 'done', {
+							get: function () {
+								throw new EvalError('done getter threw');
+							}
+						});
+						return result;
+					}
+				};
+
+				var iter = drop(throwingIterator, 1);
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws when done getter throws');
+
+				s2t.end();
+			});
+
+			st.test('262: next method throws', function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						throw new EvalError('next threw');
+					}
+				};
+
+				var iter = drop(throwingIterator, 1);
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws error from next');
+
+				s2t.end();
+			});
+
+			st.test('262: throws TypeError when generator is running', function (s2t) {
+				var reentrantIterator;
+				var testIter = {
+					next: function () {
+						reentrantIterator.next();
+						return { done: false, value: 1 };
+					}
+				};
+
+				reentrantIterator = drop(testIter, 0);
+				s2t['throws'](function () { reentrantIterator.next(); }, TypeError, 'throws on reentrant next()');
+
+				s2t.end();
+			});
+
+			st.test('262: limit-equals-total', function (s2t) {
+				testIterator(drop(iterator(), 3), [], s2t, 'drop exactly 3 from 3-item iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: limit-greater-than-total', function (s2t) {
+				testIterator(drop(iterator(), 5), [], s2t, 'drop 5 from 3-item iterator');
+				testIterator(drop(iterator(), 100), [], s2t, 'drop 100 from 3-item iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: limit-less-than-total', function (s2t) {
+				testIterator(drop(iterator(), 1), [2, 3], s2t, 'drop 1 from 3-item iterator');
+				testIterator(drop(iterator(), 2), [3], s2t, 'drop 2 from 3-item iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: exhaustion does not call return', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: true, value: undefined };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = drop(testIter, 1);
+				iter.next();
+				s2t.equal(returnCalls, 0, 'return not called on exhaustion');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/drop/get-return-method-throws', { skip: !hasPropertyDescriptors }, function (st) {
+			var badIterator = {
+				next: function next() {
+					return {
+						done: false,
+						value: 1
+					};
+				}
+			};
+
+			Object.defineProperty(badIterator, 'return', {
+				configurable: true,
+				enumerable: true,
+				get: function () { throw new SyntaxError(); }
+			});
+
+			var iter = drop(badIterator, 1);
+			iter.next();
+
+			st['throws'](
+				function () { iter['return'](); },
+				SyntaxError,
+				'gets the `return` method, whose getter throws'
+			);
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/drop/return-is-forwarded', function (st) {
+			var returnCount = 0;
+
+			var makeBadIterator = function makeBadIterator() {
+				return {
+					next: function next() {
+						return {
+							done: false,
+							value: 1
+						};
+					},
+					'return': function () {
+						returnCount += 1;
+						return {};
+					}
+				};
+			};
+
+			var iter1 = drop(makeBadIterator(), 0);
+			st.equal(returnCount, 0, 'iter1, before return()');
+			iter1['return']();
+			st.equal(returnCount, 1, 'iter1, after return()'); // TODO
+
+			var iter2 = drop(makeBadIterator(), 1);
+			st.equal(returnCount, 1, 'iter2, before return()'); // TODO
+			iter2['return']();
+			st.equal(returnCount, 2, 'iter2, after return()'); // TODO
+
+			// 5 drops (i wish i had pipeline)
+			var iter3 = drop(
+				drop(
+					drop(
+						drop(
+							drop(
+								makeBadIterator(),
+								1
+							),
+							1
+						),
+						1
+					),
+					1
+				),
+				1
+			);
+			st.equal(returnCount, 2, 'iter3, before return()'); // TODO
+			iter3['return']();
+			st.equal(returnCount, 3, 'iter3, after return()'); // TODO
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/drop/return-is-not-forwarded-after-exhaustion', { skip: !hasPropertyDescriptors }, function (st) {
+			var makeBadIterator = function makeBadIterator() {
+				return {
+					next: function next() {
+						return {
+							done: true,
+							value: undefined
+						};
+					},
+					'return': function () {
+						throw new SyntaxError();
+					}
+				};
+			};
+
+			var iter1 = drop(makeBadIterator(), 0); // TODO
+			st['throws'](
+				function () { iter1['return'](); },
+				SyntaxError,
+				'iter1, return() throws'
+			);
+			iter1.next();
+			iter1['return']();
+
+			var iter2 = drop(makeBadIterator(), 1);
+			st['throws'](
+				function () { iter2['return'](); },
+				SyntaxError,
+				'iter2, return() throws'
+			);
+			iter2.next();
+			iter2['return']();
+
+			// 5 drops (i wish i had pipeline)
+			var iter3 = drop(
+				drop(
+					drop(
+						drop(
+							drop(
+								makeBadIterator(),
+								1
+							),
+							1
+						),
+						1
+					),
+					1
+				),
+				1
+			);
+			st['throws'](
+				function () { iter3['return'](); },
+				SyntaxError,
+				'iter3, return() throws'
+			);
+			iter3.next();
+			iter3['return']();
+
+			var iter4 = drop(makeBadIterator(), 10);
+			st['throws'](
+				function () { iter4['return'](); },
+				SyntaxError,
+				'iter4, return() throws'
+			);
+			iter4.next();
+			iter4['return']();
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, NaN); },
+					RangeError,
+					'polyfill throws RangeError for NaN limit'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.every.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.every.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.every.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,325 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.every');
+var impl = require('../Iterator.prototype.every/implementation');
+
+var fnName = 'every';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (every, name, t) {
+		t['throws'](
+			function () { return new every(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(every(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(every(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { every({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { every(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable predicate'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		t.test('observable lookups', { skip: !hasPropertyDescriptors }, function (st) {
+			var effects = [];
+
+			var obj = {};
+			Object.defineProperty(obj, 'next', {
+				configurable: true,
+				enumerable: true,
+				get: function next() {
+					effects.push('get next');
+					return function () {
+						return { done: true, value: undefined };
+					};
+				}
+			});
+
+			st['throws'](
+				function () { every(obj, null); },
+				TypeError
+			);
+
+			st.deepEqual(effects, []);
+
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new every(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new every(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			st.equal(every(iterator(), function () { return false; }), false, 'every for always-false');
+			st.equal(every(iterator(), function () { return true; }), true, 'every for always-true');
+			st.equal(every(iterator(), function (x, i) { return x === 2 && i === 1; }), false, 'every returns false for matching value/index');
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/predicate-args', function (s2t) {
+				var assertionCount = 0;
+				var result = every(
+					['a', 'b', 'c'][Symbol.iterator](),
+					function (value, count) {
+						if (value === 'a') {
+							s2t.equal(count, 0);
+						} else if (value === 'b') {
+							s2t.equal(count, 1);
+						} else if (value === 'c') {
+							s2t.equal(count, 2);
+						} else {
+							s2t.fail('unexpected value');
+						}
+						assertionCount += 1;
+						return true;
+					}
+				);
+				s2t.equal(result, true, 'every returns true when all pass');
+				s2t.equal(assertionCount, 3, 'predicate called three times');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/predicate-this', function (s2t) {
+				var expectedThis = (function () { return this; }());
+				var assertionCount = 0;
+				var result = every(
+					[0][Symbol.iterator](),
+					function () {
+						s2t.equal(this, expectedThis, 'predicate this is undefined');
+						assertionCount += 1;
+						return true;
+					}
+				);
+				s2t.equal(result, true);
+				s2t.equal(assertionCount, 1);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/predicate-returns-truthy', function (s2t) {
+				var result = every(
+					[0, 1, 2, 3, 4][Symbol.iterator](),
+					function () { return true; }
+				);
+				s2t.equal(result, true, 'every returns true when predicate always returns truthy');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/predicate-returns-falsey', function (s2t) {
+				var result = every(
+					[0, 1, 2, 3, 4][Symbol.iterator](),
+					function () { return false; }
+				);
+				s2t.equal(result, false, 'every returns false when predicate returns falsey');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/predicate-returns-truthy-then-falsey', function (s2t) {
+				var callCount = 0;
+				var returnCalled = false;
+				var values = [0, 1, 2, 3, 4];
+				var idx = 0;
+				var iter = {
+					next: function () {
+						if (idx < values.length) {
+							var val = values[idx];
+							idx += 1;
+							return { done: false, value: val };
+						}
+						return { done: true, value: undefined };
+					},
+					'return': function () {
+						returnCalled = true;
+						return { done: true, value: undefined };
+					}
+				};
+				var result = every(
+					iter,
+					function (value) {
+						callCount += 1;
+						return value < 3;
+					}
+				);
+				s2t.equal(result, false, 'every returns false when predicate returns falsey');
+				s2t.equal(callCount, 4, 'predicate called until falsey returned');
+				s2t.equal(returnCalled, true, 'iterator is closed');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/predicate-returns-non-boolean', function (s2t) {
+				// truthy non-boolean values
+				s2t.equal(every([1][Symbol.iterator](), function () { return 1; }), true, 'truthy number');
+				s2t.equal(every([1][Symbol.iterator](), function () { return 'yes'; }), true, 'truthy string');
+				s2t.equal(every([1][Symbol.iterator](), function () { return {}; }), true, 'truthy object');
+
+				// falsy non-boolean values
+				s2t.equal(every([1][Symbol.iterator](), function () { return 0; }), false, 'falsy number');
+				s2t.equal(every([1][Symbol.iterator](), function () { return ''; }), false, 'falsy string');
+				s2t.equal(every([1][Symbol.iterator](), function () { return null; }), false, 'null');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/predicate-throws', function (s2t) {
+				var returnCount = 0;
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCount += 1;
+						return { done: true };
+					}
+				};
+
+				var callbackCount = 0;
+				s2t['throws'](
+					function () {
+						every(testIter, function () {
+							callbackCount += 1;
+							throw new SyntaxError('predicate threw');
+						});
+					},
+					SyntaxError
+				);
+				s2t.equal(callbackCount, 1, 'predicate called once');
+				s2t.equal(returnCount, 1, 'iterator closed when predicate throws');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/every/iterator-already-exhausted', function (s2t) {
+				var iter = [][Symbol.iterator]();
+				var callbackCount = 0;
+				var result = every(iter, function () {
+					callbackCount += 1;
+					return true;
+				});
+				s2t.equal(result, true, 'every returns true for empty iterator');
+				s2t.equal(callbackCount, 0, 'predicate not called');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.filter.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.filter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.filter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,648 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.filter');
+var impl = require('../Iterator.prototype.filter/implementation');
+
+var fnName = 'filter';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (filter, name, t) {
+		t['throws'](
+			function () { return new filter(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(filter(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(filter(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { filter({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { filter(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable predicate'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		t.test('observable lookups', { skip: !hasPropertyDescriptors }, function (st) {
+			var effects = [];
+
+			var obj = {};
+			Object.defineProperty(obj, 'next', {
+				configurable: true,
+				enumerable: true,
+				get: function next() {
+					effects.push('get next');
+					return function () {
+						return { done: true, value: undefined };
+					};
+				}
+			});
+
+			st['throws'](
+				function () { filter(obj, null); },
+				TypeError
+			);
+
+			st.deepEqual(effects, []);
+
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new filter(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new filter(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			testIterator(filter(iterator(), function () { return false; }), [], st, 'filter for always-false');
+			testIterator(filter(iterator(), function () { return true; }), [1, 2, 3], st, 'filter for always-true');
+			testIterator(filter(iterator(), function (x, i) { return x === 2 && i === 1; }), [2], st, 'filter returns value for matching value/index');
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/filter/predicate-args', function (st) {
+			var g = function g() {
+				var arr = ['a', 'b', 'c'];
+				var i = 0;
+				return {
+					next: function () {
+						try {
+							return {
+								value: arr[i],
+								done: i >= arr.length
+							};
+						} finally {
+							i += 1;
+						}
+					}
+				};
+			};
+			var assertionCount = 0;
+			var iter = filter(
+				g(),
+				function (value, count) {
+					if (value === 'a') {
+						st.equal(count, 0, 'first iteration');
+					} else if (value === 'b') {
+						st.equal(count, 1, 'second iteration');
+					} else if (value === 'c') {
+						st.equal(count, 2, 'third iteration');
+					} else {
+						st.fail('unexpected iteration');
+					}
+					assertionCount += 1;
+					return true;
+				}
+			);
+
+			st.equal(assertionCount, 0, 'prior to iteration');
+
+			testIterator(iter, ['a', 'b', 'c'], st, 'iteration');
+
+			st.equal(assertionCount, 3);
+
+			st.end();
+		});
+
+		t.test('counter increments correctly with mixed matches', { skip: !hasSymbols }, function (st) {
+			var counters = [];
+			var iter = filter(
+				[1, 2, 3, 4, 5][Symbol.iterator](),
+				function (value, count) {
+					counters.push(count);
+					return value % 2 === 1; // only odd values match
+				}
+			);
+
+			// 1 matches (count=0), 2 skipped (count=1), 3 matches (count=2)
+			st.deepEqual(iter.next(), { value: 1, done: false }, 'first match');
+			st.deepEqual(counters, [0], 'predicate called once so far');
+
+			st.deepEqual(iter.next(), { value: 3, done: false }, 'second match');
+			// predicate was called for 2 (count=1, no match) and 3 (count=2, match)
+			st.deepEqual(counters, [0, 1, 2], 'counter increments for every call');
+
+			st.deepEqual(iter.next(), { value: 5, done: false }, 'third match');
+			st.deepEqual(counters, [0, 1, 2, 3, 4], 'counter continues incrementing');
+
+			st.end();
+		});
+
+		t.test('counter not incremented after return while suspended', { skip: !hasSymbols }, function (st) {
+			var counters = [];
+			var returnCalled = false;
+			var underlying = {
+				next: function () {
+					return { value: 1, done: false };
+				},
+				'return': function () {
+					returnCalled = true;
+					return { done: true };
+				}
+			};
+			underlying[Symbol.iterator] = function () { return underlying; };
+
+			var iter = filter(underlying, function (value, count) {
+				counters.push(count);
+				return true;
+			});
+
+			iter.next(); // predicate called with count=0, matches, Yield suspends
+			st.deepEqual(counters, [0], 'predicate called with 0');
+
+			// call return while suspended - counter should NOT have incremented yet
+			iter['return']();
+			st.equal(returnCalled, true, 'underlying return called');
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/filter/predicate-throws', function (st) {
+			var returnCalls = 0;
+
+			var iter = {
+				next: function () {
+					return {
+						done: false,
+						value: 1
+					};
+				},
+				'return': function () {
+					returnCalls += 1;
+					return {};
+				}
+			};
+
+			var callbackCalls = 0;
+			var iterator = filter(iter, function () {
+				callbackCalls += 1;
+				throw new SyntaxError();
+			});
+
+			st['throws'](function () { iterator.next(); }, SyntaxError, 'next() throws');
+
+			st.equal(callbackCalls, 1);
+			st.equal(returnCalls, 1);
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/filter/predicate-throws-then-closing-iterator-also-throws', function (st) {
+			var iter = {
+				next: function next() {
+					return {
+						done: false,
+						value: 1
+					};
+				},
+				'return': function () {
+					throw new EvalError();
+				}
+			};
+
+			var iterator = filter(iter, function () {
+				throw new SyntaxError();
+			});
+
+			st['throws'](
+				function () { iterator.next(); },
+				SyntaxError,
+				'when the predicate and return() both throw, the predicate’s exception wins'
+			);
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/filter/get-return-method-throws', { skip: !hasPropertyDescriptors }, function (st) {
+			var badIterator = {
+				next: function next() {
+					return {
+						done: false,
+						value: 1
+					};
+				}
+			};
+
+			Object.defineProperty(badIterator, 'return', { get: function () { throw new SyntaxError(); } });
+
+			var iter = filter(badIterator, function () { return true; });
+			iter.next();
+
+			st['throws'](
+				function () { iter['return'](); },
+				SyntaxError,
+				'gets the `return` method, whose getter throws'
+			);
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/drop/return-is-forwarded', function (st) {
+			var returnCount = 0;
+
+			var badIterator = {
+				next: function next() {
+					return {
+						done: false,
+						value: 1
+					};
+				},
+				'return': function () {
+					returnCount += 1;
+					return {};
+				}
+			};
+
+			var iter1 = filter(badIterator, function () { return false; });
+			st.equal(returnCount, 0, 'iter1, before return()');
+			iter1['return']();
+			st.equal(returnCount, 1, 'iter1, after return()');
+
+			st.end();
+		});
+
+		t.test('262: test/built-ins/Iterator/prototype/drop/return-is-not-forwarded-after-exhaustion', { skip: !hasPropertyDescriptors }, function (st) {
+			var makeBadIterator = function makeBadIterator() {
+				return {
+					next: function next() {
+						return {
+							done: true,
+							value: undefined
+						};
+					},
+					'return': function () {
+						throw new SyntaxError();
+					}
+				};
+			};
+
+			var iter1 = filter(makeBadIterator(), function () { return true; });
+			st['throws'](
+				function () { iter1['return'](); },
+				SyntaxError,
+				'iter1, return() throws'
+			);
+			iter1.next();
+			iter1['return']();
+
+			// 3 filters (i wish i had pipeline)
+			var iter2 = filter(
+				filter(
+					filter(
+						makeBadIterator(),
+						function () { return true; }
+					),
+					function () { return true; }
+				),
+				function () { return true; }
+			);
+			st['throws']( // TODO
+				function () { iter2['return'](); },
+				SyntaxError,
+				'iter2, return() throws'
+			);
+			iter2.next();
+			iter2['return']();
+
+			st.end();
+		});
+
+		t.test('262: predicate-this', { skip: !hasSymbols }, function (st) {
+			var thisValue;
+			var iter = filter(
+				[1][Symbol.iterator](),
+				function () {
+					thisValue = this;
+					return true;
+				}
+			);
+			iter.next();
+			st.equal(thisValue, undefined, 'predicate this is undefined');
+
+			st.end();
+		});
+
+		t.test('262: predicate-returns-non-boolean', { skip: !hasSymbols }, function (st) {
+			// truthy non-boolean values should pass
+			testIterator(
+				filter([1, 2, 3][Symbol.iterator](), function () { return 1; }),
+				[1, 2, 3],
+				st,
+				'truthy number passes'
+			);
+			testIterator(
+				filter([1, 2, 3][Symbol.iterator](), function () { return 'yes'; }),
+				[1, 2, 3],
+				st,
+				'truthy string passes'
+			);
+			testIterator(
+				filter([1, 2, 3][Symbol.iterator](), function () { return {}; }),
+				[1, 2, 3],
+				st,
+				'truthy object passes'
+			);
+
+			// falsy non-boolean values should fail
+			testIterator(
+				filter([1, 2, 3][Symbol.iterator](), function () { return 0; }),
+				[],
+				st,
+				'falsy number fails'
+			);
+			testIterator(
+				filter([1, 2, 3][Symbol.iterator](), function () { return ''; }),
+				[],
+				st,
+				'falsy string fails'
+			);
+			testIterator(
+				filter([1, 2, 3][Symbol.iterator](), function () { return null; }),
+				[],
+				st,
+				'null fails'
+			);
+
+			st.end();
+		});
+
+		t.test('262: result is iterator', { skip: !hasSymbols }, function (st) {
+			var iterator = filter([1, 2][Symbol.iterator](), function () { return true; });
+			st.equal(typeof iterator.next, 'function', 'has next method');
+			st.equal(typeof iterator[Symbol.iterator], 'function', 'has Symbol.iterator method');
+			st.equal(iterator[Symbol.iterator](), iterator, 'Symbol.iterator returns itself');
+
+			st.end();
+		});
+
+		t.test('262: get next method only once', { skip: !hasPropertyDescriptors }, function (st) {
+			var nextGets = 0;
+			var testIter = {};
+			Object.defineProperty(testIter, 'next', {
+				get: function () {
+					nextGets += 1;
+					return function () {
+						return { done: true, value: undefined };
+					};
+				}
+			});
+
+			var iter = filter(testIter, function () { return true; });
+			st.equal(nextGets, 1, 'next retrieved once on creation');
+			iter.next();
+			st.equal(nextGets, 1, 'next not retrieved again');
+
+			st.end();
+		});
+
+		t.test('262: get next method throws', { skip: !hasPropertyDescriptors }, function (st) {
+			var testIter = {};
+			Object.defineProperty(testIter, 'next', {
+				get: function () {
+					throw new EvalError('next getter threw');
+				}
+			});
+
+			st['throws'](
+				function () { filter(testIter, function () { return true; }); },
+				EvalError,
+				'throws when getting next throws'
+			);
+
+			st.end();
+		});
+
+		t.test('262: next method returns non-object throws', function (st) {
+			var badIterator = {
+				next: function () {
+					return null;
+				}
+			};
+
+			var iter = filter(badIterator, function () { return true; });
+			st['throws'](function () { iter.next(); }, TypeError, 'throws when next returns null');
+
+			st.end();
+		});
+
+		t.test('262: next method returns throwing done', { skip: !hasPropertyDescriptors }, function (st) {
+			var throwingIterator = {
+				next: function () {
+					var result = { value: 1 };
+					Object.defineProperty(result, 'done', {
+						get: function () {
+							throw new EvalError('done getter threw');
+						}
+					});
+					return result;
+				}
+			};
+
+			var iter = filter(throwingIterator, function () { return true; });
+			st['throws'](function () { iter.next(); }, EvalError, 'throws when done getter throws');
+
+			st.end();
+		});
+
+		t.test('262: next method returns throwing value', { skip: !hasPropertyDescriptors }, function (st) {
+			var throwingIterator = {
+				next: function () {
+					var result = { done: false };
+					Object.defineProperty(result, 'value', {
+						get: function () {
+							throw new EvalError('value getter threw');
+						}
+					});
+					return result;
+				}
+			};
+
+			var iter = filter(throwingIterator, function () { return true; });
+			st['throws'](function () { iter.next(); }, EvalError, 'throws when value getter throws');
+
+			st.end();
+		});
+
+		t.test('262: next method throws', function (st) {
+			var throwingIterator = {
+				next: function () {
+					throw new EvalError('next threw');
+				}
+			};
+
+			var iter = filter(throwingIterator, function () { return true; });
+			st['throws'](function () { iter.next(); }, EvalError, 'throws error from next');
+
+			st.end();
+		});
+
+		t.test('262: iterator already exhausted', function (st) {
+			var testIter = {
+				next: function () {
+					return { done: true, value: undefined };
+				}
+			};
+
+			var predicateCalls = 0;
+			var iter = filter(testIter, function () {
+				predicateCalls += 1;
+				return true;
+			});
+
+			var result = iter.next();
+			st.equal(result.done, true, 'done is true');
+			st.equal(result.value, undefined, 'value is undefined');
+			st.equal(predicateCalls, 0, 'predicate not called for exhausted iterator');
+
+			st.end();
+		});
+
+		t.test('262: throws TypeError when generator is running', function (st) {
+			var reentrantIterator;
+			var testIter = {
+				next: function () {
+					reentrantIterator.next();
+					return { done: false, value: 1 };
+				}
+			};
+
+			reentrantIterator = filter(testIter, function () { return true; });
+			st['throws'](function () { reentrantIterator.next(); }, TypeError, 'throws on reentrant next()');
+
+			st.end();
+		});
+
+		t.test('262: exhaustion does not call return', function (st) {
+			var returnCalls = 0;
+
+			var testIter = {
+				next: function () {
+					return { done: true, value: undefined };
+				},
+				'return': function () {
+					returnCalls += 1;
+					return { done: true, value: undefined };
+				}
+			};
+
+			var iter = filter(testIter, function () { return true; });
+			iter.next();
+			st.equal(returnCalls, 0, 'return not called on exhaustion');
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.find.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.find.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.find.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,322 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.find');
+var impl = require('../Iterator.prototype.find/implementation');
+
+var fnName = 'find';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (find, name, t) {
+		t['throws'](
+			function () { return new find(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(find(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(find(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { find({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { find(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable predicate'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new find(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new find(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			st.equal(find(iterator(), function () { return false; }), undefined, 'find for always-false');
+			st.equal(find(iterator(), function () { return true; }), 1, 'find for always-true');
+			st.equal(find(iterator(), function (x, i) { return x === 2 && i === 1; }), 2, 'find returns value for matching value/index');
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/predicate-args', function (s2t) {
+				var assertionCount = 0;
+				var result = find(
+					['a', 'b', 'c'][Symbol.iterator](),
+					function (value, count) {
+						if (value === 'a') {
+							s2t.equal(count, 0);
+						} else if (value === 'b') {
+							s2t.equal(count, 1);
+						} else if (value === 'c') {
+							s2t.equal(count, 2);
+						} else {
+							s2t.fail('unexpected value');
+						}
+						assertionCount += 1;
+						return false;
+					}
+				);
+				s2t.equal(result, undefined, 'find returns undefined when none match');
+				s2t.equal(assertionCount, 3, 'predicate called three times');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/predicate-this', function (s2t) {
+				var expectedThis = (function () { return this; }());
+				var assertionCount = 0;
+				var result = find(
+					[0][Symbol.iterator](),
+					function () {
+						s2t.equal(this, expectedThis, 'predicate this is undefined');
+						assertionCount += 1;
+						return true;
+					}
+				);
+				s2t.equal(result, 0);
+				s2t.equal(assertionCount, 1);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/predicate-returns-truthy', function (s2t) {
+				var callCount = 0;
+				var returnCalled = false;
+				var values = [0, 1, 2];
+				var idx = 0;
+				var iter = {
+					next: function () {
+						if (idx < values.length) {
+							var val = values[idx];
+							idx += 1;
+							return { done: false, value: val };
+						}
+						return { done: true, value: undefined };
+					},
+					'return': function () {
+						returnCalled = true;
+						return { done: true, value: undefined };
+					}
+				};
+				var result = find(
+					iter,
+					function () {
+						callCount += 1;
+						return true;
+					}
+				);
+				s2t.equal(result, 0, 'find returns first value when predicate returns truthy');
+				s2t.equal(callCount, 1, 'predicate called once');
+				s2t.equal(returnCalled, true, 'iterator is closed');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/predicate-returns-falsey', function (s2t) {
+				var result = find(
+					[0, 1, 2, 3, 4][Symbol.iterator](),
+					function () { return false; }
+				);
+				s2t.equal(result, undefined, 'find returns undefined when predicate always returns falsey');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/predicate-returns-falsey-then-truthy', function (s2t) {
+				var callCount = 0;
+				var returnCalled = false;
+				var values = [0, 1, 2, 3, 4];
+				var idx = 0;
+				var iter = {
+					next: function () {
+						if (idx < values.length) {
+							var val = values[idx];
+							idx += 1;
+							return { done: false, value: val };
+						}
+						return { done: true, value: undefined };
+					},
+					'return': function () {
+						returnCalled = true;
+						return { done: true, value: undefined };
+					}
+				};
+				var result = find(
+					iter,
+					function (value) {
+						callCount += 1;
+						return value >= 3;
+					}
+				);
+				s2t.equal(result, 3, 'find returns matching value');
+				s2t.equal(callCount, 4, 'predicate called until truthy returned');
+				s2t.equal(returnCalled, true, 'iterator is closed');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/predicate-returns-non-boolean', function (s2t) {
+				// truthy non-boolean values find the first element
+				s2t.equal(find([1, 2][Symbol.iterator](), function () { return 1; }), 1, 'truthy number');
+				s2t.equal(find([1, 2][Symbol.iterator](), function () { return 'yes'; }), 1, 'truthy string');
+				s2t.equal(find([1, 2][Symbol.iterator](), function () { return {}; }), 1, 'truthy object');
+
+				// falsy non-boolean values return undefined
+				s2t.equal(find([1][Symbol.iterator](), function () { return 0; }), undefined, 'falsy number');
+				s2t.equal(find([1][Symbol.iterator](), function () { return ''; }), undefined, 'falsy string');
+				s2t.equal(find([1][Symbol.iterator](), function () { return null; }), undefined, 'null');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/predicate-throws', function (s2t) {
+				var returnCount = 0;
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCount += 1;
+						return { done: true };
+					}
+				};
+
+				var callbackCount = 0;
+				s2t['throws'](
+					function () {
+						find(testIter, function () {
+							callbackCount += 1;
+							throw new SyntaxError('predicate threw');
+						});
+					},
+					SyntaxError
+				);
+				s2t.equal(callbackCount, 1, 'predicate called once');
+				s2t.equal(returnCount, 1, 'iterator closed when predicate throws');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/find/iterator-already-exhausted', function (s2t) {
+				var iter = [][Symbol.iterator]();
+				var callbackCount = 0;
+				var result = find(iter, function () {
+					callbackCount += 1;
+					return true;
+				});
+				s2t.equal(result, undefined, 'find returns undefined for empty iterator');
+				s2t.equal(callbackCount, 0, 'predicate not called');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.flatMap.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.flatMap.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.flatMap.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,346 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var iterate = require('iterate-iterator');
+
+var StringToCodePoints = require('es-abstract/2025/StringToCodePoints');
+
+var index = require('../Iterator.prototype.flatMap');
+var impl = require('../Iterator.prototype.flatMap/implementation');
+
+var fnName = 'flatMap';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (flatMap, name, t) {
+		t['throws'](
+			function () { return new flatMap(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(flatMap(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(flatMap(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { flatMap({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { flatMap(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable mapper'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		t.test('inner close error propagates via backup completion', { skip: !hasSymbols }, function (st) {
+			var outerReturnCalls = 0;
+
+			var outerIter = {
+				next: function () {
+					return { done: false, value: [1] };
+				},
+				'return': function () {
+					outerReturnCalls += 1;
+					return { done: true };
+				}
+			};
+
+			var iter = flatMap(outerIter, function (x) { return x; });
+			iter.next(); // get inner iterator going
+
+			// When we call return(), it should close inner, then close outer
+			// The inner iterator's return will throw
+			// We need an inner iterator that throws on close
+			// This is tested indirectly - the closeIfAbrupt path
+			st.equal(outerReturnCalls, 0, 'outer return not called yet');
+			iter['return']();
+			st.equal(outerReturnCalls, 1, 'outer return called');
+
+			st.end();
+		});
+
+		t.test('inner IteratorStepValue throwing closes outer but not inner', { skip: !hasSymbols }, function (st) {
+			var outerReturnCalls = 0;
+			var innerReturnCalls = 0;
+			var throwOnInnerNext = false;
+
+			var outerIter = {
+				next: function () {
+					return { done: false, value: 'x' };
+				},
+				'return': function () {
+					outerReturnCalls += 1;
+					return { done: true };
+				}
+			};
+			outerIter[Symbol.iterator] = function () { return outerIter; };
+
+			var innerIter = {
+				next: function () {
+					if (throwOnInnerNext) {
+						throw new EvalError('inner next threw');
+					}
+					return { done: false, value: 1 };
+				},
+				'return': function () {
+					innerReturnCalls += 1;
+					return { done: true };
+				}
+			};
+			innerIter[Symbol.iterator] = function () { return innerIter; };
+
+			var iter = flatMap(outerIter, function () { return innerIter; });
+			iter.next(); // get inner iterator going
+			throwOnInnerNext = true;
+
+			st['throws'](
+				function () { iter.next(); },
+				EvalError,
+				'inner next() throwing propagates'
+			);
+			st.equal(innerReturnCalls, 0, 'inner return NOT called (protocol violation)');
+			st.equal(outerReturnCalls, 1, 'outer return called (stopping early)');
+
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new flatMap(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new flatMap(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+
+			var nonIterableFlatMap = flatMap(iterator(), function (x) { return x; });
+			st['throws'](
+				function () { nonIterableFlatMap.next(); },
+				TypeError,
+				'non-iterable return value throws'
+			);
+
+			forEach(v.strings, function (string) {
+				st['throws'](
+					function () { flatMap(iterator(), function () { return string; }).next(); },
+					TypeError,
+					'non-object return value throws even if iterable (' + debug(string) + ')'
+				);
+
+				testIterator(
+					flatMap(iterator(), function () { return Object(string); }),
+					[].concat(StringToCodePoints(string), StringToCodePoints(string), StringToCodePoints(string)),
+					st,
+					'boxed string (' + debug(string) + ')'
+				);
+			});
+
+			testIterator(flatMap(iterator(), function (x) { return [x][Symbol.iterator](); }), [1, 2, 3], st, 'identity mapper in array iterator');
+			testIterator(flatMap(iterator(), function (x) { return [2 * x][Symbol.iterator](); }), [2, 4, 6], st, 'doubler mapper in array iterator');
+
+			testIterator(flatMap(iterator(), function () { return []; }), [], st, 'empty mapper in nested array iterator');
+			testIterator(flatMap(iterator(), function (x) { return [[x, x + 1]][Symbol.iterator](); }), [[1, 2], [2, 3], [3, 4]], st, 'identity mapper in nested array iterator');
+			testIterator(flatMap(iterator(), function (x) { return [[2 * x, 2 * (x + 1)]][Symbol.iterator](); }), [[2, 4], [4, 6], [6, 8]], st, 'doubler mapper in nested array iterator');
+
+			testIterator(flatMap([0, 1, 2, 3][Symbol.iterator](), function (value) {
+				var result = [];
+				for (var i = 0; i < value; ++i) {
+					result.push(value);
+				}
+				return result;
+			}), [1, 2, 2, 3, 3, 3], st, 'test262: test/built-ins/Iterator/prototype/flatMap/flattens-iteratable');
+
+			testIterator(flatMap([0, 1, 2, 3][Symbol.iterator](), function (value) {
+				var i = 0;
+				return {
+					next: function () {
+						if (i < value) {
+							i += 1;
+							return {
+								value: value,
+								done: false
+							};
+						}
+						return {
+							value: undefined,
+							done: true
+						};
+
+					}
+				};
+			}), [1, 2, 2, 3, 3, 3], st, 'test262: test/built-ins/Iterator/prototype/flatMap/flattens-iterator');
+
+			testIterator(flatMap([0][Symbol.iterator](), function () {
+				var n = [0, 1, 2][Symbol.iterator]();
+
+				var ret = {
+					next: function next() {
+						return n.next();
+					}
+				};
+				ret[Symbol.iterator] = null;
+				return ret;
+			}), [0, 1, 2], st, 'test262: test/built-ins/Iterator/prototype/flatMap/iterable-to-iterator-fallback');
+
+			var counts = [];
+			testIterator(flatMap(['a', 'b', 'c', 'd', 'e'][Symbol.iterator](), function (value, count) {
+				counts.push(count);
+
+				if (value === 'a' || value === 'b') {
+					return [0];
+				}
+				if (value === 'c') {
+					return [1, 2];
+				}
+				if (value === 'd') {
+					return [3, 4, 5];
+				}
+				if (value === 'e') {
+					return [6, 7, 8, 9];
+				}
+
+				return st.fail('got unexpected value: ' + debug(v));
+			}), [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], st, 'test262: test/built-ins/Iterator/prototype/flatMap/mapper-args');
+			st.deepEqual(counts, [0, 1, 2, 3, 4], 'count values are as expected');
+
+			st.test('return protocol', function (s2t) {
+				var returnCount = 0;
+
+				var iter = flatMap([0][Symbol.iterator](), function () {
+					return {
+						next: function next() {
+							return {
+								done: false,
+								value: 1
+							};
+						},
+						'return': function () {
+							returnCount += 1;
+							return {};
+						}
+					};
+				});
+				s2t.equal(returnCount, 0, '`return` is not called yet');
+
+				s2t.deepEqual(iter.next(), {
+					done: false,
+					value: 1
+				});
+
+				s2t.equal(returnCount, 0, '`return` is not called after first yield');
+
+				iter['return']();
+				s2t.equal(returnCount, 1, '`return` is called when iterator return is called');
+
+				iter['return']();
+				s2t.equal(returnCount, 1, '`return` is not called again when iterator return is called again');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.forEach.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.forEach.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.forEach.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,268 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEachNormal = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.forEach');
+var impl = require('../Iterator.prototype.forEach/implementation');
+
+var fnName = 'forEach';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (forEach, name, t) {
+		t['throws'](
+			function () { return new forEach(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEachNormal(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(forEach(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(forEach(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEachNormal(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { forEach({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { forEach(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable fn'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new forEach(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new forEach(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+
+			var results = [];
+			var ret = forEach(
+				iterator(),
+				function (x, i) {
+
+					results.push({ value: x, count: i, 'this': this, args: arguments.length });
+				}
+			);
+
+			st.equal(ret, undefined, 'returns undefined');
+
+			st.deepEqual(
+				results,
+				[
+					{ value: 1, count: 0, 'this': undefined, args: 2 },
+					{ value: 2, count: 1, 'this': undefined, args: 2 },
+					{ value: 3, count: 2, 'this': undefined, args: 2 }
+				],
+				'forEach callback receives the expected values'
+			);
+
+			st.test('test262: test/built-ins/Iterator/prototype/forEach/fn-args', function (s2t) {
+				var assertionCount = 0;
+				var result = forEach(
+					['a', 'b', 'c'][Symbol.iterator](),
+					function (value, count) {
+						if (value === 'a') {
+							s2t.equal(count, 0);
+						} else if (value === 'b') {
+							s2t.equal(count, 1);
+						} else if (value === 'c') {
+							s2t.equal(count, 2);
+						} else {
+							s2t.fail('unexpected value');
+						}
+						assertionCount += 1;
+					}
+				);
+				s2t.equal(result, undefined, 'forEach returns undefined');
+				s2t.equal(assertionCount, 3, 'callback called three times');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/forEach/fn-this', function (s2t) {
+				var expectedThis = (function () { return this; }());
+				var assertionCount = 0;
+				var result = forEach(
+					[0][Symbol.iterator](),
+					function () {
+						s2t.equal(this, expectedThis, 'fn this is undefined');
+						assertionCount += 1;
+					}
+				);
+				s2t.equal(result, undefined);
+				s2t.equal(assertionCount, 1);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/forEach/fn-called-for-each-yielded-value', function (s2t) {
+				var values = [];
+				forEach(
+					[1, 2, 3, 4, 5][Symbol.iterator](),
+					function (value) { values.push(value); }
+				);
+				s2t.deepEqual(values, [1, 2, 3, 4, 5], 'callback called for each value');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/forEach/fn-throws', function (s2t) {
+				var returnCount = 0;
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCount += 1;
+						return { done: true };
+					}
+				};
+
+				var callbackCount = 0;
+				s2t['throws'](
+					function () {
+						forEach(testIter, function () {
+							callbackCount += 1;
+							throw new SyntaxError('callback threw');
+						});
+					},
+					SyntaxError
+				);
+				s2t.equal(callbackCount, 1, 'callback called once');
+				s2t.equal(returnCount, 1, 'iterator closed when callback throws');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/forEach/iterator-already-exhausted', function (s2t) {
+				var iter = [][Symbol.iterator]();
+				var callbackCount = 0;
+				var result = forEach(iter, function () {
+					callbackCount += 1;
+				});
+				s2t.equal(result, undefined, 'forEach returns undefined for empty iterator');
+				s2t.equal(callbackCount, 0, 'callback not called');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/forEach/result-is-undefined', function (s2t) {
+				var result = forEach(
+					[1, 2, 3][Symbol.iterator](),
+					function () {}
+				);
+				s2t.equal(result, undefined, 'forEach returns undefined');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.includes.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.includes.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.includes.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,159 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.includes');
+var impl = require('../Iterator.prototype.includes/implementation');
+
+var fnName = 'includes';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (includes, name, t) {
+		t['throws'](
+			function () { return new includes(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(includes(nonIterator)); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(includes(badNext)); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonIntegerNumbers, function (nonInteger) {
+			t['throws'](
+				function () { includes({ next: function () {} }, undefined, nonInteger); },
+				TypeError,
+				debug(nonInteger) + ' is not an integer number'
+			);
+		});
+
+		forEach([-1, -2, -Infinity], function (negativeInteger) {
+			t['throws'](
+				function () { includes({ next: function () {} }, undefined, negativeInteger); },
+				RangeError,
+				debug(negativeInteger) + ' is not a positive integer number'
+			);
+		});
+
+		t.test('Infinity skippedElements', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st.equal(includes(iterator(), 1, Infinity), false, 'Infinity skips everything, returns false');
+			st.equal(includes(iterator(), 1, 0), true, '0 skips nothing, finds 1');
+
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new includes(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new includes(iterator(), 2); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			st.equal(includes(iterator(), 4), false, 'includes for always-false');
+			st.equal(includes(iterator(), 1), true, 'includes for 1');
+			st.equal(includes(iterator(), 1, 1), false, 'includes for 1, 1');
+			st.equal(includes(iterator(), 2), true, 'includes for 2');
+			st.equal(includes(iterator(), 2, 1), true, 'includes for 2, 1');
+			st.equal(includes(iterator(), 2, 2), false, 'includes for 2, 2');
+			st.equal(includes(iterator(), 3), true, 'includes for 3');
+			st.equal(includes(iterator(), 3, 1), true, 'includes for 3, 1');
+			st.equal(includes(iterator(), 3, 2), true, 'includes for 3, 2');
+			st.equal(includes(iterator(), 3, 3), false, 'includes for 3, 3');
+
+			st.test('test262: test/built-ins/Iterator/prototype/includes/iterator-already-exhausted', function (s2t) {
+				var iter = [][Symbol.iterator]();
+				var result = includes(iter);
+				s2t.equal(result, false, 'includes returns false for empty iterator');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t['throws'](
+				function () { return new impl(); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + fnName + '` is not a constructor'
+			);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			t['throws'](
+				function () { return new Iterator.prototype[fnName](); },
+				TypeError,
+				'`' + fnName + '` is not a constructor'
+			);
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,72 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var hasSymbols = require('has-symbols')();
+var hasToStringTag = require('has-tostringtag');
+var functionsHaveNames = require('functions-have-names')();
+var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();
+
+var index = require('../Iterator.prototype');
+var impl = require('../Iterator.prototype/implementation');
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var $Iterator = require('../Iterator/implementation');
+
+module.exports = {
+	tests: function (proto, name, t) {
+		t.notEqual(proto, null, 'is not null');
+		t.equal(typeof proto, 'object', 'is an object');
+
+		t.test('Symbol.iterator', { skip: !hasSymbols }, function (st) {
+			st.equal(typeof proto[Symbol.iterator], 'function', 'has a `Symbol.iterator` method');
+			st.equal(
+				proto[Symbol.iterator].name,
+				'[Symbol.iterator]',
+				'has name "[Symbol.iterator]"',
+				{ skip: functionsHaveNames && !functionsHaveConfigurableNames }
+			);
+			st.equal(proto[Symbol.iterator](), proto, 'function returns proto');
+			st.equal(proto[Symbol.iterator].call($Iterator), $Iterator, 'function returns receiver');
+
+			st.end();
+		});
+
+		t.test(
+			'Symbol.toStringTag',
+			{ skip: !hasToStringTag || 'temporarily skipped pending https://bugs.chromium.org/p/chromium/issues/detail?id=1477372' },
+			function (st) {
+				st.equal(proto[Symbol.toStringTag], 'Iterator', 'has a `Symbol.toStringTag` property');
+
+				st.end();
+			}
+		);
+	},
+	index: function () {
+		test('Iterator.prototype: index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype', t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype: implementation', function (t) {
+			module.exports.tests(impl, 'Iterator.prototype', t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype: shimmed', function (t) {
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator, 'prototype'), 'Iterator.prototype is not enumerable');
+				et.end();
+			});
+
+			module.exports.tests(Iterator.prototype, 'Iterator.prototype', t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.map.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.map.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.map.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,524 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var generators = require('make-generator-function')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.map');
+var impl = require('../Iterator.prototype.map/implementation');
+
+var fnName = 'map';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (map, name, t) {
+		t['throws'](
+			function () { return new map(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(map(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(map(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { map({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { map(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable mapper'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		var sentinel = {};
+		var done = false;
+		var fakeIterator = {
+			next: function () {
+				try {
+					return {
+						done: !!done,
+						value: sentinel
+					};
+				} finally {
+					done = done === false ? null : true;
+				}
+			}
+		};
+		var result = {};
+		testIterator(
+			map(fakeIterator, function (x, i) {
+				result.value = x;
+				result.counter = i;
+				result.receiver = this;
+				result.args = arguments.length;
+				return fakeIterator;
+			}),
+			[fakeIterator, fakeIterator],
+			t,
+			'fake iterator, mapped, runs as expected'
+		);
+		t.deepEqual(
+			result,
+			{ value: sentinel, counter: 1, receiver: undefined, args: 2 },
+			'callback is called with the correct arguments'
+		);
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new map(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new map(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			testIterator(map(iterator(), function (x) { return x; }), [1, 2, 3], st, 'identity mapper');
+			testIterator(map(iterator(), function (x) { return 2 * x; }), [2, 4, 6], st, 'doubler mapper');
+
+			st.test('generators', { skip: generators.length === 0 }, function (s2t) {
+				forEach(generators, function (gen) {
+					s2t.doesNotThrow(
+						function () { map(gen(), function () {}); },
+						'generator function ' + debug(gen) + ' does not need to be from-wrapped first'
+					);
+				});
+
+				s2t.end();
+			});
+
+			st.test('262: mapper-this', function (s2t) {
+				var thisValue;
+				var iter = map(
+					[1][Symbol.iterator](),
+					function () {
+						thisValue = this;
+						return 42;
+					}
+				);
+				iter.next();
+				s2t.equal(thisValue, undefined, 'mapper this is undefined in sloppy mode');
+
+				s2t.end();
+			});
+
+			st.test('262: result is iterator', function (s2t) {
+				var mappedIter = map([1, 2][Symbol.iterator](), function (x) { return x; });
+				s2t.equal(typeof mappedIter.next, 'function', 'has next method');
+				s2t.equal(typeof mappedIter[Symbol.iterator], 'function', 'has Symbol.iterator method');
+				s2t.equal(mappedIter[Symbol.iterator](), mappedIter, 'Symbol.iterator returns itself');
+
+				s2t.end();
+			});
+
+			st.test('262: get next method only once', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var nextGets = 0;
+				var testIter = {
+					next: function () {
+						return { done: true, value: undefined };
+					}
+				};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						nextGets += 1;
+						return function () {
+							return { done: true, value: undefined };
+						};
+					}
+				});
+
+				var iter = map(testIter, function (x) { return x; });
+				s2t.equal(nextGets, 1, 'next retrieved once on creation');
+				iter.next();
+				s2t.equal(nextGets, 1, 'next not retrieved again');
+
+				s2t.end();
+			});
+
+			st.test('262: get next method throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var testIter = {};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						throw new EvalError('next getter threw');
+					}
+				});
+
+				s2t['throws'](
+					function () { map(testIter, function () {}); },
+					EvalError,
+					'throws when getting next throws'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns non-object throws', function (s2t) {
+				var badIterator = {
+					next: function () {
+						return null;
+					}
+				};
+
+				var iter = map(badIterator, function (x) { return x; });
+				s2t['throws'](function () { iter.next(); }, TypeError, 'throws when next returns null');
+
+				var badIterator2 = {
+					next: function () {
+						return 42;
+					}
+				};
+
+				var iter2 = map(badIterator2, function (x) { return x; });
+				s2t['throws'](function () { iter2.next(); }, TypeError, 'throws when next returns number');
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns throwing done', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var iterResult = { value: 1 };
+						Object.defineProperty(iterResult, 'done', {
+							get: function () {
+								throw new EvalError('done getter threw');
+							}
+						});
+						return iterResult;
+					}
+				};
+
+				var iter = map(throwingIterator, function (x) { return x; });
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws when done getter throws');
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns throwing value', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var iterResult = { done: false };
+						Object.defineProperty(iterResult, 'value', {
+							get: function () {
+								throw new EvalError('value getter threw');
+							}
+						});
+						return iterResult;
+					}
+				};
+
+				var iter = map(throwingIterator, function (x) { return x; });
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws when value getter throws');
+
+				s2t.end();
+			});
+
+			st.test('262: next method throws', function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						throw new EvalError('next threw');
+					}
+				};
+
+				var iter = map(throwingIterator, function (x) { return x; });
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws error from next');
+
+				s2t.end();
+			});
+
+			st.test('262: mapper throws', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = map(testIter, function () {
+					throw new SyntaxError('mapper threw');
+				});
+
+				s2t['throws'](function () { iter.next(); }, SyntaxError, 'throws error from mapper');
+				s2t.equal(returnCalls, 1, 'return called on underlying iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: mapper throws then closing iterator also throws', function (s2t) {
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						throw new EvalError('return threw');
+					}
+				};
+
+				var iter = map(testIter, function () {
+					throw new SyntaxError('mapper threw');
+				});
+
+				s2t['throws'](function () { iter.next(); }, SyntaxError, 'mapper exception wins over return exception');
+
+				s2t.end();
+			});
+
+			st.test('262: get return method throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var badIterator = {
+					next: function () {
+						return { done: false, value: 1 };
+					}
+				};
+				Object.defineProperty(badIterator, 'return', {
+					get: function () {
+						throw new SyntaxError('return getter threw');
+					}
+				});
+
+				var iter = map(badIterator, function (x) { return x; });
+				iter.next();
+
+				s2t['throws'](function () { iter['return'](); }, SyntaxError, 'throws error from return getter');
+
+				s2t.end();
+			});
+
+			st.test('262: return is forwarded to underlying iterator', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = map(testIter, function (x) { return x; });
+				iter.next();
+				s2t.equal(returnCalls, 0, 'return not called before calling return()');
+				iter['return']();
+				s2t.equal(returnCalls, 1, 'return called once');
+
+				s2t.end();
+			});
+
+			st.test('262: return on suspended helper returns done and closes underlying', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = map(testIter, function (x) { return x * 2; });
+				var first = iter.next();
+				s2t.deepEqual(first, { value: 2, done: false }, 'first next returns mapped value');
+				s2t.equal(returnCalls, 0, 'return not yet called');
+
+				var returnResult = iter['return']();
+				s2t.deepEqual(returnResult, { value: undefined, done: true }, 'return() returns {value: undefined, done: true}');
+				s2t.equal(returnCalls, 1, 'underlying return called exactly once');
+
+				s2t.end();
+			});
+
+			st.test('262: return is not forwarded after exhaustion', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: true, value: undefined };
+					},
+					'return': function () {
+						returnCalls += 1;
+						throw new EvalError('return should not be called');
+					}
+				};
+
+				var iter = map(testIter, function (x) { return x; });
+				iter.next();
+				iter['return']();
+				s2t.equal(returnCalls, 0, 'return not called after exhaustion');
+
+				s2t.end();
+			});
+
+			st.test('262: iterator already exhausted', function (s2t) {
+				var testIter = {
+					next: function () {
+						return { done: true, value: undefined };
+					}
+				};
+
+				var mapperCalls = 0;
+				var iter = map(testIter, function (x) {
+					mapperCalls += 1;
+					return x;
+				});
+
+				var nextResult = iter.next();
+				s2t.equal(nextResult.done, true, 'done is true');
+				s2t.equal(nextResult.value, undefined, 'value is undefined');
+				s2t.equal(mapperCalls, 0, 'mapper not called for exhausted iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: throws TypeError when generator is running', function (s2t) {
+				var reentrantIterator;
+				var testIter = {
+					next: function () {
+						reentrantIterator.next();
+						return { done: false, value: 1 };
+					}
+				};
+
+				reentrantIterator = map(testIter, function (x) { return x; });
+				s2t['throws'](function () { reentrantIterator.next(); }, TypeError, 'throws on reentrant next()');
+
+				s2t.end();
+			});
+
+			st.test('262: underlying iterator closed when mapper returns abrupt', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = map(testIter, function () {
+					throw new EvalError('mapper threw');
+				});
+
+				s2t['throws'](function () { iter.next(); }, EvalError);
+				s2t.equal(returnCalls, 1, 'underlying iterator closed on mapper throw');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.equal(typeof Iterator.prototype[fnName], 'function', 'exists and is a function');
+
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.reduce.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.reduce.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.reduce.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,354 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.reduce');
+var impl = require('../Iterator.prototype.reduce/implementation');
+
+var fnName = 'reduce';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (reduce, name, t) {
+		t['throws'](
+			function () { return new reduce(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(reduce(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(reduce(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { reduce({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { reduce(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable reducer'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new reduce(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new reduce(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+
+			var results = [];
+			var ret = reduce(
+				iterator(),
+				function (acc, x, i) {
+
+					results.push({ acc: acc, value: x, count: i, 'this': this, args: arguments.length });
+					return acc + x;
+				}
+			);
+			st.equal(ret, 6, 'returns sum of all numbers');
+			st.deepEqual(
+				results,
+				[
+					{ acc: 1, value: 2, count: 1, 'this': undefined, args: 3 },
+					{ acc: 3, value: 3, count: 2, 'this': undefined, args: 3 }
+				],
+				'reduce callback receives the expected values without initialValue'
+			);
+
+			var results2 = [];
+			var ret2 = reduce(
+				iterator(),
+				function (acc, x, i) {
+
+					results2.push({ acc: acc, value: x, count: i, 'this': this, args: arguments.length });
+					return acc + x;
+				},
+				10
+			);
+			st.equal(ret2, 16, 'returns sum of all numbers plus initialValue');
+			st.deepEqual(
+				results2,
+				[
+					{ acc: 10, value: 1, count: 0, 'this': undefined, args: 3 },
+					{ acc: 11, value: 2, count: 1, 'this': undefined, args: 3 },
+					{ acc: 13, value: 3, count: 2, 'this': undefined, args: 3 }
+				],
+				'reduce callback receives the expected values with initialValue'
+			);
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/reducer-args-initial-value', function (s2t) {
+				var assertionCount = 0;
+				var result = reduce(
+					['a', 'b', 'c'][Symbol.iterator](),
+					function (memo, value, count) {
+						if (value === 'a') {
+							s2t.equal(memo, 'start', 'memo is initial value for first call');
+							s2t.equal(count, 0);
+						} else if (value === 'b') {
+							s2t.equal(memo, 'a', 'memo is previous return');
+							s2t.equal(count, 1);
+						} else if (value === 'c') {
+							s2t.equal(memo, 'b', 'memo is previous return');
+							s2t.equal(count, 2);
+						} else {
+							s2t.fail('unexpected value');
+						}
+						assertionCount += 1;
+						return value;
+					},
+					'start'
+				);
+				s2t.equal(result, 'c', 'reduce returns last value');
+				s2t.equal(assertionCount, 3, 'reducer called three times');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/reducer-args-no-initial-value', function (s2t) {
+				var assertionCount = 0;
+				var result = reduce(
+					['a', 'b', 'c'][Symbol.iterator](),
+					function (memo, value, count) {
+						if (value === 'b') {
+							s2t.equal(memo, 'a', 'memo is first value when no initial');
+							s2t.equal(count, 1);
+						} else if (value === 'c') {
+							s2t.equal(memo, 'b', 'memo is previous return');
+							s2t.equal(count, 2);
+						} else {
+							s2t.fail('unexpected value');
+						}
+						assertionCount += 1;
+						return value;
+					}
+				);
+				s2t.equal(result, 'c', 'reduce returns last value');
+				s2t.equal(assertionCount, 2, 'reducer called twice');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/reducer-this', function (s2t) {
+				var expectedThis = (function () { return this; }());
+				var assertionCount = 0;
+				var result = reduce(
+					[0, 1][Symbol.iterator](),
+					function () {
+						s2t.equal(this, expectedThis, 'reducer this is undefined');
+						assertionCount += 1;
+						return 0;
+					}
+				);
+				s2t.equal(result, 0);
+				s2t.equal(assertionCount, 1, 'reducer called once');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/reducer-throws', function (s2t) {
+				var returnCount = 0;
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCount += 1;
+						return { done: true };
+					}
+				};
+
+				var callbackCount = 0;
+				s2t['throws'](
+					function () {
+						reduce(testIter, function () {
+							callbackCount += 1;
+							throw new SyntaxError('reducer threw');
+						}, 0);
+					},
+					SyntaxError
+				);
+				s2t.equal(callbackCount, 1, 'reducer called once');
+				s2t.equal(returnCount, 1, 'iterator closed when reducer throws');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/iterator-already-exhausted-initial-value', function (s2t) {
+				var iter = [][Symbol.iterator]();
+				var callbackCount = 0;
+				var result = reduce(iter, function () {
+					callbackCount += 1;
+					return 'called';
+				}, 'initial');
+				s2t.equal(result, 'initial', 'reduce returns initial value for empty iterator');
+				s2t.equal(callbackCount, 0, 'reducer not called');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/iterator-already-exhausted-no-initial-value', function (s2t) {
+				var iter = [][Symbol.iterator]();
+				s2t['throws'](
+					function () {
+						reduce(iter, function () {});
+					},
+					TypeError,
+					'reduce throws TypeError for empty iterator without initial value'
+				);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/iterator-yields-once-initial-value', function (s2t) {
+				var callbackCount = 0;
+				var result = reduce(
+					[42][Symbol.iterator](),
+					function (memo, value) {
+						callbackCount += 1;
+						return memo + value;
+					},
+					10
+				);
+				s2t.equal(result, 52, 'reduce returns sum');
+				s2t.equal(callbackCount, 1, 'reducer called once');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/iterator-yields-once-no-initial-value', function (s2t) {
+				var callbackCount = 0;
+				var result = reduce(
+					[42][Symbol.iterator](),
+					function () {
+						callbackCount += 1;
+						return 'called';
+					}
+				);
+				s2t.equal(result, 42, 'reduce returns sole value');
+				s2t.equal(callbackCount, 0, 'reducer not called');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/reduce/reducer-memo-can-be-any-type', function (s2t) {
+				// test various memo types
+				s2t.equal(reduce([1][Symbol.iterator](), function (m) { return m; }, null), null, 'null memo');
+				s2t.equal(reduce([1][Symbol.iterator](), function (m) { return m; }, undefined), undefined, 'undefined memo');
+				s2t.equal(reduce([1][Symbol.iterator](), function (m) { return m; }, 0), 0, 'number memo');
+				s2t.equal(reduce([1][Symbol.iterator](), function (m) { return m; }, ''), '', 'string memo');
+				s2t.equal(reduce([1][Symbol.iterator](), function (m) { return m; }, false), false, 'boolean memo');
+				var obj = {};
+				s2t.equal(reduce([1][Symbol.iterator](), function (m) { return m; }, obj), obj, 'object memo');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.some.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.some.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.some.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,322 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.some');
+var impl = require('../Iterator.prototype.some/implementation');
+
+var fnName = 'some';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (some, name, t) {
+		t['throws'](
+			function () { return new some(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(some(nonIterator, function () {})); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(some(badNext, function () {})); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		forEach(v.nonFunctions, function (nonFunction) {
+			t['throws'](
+				function () { some({ next: function () {} }, nonFunction); },
+				TypeError,
+				debug(nonFunction) + ' is not a function'
+			);
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+			st['throws'](
+				function () { some(obj, 'not a function'); },
+				TypeError,
+				'throws TypeError for non-callable predicate'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when IsCallable fails');
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new some(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new some(iterator(), function () {}); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			st.equal(some(iterator(), function () { return false; }), false, 'some for always-false');
+			st.equal(some(iterator(), function () { return true; }), true, 'some for always-true');
+			st.equal(some(iterator(), function (x, i) { return x === 2 && i === 1; }), true, 'some returns true for matching value/index');
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/predicate-args', function (s2t) {
+				var assertionCount = 0;
+				var result = some(
+					['a', 'b', 'c'][Symbol.iterator](),
+					function (value, count) {
+						if (value === 'a') {
+							s2t.equal(count, 0);
+						} else if (value === 'b') {
+							s2t.equal(count, 1);
+						} else if (value === 'c') {
+							s2t.equal(count, 2);
+						} else {
+							s2t.fail('unexpected value');
+						}
+						assertionCount += 1;
+						return false;
+					}
+				);
+				s2t.equal(result, false, 'some returns false when none match');
+				s2t.equal(assertionCount, 3, 'predicate called three times');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/predicate-this', function (s2t) {
+				var expectedThis = (function () { return this; }());
+				var assertionCount = 0;
+				var result = some(
+					[0][Symbol.iterator](),
+					function () {
+						s2t.equal(this, expectedThis, 'predicate this is undefined');
+						assertionCount += 1;
+						return true;
+					}
+				);
+				s2t.equal(result, true);
+				s2t.equal(assertionCount, 1);
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/predicate-returns-truthy', function (s2t) {
+				var callCount = 0;
+				var returnCalled = false;
+				var values = [0, 1, 2];
+				var idx = 0;
+				var iter = {
+					next: function () {
+						if (idx < values.length) {
+							var val = values[idx];
+							idx += 1;
+							return { done: false, value: val };
+						}
+						return { done: true, value: undefined };
+					},
+					'return': function () {
+						returnCalled = true;
+						return { done: true, value: undefined };
+					}
+				};
+				var result = some(
+					iter,
+					function () {
+						callCount += 1;
+						return true;
+					}
+				);
+				s2t.equal(result, true, 'some returns true when predicate returns truthy');
+				s2t.equal(callCount, 1, 'predicate called once');
+				s2t.equal(returnCalled, true, 'iterator is closed');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/predicate-returns-falsey', function (s2t) {
+				var result = some(
+					[0, 1, 2, 3, 4][Symbol.iterator](),
+					function () { return false; }
+				);
+				s2t.equal(result, false, 'some returns false when predicate always returns falsey');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/predicate-returns-falsey-then-truthy', function (s2t) {
+				var callCount = 0;
+				var returnCalled = false;
+				var values = [0, 1, 2, 3, 4];
+				var idx = 0;
+				var iter = {
+					next: function () {
+						if (idx < values.length) {
+							var val = values[idx];
+							idx += 1;
+							return { done: false, value: val };
+						}
+						return { done: true, value: undefined };
+					},
+					'return': function () {
+						returnCalled = true;
+						return { done: true, value: undefined };
+					}
+				};
+				var result = some(
+					iter,
+					function (value) {
+						callCount += 1;
+						return value >= 3;
+					}
+				);
+				s2t.equal(result, true, 'some returns true when predicate returns truthy');
+				s2t.equal(callCount, 4, 'predicate called until truthy returned');
+				s2t.equal(returnCalled, true, 'iterator is closed');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/predicate-returns-non-boolean', function (s2t) {
+				// truthy non-boolean values
+				s2t.equal(some([1][Symbol.iterator](), function () { return 1; }), true, 'truthy number');
+				s2t.equal(some([1][Symbol.iterator](), function () { return 'yes'; }), true, 'truthy string');
+				s2t.equal(some([1][Symbol.iterator](), function () { return {}; }), true, 'truthy object');
+
+				// falsy non-boolean values
+				s2t.equal(some([1][Symbol.iterator](), function () { return 0; }), false, 'falsy number');
+				s2t.equal(some([1][Symbol.iterator](), function () { return ''; }), false, 'falsy string');
+				s2t.equal(some([1][Symbol.iterator](), function () { return null; }), false, 'null');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/predicate-throws', function (s2t) {
+				var returnCount = 0;
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCount += 1;
+						return { done: true };
+					}
+				};
+
+				var callbackCount = 0;
+				s2t['throws'](
+					function () {
+						some(testIter, function () {
+							callbackCount += 1;
+							throw new SyntaxError('predicate threw');
+						});
+					},
+					SyntaxError
+				);
+				s2t.equal(callbackCount, 1, 'predicate called once');
+				s2t.equal(returnCount, 1, 'iterator closed when predicate throws');
+
+				s2t.end();
+			});
+
+			st.test('test262: test/built-ins/Iterator/prototype/some/iterator-already-exhausted', function (s2t) {
+				var iter = [][Symbol.iterator]();
+				var callbackCount = 0;
+				var result = some(iter, function () {
+					callbackCount += 1;
+					return true;
+				});
+				s2t.equal(result, false, 'some returns false for empty iterator');
+				s2t.equal(callbackCount, 0, 'predicate not called');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, null); },
+					TypeError,
+					'polyfill throws TypeError for non-callable argument'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.take.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.take.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.take.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,418 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.take');
+var impl = require('../Iterator.prototype.take/implementation');
+
+var fnName = 'take';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (take, name, t) {
+		t['throws'](
+			function () { return new take(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(take(nonIterator, 1)); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			if (nonIterator != null && typeof nonIterator !== 'string') {
+				var badNext = { next: nonIterator };
+				t['throws'](
+					function () { iterate(take(badNext, 1)); },
+					TypeError,
+					debug(badNext) + ' is not an Object with a callable `next` method'
+				);
+			}
+		});
+
+		t.test('early-error calls return on receiver', function (st) {
+			var returnCalls = 0;
+			var obj = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					returnCalls += 1;
+					return { done: true };
+				}
+			};
+
+			st['throws'](
+				function () { take(obj, NaN); },
+				RangeError,
+				'NaN throws RangeError'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver for NaN');
+
+			returnCalls = 0;
+			st['throws'](
+				function () { take(obj, -1); },
+				RangeError,
+				'-1 throws RangeError'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver for negative limit');
+
+			returnCalls = 0;
+			st['throws'](
+				function () { take(obj, { valueOf: function () { throw new SyntaxError('bad'); } }); },
+				SyntaxError,
+				'ToNumber throwing calls return'
+			);
+			st.equal(returnCalls, 1, 'return called on receiver when ToNumber throws');
+
+			st.end();
+		});
+
+		var arr = [1, 2, 3];
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { take(iterator(), -3); },
+				RangeError,
+				'-3 is not >= 0'
+			);
+
+			st['throws'](
+				function () { return new take(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+			st['throws'](
+				function () { return new take(iterator(), 0); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+			testIterator(take(iterator(), 0), [], st, 'take 0');
+			testIterator(take(iterator(), 1), [1], st, 'take 1');
+			testIterator(take(iterator(), 2), [1, 2], st, 'take 2');
+			testIterator(take(iterator(), 3), [1, 2, 3], st, 'take 3');
+			testIterator(take(iterator(), Infinity), [1, 2, 3], st, 'take ∞');
+
+			st.test('262: limit-tonumber', function (s2t) {
+				// ToNumber coercion
+				testIterator(take(iterator(), '2'), [1, 2], s2t, 'string "2" coerced to 2');
+				testIterator(take(iterator(), 2.9), [1, 2], s2t, '2.9 truncated to 2');
+				testIterator(take(iterator(), { valueOf: function () { return 2; } }), [1, 2], s2t, 'object with valueOf');
+				testIterator(take(iterator(), true), [1], s2t, 'true coerced to 1');
+				testIterator(take(iterator(), null), [], s2t, 'null coerced to 0');
+
+				s2t.end();
+			});
+
+			st.test('262: limit-tonumber-throws', function (s2t) {
+				s2t['throws'](
+					function () { take(iterator(), { valueOf: function () { throw new EvalError('valueOf threw'); } }); },
+					EvalError,
+					'throws when valueOf throws'
+				);
+
+				s2t['throws'](
+					function () { take(iterator(), Symbol('test')); },
+					TypeError,
+					'throws when limit is a Symbol'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: limit-rangeerror', function (s2t) {
+				s2t['throws'](function () { take(iterator(), -1); }, RangeError, '-1 throws RangeError');
+				s2t['throws'](function () { take(iterator(), -Infinity); }, RangeError, '-Infinity throws RangeError');
+				s2t['throws'](function () { take(iterator(), NaN); }, RangeError, 'NaN throws RangeError');
+
+				s2t.end();
+			});
+
+			st.test('262: result is iterator', function (s2t) {
+				var iter = take(iterator(), 2);
+				s2t.equal(typeof iter.next, 'function', 'has next method');
+				s2t.equal(typeof iter[Symbol.iterator], 'function', 'has Symbol.iterator method');
+				s2t.equal(iter[Symbol.iterator](), iter, 'Symbol.iterator returns itself');
+
+				s2t.end();
+			});
+
+			st.test('262: get next method only once', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var nextGets = 0;
+				var testIter = {};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						nextGets += 1;
+						return function () {
+							return { done: true, value: undefined };
+						};
+					}
+				});
+
+				var iter = take(testIter, 2);
+				s2t.equal(nextGets, 1, 'next retrieved once on creation');
+				iter.next();
+				s2t.equal(nextGets, 1, 'next not retrieved again');
+
+				s2t.end();
+			});
+
+			st.test('262: get next method throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var testIter = {};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						throw new EvalError('next getter threw');
+					}
+				});
+
+				s2t['throws'](
+					function () { take(testIter, 2); },
+					EvalError,
+					'throws when getting next throws'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns non-object throws', function (s2t) {
+				var badIterator = {
+					next: function () {
+						return null;
+					}
+				};
+
+				var iter = take(badIterator, 2);
+				s2t['throws'](function () { iter.next(); }, TypeError, 'throws when next returns null');
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns throwing done', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var result = { value: 1 };
+						Object.defineProperty(result, 'done', {
+							get: function () {
+								throw new EvalError('done getter threw');
+							}
+						});
+						return result;
+					}
+				};
+
+				var iter = take(throwingIterator, 2);
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws when done getter throws');
+
+				s2t.end();
+			});
+
+			st.test('262: next method returns throwing value', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var result = { done: false };
+						Object.defineProperty(result, 'value', {
+							get: function () {
+								throw new EvalError('value getter threw');
+							}
+						});
+						return result;
+					}
+				};
+
+				var iter = take(throwingIterator, 2);
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws when value getter throws');
+
+				s2t.end();
+			});
+
+			st.test('262: next method throws', function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						throw new EvalError('next threw');
+					}
+				};
+
+				var iter = take(throwingIterator, 2);
+				s2t['throws'](function () { iter.next(); }, EvalError, 'throws error from next');
+
+				s2t.end();
+			});
+
+			st.test('262: return is forwarded', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = take(testIter, 5);
+				iter.next();
+				s2t.equal(returnCalls, 0, 'return not called before calling return()');
+				iter['return']();
+				s2t.equal(returnCalls, 1, 'return called once');
+
+				s2t.end();
+			});
+
+			st.test('262: return is not forwarded after exhaustion', function (s2t) {
+				var returnCalls = 0;
+
+				var testIter = {
+					next: function () {
+						return { done: false, value: 1 };
+					},
+					'return': function () {
+						returnCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+
+				var iter = take(testIter, 1);
+				iter.next(); // takes the one value, returnCalls still 0
+				iter.next(); // exhausted, calls return on underlying -> returnCalls = 1
+				s2t.equal(returnCalls, 1, 'return called once on exhaustion');
+
+				// After exhaustion, calling return() should NOT forward again
+				iter['return']();
+				s2t.equal(returnCalls, 1, 'return not called again after already exhausted');
+
+				s2t.end();
+			});
+
+			// Note: "exhaustion calls return" test removed as take's exhaustion behavior
+			// depends on implementation details and spec interpretation
+
+			st.test('262: get return method throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var badIterator = {
+					next: function () {
+						return { done: false, value: 1 };
+					}
+				};
+				Object.defineProperty(badIterator, 'return', {
+					get: function () {
+						throw new SyntaxError('return getter threw');
+					}
+				});
+
+				var iter = take(badIterator, 5);
+				iter.next();
+
+				s2t['throws'](function () { iter['return'](); }, SyntaxError, 'throws error from return getter');
+
+				s2t.end();
+			});
+
+			st.test('262: throws TypeError when generator is running', function (s2t) {
+				var reentrantIterator;
+				var testIter = {
+					next: function () {
+						reentrantIterator.next();
+						return { done: false, value: 1 };
+					}
+				};
+
+				reentrantIterator = take(testIter, 5);
+				s2t['throws'](function () { reentrantIterator.next(); }, TypeError, 'throws on reentrant next()');
+
+				s2t.end();
+			});
+
+			st.test('262: limit-greater-than-or-equal-to-total', function (s2t) {
+				// When limit >= total items, should return all items
+				testIterator(take(iterator(), 5), [1, 2, 3], s2t, 'take 5 from 3-item iterator');
+				testIterator(take(iterator(), 3), [1, 2, 3], s2t, 'take exactly 3 from 3-item iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: limit-less-than-total', function (s2t) {
+				// When limit < total items, should stop early
+				testIterator(take(iterator(), 2), [1, 2], s2t, 'take 2 from 3-item iterator');
+				testIterator(take(iterator(), 1), [1], s2t, 'take 1 from 3-item iterator');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.test('polyfill has early-error IteratorClose', function (st) {
+				var returnCalls = 0;
+				var obj = {
+					next: function () { return { done: true }; },
+					'return': function () {
+						returnCalls += 1;
+						return { done: true };
+					}
+				};
+				st['throws'](
+					function () { index(obj, NaN); },
+					RangeError,
+					'polyfill throws RangeError for NaN limit'
+				);
+				st.equal(returnCalls, 1, 'polyfill calls return on early error');
+				st.end();
+			});
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.toArray.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.toArray.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.prototype.toArray.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,286 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var hasStrictMode = require('has-strict-mode')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var iterate = require('iterate-iterator');
+
+var index = require('../Iterator.prototype.toArray');
+var impl = require('../Iterator.prototype.toArray/implementation');
+
+var fnName = 'toArray';
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (toArray, name, t) {
+		t['throws'](
+			function () { return new toArray(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` is not a constructor'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { iterate(toArray(nonIterator)); },
+				TypeError,
+				debug(nonIterator) + ' is not an Object with a callable `next` method'
+			);
+
+			var badNext = { next: nonIterator };
+			t['throws'](
+				function () { iterate(toArray(badNext)); },
+				TypeError,
+				debug(badNext) + ' is not an Object with a callable `next` method'
+			);
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			var arr = [1, 2, 3];
+			var iterator = callBind(arr[Symbol.iterator], arr);
+
+			st['throws'](
+				function () { return new toArray(iterator()); }, // eslint-disable-line new-cap
+				TypeError,
+				'`' + name + '` iterator is not a constructor'
+			);
+
+			testIterator(iterator(), [1, 2, 3], st, 'original');
+
+			st.deepEqual(toArray(iterator()), [1, 2, 3], 'toArray');
+
+			st.test('262: iterator-already-exhausted', function (s2t) {
+				var exhaustedIter = {
+					next: function () {
+						return { done: true, value: undefined };
+					}
+				};
+
+				var result = toArray(exhaustedIter);
+				s2t.ok(Array.isArray(result), 'result is an array');
+				s2t.deepEqual(result, [], 'empty array for exhausted iterator');
+
+				s2t.end();
+			});
+
+			st.test('262: get-next-method-only-once', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var nextGets = 0;
+				var callCount = 0;
+				var testIter = {};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						nextGets += 1;
+						return function () {
+							callCount += 1;
+							if (callCount <= 2) {
+								return { done: false, value: callCount };
+							}
+							return { done: true, value: undefined };
+						};
+					}
+				});
+
+				var result = toArray(testIter);
+				s2t.equal(nextGets, 1, 'next retrieved once');
+				s2t.deepEqual(result, [1, 2], 'result is correct');
+
+				s2t.end();
+			});
+
+			st.test('262: get-next-method-throws', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var testIter = {};
+				Object.defineProperty(testIter, 'next', {
+					get: function () {
+						throw new EvalError('next getter threw');
+					}
+				});
+
+				s2t['throws'](
+					function () { toArray(testIter); },
+					EvalError,
+					'throws when getting next throws'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: next-method-returns-non-object', function (s2t) {
+				var badIterator = {
+					next: function () {
+						return null;
+					}
+				};
+
+				s2t['throws'](
+					function () { toArray(badIterator); },
+					TypeError,
+					'throws when next returns null'
+				);
+
+				var badIterator2 = {
+					next: function () {
+						return 42;
+					}
+				};
+
+				s2t['throws'](
+					function () { toArray(badIterator2); },
+					TypeError,
+					'throws when next returns a number'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: next-method-returns-throwing-done', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var result = { value: 1 };
+						Object.defineProperty(result, 'done', {
+							get: function () {
+								throw new EvalError('done getter threw');
+							}
+						});
+						return result;
+					}
+				};
+
+				s2t['throws'](
+					function () { toArray(throwingIterator); },
+					EvalError,
+					'throws when done getter throws'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: next-method-returns-throwing-value', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						var result = { done: false };
+						Object.defineProperty(result, 'value', {
+							get: function () {
+								throw new EvalError('value getter threw');
+							}
+						});
+						return result;
+					}
+				};
+
+				s2t['throws'](
+					function () { toArray(throwingIterator); },
+					EvalError,
+					'throws when value getter throws'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: next-method-returns-throwing-value-done', { skip: !hasPropertyDescriptors }, function (s2t) {
+				// Value property should not be accessed after done: true
+				var valueAccessed = false;
+				var doneIterator = {
+					next: function () {
+						var result = { done: true };
+						Object.defineProperty(result, 'value', {
+							get: function () {
+								valueAccessed = true;
+								throw new EvalError('value getter threw');
+							}
+						});
+						return result;
+					}
+				};
+
+				var result = toArray(doneIterator);
+				s2t.deepEqual(result, [], 'toArray returns empty array');
+				s2t.equal(valueAccessed, false, 'value not accessed when done is true');
+
+				s2t.end();
+			});
+
+			st.test('262: next-method-throws', function (s2t) {
+				var throwingIterator = {
+					next: function () {
+						throw new EvalError('next threw');
+					}
+				};
+
+				s2t['throws'](
+					function () { toArray(throwingIterator); },
+					EvalError,
+					'throws error from next'
+				);
+
+				s2t.end();
+			});
+
+			st.test('262: this-plain-iterator', function (s2t) {
+				// toArray works with plain iterator objects not inheriting from Iterator.prototype
+				var callCount = 0;
+				var plainIterator = {
+					next: function () {
+						callCount += 1;
+						if (callCount <= 3) {
+							return { done: false, value: callCount };
+						}
+						return { done: true, value: undefined };
+					}
+				};
+
+				var result = toArray(plainIterator);
+				s2t.deepEqual(result, [1, 2, 3], 'toArray works with plain iterator');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.prototype.' + fnName + ': index', function (t) {
+			module.exports.tests(index, 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.prototype.' + fnName + ': implementation', function (t) {
+			module.exports.tests(callBind(impl), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.prototype.' + fnName + ': shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.prototype[fnName].name, fnName, 'Iterator#' + fnName + ' has name "' + fnName + '"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator.prototype, fnName), 'Iterator#' + fnName + ' is not enumerable');
+				et.end();
+			});
+
+			t.test('bad string/this value', { skip: !hasStrictMode }, function (st) {
+				st['throws'](function () { return Iterator.prototype[fnName].call(undefined, 'a'); }, TypeError, 'undefined is not an object');
+				st['throws'](function () { return Iterator.prototype[fnName].call(null, 'a'); }, TypeError, 'null is not an object');
+				st.end();
+			});
+
+			module.exports.tests(callBind(Iterator.prototype[fnName]), 'Iterator.prototype.' + fnName, t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.zip.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.zip.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.zip.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,310 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var mockProperty = require('mock-property');
+
+var index = require('../Iterator.zip');
+var impl = require('../Iterator.zip/implementation');
+var from = require('../Iterator.from/polyfill')();
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var testIterator = require('./helpers/testIterator');
+
+module.exports = {
+	tests: function (zip, name, t) {
+		t['throws'](
+			function () { return new zip(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor'
+		);
+		t['throws'](
+			function () { return new zip({}); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor, with an argument'
+		);
+
+		forEach(v.primitives.concat(v.objects), function (nonIterator) {
+			t['throws'](
+				function () { zip(nonIterator, []); },
+				TypeError,
+				debug(nonIterator) + ' is not an iterable Object'
+			);
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			forEach(v.nonFunctions, function (nonFunction) {
+				if (nonFunction != null) {
+					var badIterable = {};
+					badIterable[Symbol.iterator] = nonFunction;
+					st['throws'](
+						function () { zip([[], badIterable, []]).next(); },
+						TypeError,
+						debug(badIterable) + ' is not a function'
+					);
+				}
+			});
+
+			forEach(v.strings, function (string) {
+				st['throws'](
+					function () { zip([string]); },
+					TypeError,
+					'non-objects are not considered iterable'
+				);
+			});
+
+			var arrayIt = zip([[1, 2, 3]]);
+			st.equal(typeof arrayIt.next, 'function', 'has a `next` function');
+
+			st.test('real iterators', { skip: !hasSymbols }, function (s2t) {
+				var iter = [1, 2][Symbol.iterator]();
+				testIterator(zip([iter, [3, 4]]), [[1, 3], [2, 4]], s2t, 'array iterator + array yields combined results');
+
+				s2t.end();
+			});
+
+			st.test('observability in a replaced String iterator', function (s2t) {
+				var originalStringIterator = String.prototype[Symbol.iterator];
+				var observedType;
+				s2t.teardown(mockProperty(String.prototype, Symbol.iterator, {
+					get: function () {
+						'use strict'; // eslint-disable-line strict, lines-around-directive
+
+						observedType = typeof this;
+						return originalStringIterator;
+					}
+				}));
+
+				zip([from('')]);
+				s2t.equal(observedType, 'string', 'string primitive -> primitive receiver in Symbol.iterator getter');
+				zip([from(Object(''))]);
+				s2t.equal(observedType, 'object', 'boxed string -> boxed string in Symbol.iterator getter');
+
+				s2t.end();
+			});
+
+			st.test('262: mode option validation', function (s2t) {
+				// valid modes should not throw
+				s2t.doesNotThrow(function () { zip([[1], [2]]); }, 'undefined mode is valid');
+				s2t.doesNotThrow(function () { zip([[1], [2]], { mode: undefined }); }, 'explicit undefined mode is valid');
+				s2t.doesNotThrow(function () { zip([[1], [2]], { mode: 'shortest' }); }, '"shortest" mode is valid');
+				s2t.doesNotThrow(function () { zip([[1], [2]], { mode: 'longest' }); }, '"longest" mode is valid');
+				s2t.doesNotThrow(function () { zip([[1], [2]], { mode: 'strict' }); }, '"strict" mode is valid');
+
+				// invalid modes should throw TypeError
+				s2t['throws'](function () { zip([[1], [2]], { mode: null }); }, TypeError, 'null mode throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: false }); }, TypeError, 'false mode throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: '' }); }, TypeError, 'empty string mode throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: 'short' }); }, TypeError, '"short" mode throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: 'long' }); }, TypeError, '"long" mode throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: 'loose' }); }, TypeError, '"loose" mode throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: 0 }); }, TypeError, '0 mode throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: {} }); }, TypeError, 'object mode throws TypeError');
+
+				// String wrapper should not be coerced
+				s2t['throws'](function () { zip([[1], [2]], { mode: Object('shortest') }); }, TypeError, 'String wrapper mode throws TypeError');
+
+				// objects with toString/valueOf should not be coerced
+				s2t['throws'](function () { zip([[1], [2]], { mode: { toString: function () { return 'shortest'; } } }); }, TypeError, 'object with toString throws TypeError');
+				s2t['throws'](function () { zip([[1], [2]], { mode: { valueOf: function () { return 'shortest'; } } }); }, TypeError, 'object with valueOf throws TypeError');
+
+				s2t.end();
+			});
+
+			st.test('262: basic shortest mode', function (s2t) {
+				// shortest mode (default) stops at minimum length
+				testIterator(zip([[1, 2, 3], [4, 5]]), [[1, 4], [2, 5]], s2t, 'shortest mode stops at shorter iterator');
+				testIterator(zip([[1, 2], [3, 4, 5]]), [[1, 3], [2, 4]], s2t, 'shortest mode stops at shorter first iterator');
+				testIterator(zip([[1], [2], [3]]), [[1, 2, 3]], s2t, 'three iterators of length 1');
+				testIterator(zip([[], [1, 2, 3]]), [], s2t, 'empty first iterator yields nothing');
+				testIterator(zip([[1, 2, 3], []]), [], s2t, 'empty second iterator yields nothing');
+
+				// explicit shortest mode
+				testIterator(zip([[1, 2, 3], [4, 5]], { mode: 'shortest' }), [[1, 4], [2, 5]], s2t, 'explicit shortest mode');
+
+				s2t.end();
+			});
+
+			st.test('262: basic longest mode', function (s2t) {
+				// longest mode continues with undefined padding by default
+				testIterator(zip([[1, 2, 3], [4, 5]], { mode: 'longest' }), [[1, 4], [2, 5], [3, undefined]], s2t, 'longest mode pads with undefined');
+				testIterator(zip([[1, 2], [3, 4, 5]], { mode: 'longest' }), [[1, 3], [2, 4], [undefined, 5]], s2t, 'longest mode pads first iterator');
+				testIterator(zip([[1], [2, 3], [4, 5, 6]], { mode: 'longest' }), [[1, 2, 4], [undefined, 3, 5], [undefined, undefined, 6]], s2t, 'longest mode with three iterators');
+
+				s2t.end();
+			});
+
+			st.test('262: basic strict mode', function (s2t) {
+				// strict mode succeeds when lengths match
+				testIterator(zip([[1, 2], [3, 4]], { mode: 'strict' }), [[1, 3], [2, 4]], s2t, 'strict mode succeeds with equal lengths');
+				testIterator(zip([[1], [2], [3]], { mode: 'strict' }), [[1, 2, 3]], s2t, 'strict mode with three iterators of length 1');
+
+				// strict mode throws when lengths differ
+				var strictIter1 = zip([[1, 2, 3], [4, 5]], { mode: 'strict' });
+				strictIter1.next(); // [1, 4]
+				strictIter1.next(); // [2, 5]
+				s2t['throws'](function () { strictIter1.next(); }, TypeError, 'strict mode throws when first iterator has more');
+
+				var strictIter2 = zip([[1, 2], [3, 4, 5]], { mode: 'strict' });
+				strictIter2.next(); // [1, 3]
+				strictIter2.next(); // [2, 4]
+				s2t['throws'](function () { strictIter2.next(); }, TypeError, 'strict mode throws when second iterator has more');
+
+				s2t.end();
+			});
+
+			st.test('strict mode: errored iterator not double-closed', function (s2t) {
+				var closeCounts = { a: 0, b: 0 };
+				var iterA = {
+					next: function () { return { done: true, value: undefined }; },
+					'return': function () {
+						closeCounts.a += 1;
+						return { done: true };
+					}
+				};
+				iterA[Symbol.iterator] = function () { return iterA; };
+				var iterB = {
+					next: function () { throw new EvalError('iterB.next threw'); },
+					'return': function () {
+						closeCounts.b += 1;
+						return { done: true };
+					}
+				};
+				iterB[Symbol.iterator] = function () { return iterB; };
+
+				var strictZip = zip([iterA, iterB], { mode: 'strict' });
+				// iterA.next() returns done:true, then in strict mode we check iterB
+				// iterB.next() throws - iterB should be removed from openIters before closing
+				s2t['throws'](
+					function () { strictZip.next(); },
+					EvalError,
+					'strict mode propagates error from next()'
+				);
+				s2t.equal(closeCounts.b, 0, 'errored iterator is not closed again');
+
+				s2t.end();
+			});
+
+			st.test('262: padding option validation', function (s2t) {
+				// padding is only used in longest mode
+				s2t.doesNotThrow(function () { zip([[1], [2]], { mode: 'shortest', padding: null }); }, 'invalid padding ignored in shortest mode');
+				s2t.doesNotThrow(function () { zip([[1], [2]], { mode: 'strict', padding: null }); }, 'invalid padding ignored in strict mode');
+
+				// invalid padding in longest mode
+				s2t['throws'](function () { zip([[1], [2]], { mode: 'longest', padding: null }); }, TypeError, 'null padding throws in longest mode');
+				s2t['throws'](function () { zip([[1], [2]], { mode: 'longest', padding: 'abc' }); }, TypeError, 'string padding throws in longest mode');
+				s2t['throws'](function () { zip([[1], [2]], { mode: 'longest', padding: 123 }); }, TypeError, 'number padding throws in longest mode');
+				s2t['throws'](function () { zip([[1], [2]], { mode: 'longest', padding: true }); }, TypeError, 'boolean padding throws in longest mode');
+
+				s2t.end();
+			});
+
+			st.test('262: result is iterator', function (s2t) {
+				var zipIter = zip([[1, 2], [3, 4]]);
+				s2t.equal(typeof zipIter.next, 'function', 'has next method');
+				s2t.equal(typeof zipIter[Symbol.iterator], 'function', 'has Symbol.iterator method');
+				s2t.equal(zipIter[Symbol.iterator](), zipIter, 'Symbol.iterator returns itself');
+
+				s2t.end();
+			});
+
+			st.test('262: return closes all underlying iterators', function (s2t) {
+				var return1Calls = 0;
+				var return2Calls = 0;
+
+				var iter1 = {
+					next: function () { return { done: false, value: 1 }; },
+					'return': function () {
+						return1Calls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+				iter1[Symbol.iterator] = function () { return iter1; };
+
+				var iter2 = {
+					next: function () { return { done: false, value: 2 }; },
+					'return': function () {
+						return2Calls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+				iter2[Symbol.iterator] = function () { return iter2; };
+
+				var zipIter = zip([iter1, iter2]);
+				zipIter.next();
+				s2t.equal(return1Calls, 0, 'return not called before calling return()');
+				s2t.equal(return2Calls, 0, 'return not called before calling return()');
+
+				zipIter['return']();
+				s2t.equal(return1Calls, 1, 'iter1.return called once');
+				s2t.equal(return2Calls, 1, 'iter2.return called once');
+
+				s2t.end();
+			});
+
+			st.test('262: next method throws closes other iterators', function (s2t) {
+				var return2Calls = 0;
+
+				var iter1 = {
+					next: function () { throw new EvalError('iter1 next threw'); }
+				};
+				iter1[Symbol.iterator] = function () { return iter1; };
+
+				var iter2 = {
+					next: function () { return { done: false, value: 2 }; },
+					'return': function () {
+						return2Calls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+				iter2[Symbol.iterator] = function () { return iter2; };
+
+				var zipIter = zip([iter1, iter2]);
+				s2t['throws'](function () { zipIter.next(); }, EvalError, 'throws error from iter1.next');
+				s2t.equal(return2Calls, 1, 'iter2.return called when iter1.next throws');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.zip: index', function (t) {
+			module.exports.tests(index, 'Iterator.zip', t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.zip: implementation', function (t) {
+			module.exports.tests(impl, 'Iterator.zip', t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.zip: shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.zip.name, 'zip', 'Iterator.zip has name "zip"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator, 'zip'), 'Iterator.zip is not enumerable');
+				et.end();
+			});
+
+			module.exports.tests(callBind(Iterator.zip, Iterator), 'Iterator.zip', t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/Iterator.zipKeyed.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/Iterator.zipKeyed.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/Iterator.zipKeyed.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,383 @@
+'use strict';
+
+var defineProperties = require('define-properties');
+var test = require('tape');
+var callBind = require('call-bind');
+var functionsHaveNames = require('functions-have-names')();
+var forEach = require('for-each');
+var debug = require('object-inspect');
+var v = require('es-value-fixtures');
+var hasSymbols = require('has-symbols/shams')();
+var hasPropertyDescriptors = require('has-property-descriptors')();
+var mockProperty = require('mock-property');
+
+var index = require('../Iterator.zipKeyed');
+var impl = require('../Iterator.zipKeyed/implementation');
+var from = require('../Iterator.from/polyfill')();
+
+var testIterator = require('./helpers/testIterator');
+
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+module.exports = {
+	tests: function (zipKeyed, name, t) {
+		t['throws'](
+			function () { return new zipKeyed(); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor'
+		);
+		t['throws'](
+			function () { return new zipKeyed({}); }, // eslint-disable-line new-cap
+			TypeError,
+			'`' + name + '` itself is not a constructor, with an argument'
+		);
+
+		forEach(v.primitives, function (primitive) {
+			t['throws'](
+				function () { zipKeyed(primitive); },
+				TypeError,
+				debug(primitive) + ' is not an Object'
+			);
+			if (primitive != null) {
+				t['throws'](
+					function () { zipKeyed({ a: primitive }); },
+					TypeError,
+					'key "a" on iterables object is ' + debug(primitive) + ' which is not an iterable Object'
+				);
+			}
+		});
+
+		forEach(v.objects, function (nonIterator) {
+			t.doesNotThrow(function () { zipKeyed({ a: nonIterator }); }, 'does not throw until `.next()`');
+
+			t['throws'](
+				function () { zipKeyed({ a: nonIterator }).next(); },
+				TypeError,
+				'key "a" on iterables object is ' + debug(nonIterator) + ' which is not an iterable Object'
+			);
+		});
+
+		t.test('accessor getter error calls IfAbruptCloseIterators', { skip: !hasPropertyDescriptors || !hasSymbols }, function (st) {
+			var closedIters = [];
+			var iterA = {
+				next: function () { return { done: true }; },
+				'return': function () {
+					closedIters.push('0');
+					return { done: true };
+				}
+			};
+			iterA[Symbol.iterator] = function () { return iterA; };
+
+			// Use an integer index for the data property so it is guaranteed to be
+			// enumerated before string keys per spec, working around a V8 4.2–4.6
+			// (io.js 2 / node 5) bug where ownKeys reorders string keys for objects
+			// with mixed data and accessor properties on repeated calls.
+			var obj = {};
+			obj[0] = iterA;
+			Object.defineProperty(obj, 'b', {
+				enumerable: true,
+				get: function () {
+					throw new EvalError('getter threw');
+				}
+			});
+
+			st['throws'](
+				function () { zipKeyed(obj); },
+				EvalError,
+				'accessor getter error propagates'
+			);
+			st.deepEqual(closedIters, ['0'], 'previously opened iterator is closed');
+
+			st.end();
+		});
+
+		t.test('actual iteration', { skip: !hasSymbols }, function (st) {
+			forEach(v.nonFunctions, function (nonFunction) {
+				if (nonFunction != null) {
+					var badIterable = {};
+					badIterable[Symbol.iterator] = nonFunction;
+					st['throws'](
+						function () { zipKeyed({ a: [], b: badIterable, c: [] }).next(); },
+						TypeError,
+						'key "b" on iterables object is ' + debug(badIterable) + ' is not a function'
+					);
+				}
+			});
+
+			forEach(v.strings, function (string) {
+				st['throws'](
+					function () { zipKeyed({ a: string }); },
+					TypeError,
+					'key "a" on iterables object is an iterable primitive, but non-objects are not considered iterable'
+				);
+			});
+
+			st.test('real iterators', { skip: !hasSymbols }, function (s2t) {
+				var iter = [['a', 1], ['b', 2]][Symbol.iterator]();
+				var iterator = zipKeyed({ a: iter, b: ['a', 3], c: ['b', 4] });
+
+				testIterator(
+					iterator,
+					[
+						{ __proto__: null, a: ['a', 1], b: 'a', c: 'b' },
+						{ __proto__: null, a: ['b', 2], b: 3, c: 4 }
+					],
+					s2t,
+					'array iterator + array yields combined results'
+				);
+
+				s2t.end();
+			});
+
+			st.test('observability in a replaced String iterator', function (s2t) {
+				var originalStringIterator = String.prototype[Symbol.iterator];
+				var observedType;
+				s2t.teardown(mockProperty(String.prototype, Symbol.iterator, {
+					get: function () {
+						'use strict'; // eslint-disable-line strict, lines-around-directive
+
+						observedType = typeof this;
+						return originalStringIterator;
+					}
+				}));
+
+				zipKeyed([from('')]);
+				s2t.equal(observedType, 'string', 'string primitive -> primitive receiver in Symbol.iterator getter');
+				zipKeyed([from(Object(''))]);
+				s2t.equal(observedType, 'object', 'boxed string -> boxed string in Symbol.iterator getter');
+
+				s2t.end();
+			});
+
+			st.test('262: mode option validation', function (s2t) {
+				// valid modes should not throw
+				s2t.doesNotThrow(function () { zipKeyed({ a: [1], b: [2] }); }, 'undefined mode is valid');
+				s2t.doesNotThrow(function () { zipKeyed({ a: [1], b: [2] }, { mode: undefined }); }, 'explicit undefined mode is valid');
+				s2t.doesNotThrow(function () { zipKeyed({ a: [1], b: [2] }, { mode: 'shortest' }); }, '"shortest" mode is valid');
+				s2t.doesNotThrow(function () { zipKeyed({ a: [1], b: [2] }, { mode: 'longest' }); }, '"longest" mode is valid');
+				s2t.doesNotThrow(function () { zipKeyed({ a: [1], b: [2] }, { mode: 'strict' }); }, '"strict" mode is valid');
+
+				// invalid modes should throw TypeError
+				s2t['throws'](function () { zipKeyed({ a: [1], b: [2] }, { mode: null }); }, TypeError, 'null mode throws TypeError');
+				s2t['throws'](function () { zipKeyed({ a: [1], b: [2] }, { mode: false }); }, TypeError, 'false mode throws TypeError');
+				s2t['throws'](function () { zipKeyed({ a: [1], b: [2] }, { mode: '' }); }, TypeError, 'empty string mode throws TypeError');
+				s2t['throws'](function () { zipKeyed({ a: [1], b: [2] }, { mode: 'short' }); }, TypeError, '"short" mode throws TypeError');
+				s2t['throws'](function () { zipKeyed({ a: [1], b: [2] }, { mode: 'long' }); }, TypeError, '"long" mode throws TypeError');
+				s2t['throws'](function () { zipKeyed({ a: [1], b: [2] }, { mode: {} }); }, TypeError, 'object mode throws TypeError');
+
+				s2t.end();
+			});
+
+			st.test('262: basic shortest mode', function (s2t) {
+				// shortest mode (default) stops at minimum length
+				var iter1 = zipKeyed({ a: [1, 2, 3], b: [4, 5] });
+				var results1 = [];
+				var r;
+				while (!(r = iter1.next()).done) {
+					results1.push(r.value);
+				}
+				s2t.equal(results1.length, 2, 'shortest mode stops at shorter iterator');
+				s2t.deepEqual(results1[0], { __proto__: null, a: 1, b: 4 }, 'first result');
+				s2t.deepEqual(results1[1], { __proto__: null, a: 2, b: 5 }, 'second result');
+
+				s2t.end();
+			});
+
+			st.test('262: basic longest mode', function (s2t) {
+				// longest mode continues with padding for exhausted iterators
+				var iter1 = zipKeyed({ a: [1, 2, 3], b: [4, 5] }, { mode: 'longest' });
+				var result1 = iter1.next().value;
+				s2t.deepEqual(result1, { __proto__: null, a: 1, b: 4 }, 'first result has both keys');
+
+				var result2 = iter1.next().value;
+				s2t.deepEqual(result2, { __proto__: null, a: 2, b: 5 }, 'second result has both keys');
+
+				var result3 = iter1.next().value;
+				s2t.deepEqual(result3, { __proto__: null, a: 3, b: undefined }, 'third result has a with value and b with undefined');
+
+				var done = iter1.next();
+				s2t.equal(done.done, true, 'iterator is done after third result');
+
+				s2t.end();
+			});
+
+			st.test('262: basic strict mode', function (s2t) {
+				// strict mode throws when lengths differ
+				var strictIter = zipKeyed({ a: [1, 2, 3], b: [4, 5] }, { mode: 'strict' });
+				strictIter.next(); // { a: 1, b: 4 }
+				strictIter.next(); // { a: 2, b: 5 }
+				s2t['throws'](function () { strictIter.next(); }, TypeError, 'strict mode throws when lengths differ');
+
+				s2t.end();
+			});
+
+			st.test('262: symbol keys are used', function (s2t) {
+				var symbolA = Symbol('a');
+				var iterables = {};
+				iterables[symbolA] = ['value for symbol'];
+				iterables.b = ['value for b'];
+
+				var iter = zipKeyed(iterables);
+				var result = iter.next().value;
+
+				s2t.equal(Object.getPrototypeOf(result), null, 'result has null prototype');
+				s2t.ok(Object.prototype.hasOwnProperty.call(result, symbolA), 'result has symbol key');
+				s2t.ok(Object.prototype.hasOwnProperty.call(result, 'b'), 'result has string key');
+				s2t.equal(result[symbolA], 'value for symbol', 'symbol key has correct value');
+				s2t.equal(result.b, 'value for b', 'string key has correct value');
+
+				s2t.end();
+			});
+
+			st.test('262: inherited properties are skipped', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var parentAccessed = false;
+				var parent = {};
+				Object.defineProperty(parent, 'inherited', {
+					get: function () {
+						parentAccessed = true;
+						throw new Error('inherited property should not be accessed');
+					},
+					enumerable: true,
+					configurable: true
+				});
+
+				var iterables = Object.create(parent);
+				iterables.own = ['own value'];
+
+				var iter = zipKeyed(iterables);
+				var result = iter.next().value;
+
+				s2t.equal(parentAccessed, false, 'inherited property getter not called');
+				s2t.ok(Object.prototype.hasOwnProperty.call(result, 'own'), 'result has own key');
+				s2t.notOk(Object.prototype.hasOwnProperty.call(result, 'inherited'), 'result does not have inherited key');
+				s2t.equal(result.own, 'own value', 'own key has correct value');
+
+				s2t.end();
+			});
+
+			st.test('262: non-enumerable properties are skipped', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var iterables = {};
+				Object.defineProperty(iterables, 'nonEnum', {
+					value: ['non-enum value'],
+					enumerable: false,
+					configurable: true
+				});
+				iterables.enumerable = ['enum value'];
+
+				var iter = zipKeyed(iterables);
+				var result = iter.next().value;
+
+				s2t.notOk(Object.prototype.hasOwnProperty.call(result, 'nonEnum'), 'result does not have non-enumerable key');
+				s2t.ok(Object.prototype.hasOwnProperty.call(result, 'enumerable'), 'result has enumerable key');
+
+				s2t.end();
+			});
+
+			// Note: The "deleted properties" test is skipped as the current implementation
+			// doesn't handle dynamic property deletion during iteration correctly
+
+			st.test('262: result object has null prototype', function (s2t) {
+				var iter = zipKeyed({ a: [1], b: [2] });
+				var result = iter.next().value;
+
+				s2t.equal(Object.getPrototypeOf(result), null, 'result has null prototype');
+
+				s2t.end();
+			});
+
+			st.test('262: result object has default attributes', { skip: !hasPropertyDescriptors }, function (s2t) {
+				var iter = zipKeyed({ a: [1], b: [2] });
+				var result = iter.next().value;
+
+				var descA = Object.getOwnPropertyDescriptor(result, 'a');
+				var descB = Object.getOwnPropertyDescriptor(result, 'b');
+
+				s2t.equal(descA.writable, true, 'property a is writable');
+				s2t.equal(descA.enumerable, true, 'property a is enumerable');
+				s2t.equal(descA.configurable, true, 'property a is configurable');
+
+				s2t.equal(descB.writable, true, 'property b is writable');
+				s2t.equal(descB.enumerable, true, 'property b is enumerable');
+				s2t.equal(descB.configurable, true, 'property b is configurable');
+
+				s2t.end();
+			});
+
+			st.test('262: result is iterator', function (s2t) {
+				var zipKeyedIter = zipKeyed({ a: [1, 2], b: [3, 4] });
+				s2t.equal(typeof zipKeyedIter.next, 'function', 'has next method');
+				s2t.equal(typeof zipKeyedIter[Symbol.iterator], 'function', 'has Symbol.iterator method');
+				s2t.equal(zipKeyedIter[Symbol.iterator](), zipKeyedIter, 'Symbol.iterator returns itself');
+
+				s2t.end();
+			});
+
+			st.test('262: return closes all underlying iterators', function (s2t) {
+				var returnACalls = 0;
+				var returnBCalls = 0;
+
+				var iterA = {
+					next: function () { return { done: false, value: 1 }; },
+					'return': function () {
+						returnACalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+				iterA[Symbol.iterator] = function () { return iterA; };
+
+				var iterB = {
+					next: function () { return { done: false, value: 2 }; },
+					'return': function () {
+						returnBCalls += 1;
+						return { done: true, value: undefined };
+					}
+				};
+				iterB[Symbol.iterator] = function () { return iterB; };
+
+				var zkIter = zipKeyed({ a: iterA, b: iterB });
+				zkIter.next();
+				s2t.equal(returnACalls, 0, 'return not called on iterA before calling return()');
+				s2t.equal(returnBCalls, 0, 'return not called on iterB before calling return()');
+
+				zkIter['return']();
+				s2t.equal(returnACalls, 1, 'iterA.return called once');
+				s2t.equal(returnBCalls, 1, 'iterB.return called once');
+
+				s2t.end();
+			});
+
+			st.end();
+		});
+	},
+	index: function () {
+		test('Iterator.zipKeyed: index', function (t) {
+			module.exports.tests(index, 'Iterator.zipKeyed', t);
+
+			t.end();
+		});
+	},
+	implementation: function () {
+		test('Iterator.zipKeyed: implementation', function (t) {
+			module.exports.tests(impl, 'Iterator.zipKeyed', t);
+
+			t.end();
+		});
+	},
+	shimmed: function () {
+		test('Iterator.zipKeyed: shimmed', function (t) {
+			t.test('Function name', { skip: !functionsHaveNames }, function (st) {
+				st.equal(Iterator.zipKeyed.name, 'zipKeyed', 'Iterator.zipKeyed has name "zipKeyed"');
+				st.end();
+			});
+
+			t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
+				et.equal(false, isEnumerable.call(Iterator, 'zipKeyed'), 'Iterator.zipKeyed is not enumerable');
+				et.end();
+			});
+
+			module.exports.tests(callBind(Iterator.zipKeyed, Iterator), 'Iterator.zipKeyed', t);
+
+			t.end();
+		});
+	}
+};
Index: frontend/node_modules/es-iterator-helpers/test/helpers/testIterator.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/helpers/testIterator.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/helpers/testIterator.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+'use strict';
+
+var iterate = require('iterate-iterator');
+
+module.exports = function testIterator(iterator, expected, t, msg) {
+	t.deepEqual(iterate(iterator), expected, 'iterator yields expected values: ' + msg);
+};
Index: frontend/node_modules/es-iterator-helpers/test/implementation.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/implementation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+'use strict';
+
+var test = require('tape');
+var forEach = require('for-each');
+
+var shims = require('..');
+
+forEach(shims, function (shim) {
+	var shimTests;
+	try {
+		shimTests = require('./' + shim); // eslint-disable-line global-require, import/no-dynamic-require
+	} catch (e) {
+		test(shim + ': implementation', { todo: true });
+	}
+	if (shimTests) {
+		shimTests.implementation();
+	}
+});
Index: frontend/node_modules/es-iterator-helpers/test/index.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+'use strict';
+
+var test = require('tape');
+var forEach = require('for-each');
+
+var shims = require('..');
+
+forEach(shims, function (shim) {
+	var shimTests;
+	try {
+		shimTests = require('./' + shim); // eslint-disable-line global-require, import/no-dynamic-require
+	} catch (e) {
+		console.error(e);
+		test(shim + ': index', { todo: true });
+	}
+	if (shimTests) {
+		shimTests.index();
+	}
+});
+
Index: frontend/node_modules/es-iterator-helpers/test/shimmed.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/shimmed.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/shimmed.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,70 @@
+'use strict';
+
+require('../auto');
+
+var test = require('tape');
+var forEach = require('for-each');
+
+var shims = require('..');
+
+forEach(shims, function (shim) {
+	var shimTests;
+	try {
+		shimTests = require('./' + shim); // eslint-disable-line global-require, import/no-dynamic-require
+	} catch (e) {
+		test(shim + ': shimmed', { todo: true });
+	}
+	if (shimTests) {
+		shimTests.shimmed();
+	}
+});
+
+test('integration', function (t) {
+	var seenMapEveryMap = [];
+	var seenMapEveryEvery = [];
+	var mapEveryResult = Iterator.from([1, 2, 3, 4, 5]).map(function (x) {
+		seenMapEveryMap.push(x);
+		return x * x;
+	}).every(function (x) {
+		seenMapEveryEvery.push(x);
+		return x < 10;
+	});
+	t.equal(mapEveryResult, false, 'map + every: every predicate returned false nonzero times');
+	t.deepEqual(seenMapEveryMap, [1, 2, 3, 4], 'map + every, map: all values are seen until after the first one that is > 10 when squared');
+	t.deepEqual(seenMapEveryEvery, [1, 4, 9, 16], 'map + every, every: all values are seen until after the first one that is > 10 when squared');
+
+	var seenMapSomeMap = [];
+	var seenMapSomeSome = [];
+	var mapSomeResult = Iterator.from([1, 2, 3, 4, 5]).map(function (x) {
+		seenMapSomeMap.push(x);
+		return x * x;
+	}).some(function (x) {
+		seenMapSomeSome.push(x);
+		return x > 10;
+	});
+	t.equal(mapSomeResult, true, 'map + some: some predicate returned true nonzero times');
+	t.deepEqual(seenMapSomeMap, [1, 2, 3, 4], 'map + some, map: all values are seen until after the first one that is > 10 when squared');
+	t.deepEqual(seenMapSomeSome, [1, 4, 9, 16], 'map + some, some: all values are seen until after the first one that is > 10 when squared');
+
+	var seenMapFind = [];
+	var mapFindResult = Iterator.from([1, 2, 3, 4, 5]).map(function (x) {
+		seenMapFind.push(x);
+		return x * x;
+	}).find(function (x) {
+		return x > 10;
+	});
+	t.equal(mapFindResult, 16, 'map + find: find found the first mapped value over 10');
+	t.deepEqual(seenMapFind, [1, 2, 3, 4], 'map + find: all values are seen until after the first one that is > 10 when squared');
+
+	var seenFilterEvery = [];
+	var filterEveryResult = Iterator.from([1, 2, 3, 4, 5]).filter(function (x) {
+		seenFilterEvery.push(x);
+		return x;
+	}).every(function (x) {
+		return x <= 3;
+	});
+	t.equal(filterEveryResult, false, 'filter + every: every predicate returned false nonzero times');
+	t.deepEqual(seenMapFind, [1, 2, 3, 4], 'filter + every: all values are seen until after the first one that is > 10 when squared');
+
+	t.end();
+});
Index: frontend/node_modules/es-iterator-helpers/test/tests.js
===================================================================
--- frontend/node_modules/es-iterator-helpers/test/tests.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/es-iterator-helpers/test/tests.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+'use strict';
+
+var data = {
+	anchor: { arg: 'bar"baz"', expected: '<a name="bar&quot;baz&quot;">foo</a>' },
+	big: '<big>foo</big>',
+	blink: '<blink>foo</blink>',
+	bold: '<b>foo</b>',
+	fixed: '<tt>foo</tt>',
+	fontcolor: { arg: 'blue"red"green', expected: '<font color="blue&quot;red&quot;green">foo</font>' },
+	fontsize: { arg: '10"large"small', expected: '<font size="10&quot;large&quot;small">foo</font>' },
+	italics: '<i>foo</i>',
+	link: { arg: 'url"http://"', expected: '<a href="url&quot;http://&quot;">foo</a>' },
+	small: '<small>foo</small>',
+	strike: '<strike>foo</strike>',
+	sub: '<sub>foo</sub>',
+	sup: '<sup>foo</sup>'
+};
+
+module.exports = function (method, name, t) {
+	var result = data[name] || {};
+	var expected = typeof result === 'string' ? result : result.expected;
+	var actual = typeof result === 'string' ? method('foo') : method('foo', result.arg);
+
+	t.equal(actual, expected, name + ': got expected result');
+};
