toiljs 0.0.109 → 0.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.0.108] - 2026-07-06
4
+
5
+ - No changes
6
+
7
+
3
8
  ## [v0.0.107] - 2026-07-05
4
9
 
5
10
  - No changes
@@ -1 +1 @@
1
- {"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/typescript/lib/lib.es2025.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/typescript/lib/lib.webworker.d.ts","../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/typescript/lib/lib.webworker.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/typescript/lib/lib.es2025.collection.d.ts","../../node_modules/typescript/lib/lib.es2025.float16.d.ts","../../node_modules/typescript/lib/lib.es2025.intl.d.ts","../../node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../node_modules/typescript/lib/lib.es2025.promise.d.ts","../../node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.date.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.error.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.esnext.temporal.d.ts","../../node_modules/typescript/lib/lib.esnext.typedarrays.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/picocolors/types.d.ts","../../node_modules/picocolors/picocolors.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/blob.d.ts","../../node_modules/@types/node/web-globals/console.d.ts","../../node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/encoding.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/utility.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client-stats.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/round-robin-pool.d.ts","../../node_modules/undici-types/h2c-client.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/dispatcher1-wrapper.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-call-history.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/socks5-proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/importmeta.d.ts","../../node_modules/@types/node/web-globals/messaging.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/performance.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/web-globals/timers.d.ts","../../node_modules/@types/node/web-globals/url.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/ffi.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/inspector/promises.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/path/posix.d.ts","../../node_modules/@types/node/path/win32.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/quic.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/iter.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/test/reporters.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/util/types.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/zlib/iter.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/vite/types/hmrPayload.d.ts","../../node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","../../node_modules/vite/types/customEvent.d.ts","../../node_modules/rolldown/dist/shared/logging-BSNejiLS.d.mts","../../node_modules/@oxc-project/types/types.d.ts","../../node_modules/rolldown/dist/shared/binding-B1q9aYT-.d.mts","../../node_modules/@rolldown/pluginutils/dist/filter/index.d.mts","../../node_modules/@rolldown/pluginutils/dist/index.d.mts","../../node_modules/rolldown/dist/shared/define-config-BBz954-q.d.mts","../../node_modules/rolldown/dist/index.d.mts","../../node_modules/rolldown/dist/parse-ast-index.d.mts","../../node_modules/vite/types/internal/rollupTypeCompat.d.ts","../../node_modules/rolldown/dist/shared/constructors-2i1T9YcF.d.mts","../../node_modules/rolldown/dist/plugins-index.d.mts","../../node_modules/rolldown/dist/shared/transform-CEmFsvJW.d.mts","../../node_modules/rolldown/dist/utils-index.d.mts","../../node_modules/vite/types/hot.d.ts","../../node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/esbuild/lib/main.d.ts","../../node_modules/vite/types/internal/esbuildOptions.d.ts","../../node_modules/vite/types/metadata.d.ts","../../node_modules/vite/types/internal/terserOptions.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/lightningcss/node/ast.d.ts","../../node_modules/lightningcss/node/targets.d.ts","../../node_modules/lightningcss/node/index.d.ts","../../node_modules/vite/types/internal/lightningcssOptions.d.ts","../../node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","../../node_modules/rolldown/dist/filter-index.d.mts","../../node_modules/vite/types/importGlob.d.ts","../../node_modules/vite/dist/node/index.d.ts","../shared/index.d.ts","../../src/compiler/routes.ts","../../src/compiler/seo.ts","../../src/compiler/config.ts","../../node_modules/@vitejs/plugin-react/types/optionalTypes.d.ts","../../node_modules/@vitejs/plugin-react/dist/index.d.ts","../../node_modules/@img/colour/index.d.ts","../../node_modules/sharp/dist/index.d.mts","../../node_modules/imagetools-core/dist/transforms/kernel.d.ts","../../node_modules/imagetools-core/dist/transforms/position.d.ts","../../node_modules/imagetools-core/dist/types.d.ts","../../node_modules/imagetools-core/dist/transforms/autoOrient.d.ts","../../node_modules/imagetools-core/dist/transforms/background.d.ts","../../node_modules/imagetools-core/dist/transforms/blur.d.ts","../../node_modules/imagetools-core/dist/transforms/effort.d.ts","../../node_modules/imagetools-core/dist/transforms/fit.d.ts","../../node_modules/imagetools-core/dist/transforms/flatten.d.ts","../../node_modules/imagetools-core/dist/transforms/flip.d.ts","../../node_modules/imagetools-core/dist/transforms/flop.d.ts","../../node_modules/imagetools-core/dist/transforms/format.d.ts","../../node_modules/imagetools-core/dist/transforms/grayscale.d.ts","../../node_modules/imagetools-core/dist/transforms/hsb.d.ts","../../node_modules/imagetools-core/dist/transforms/invert.d.ts","../../node_modules/imagetools-core/dist/transforms/lossless.d.ts","../../node_modules/imagetools-core/dist/transforms/median.d.ts","../../node_modules/imagetools-core/dist/transforms/normalize.d.ts","../../node_modules/imagetools-core/dist/transforms/progressive.d.ts","../../node_modules/imagetools-core/dist/transforms/quality.d.ts","../../node_modules/imagetools-core/dist/transforms/resize.d.ts","../../node_modules/imagetools-core/dist/transforms/rotate.d.ts","../../node_modules/imagetools-core/dist/transforms/tint.d.ts","../../node_modules/imagetools-core/dist/builtins.d.ts","../../node_modules/imagetools-core/dist/output-formats.d.ts","../../node_modules/imagetools-core/dist/lib/parse-url.d.ts","../../node_modules/imagetools-core/dist/lib/resolve-configs.d.ts","../../node_modules/imagetools-core/dist/lib/generate-transforms.d.ts","../../node_modules/imagetools-core/dist/lib/apply-transforms.d.ts","../../node_modules/imagetools-core/dist/lib/metadata.d.ts","../../node_modules/imagetools-core/dist/index.d.ts","../../node_modules/vite-imagetools/dist/types.d.ts","../../node_modules/vite-imagetools/dist/index.d.ts","../../node_modules/node-stdlib-browser/esm/index.d.ts","../../node_modules/vite-plugin-node-polyfills/dist/utils.d.ts","../../node_modules/vite-plugin-node-polyfills/dist/index.d.ts","../../src/compiler/fonts.ts","../../src/compiler/image-report.ts","../../src/compiler/image-blur.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/client.d.ts","../../node_modules/@types/react-dom/static.d.ts","../../node_modules/@types/react-dom/server.d.ts","../../src/compiler/email-preview.ts","../../src/compiler/toil-docs.generated.ts","../../src/compiler/docs.ts","../../node_modules/typescript/lib/typescript.d.ts","../../src/compiler/prerender.ts","../../src/compiler/pages.ts","../../src/compiler/generate.ts","../../src/compiler/plugin.ts","../../src/compiler/sri.ts","../../src/compiler/vite.ts","../../src/compiler/emails.ts","../../src/compiler/auth-emails.ts","../backend/index.d.ts","../../src/compiler/ssg.ts","../../src/compiler/template.ts","../../src/compiler/ssr-codegen.ts","../../src/compiler/template-build.ts","../devserver/runtime/crypto.d.ts","../devserver/runtime/host.d.ts","../devserver/db/types.d.ts","../devserver/db/database.d.ts","../devserver/db/catalog.d.ts","../devserver/db/derives.d.ts","../devserver/db/index.d.ts","../devserver/daemon/host.d.ts","../../node_modules/@dacely/uwebsockets.js/index.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/LiveFile.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/SSEventStream.d.ts","../../node_modules/@dacely/hyper-express/types/components/http/Response.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/MultipartField.d.ts","../../node_modules/@dacely/hyper-express/types/components/http/Request.d.ts","../../node_modules/typed-emitter/index.d.ts","../../node_modules/@dacely/hyper-express/types/components/ws/Websocket.d.ts","../../node_modules/@dacely/hyper-express/types/components/middleware/MiddlewareNext.d.ts","../../node_modules/@dacely/hyper-express/types/components/middleware/MiddlewareHandler.d.ts","../../node_modules/@dacely/hyper-express/types/components/router/Router.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/HostManager.d.ts","../../node_modules/@dacely/hyper-express/types/components/Server.d.ts","../../node_modules/@dacely/hyper-express/types/index.d.ts","../devserver/http/proxy.d.ts","../devserver/ssr.d.ts","../devserver/server.d.ts","../devserver/production-ipc.d.ts","../devserver/production.d.ts","../devserver/http/envelope.d.ts","../devserver/db/routeKinds.d.ts","../devserver/runtime/module.d.ts","../devserver/daemon/catalog.d.ts","../devserver/daemon/index.d.ts","../devserver/daemon/cron.d.ts","../devserver/wasm/surface.d.ts","../devserver/wasm/sections.d.ts","../devserver/index.d.ts","../../src/compiler/index.ts"],"fileIdsList":[[97,162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,373],[97,162,170,175,178,180,181,182,195,343,344,349],[97,162,170,175,178,180,181,182,195,350,373],[97,162,170,175,178,180,181,182,195,345],[97,162,170,175,178,180,181,182,195,344,345],[97,162,170,175,178,180,181,182,195,345,346,347,348],[97,162,170,175,178,180,181,182,195,364],[97,162,170,175,178,180,181,182,195,344,350,365,367,369,370,372,373,374,375,376,377],[97,162,170,175,178,180,181,182,195,273,350,366,368],[97,162,167,170,175,178,180,181,182,195,344],[97,162,170,175,178,180,181,182,195,343,349],[97,162,170,175,178,180,181,182,195,344,349,370,371],[97,162,170,175,178,180,181,182,195,273,350,365,366],[97,162,170,175,178,180,181,182,195,200,351,354,356,361,362],[97,162,170,175,178,180,181,182,195,200,351,355,363],[97,162,170,175,178,180,181,182,195,200,351,352,353,363],[97,162,170,175,178,180,181,182,195,354,356,359],[97,162,170,173,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,200],[97,162,170,175,178,180,181,182,195,354],[97,162,170,175,178,180,181,182,195,200,351,354,356,358,360],[97,162,170,173,175,178,180,181,182,195,200,351,354,357],[97,162,170,175,178,180,181,182,195,351,352,353,354,355,356,358,359,360,361,363],[97,162,170,175,178,180,181,182,195,229],[97,159,160,162,170,175,178,180,181,182,195],[97,161,162,170,175,178,180,181,182,195],[162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,204],[97,162,163,168,170,173,175,178,180,181,182,184,195,200,213],[97,162,163,164,170,173,175,178,180,181,182,195],[97,162,165,170,175,178,180,181,182,195,214],[97,162,166,167,170,175,178,180,181,182,186,195],[97,162,167,170,175,178,180,181,182,195,200,210],[97,162,168,170,173,175,178,180,181,182,184,195],[97,161,162,169,170,175,178,180,181,182,195],[97,162,170,171,175,178,180,181,182,195],[97,162,170,172,173,175,178,180,181,182,195],[97,161,162,170,173,175,178,180,181,182,195],[97,162,170,173,175,176,178,180,181,182,195,200,213],[97,162,170,173,175,176,178,180,181,182,195,200,202,204],[97,149,162,170,173,175,177,178,180,181,182,184,195,200,213],[97,162,170,173,175,177,178,180,181,182,184,195,200,210,213],[97,162,170,175,177,178,179,180,181,182,195,200,210,213],[96,97,98,99,100,101,102,103,104,105,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221],[97,162,170,175,178,180,182,195],[97,162,170,175,178,180,181,182,183,195,213],[97,162,170,173,175,178,180,181,182,184,195,200],[97,162,170,175,178,180,181,182,186,195],[97,162,170,175,178,180,181,182,187,195],[97,162,170,173,175,178,180,181,182,190,195],[97,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[97,162,170,175,178,180,181,182,192,195],[97,162,170,175,178,180,181,182,193,195],[97,162,167,170,175,178,180,181,182,184,195,204],[97,162,170,173,175,178,180,181,182,195,196],[97,162,170,175,178,180,181,182,195,197,214,217],[97,162,170,173,175,178,180,181,182,195,200,202,203,204],[97,162,170,175,178,180,181,182,195,201,204],[97,162,170,173,175,178,180,181,182,195,200,202],[97,162,170,173,175,178,180,181,182,195,200,203,204],[97,162,170,175,178,180,181,182,195,204,214],[97,162,170,175,178,180,181,182,195,205],[97,159,162,170,175,178,180,181,182,195,200,207,213],[97,162,170,175,178,180,181,182,195,200,206],[97,162,170,173,175,178,180,181,182,195,208,209],[97,162,170,175,178,180,181,182,195,208,209],[97,162,167,170,175,178,180,181,182,184,195,200,210],[97,162,170,175,178,180,181,182,195,211],[97,162,170,175,178,180,181,182,184,195,212],[97,162,170,175,177,178,180,181,182,193,195,213],[97,162,170,175,178,180,181,182,195,214,215],[97,162,167,170,175,178,180,181,182,195,215],[97,162,170,175,178,180,181,182,195,200,216],[97,162,170,175,178,180,181,182,183,195,217],[97,162,170,175,178,180,181,182,195,218],[97,162,165,170,175,178,180,181,182,195],[97,162,167,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,214],[97,149,162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,213],[97,162,170,175,178,180,181,182,195,219],[97,162,170,175,178,180,181,182,190,195],[97,162,170,175,178,180,181,182,195,209],[97,149,162,170,173,175,176,178,180,181,182,190,195,200,204,213,216,217,219],[97,162,170,175,178,180,181,182,195,200,220],[97,162,170,175,178,180,181,182,195,202,221],[97,162,170,175,178,180,181,182,195,322],[97,162,170,175,178,180,181,182,195,322,323,324],[97,162,170,175,178,180,181,182,195,322,323],[97,162,170,175,178,180,181,182,195,320,321],[97,162,170,175,178,180,181,182,195,272,277],[97,162,170,175,178,180,181,182,195,283,284,286,289,290,291,292,293,294,295,297,298,301,302,303],[97,162,170,175,178,180,181,182,195,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310],[97,162,170,175,178,180,181,182,195,280,283,310],[97,162,170,175,178,180,181,182,195,283],[97,162,170,175,178,180,181,182,195,311],[97,162,170,175,178,180,181,182,195,280,281,282,310],[97,162,170,175,178,180,181,182,195,265,266],[94,97,162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,260],[97,162,170,175,178,180,181,182,195,258,260],[97,162,170,175,178,180,181,182,195,249,257,258,259,261,263],[97,162,170,175,178,180,181,182,195,247],[97,162,170,175,178,180,181,182,195,250,255,260,263],[97,162,170,175,178,180,181,182,195,246,263],[97,162,170,175,178,180,181,182,195,250,251,254,255,256,263],[97,162,170,175,178,180,181,182,195,250,251,252,254,255,263],[97,162,170,175,178,180,181,182,195,247,248,249,250,251,255,256,257,259,260,261,263],[97,162,170,175,178,180,181,182,195,263],[97,162,170,175,178,180,181,182,195,245,247,248,249,250,251,252,254,255,256,257,258,259,260,261,262],[97,162,170,175,178,180,181,182,195,245,263],[97,162,170,175,178,180,181,182,195,250,252,253,255,256,263],[97,162,170,175,178,180,181,182,195,254,263],[97,162,170,175,178,180,181,182,195,255,256,260,263],[97,162,170,175,178,180,181,182,195,248,258],[97,162,170,175,178,180,181,182,195,231],[97,162,170,175,178,180,181,182,195,226,228,231],[97,162,170,175,178,180,181,182,195,227,228],[97,162,170,175,178,180,181,182,195,228,231,235],[97,162,170,175,178,180,181,182,195,227],[97,162,170,175,178,180,181,182,195,228,231],[97,162,170,175,178,180,181,182,195,226,227,228,230],[97,162,170,175,178,180,181,182,195,226,228],[97,162,170,175,178,180,181,182,195,227,228,237],[97,162,170,175,178,180,181,182,195,200,222,279],[97,112,115,118,119,162,170,175,178,180,181,182,195,213],[97,115,162,170,175,178,180,181,182,195,200,213],[97,115,119,162,170,175,178,180,181,182,195,213],[97,109,162,170,175,178,180,181,182,195],[97,113,162,170,175,178,180,181,182,195],[97,111,112,115,162,170,175,178,180,181,182,195,213],[97,162,170,175,178,180,181,182,184,195,210],[97,162,170,175,178,180,181,182,195,222],[97,109,162,170,175,178,180,181,182,195,222],[97,111,115,162,170,175,178,180,181,182,184,195,213],[97,106,107,108,110,114,162,170,173,175,178,180,181,182,195,200,213],[97,115,162,170,175,178,180,181,182,195],[97,115,124,133,162,170,175,178,180,181,182,195],[97,107,113,162,170,175,178,180,181,182,195],[97,115,143,144,162,170,175,178,180,181,182,195],[97,107,110,115,162,170,175,178,180,181,182,195,204,213,222],[97,111,115,162,170,175,178,180,181,182,195,213],[97,106,162,170,175,178,180,181,182,195],[97,109,110,111,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,144,145,146,147,148,162,170,175,178,180,181,182,195],[97,115,136,139,162,170,175,178,180,181,182,195],[97,115,124,126,127,162,170,175,178,180,181,182,195],[97,113,115,126,128,162,170,175,178,180,181,182,195],[97,114,162,170,175,178,180,181,182,195],[97,107,109,115,162,170,175,178,180,181,182,195],[97,115,119,126,128,162,170,175,178,180,181,182,195],[97,119,162,170,175,178,180,181,182,195],[97,113,115,118,162,170,175,178,180,181,182,195,213],[97,107,111,115,124,162,170,175,178,180,181,182,195],[97,115,136,162,170,175,178,180,181,182,195],[97,128,162,170,175,178,180,181,182,195],[97,107,111,115,119,162,170,175,178,180,181,182,195],[97,109,115,143,162,170,175,178,180,181,182,195,204,219,222],[97,162,170,175,178,180,181,182,195,272,311,312],[97,162,170,175,178,180,181,182,195,280,310,311],[97,162,170,175,178,180,181,182,195,272,315],[97,162,170,175,178,180,181,182,195,272,314],[97,162,170,175,178,180,181,182,195,223],[97,162,170,173,175,177,178,179,180,181,182,184,195,200,210,213,220,222,223,224,225,232,233,234,236,238,240,242,243,244,264,268,269,270,271,272],[97,162,170,175,178,180,181,182,195,223,224,225,239],[97,162,170,175,178,180,181,182,195,225],[97,162,170,175,178,180,181,182,195,241],[97,162,170,175,178,180,181,182,195,267],[97,162,170,175,178,180,181,182,195,232,243,272],[97,162,170,175,178,180,181,182,195,232,272],[95,97,162,170,175,178,180,181,182,187,195,272,276,325,335,336],[97,162,170,175,178,180,181,182,187,195,213,272,273,275],[97,162,170,175,178,180,181,182,187,195,327],[97,162,170,175,178,180,181,182,187,195,272,276,325,336],[95,97,162,170,175,178,180,181,182,187,195,272,276,325,335],[97,162,170,175,178,180,181,182,195,272,276],[97,162,170,175,178,180,181,182,187,195,274,275,276,328,331],[97,162,170,175,178,180,181,182,195,272,280,310],[95,97,162,170,175,178,180,181,182,187,195,272],[95,97,162,163,170,175,178,180,181,182,183,184,187,195,213,272,274,276,328,332,335,336,337,338,339,342,378],[97,162,170,175,178,180,181,182,183,187,195,274,329,330],[97,162,163,170,175,177,178,180,181,182,183,187,195,213,272,274,276,326,332],[97,162,170,175,178,180,181,182,183,187,195,213,272,274,275,276,329],[97,162,170,175,178,180,181,182,195,274],[97,162,167,170,175,178,180,181,182,187,195,272,276],[97,162,170,175,178,180,181,182,187,195,272,274,275,276,330,335],[97,162,170,175,178,180,181,182,195,340],[97,162,170,175,178,180,181,182,183,187,195,272,274,275,276,322,325,330,332,335,340,341],[95,97,162,170,175,178,180,181,182,183,187,195,213,272,276,278,313,316,317,318,319,330,333,334]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"17f13ecb98cbc39243f2eee1f16d45cd8ec4706b03ee314f1915f1a8b42f6984","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"d52ed68e7eb5881768a55713c9b5c7c443e6b46de15c04e348928b8efd20b110","affectsGlobalScope":true,"impliedFormat":1},{"version":"2a2de5b9459b3fc44decd9ce6100b72f1b002ef523126c1d3d8b2a4a63d74d78","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"5fcab789c73a97cd43828ee3cc94a61264cf24d4c44472ce64ced0e0f148bdb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"673294292640f5722b700e7d814e17aaf7d93f83a48a2c9b38f33cbc940ad8b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"d786b48f934cbca483b3c6d0a798cb43bbb4ada283e76fb22c28e53ae05b9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"142efd4ce210576f777dc34df121777be89eda476942d6d6663b03dcb53be3ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"379bc41580c2d774f82e828c70308f24a005b490c25ba34d679d84bcf05c3d9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed484fb2aa8a1a23d0277056ec3336e0a0b52f9b8d6a961f338a642faf43235d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"83a730b125d477dd264df8ba479afab27a3dae7152b005c214ab94dc7ee44fd3","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"590595c1230ebb7c43ebac51b2b2da956a719b213355b4358e2a6b16a8b5936c","impliedFormat":1},{"version":"8c5f0739f00f89f89b03a1fe6658c6d78000d7ebd7f556f0f8d6908fa679de35","impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"f53a7652392cf26ebbe4e29fd0672aa87c93bd6d0241289c13fab87b9ac35c8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"b00a630557d1622ad312633bdbfbdb9c6b7220d948dca9f899db30679f160074","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"88809d6c1b9c78d04a133646a6feb926def05a8774c308c7c93bc32ee163d271","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"3ac40516c33b87f751f7507346933081a26cdb8a3e11a6b3aa07d23f803c85db","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"14e9acf826baba0ef4b5665704084896e7bcc06f65a9ab13af7e93d27d6b7069","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"829bc57ee8f287b490ab5bbc5a962fca57e432c1e38ec680ecd3ecaf12800613","impliedFormat":1},{"version":"eec76bf6b9346f3f95fa402621b889489e96930e72295b0369022f332e9b4a6a","impliedFormat":1},{"version":"3a3ff14da53d5013f3e6d8c4ad55225e3649c08786c4421ce639c00d8d589b7d","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"38004e6801340cb890afb8cb5a9fc8972297e7f88ab94026e4b0b3c61fb32f8a","impliedFormat":1},{"version":"d243db6b25788f439e7e2f03c05688e92f46764351673bb0e7b2f3631232e186","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"149f9a9e7f04e67afa0e2a49fc0ff421035c01d6b793cfcae7d2e9f6819431e2","impliedFormat":1},{"version":"e8a9dfa4c75ef6d25df8b40eaa9c31e0a69452aaf2ced4a3f4215dbdbaa876f4","impliedFormat":1},{"version":"a70af845a2eb9dd6e2723e319e14ea7fb28b129ec1361c21509b49305448c323","impliedFormat":1},{"version":"b53dc572d4f187904207ae1166652de47aab8eeb00c254d009cb226863076b56","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"f501234c5aeeeb5d7659412335227466aaacf30b952372d60afeb21c02c96348","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"9ac977503f15bf13ca7c82ad9a32a782f42d43e474824e8b3bffe228fd5f2639","impliedFormat":1},{"version":"8b91ff5bb912be3ea213cbcf0075aace1f5d4ff249a0d227ed673868cb7bfabc","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"7cb4f431a4591b0e23002bed805dc871a874dfed6b9a3994dce68a6df73e6739","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"e99963ae1e3a48ca7a7958c02f3e88bb963eb7978c28b68ae6b8c9f03309d83c","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"594ae90cacd813fa392ff80d2e0a8eff4e41f4a136329a940e321399dd8895b4","impliedFormat":1},{"version":"d1f333ade8ff35a409b4984e1f11956fe11c61855b0c7e9b59f0313e48b40c4a","impliedFormat":1},{"version":"0224aa4b3464895d69c413a640a19ac2166778a74eb5eb3b36b021c72d42b274","impliedFormat":1},{"version":"2e6fca0024dd8a076a886d9ec031a936ea59ad878a25b944820495d92f8381dd","affectsGlobalScope":true,"impliedFormat":1},{"version":"177459cba484e2f1e08872a3d2fdbca3162d9d43ca5ec9dc0c946835b55f74be","impliedFormat":1},{"version":"2fbf504c4791f9d32cd766cfe6b605bcda63289b925401953a7900db9af85348","impliedFormat":1},{"version":"ed0fb633cae35948d9e144004299a4bdf1ab912667c787b7fbffcd6d8c7b92a2","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"0e312260895afc9de021ce9de3c8a857392f0ccc7f19d3a030e4d6136a4ac91e","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"98fc7231d6c846a8ed19bdef026ddffe5e2182cc818be74899287421ad370a87","impliedFormat":1},{"version":"3a40b5d34e014017539acb92f04cf2bc0aa71e49efb33c66039df93be97842a1","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"8c7e618c2a91ea7f6b5cca272a295864e92c16413be8fc56a943e8c7d5320011","affectsGlobalScope":true,"impliedFormat":1},{"version":"79a85c64bf083c5f4dd7074e804d1000c0c47301b84d48417a224decd681be30","impliedFormat":1},{"version":"9f1e3a76d5f509b5579e567de522b402cb79e201c4f47dcd014451c0580b290d","impliedFormat":1},{"version":"2ddab5b6932f9a6327f71baeb82a1d6b0824e0d23a4c7a5de5d355857113c22f","impliedFormat":1},{"version":"70f3f8b2dcaf7388f26731a59c79437813e3620b594903525a303cb2a7901016","impliedFormat":1},{"version":"62e8f884c3bc6dff6189b6e662ebe8b238a645938f2df7a97b8a82fca56773a4","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"57a0d1b3d59063d4af2d3f8aac27cfe3c20a0f5d1faf0f8598ccf0b779637939","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"97234c5303866576f913d0ccae7d58d6322d9e803c7bf1228a3fda46ab8087b2","affectsGlobalScope":true,"impliedFormat":1},{"version":"93ecf87143cac7b9d05cffc1d6bdc075b7e4fdd48ff05f1fad85043f6ae678d3","impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"6f200afcb82b3e9a54bed6db23f2edf2508cd266801257312c0f124b47f2bdb9","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"39338f84e8c4d0e3de7b3c4a7024fb3925f42100eed5cbe73be58902799dff4d","impliedFormat":1},{"version":"fbf83eb33bf5e329527add92acc65da59323876c702ddccf5f4bf1e848c92369","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"515318bc6e656f75e9e34db625316bfafbafd800dfb1642574af93735a24ad38","impliedFormat":1},{"version":"441b9bb09013654aa3d050e68b06464d8959b473e85868249d9d18f692acd35b","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"55246f15e33ff1e2e9e679b25fa9790a48db55dc63d567fe25fac8b6a0efe911","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"03b7804d69cecd66850abada858ed6d4a59001f8c228a9fe212306ee860a4ff6","impliedFormat":1},{"version":"5b26c4dd672d88336bb929787c9bfb55119e80ba89ec6dc923da1c063892843e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"987fd1f85dc36f4b2c927aa3db814ac6b452e970f4f55d24ed4ecbb7df09be00","impliedFormat":1},{"version":"f12624a4a8d042b68914eac1b0a16571fc1c523173fcdf2517c65d191bd5a86c","impliedFormat":1},{"version":"b4769767f13a1692a66186e01c3aa186ff808d5ff72ed36eda8c37738fb2ac92","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"683edfc4f2b411ebe04729cb6dc09ddd26fbac2c57771a6d7c55964af776e176","impliedFormat":1},{"version":"1ec3f3a5f04cc42df33274fbe5c0937d9a9e06f249a7a26288d7d54f0763ffd4","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"e47f532d6e1617833f13a5b0710c0089d402c89c2f2b54f324e5a20e418d287a","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"8e2577e7262051fd3c5bd6ca2b2056d358ff8853565720f92455860824c25188","impliedFormat":1},{"version":"7ec8d7d483f7394f9da611b10d3a0e402f76ff5c991261e6ce43a15f81ca4258","impliedFormat":1},{"version":"bb9dbb4b2ad81e3e71ec5ba4314973718555b9d04ba2a17dfbf875efecb8e2c0","impliedFormat":1},{"version":"82c3cc48c692438e41b94d936b8acd75ca97b18c50fa1af8a0715eb9d07d18cd","impliedFormat":1},{"version":"045a210189ec63c5488410b33f9fca53d77d051599d0d6506d8048551399c5f3","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"632c45ccb4cdc2c3a80c7a36a63dd7763016e59cac5e07bfb3e37e3548957028","impliedFormat":1},{"version":"c9a2daf6cd1eb854cd5b9e424247c5e306692055738c2effd35f7871d942b76e","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"e50a7130339a951e6da9e968ed5521b0997a5b0479e148914087213839b5474c","impliedFormat":1},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"16fe60bb544cfedfd2b5bb2f7d0b3957be7978706d57d9f06edc9c0c8dbdba23","impliedFormat":99},{"version":"de4a612aa8f1704af486f701e21993c786ba7d8cfed55fffa6684026aea2346e","impliedFormat":99},{"version":"c73fdf42528325dd17940937ed787b15ae3445c6a2dae1a2b74bc4d87d337ca2","impliedFormat":99},{"version":"e8e17dfef3cfa9f0847ac93dd535a9896af7fb57c1a1b164484bb1b0ee4a25d8","impliedFormat":99},{"version":"f2ff36fddc8fdbadde620cdfc653ee3e7b722649e1769a527c84a88aa91a76bf","impliedFormat":99},{"version":"638a22f8e16b31c37297483fa38cfc760ed309b16d4c606a7b4532f4394c9c0c","impliedFormat":99},{"version":"9394183f4c37b8591156f32e41223c9e0dd211eefe7499155d4cdf15268eaea8","impliedFormat":99},{"version":"7cd005825cded848f6aef39302c91906c828b56eb2a871f7ec2905be03c410ee","impliedFormat":99},{"version":"8f5dd83a487a147ef727ea1f134d3270feb6e5820c7cec2f3bea2b1896969987","impliedFormat":99},{"version":"ef4cf7840808d33d454407e836d7186000b25b5132d1e5e5d864a598541839fc","impliedFormat":99},{"version":"7d3e062a778b8f5ea4f0cac7e925e31f88e6739812ebc5f827474324a4048f14","impliedFormat":99},{"version":"c21183546a150db7c0619335e32af4fac9a633156a24c49985bd0c54ef93ae2e","impliedFormat":99},{"version":"6209d9e7e93217ab3ff8cef7357ed16a457d8419038de522dafae421bfeeeaa6","impliedFormat":99},{"version":"738aecb56bf52a994c4e3980f356255c5843b505c66ffa8a3142c8e13d30d2b2","impliedFormat":99},{"version":"e04b33dbc442d710225fdc64ad081a202f8b6ac8c6965a46d34fecf1ba3c2a9b","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"8887e70871f697fa42ad7cdf32168db60ec2d6760c173c97973e35377fe5d83b","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0864480ea083087d705f9405bd6bf59b795e8474c3447f0d6413b2bce535a09","impliedFormat":99},{"version":"e67cbea16f1994af89efd700542dbf3828a46a52b29e4d67e801bd7869dc103c","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":99},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":99},{"version":"94325c2597b60c34988a0b335b1b4e94ee758c9cc28fdb3d6837c2b5771d5638","impliedFormat":99},{"version":"e50d04d261120f8f9d07e85698735d5b88f3a66bc395c08ce26c3d817d141a73","affectsGlobalScope":true,"impliedFormat":99},{"version":"27a65fc36588a883248464d29685939a70859d9133db601b696941f518793639","impliedFormat":99},"7427c56ad284f0a61481dac8b11e66b3282aac3674ed9c7bcd91760566157867",{"version":"acc1cfbec259e2d9757c37897193e039c682638c910800ea539659ba97dc6812","signature":"eb02c7c8867cdcf7f7040046e8b57aef92bd814776a267f8bd05fba9f3b4c8f2"},{"version":"fbf47f7bf74f1b02ff88fcafb2d078fc95ee16fd904996819a531381bd259b40","signature":"754e233ac817b8be08782babd95b9a949636d321e33e6f5f551c3dc2eb299c60"},{"version":"20e58eccbf0fd59abb2db10a5e8550089f94c595f94235aa1e5831442516a458","signature":"0690b86569357b2583c089f3570414df97d89dc03361f49197073b0b2b5ab468"},{"version":"2faebfa830ae4cfbfb58e48b0ec20a2a63882d776f0ca36ec7155d45cf1b7f2d","impliedFormat":99},{"version":"dc6e3ce502651ecc523590588213bfb986c04b60f5265d37f76662b824425903","impliedFormat":99},{"version":"2467b00d963828f540f4acd7910f4c04cfe4b489550e6bb682212f65583bca5b","impliedFormat":1},{"version":"854e50b93090b3f8fd6e355b074e1d24dce1ae0240f1ce46563e35fea210a6d5","impliedFormat":99},{"version":"f7e4383f98f1e5b68f8507236fbd60832d391666213bab3ede2dbe4b61417b9d","impliedFormat":99},{"version":"149be55faecff54f412f680211558227bf7dab9d3680f4deac6023fe7cbbd949","impliedFormat":99},{"version":"2ee6918826cb759305128f440bf200073fc0083d499a0c27c0bbdd50c812f53f","impliedFormat":99},{"version":"0488c8ef5e546f2230952237e48f1693ca6ccefe81ffa8dad27c652832013499","impliedFormat":99},{"version":"5b9d2fcfa745b4cb0750e99c340bccb3caedfbbf8e2d1fdcc1558e81d9723ccf","impliedFormat":99},{"version":"53977891ac6dd2f0999c1f87e563d1aaca36a42ed795b9ac8756ddae1220d885","impliedFormat":99},{"version":"18a17db365d40c4eeff41ff1886eaf56d9ca6b9f1c7ea4a7aeff0360a37cbeb9","impliedFormat":99},{"version":"facb3afc979337bc65dfee5aca99672debb63494d290a1a93de5ba0bfe2aaed6","impliedFormat":99},{"version":"4f4f4d55d5877e625861c64c2a36b24e3bc1c0664f0e24d4b4d7289e2af641d1","impliedFormat":99},{"version":"79d3757b73317c225b8378fd80bfa4f31af12ef75f72e344a5b3919fd95ce519","impliedFormat":99},{"version":"c538c581117291675fc3385f93d4eaea9fabac371659b2d5f33fbf1a7995057f","impliedFormat":99},{"version":"672ea9a6a8bc9a5e51e7cea23606a3faecaf720f3ddba23b8c2c91d816f2ffc7","impliedFormat":99},{"version":"870f295d1e4c7b53865a2bccd70acafd9c2bad99f8fa1bdd5e8d63fa79aa0ae3","impliedFormat":99},{"version":"a5c5c45f8479acb992d84421529bb51f57ce760d4a78feab65c4ec1fb26443a5","impliedFormat":99},{"version":"27f7f4347ba66354f67ddfd30477175d6f737e48aa410a66597351ee085d5897","impliedFormat":99},{"version":"9cab09d2fae1eb249a48f699d89164f164d47098bf0496ef48d819d954522be0","impliedFormat":99},{"version":"aed8fdfa1735772a71b641e8b67c5ff071a137d9ccccb3325619d8f3ace1e6b8","impliedFormat":99},{"version":"dcf1cb4cd3b27f0e108d001fc2fed0b8b5259cb35e1d235359b0d641be13110a","impliedFormat":99},{"version":"43ab854546749b24ed1a5c94660c1d4c1e057c7f054cb7ce55685219622a7738","impliedFormat":99},{"version":"ac1ea9507851331f3b2b675c59bc8592198a5cfa98cf074cae126f4cbe1e8527","impliedFormat":99},{"version":"347ac91dc251f916ed60c4359a7ebc7e0fa910bf128d0fd514dadc589a6beb3c","impliedFormat":99},{"version":"35430f542856fbf5d9f84644db699049c591e905c709bfa928f2094c5feb1f7d","impliedFormat":99},{"version":"4f4ca00be6361168ce482f1a8bfd44d37f35548cd7780384fbb0a6c9f25b5439","impliedFormat":99},{"version":"660e17a862d375ae05cee53600bc4e22289376e59a255d6de5ca1b53560ec8b5","impliedFormat":99},{"version":"e16d8f9bd6b01fdad145b7934cdf1b384fea92c0c7cca68776f12ca71feec266","impliedFormat":99},{"version":"f2b98fa6df7305499bf85c66887a3b4ebc0c9e73c24ecfa3ec2d448a02e208f6","impliedFormat":99},{"version":"0204dcd27fad4d0b803909b8c260b145cb947c11c29afe44ceca7a0214d818f1","impliedFormat":99},{"version":"72518f51a9de8d269fc06fe7e812b612fb84f748816fdb8492bcefc358a5a9d0","impliedFormat":99},{"version":"1b0d78ad9e5025e4f87e8f8b64c4ee5f7ab70fd62f4965e89c03a333996a5bdc","impliedFormat":99},{"version":"702ab0e7034b6564557abfa56b3c1b3e6636262e57710abc11ce3ca7451dbe26","impliedFormat":99},{"version":"1a516a7f4bc334d3ad0914f51f0b7438595f71e3979778f91fa98eeece210328","impliedFormat":99},{"version":"00a9f1b94a9cc1d0654bc0ba2ea6c802f59bbc7f81cedab9e352a7e114be232b","impliedFormat":99},{"version":"a6468e004cba50fb5150bfd71221031a521c1141b110fefebf01bb27a2a1eca0","impliedFormat":99},{"version":"816ad2333292d54fb1b764ee3ac7cc86c84f10333d6591d8e5b9b0e82af4c781","impliedFormat":99},{"version":"14d924455728baaf31aa1877d5533689603b9dc5d5f4d4b7224c37320faee815","impliedFormat":99},{"version":"5b9b0308d77913b037d8a98114c81f1d6c59957d74a2828ac4c69d5764ca18e8","impliedFormat":99},{"version":"4dc33f042bc0befa747d78ea308aac831df5fa7aa2bba0cd6b4f0358feac6884","signature":"f2cb8613228d38631e48bd50390519dffbf944012011144058ef2b6c734d748b"},{"version":"fedc60744f04d8a7db4e29cfc4a0d756e95103319acdb14421f0ab5ee3c840e5","signature":"8e72b201f46478a1b85aabc4b8454ab69777f512d6d916e5fad4c7fdc8e72ddb"},{"version":"1a058dcd50e94e7c471db7d66357add40f04a82450d2a7afbd90b5e3d18a67ea","signature":"49f3309e348fdead1954b62f39f74c4d9bc1d547a12cc3b0e0b473acced7d9f6"},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc782ff85b2cb10075ecffc158af7bfb27ff97bf8491c917efea0c3d622d5ac4","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"703ab6e138e341195708373e108eeba31eb1a23a5f618584159c4302feddfda7","signature":"99c1c891320ed07d31223de5c74053371071c2ea7e79abe08ef2dd4f5a0497c9"},{"version":"95d9e1ea7133d833f28aff46277b7fe53ce282ef2e9e09bf3b9cac8d21ccee62","signature":"1510b4d6f80895779e0eff6832519f012229fbd0bd0bd774378d7adc0dad9b0d"},{"version":"93fc3829df844164298ef309f2d80294b26e0c1dfa2e31c31eec2b9bf3a7c405","signature":"dc2d00cdd97f9e637e2a04b1c1e53fdf41a183b30f420d85737d0bd9e0cb05f3"},{"version":"c967e03c8dbb4770f7e2f0b71b5d13593de679a41cc2b60266c4b69f1342a263","impliedFormat":1},{"version":"55dfdf48d02f51b57634939c3c03ab0588a2e6f03ac53bc669b0ca5cafd24c64","signature":"4d3b92f61465a75b4551f4b99eea552a58f60e72f75bcdaefbf9c20193a547c7"},{"version":"a4ddaaef7fc293f9aa2fa8738b9daf6909d9fccfedc73a4e476bf88fa11492fb","signature":"7594c89e58da5cb8cca0b678dead3d963e0166f22a864412c40ba74111fdf4a2"},{"version":"75a990e62ac6bea564ec6b4070bb58f91551759bf93cfbce34b0cf7303957df8","signature":"ac7d0433fdbc4e27cd49935dfdc56ba3ee3fd9fd7670f5a3fbe99fe279e24551"},{"version":"3e6fd76def30965db404c111dc7a11537d1ad0a92eaf21831a4cc362503a773b","signature":"5b3483a0693e49477c7b15f61945ffbe822afed11460f26af060ebb2ac807b15"},{"version":"d628e79de70874945d2b7f93c13551d20beaae2b454a8349bb5ff6e4e9d69e52","signature":"8126af403acc994433119b11a0a9c70b70bcfd643fc8372722f5b60a5c9318c2"},{"version":"03efa38e546999481f92188b74703f72b440c20427ae7d643ba7ef878ef0f9ca","signature":"04074d06a402abc0f0724ca6549afcd06f20d94d2f3dcc6ae453c5411141aacf"},{"version":"4cb3a862982ac87d902fde08eacd8977fc82f41d87f5c111b6cb3608e8039e05","signature":"2fb2ab9bea96527caf97ffd4872d0e695c123040bc82ad582131c24325042e30"},{"version":"95539d8417a8e2162d081f741cac60bb88f5625031ee73d604e3933fb157d1fe","signature":"21d8cfbf79f112c6ed1a4278687923ab2ae9a8a0b3d6563541a1d5ed0435ac59"},"17e3af800a58dd7cc1bb2af42de592ef711b8f6c613299711ea81c3b63108130",{"version":"231a77a5f60b4055d36d8007321de7faf5d9d5a845c0c934f7f4fbee437dc3ed","signature":"aac474c4ff87ed1dc35a57387caeb49fa21352d5b29ed00efa809db3a27a2d8c"},{"version":"4048156bb861b1713569f54b8c018ec5e4c5b2db34379189e173c087dd97acff","signature":"dc8b7456101d0e9a14fdae73b1d29781a876642af4f282375d29bff5425367d6"},{"version":"619302ebcb46a29d536a713fb07543d77b4f379d92bd15bd8ee5b7cc024339a7","signature":"aedde8205ee99fa054a063c51ecd576b424758cda1065e5c79a14f3bc9b33043"},{"version":"3d582b786effb42a113b93f8a1afca36c6e48014206836a606ad3b018748512e","signature":"b06cfd25d90b7f2d2430b98187e41c2f24882bcf00a033fdf8059d6ebe91be48"},"ca82ed5bd0e6a6a2ee805fb8ff9f76022342ab3a4830687792b225105117f1d2","914b55a462408dd85c771a10b6981a06a582753fb8ede0b9d3ee8255f8c134e7","fdbb9331c04ff5c43c95576e3f731d7d60606ee7a16fa42088c929d9012ed5b5","b4ac144e1833e4e9615ff5d857f8379fe5be980edc1a9d321666eaf452e07097","7d81fa2c747ede1d7353d14e46a294f8067e3185ab52990748133eb1ecbb8e95","d3421d1c910ed6b9b3b40e81be3f1099176bb7e4d7577c59fc6328cc0af67f6e","5de6efc2ae3929e52daf496f688cfb80931c793003765dd0aa20b21f6156cc90","954496a4abdbf18ad54d15ef7482301b2dccec5144a6b44aec42983f63b22ec4",{"version":"7719a661a691dcf1a84eed5581eb223494502f579aa1e2425178b6f20ec8fcd0","impliedFormat":1},{"version":"4c51e36c9004c2d14a0bba49beb91630da51b15a0c41f91b2b076038126a5806","impliedFormat":1},{"version":"aca6ac8bf8de795cf3b67d450592d0f36356a3dcd0fb6425ac52c910aeb98ce4","impliedFormat":1},{"version":"f6feef58f3338b06119e40473c60553cbd5c75d74545d0aa3522374b6405720a","impliedFormat":1},{"version":"af6e515790bebd2d99ab46c08a3570f9fd74cd8542a4ecd2ca54fc7356680d24","impliedFormat":1},{"version":"5c5d0c9af035f7c920ef604080a6eef0a76cb4067ab4747ad2dc07026bfbfb48","impliedFormat":1},{"version":"6c27d4b5ba01295ef334456d9af4366aca789f228eee70fcb874b903a59b0e5b","impliedFormat":1},{"version":"93aa15a50eb71c40884e6f9b290eba6fb99d602706d21f8facf95c3bb8669abb","impliedFormat":1},{"version":"78ae308b449f2a861b1b1fbdd4aa0ba371c5e9e66aed2c2acf3b851785e652a4","impliedFormat":1},{"version":"d9e5cffcb3a6159f0a1e6fc1ad13abfe496a86cb82e0f59a82c926f8dad9d869","impliedFormat":1},{"version":"4485b7cd73d47ac60ff0a67f9c94f8b600c4d9665a27b268dd623baccc95c4eb","impliedFormat":1},{"version":"3800c5ce959fa102827db5cb875a461a05d43688ef4d85b76855c968a1573830","impliedFormat":1},{"version":"98c771706beebbe0f3720bb0a582b82e7c98cf62da175b8074cabecef2692546","impliedFormat":1},{"version":"9b1b01c85fe22541212ba4fa627d7f2059fa8af782ad6a899c43e9f4ceae4d0a","impliedFormat":1},"18363e751472a5f649e32d5f9603251d045a3b9b266334625e2ec59c1ccf317f","b46fbaff85ea35cfe2ef8dca455fc85394e2e8be592feb827152cfedc57e0262","a81afccd5831e390cd504701da7288714e795151e1df630b5281ccf3774c969b","9a8ba8f4f4be98077c4b7734ee7b805f374fcd71850d77ae6e9cd15b91b6f4bc","d239ddd36ff2760f669f87809db8aca94a749344f3e171a5d1ef122468a9ccc3","d8746f554d940f6522ec6ede961ef38d31a0947100d8f834db7a64f93cef6dd2","59be9348946adc746a9ee5b7c03c1f293ba60d7a6646f45c76fa962207de2f01","1269505d024fe59653f1789b7897073cdb4d29dc99093a1921849c99a30b4080","a6d795d9d6803cbde86e2a30c4ddde6a90ba347a93211e88aa342e914153f832","b7a2a3cc0a5c07d1fe6ce60943a491b44872e3f1e99a96dc28c6384e4b040e97","e62ba68263ee74daa6727e0741273f73bbd8c51d055452404cfcbee6e1a727c9","0640afefa828d574be4b51943041822e739b18a7eeb65ee316908a576dc96806","16f83be6917e40d274663129464b0ff536a82badf5d6dd6b63621a3fcbef3a52","40620ec486318d369901a2266445d8180a85d083c3a2f813fd4dc82767bd4425",{"version":"54885718b5e5904088b4d350d69dd0756ec17cdc94568a306128c9d11d40d077","signature":"94781d8f9b2836e44c499950d715168679b828cf8e85d153e98e8de1db9768c5"}],"root":[[274,276],[317,319],[326,328],[330,337],[339,342],379],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"declaration":true,"esModuleInterop":true,"experimentalDecorators":true,"module":99,"noImplicitAny":true,"outDir":"./","preserveConstEnums":true,"removeComments":true,"rootDir":"../../src/compiler","skipLibCheck":true,"sourceMap":false,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"suppressImplicitAnyIndexErrors":false,"target":99,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[338,1],[373,1],[375,2],[350,3],[374,4],[347,5],[346,6],[348,1],[349,7],[371,5],[345,1],[370,1],[365,8],[378,9],[368,1],[369,10],[343,11],[344,12],[372,13],[367,14],[366,1],[377,1],[376,1],[273,1],[363,15],[356,16],[354,17],[360,18],[359,1],[362,19],[352,19],[355,20],[353,21],[361,22],[358,23],[364,24],[351,1],[279,1],[227,1],[229,1],[230,25],[159,26],[160,26],[161,27],[97,28],[162,29],[163,30],[164,31],[165,32],[166,33],[167,34],[168,35],[169,36],[170,37],[171,37],[172,38],[173,39],[174,1],[175,40],[176,41],[98,1],[96,1],[177,42],[178,43],[179,44],[222,45],[180,19],[181,46],[182,19],[183,47],[184,48],[186,49],[187,50],[188,50],[189,50],[190,51],[191,52],[192,53],[193,54],[194,55],[195,56],[196,56],[197,57],[198,1],[199,1],[200,58],[201,59],[202,60],[203,61],[204,62],[205,63],[206,64],[207,65],[208,66],[209,67],[210,68],[211,69],[212,70],[213,71],[214,72],[215,73],[216,74],[217,75],[218,76],[99,19],[100,1],[101,77],[102,78],[103,1],[104,79],[105,1],[150,80],[151,81],[152,82],[153,82],[154,83],[155,1],[156,29],[157,84],[158,81],[219,85],[220,86],[221,87],[323,88],[325,89],[324,90],[320,1],[322,91],[278,92],[277,1],[185,1],[321,1],[241,1],[304,93],[311,94],[309,95],[308,96],[310,95],[306,1],[307,97],[305,96],[284,96],[285,96],[286,96],[287,96],[288,96],[289,96],[290,96],[291,96],[292,95],[293,96],[294,96],[295,96],[281,96],[296,96],[297,96],[298,96],[282,96],[299,96],[300,96],[301,96],[302,96],[303,96],[283,98],[265,1],[267,99],[266,1],[314,1],[95,100],[94,1],[261,101],[259,102],[260,103],[248,104],[249,102],[256,105],[247,106],[252,107],[262,1],[253,108],[258,109],[264,110],[263,111],[246,112],[254,113],[255,114],[250,115],[257,101],[251,116],[270,117],[232,118],[233,119],[236,120],[228,121],[235,122],[231,123],[226,1],[237,124],[238,125],[280,126],[245,1],[357,1],[92,1],[93,1],[16,1],[14,1],[15,1],[21,1],[20,1],[2,1],[22,1],[23,1],[24,1],[25,1],[26,1],[27,1],[28,1],[29,1],[3,1],[30,1],[31,1],[4,1],[32,1],[36,1],[33,1],[34,1],[35,1],[37,1],[38,1],[39,1],[5,1],[40,1],[41,1],[42,1],[43,1],[6,1],[47,1],[44,1],[45,1],[46,1],[48,1],[7,1],[49,1],[54,1],[55,1],[50,1],[51,1],[52,1],[53,1],[8,1],[59,1],[56,1],[57,1],[58,1],[60,1],[9,1],[61,1],[62,1],[63,1],[65,1],[64,1],[66,1],[67,1],[10,1],[68,1],[69,1],[70,1],[11,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[12,1],[77,1],[78,1],[79,1],[80,1],[81,1],[1,1],[82,1],[83,1],[13,1],[84,1],[85,1],[86,1],[87,1],[88,1],[89,1],[90,1],[91,1],[19,1],[17,1],[18,1],[329,1],[124,127],[138,128],[121,129],[139,20],[148,130],[112,131],[113,132],[111,133],[147,134],[142,135],[146,136],[115,137],[125,138],[135,139],[114,140],[145,141],[109,142],[110,135],[116,138],[117,1],[123,143],[120,138],[107,144],[149,145],[140,146],[128,147],[127,138],[129,148],[132,149],[126,150],[130,151],[143,134],[118,152],[119,153],[133,154],[108,20],[137,155],[136,138],[122,153],[131,156],[134,157],[141,1],[106,1],[144,158],[313,159],[312,160],[316,161],[315,162],[224,163],[272,164],[240,165],[225,163],[223,1],[239,166],[271,1],[269,1],[242,167],[268,168],[234,169],[244,1],[243,170],[337,171],[276,172],[328,173],[326,174],[336,175],[317,176],[332,177],[319,178],[318,179],[379,180],[331,181],[333,182],[330,183],[274,50],[275,184],[334,185],[339,186],[341,187],[342,188],[340,78],[327,1],[335,189]],"version":"6.0.3"}
1
+ {"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/typescript/lib/lib.es2025.d.ts","../../node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/typescript/lib/lib.webworker.d.ts","../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/typescript/lib/lib.webworker.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/typescript/lib/lib.es2025.collection.d.ts","../../node_modules/typescript/lib/lib.es2025.float16.d.ts","../../node_modules/typescript/lib/lib.es2025.intl.d.ts","../../node_modules/typescript/lib/lib.es2025.iterator.d.ts","../../node_modules/typescript/lib/lib.es2025.promise.d.ts","../../node_modules/typescript/lib/lib.es2025.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/typescript/lib/lib.esnext.date.d.ts","../../node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.error.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.esnext.temporal.d.ts","../../node_modules/typescript/lib/lib.esnext.typedarrays.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/picocolors/types.d.ts","../../node_modules/picocolors/picocolors.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/blob.d.ts","../../node_modules/@types/node/web-globals/console.d.ts","../../node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/encoding.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/utility.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client-stats.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/round-robin-pool.d.ts","../../node_modules/undici-types/h2c-client.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/dispatcher1-wrapper.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-call-history.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/socks5-proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/importmeta.d.ts","../../node_modules/@types/node/web-globals/messaging.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/performance.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/web-globals/timers.d.ts","../../node_modules/@types/node/web-globals/url.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/ffi.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/inspector/promises.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/path/posix.d.ts","../../node_modules/@types/node/path/win32.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/quic.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/iter.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/test/reporters.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/util/types.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/zlib/iter.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/vite/types/hmrPayload.d.ts","../../node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","../../node_modules/vite/types/customEvent.d.ts","../../node_modules/rolldown/dist/shared/logging-BSNejiLS.d.mts","../../node_modules/@oxc-project/types/types.d.ts","../../node_modules/rolldown/dist/shared/binding-B1q9aYT-.d.mts","../../node_modules/@rolldown/pluginutils/dist/filter/index.d.mts","../../node_modules/@rolldown/pluginutils/dist/index.d.mts","../../node_modules/rolldown/dist/shared/define-config-BBz954-q.d.mts","../../node_modules/rolldown/dist/index.d.mts","../../node_modules/rolldown/dist/parse-ast-index.d.mts","../../node_modules/vite/types/internal/rollupTypeCompat.d.ts","../../node_modules/rolldown/dist/shared/constructors-2i1T9YcF.d.mts","../../node_modules/rolldown/dist/plugins-index.d.mts","../../node_modules/rolldown/dist/shared/transform-CEmFsvJW.d.mts","../../node_modules/rolldown/dist/utils-index.d.mts","../../node_modules/vite/types/hot.d.ts","../../node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/esbuild/lib/main.d.ts","../../node_modules/vite/types/internal/esbuildOptions.d.ts","../../node_modules/vite/types/metadata.d.ts","../../node_modules/vite/types/internal/terserOptions.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/lightningcss/node/ast.d.ts","../../node_modules/lightningcss/node/targets.d.ts","../../node_modules/lightningcss/node/index.d.ts","../../node_modules/vite/types/internal/lightningcssOptions.d.ts","../../node_modules/vite/types/internal/cssPreprocessorOptions.d.ts","../../node_modules/rolldown/dist/filter-index.d.mts","../../node_modules/vite/types/importGlob.d.ts","../../node_modules/vite/dist/node/index.d.ts","../shared/index.d.ts","../../src/compiler/routes.ts","../../src/compiler/seo.ts","../../src/compiler/config.ts","../../node_modules/@vitejs/plugin-react/types/optionalTypes.d.ts","../../node_modules/@vitejs/plugin-react/dist/index.d.ts","../../node_modules/@img/colour/index.d.ts","../../node_modules/sharp/dist/index.d.mts","../../node_modules/imagetools-core/dist/transforms/kernel.d.ts","../../node_modules/imagetools-core/dist/transforms/position.d.ts","../../node_modules/imagetools-core/dist/types.d.ts","../../node_modules/imagetools-core/dist/transforms/autoOrient.d.ts","../../node_modules/imagetools-core/dist/transforms/background.d.ts","../../node_modules/imagetools-core/dist/transforms/blur.d.ts","../../node_modules/imagetools-core/dist/transforms/effort.d.ts","../../node_modules/imagetools-core/dist/transforms/fit.d.ts","../../node_modules/imagetools-core/dist/transforms/flatten.d.ts","../../node_modules/imagetools-core/dist/transforms/flip.d.ts","../../node_modules/imagetools-core/dist/transforms/flop.d.ts","../../node_modules/imagetools-core/dist/transforms/format.d.ts","../../node_modules/imagetools-core/dist/transforms/grayscale.d.ts","../../node_modules/imagetools-core/dist/transforms/hsb.d.ts","../../node_modules/imagetools-core/dist/transforms/invert.d.ts","../../node_modules/imagetools-core/dist/transforms/lossless.d.ts","../../node_modules/imagetools-core/dist/transforms/median.d.ts","../../node_modules/imagetools-core/dist/transforms/normalize.d.ts","../../node_modules/imagetools-core/dist/transforms/progressive.d.ts","../../node_modules/imagetools-core/dist/transforms/quality.d.ts","../../node_modules/imagetools-core/dist/transforms/resize.d.ts","../../node_modules/imagetools-core/dist/transforms/rotate.d.ts","../../node_modules/imagetools-core/dist/transforms/tint.d.ts","../../node_modules/imagetools-core/dist/builtins.d.ts","../../node_modules/imagetools-core/dist/output-formats.d.ts","../../node_modules/imagetools-core/dist/lib/parse-url.d.ts","../../node_modules/imagetools-core/dist/lib/resolve-configs.d.ts","../../node_modules/imagetools-core/dist/lib/generate-transforms.d.ts","../../node_modules/imagetools-core/dist/lib/apply-transforms.d.ts","../../node_modules/imagetools-core/dist/lib/metadata.d.ts","../../node_modules/imagetools-core/dist/index.d.ts","../../node_modules/vite-imagetools/dist/types.d.ts","../../node_modules/vite-imagetools/dist/index.d.ts","../../node_modules/node-stdlib-browser/esm/index.d.ts","../../node_modules/vite-plugin-node-polyfills/dist/utils.d.ts","../../node_modules/vite-plugin-node-polyfills/dist/index.d.ts","../../src/compiler/fonts.ts","../../src/compiler/image-report.ts","../../src/compiler/image-blur.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/client.d.ts","../../node_modules/@types/react-dom/static.d.ts","../../node_modules/@types/react-dom/server.d.ts","../../src/compiler/email-preview.ts","../../src/compiler/toil-docs.generated.ts","../../src/compiler/docs.ts","../../node_modules/typescript/lib/typescript.d.ts","../../src/compiler/prerender.ts","../../src/compiler/pages.ts","../../src/compiler/generate.ts","../../src/compiler/plugin.ts","../../src/compiler/sri.ts","../../src/compiler/vite.ts","../../src/compiler/emails.ts","../../src/compiler/auth-emails.ts","../backend/index.d.ts","../../src/compiler/ssg.ts","../../src/compiler/template.ts","../../src/compiler/ssr-codegen.ts","../../src/compiler/template-build.ts","../devserver/runtime/crypto.d.ts","../devserver/runtime/host.d.ts","../devserver/db/types.d.ts","../devserver/db/database.d.ts","../devserver/db/catalog.d.ts","../devserver/db/derives.d.ts","../devserver/db/index.d.ts","../devserver/daemon/host.d.ts","../../node_modules/@dacely/uwebsockets.js/index.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/LiveFile.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/SSEventStream.d.ts","../../node_modules/@dacely/hyper-express/types/components/http/Response.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/MultipartField.d.ts","../../node_modules/@dacely/hyper-express/types/components/http/Request.d.ts","../../node_modules/typed-emitter/index.d.ts","../../node_modules/@dacely/hyper-express/types/components/ws/Websocket.d.ts","../../node_modules/@dacely/hyper-express/types/components/middleware/MiddlewareNext.d.ts","../../node_modules/@dacely/hyper-express/types/components/middleware/MiddlewareHandler.d.ts","../../node_modules/@dacely/hyper-express/types/components/router/Router.d.ts","../../node_modules/@dacely/hyper-express/types/components/plugins/HostManager.d.ts","../../node_modules/@dacely/hyper-express/types/components/Server.d.ts","../../node_modules/@dacely/hyper-express/types/index.d.ts","../devserver/http/proxy.d.ts","../devserver/ssr.d.ts","../devserver/server.d.ts","../devserver/production-ipc.d.ts","../devserver/production.d.ts","../devserver/http/envelope.d.ts","../devserver/db/routeKinds.d.ts","../devserver/runtime/module.d.ts","../devserver/daemon/catalog.d.ts","../devserver/daemon/index.d.ts","../devserver/daemon/cron.d.ts","../devserver/wasm/surface.d.ts","../devserver/wasm/sections.d.ts","../devserver/index.d.ts","../../src/compiler/index.ts"],"fileIdsList":[[97,162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,373],[97,162,170,175,178,180,181,182,195,343,344,349],[97,162,170,175,178,180,181,182,195,350,373],[97,162,170,175,178,180,181,182,195,345],[97,162,170,175,178,180,181,182,195,344,345],[97,162,170,175,178,180,181,182,195,345,346,347,348],[97,162,170,175,178,180,181,182,195,364],[97,162,170,175,178,180,181,182,195,344,350,365,367,369,370,372,373,374,375,376,377],[97,162,170,175,178,180,181,182,195,273,350,366,368],[97,162,167,170,175,178,180,181,182,195,344],[97,162,170,175,178,180,181,182,195,343,349],[97,162,170,175,178,180,181,182,195,344,349,370,371],[97,162,170,175,178,180,181,182,195,273,350,365,366],[97,162,170,175,178,180,181,182,195,200,351,354,356,361,362],[97,162,170,175,178,180,181,182,195,200,351,355,363],[97,162,170,175,178,180,181,182,195,200,351,352,353,363],[97,162,170,175,178,180,181,182,195,354,356,359],[97,162,170,173,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,200],[97,162,170,175,178,180,181,182,195,354],[97,162,170,175,178,180,181,182,195,200,351,354,356,358,360],[97,162,170,173,175,178,180,181,182,195,200,351,354,357],[97,162,170,175,178,180,181,182,195,351,352,353,354,355,356,358,359,360,361,363],[97,162,170,175,178,180,181,182,195,229],[97,159,160,162,170,175,178,180,181,182,195],[97,161,162,170,175,178,180,181,182,195],[162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,204],[97,162,163,168,170,173,175,178,180,181,182,184,195,200,213],[97,162,163,164,170,173,175,178,180,181,182,195],[97,162,165,170,175,178,180,181,182,195,214],[97,162,166,167,170,175,178,180,181,182,186,195],[97,162,167,170,175,178,180,181,182,195,200,210],[97,162,168,170,173,175,178,180,181,182,184,195],[97,161,162,169,170,175,178,180,181,182,195],[97,162,170,171,175,178,180,181,182,195],[97,162,170,172,173,175,178,180,181,182,195],[97,161,162,170,173,175,178,180,181,182,195],[97,162,170,173,175,176,178,180,181,182,195,200,213],[97,162,170,173,175,176,178,180,181,182,195,200,202,204],[97,149,162,170,173,175,177,178,180,181,182,184,195,200,213],[97,162,170,173,175,177,178,180,181,182,184,195,200,210,213],[97,162,170,175,177,178,179,180,181,182,195,200,210,213],[96,97,98,99,100,101,102,103,104,105,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221],[97,162,170,175,178,180,182,195],[97,162,170,175,178,180,181,182,183,195,213],[97,162,170,173,175,178,180,181,182,184,195,200],[97,162,170,175,178,180,181,182,186,195],[97,162,170,175,178,180,181,182,187,195],[97,162,170,173,175,178,180,181,182,190,195],[97,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220],[97,162,170,175,178,180,181,182,192,195],[97,162,170,175,178,180,181,182,193,195],[97,162,167,170,175,178,180,181,182,184,195,204],[97,162,170,173,175,178,180,181,182,195,196],[97,162,170,175,178,180,181,182,195,197,214,217],[97,162,170,173,175,178,180,181,182,195,200,202,203,204],[97,162,170,175,178,180,181,182,195,201,204],[97,162,170,173,175,178,180,181,182,195,200,202],[97,162,170,173,175,178,180,181,182,195,200,203,204],[97,162,170,175,178,180,181,182,195,204,214],[97,162,170,175,178,180,181,182,195,205],[97,159,162,170,175,178,180,181,182,195,200,207,213],[97,162,170,175,178,180,181,182,195,200,206],[97,162,170,173,175,178,180,181,182,195,208,209],[97,162,170,175,178,180,181,182,195,208,209],[97,162,167,170,175,178,180,181,182,184,195,200,210],[97,162,170,175,178,180,181,182,195,211],[97,162,170,175,178,180,181,182,184,195,212],[97,162,170,175,177,178,180,181,182,193,195,213],[97,162,170,175,178,180,181,182,195,214,215],[97,162,167,170,175,178,180,181,182,195,215],[97,162,170,175,178,180,181,182,195,200,216],[97,162,170,175,178,180,181,182,183,195,217],[97,162,170,175,178,180,181,182,195,218],[97,162,165,170,175,178,180,181,182,195],[97,162,167,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,214],[97,149,162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,213],[97,162,170,175,178,180,181,182,195,219],[97,162,170,175,178,180,181,182,190,195],[97,162,170,175,178,180,181,182,195,209],[97,149,162,170,173,175,176,178,180,181,182,190,195,200,204,213,216,217,219],[97,162,170,175,178,180,181,182,195,200,220],[97,162,170,175,178,180,181,182,195,202,221],[97,162,170,175,178,180,181,182,195,322],[97,162,170,175,178,180,181,182,195,322,323,324],[97,162,170,175,178,180,181,182,195,322,323],[97,162,170,175,178,180,181,182,195,320,321],[97,162,170,175,178,180,181,182,195,272,277],[97,162,170,175,178,180,181,182,195,283,284,286,289,290,291,292,293,294,295,297,298,301,302,303],[97,162,170,175,178,180,181,182,195,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310],[97,162,170,175,178,180,181,182,195,280,283,310],[97,162,170,175,178,180,181,182,195,283],[97,162,170,175,178,180,181,182,195,311],[97,162,170,175,178,180,181,182,195,280,281,282,310],[97,162,170,175,178,180,181,182,195,265,266],[94,97,162,170,175,178,180,181,182,195],[97,162,170,175,178,180,181,182,195,260],[97,162,170,175,178,180,181,182,195,258,260],[97,162,170,175,178,180,181,182,195,249,257,258,259,261,263],[97,162,170,175,178,180,181,182,195,247],[97,162,170,175,178,180,181,182,195,250,255,260,263],[97,162,170,175,178,180,181,182,195,246,263],[97,162,170,175,178,180,181,182,195,250,251,254,255,256,263],[97,162,170,175,178,180,181,182,195,250,251,252,254,255,263],[97,162,170,175,178,180,181,182,195,247,248,249,250,251,255,256,257,259,260,261,263],[97,162,170,175,178,180,181,182,195,263],[97,162,170,175,178,180,181,182,195,245,247,248,249,250,251,252,254,255,256,257,258,259,260,261,262],[97,162,170,175,178,180,181,182,195,245,263],[97,162,170,175,178,180,181,182,195,250,252,253,255,256,263],[97,162,170,175,178,180,181,182,195,254,263],[97,162,170,175,178,180,181,182,195,255,256,260,263],[97,162,170,175,178,180,181,182,195,248,258],[97,162,170,175,178,180,181,182,195,231],[97,162,170,175,178,180,181,182,195,226,228,231],[97,162,170,175,178,180,181,182,195,227,228],[97,162,170,175,178,180,181,182,195,228,231,235],[97,162,170,175,178,180,181,182,195,227],[97,162,170,175,178,180,181,182,195,228,231],[97,162,170,175,178,180,181,182,195,226,227,228,230],[97,162,170,175,178,180,181,182,195,226,228],[97,162,170,175,178,180,181,182,195,227,228,237],[97,162,170,175,178,180,181,182,195,200,222,279],[97,112,115,118,119,162,170,175,178,180,181,182,195,213],[97,115,162,170,175,178,180,181,182,195,200,213],[97,115,119,162,170,175,178,180,181,182,195,213],[97,109,162,170,175,178,180,181,182,195],[97,113,162,170,175,178,180,181,182,195],[97,111,112,115,162,170,175,178,180,181,182,195,213],[97,162,170,175,178,180,181,182,184,195,210],[97,162,170,175,178,180,181,182,195,222],[97,109,162,170,175,178,180,181,182,195,222],[97,111,115,162,170,175,178,180,181,182,184,195,213],[97,106,107,108,110,114,162,170,173,175,178,180,181,182,195,200,213],[97,115,162,170,175,178,180,181,182,195],[97,115,124,133,162,170,175,178,180,181,182,195],[97,107,113,162,170,175,178,180,181,182,195],[97,115,143,144,162,170,175,178,180,181,182,195],[97,107,110,115,162,170,175,178,180,181,182,195,204,213,222],[97,111,115,162,170,175,178,180,181,182,195,213],[97,106,162,170,175,178,180,181,182,195],[97,109,110,111,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,144,145,146,147,148,162,170,175,178,180,181,182,195],[97,115,136,139,162,170,175,178,180,181,182,195],[97,115,124,126,127,162,170,175,178,180,181,182,195],[97,113,115,126,128,162,170,175,178,180,181,182,195],[97,114,162,170,175,178,180,181,182,195],[97,107,109,115,162,170,175,178,180,181,182,195],[97,115,119,126,128,162,170,175,178,180,181,182,195],[97,119,162,170,175,178,180,181,182,195],[97,113,115,118,162,170,175,178,180,181,182,195,213],[97,107,111,115,124,162,170,175,178,180,181,182,195],[97,115,136,162,170,175,178,180,181,182,195],[97,128,162,170,175,178,180,181,182,195],[97,107,111,115,119,162,170,175,178,180,181,182,195],[97,109,115,143,162,170,175,178,180,181,182,195,204,219,222],[97,162,170,175,178,180,181,182,195,272,311,312],[97,162,170,175,178,180,181,182,195,280,310,311],[97,162,170,175,178,180,181,182,195,272,315],[97,162,170,175,178,180,181,182,195,272,314],[97,162,170,175,178,180,181,182,195,223],[97,162,170,173,175,177,178,179,180,181,182,184,195,200,210,213,220,222,223,224,225,232,233,234,236,238,240,242,243,244,264,268,269,270,271,272],[97,162,170,175,178,180,181,182,195,223,224,225,239],[97,162,170,175,178,180,181,182,195,225],[97,162,170,175,178,180,181,182,195,241],[97,162,170,175,178,180,181,182,195,267],[97,162,170,175,178,180,181,182,195,232,243,272],[97,162,170,175,178,180,181,182,195,232,272],[95,97,162,170,175,178,180,181,182,187,195,272,276,325,335,336],[97,162,170,175,178,180,181,182,187,195,213,272,273,275],[97,162,170,175,178,180,181,182,187,195,327],[97,162,170,175,178,180,181,182,187,195,272,276,325,336],[95,97,162,170,175,178,180,181,182,187,195,272,276,325,335],[97,162,170,175,178,180,181,182,195,272,276],[97,162,170,175,178,180,181,182,187,195,274,275,276,328,331],[97,162,170,175,178,180,181,182,195,272,280,310],[95,97,162,170,175,178,180,181,182,187,195,272],[95,97,162,163,170,175,178,180,181,182,183,184,187,195,213,272,274,276,328,332,335,336,337,338,339,342,378],[97,162,170,175,178,180,181,182,183,187,195,274,329,330],[97,162,163,170,175,177,178,180,181,182,183,187,195,213,272,274,276,326,332],[97,162,170,175,178,180,181,182,183,187,195,213,272,274,275,276,329],[97,162,170,175,178,180,181,182,195,274],[97,162,167,170,175,178,180,181,182,187,195,272,276],[97,162,170,175,178,180,181,182,187,195,272,274,275,276,330,335],[97,162,170,175,178,180,181,182,195,340],[97,162,170,175,178,180,181,182,183,187,195,272,274,275,276,322,325,330,332,335,340,341],[95,97,162,170,175,178,180,181,182,183,187,195,213,272,276,278,313,316,317,318,319,330,333,334]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"1e9332c23e9a907175e0ffc6a49e236f97b48838cc8aec9ce7e4cec21e544b65","impliedFormat":1},{"version":"3753fbc1113dc511214802a2342280a8b284ab9094f6420e7aa171e868679f91","impliedFormat":1},{"version":"999ca32883495a866aa5737fe1babc764a469e4cde6ee6b136a4b9ae68853e4b","impliedFormat":1},{"version":"17f13ecb98cbc39243f2eee1f16d45cd8ec4706b03ee314f1915f1a8b42f6984","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"d52ed68e7eb5881768a55713c9b5c7c443e6b46de15c04e348928b8efd20b110","affectsGlobalScope":true,"impliedFormat":1},{"version":"2a2de5b9459b3fc44decd9ce6100b72f1b002ef523126c1d3d8b2a4a63d74d78","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"0bd714129fca875f7d4c477a1a392200b0bcd13fb2e80928cd334b63830ea047","affectsGlobalScope":true,"impliedFormat":1},{"version":"e2c9037ae6cd2c52d80ceef0b3c5ffdb488627d71529cf4f63776daf11161c9a","affectsGlobalScope":true,"impliedFormat":1},{"version":"135d5cf4d345f59f1a9caadfafcd858d3d9cc68290db616cc85797224448cccc","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc238c3f81c2984751932b6aab223cd5b830e0ac6cad76389e5e9d2ffc03287d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4a07f9b76d361f572620927e5735b77d6d2101c23cdd94383eb5b706e7b36357","affectsGlobalScope":true,"impliedFormat":1},{"version":"7c4e8dc6ab834cc6baa0227e030606d29e3e8449a9f67cdf5605ea5493c4db29","affectsGlobalScope":true,"impliedFormat":1},{"version":"de7ba0fd02e06cd9a5bd4ab441ed0e122735786e67dde1e849cced1cd8b46b78","affectsGlobalScope":true,"impliedFormat":1},{"version":"6148e4e88d720a06855071c3db02069434142a8332cf9c182cda551adedf3156","affectsGlobalScope":true,"impliedFormat":1},{"version":"d63dba625b108316a40c95a4425f8d4294e0deeccfd6c7e59d819efa19e23409","affectsGlobalScope":true,"impliedFormat":1},{"version":"0568d6befee03dd435bed4fc25c4e46865b24bdcb8c563fdc21f580a2c301904","affectsGlobalScope":true,"impliedFormat":1},{"version":"30d62269b05b584741f19a5369852d5d34895aa2ac4fd948956f886d15f9cc0d","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"ffbe6d7b295306b2ba88030f65b74c107d8d99bdcf596ea99c62a02f606108b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"996fb27b15277369c68a4ba46ed138b4e9e839a02fb4ec756f7997629242fd9f","affectsGlobalScope":true,"impliedFormat":1},{"version":"79b712591b270d4778c89706ca2cfc56ddb8c3f895840e477388f1710dc5eda9","affectsGlobalScope":true,"impliedFormat":1},{"version":"20884846cef428b992b9bd032e70a4ef88e349263f63aeddf04dda837a7dba26","affectsGlobalScope":true,"impliedFormat":1},{"version":"5fcab789c73a97cd43828ee3cc94a61264cf24d4c44472ce64ced0e0f148bdb2","affectsGlobalScope":true,"impliedFormat":1},{"version":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"673294292640f5722b700e7d814e17aaf7d93f83a48a2c9b38f33cbc940ad8b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"d786b48f934cbca483b3c6d0a798cb43bbb4ada283e76fb22c28e53ae05b9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"142efd4ce210576f777dc34df121777be89eda476942d6d6663b03dcb53be3ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"379bc41580c2d774f82e828c70308f24a005b490c25ba34d679d84bcf05c3d9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed484fb2aa8a1a23d0277056ec3336e0a0b52f9b8d6a961f338a642faf43235d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"83a730b125d477dd264df8ba479afab27a3dae7152b005c214ab94dc7ee44fd3","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"590595c1230ebb7c43ebac51b2b2da956a719b213355b4358e2a6b16a8b5936c","impliedFormat":1},{"version":"8c5f0739f00f89f89b03a1fe6658c6d78000d7ebd7f556f0f8d6908fa679de35","impliedFormat":1},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"f53a7652392cf26ebbe4e29fd0672aa87c93bd6d0241289c13fab87b9ac35c8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"b00a630557d1622ad312633bdbfbdb9c6b7220d948dca9f899db30679f160074","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"88809d6c1b9c78d04a133646a6feb926def05a8774c308c7c93bc32ee163d271","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"3ac40516c33b87f751f7507346933081a26cdb8a3e11a6b3aa07d23f803c85db","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"14e9acf826baba0ef4b5665704084896e7bcc06f65a9ab13af7e93d27d6b7069","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"829bc57ee8f287b490ab5bbc5a962fca57e432c1e38ec680ecd3ecaf12800613","impliedFormat":1},{"version":"eec76bf6b9346f3f95fa402621b889489e96930e72295b0369022f332e9b4a6a","impliedFormat":1},{"version":"3a3ff14da53d5013f3e6d8c4ad55225e3649c08786c4421ce639c00d8d589b7d","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"38004e6801340cb890afb8cb5a9fc8972297e7f88ab94026e4b0b3c61fb32f8a","impliedFormat":1},{"version":"d243db6b25788f439e7e2f03c05688e92f46764351673bb0e7b2f3631232e186","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"149f9a9e7f04e67afa0e2a49fc0ff421035c01d6b793cfcae7d2e9f6819431e2","impliedFormat":1},{"version":"e8a9dfa4c75ef6d25df8b40eaa9c31e0a69452aaf2ced4a3f4215dbdbaa876f4","impliedFormat":1},{"version":"a70af845a2eb9dd6e2723e319e14ea7fb28b129ec1361c21509b49305448c323","impliedFormat":1},{"version":"b53dc572d4f187904207ae1166652de47aab8eeb00c254d009cb226863076b56","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"f501234c5aeeeb5d7659412335227466aaacf30b952372d60afeb21c02c96348","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"9ac977503f15bf13ca7c82ad9a32a782f42d43e474824e8b3bffe228fd5f2639","impliedFormat":1},{"version":"8b91ff5bb912be3ea213cbcf0075aace1f5d4ff249a0d227ed673868cb7bfabc","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"7cb4f431a4591b0e23002bed805dc871a874dfed6b9a3994dce68a6df73e6739","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"e99963ae1e3a48ca7a7958c02f3e88bb963eb7978c28b68ae6b8c9f03309d83c","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"594ae90cacd813fa392ff80d2e0a8eff4e41f4a136329a940e321399dd8895b4","impliedFormat":1},{"version":"d1f333ade8ff35a409b4984e1f11956fe11c61855b0c7e9b59f0313e48b40c4a","impliedFormat":1},{"version":"0224aa4b3464895d69c413a640a19ac2166778a74eb5eb3b36b021c72d42b274","impliedFormat":1},{"version":"2e6fca0024dd8a076a886d9ec031a936ea59ad878a25b944820495d92f8381dd","affectsGlobalScope":true,"impliedFormat":1},{"version":"177459cba484e2f1e08872a3d2fdbca3162d9d43ca5ec9dc0c946835b55f74be","impliedFormat":1},{"version":"2fbf504c4791f9d32cd766cfe6b605bcda63289b925401953a7900db9af85348","impliedFormat":1},{"version":"ed0fb633cae35948d9e144004299a4bdf1ab912667c787b7fbffcd6d8c7b92a2","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"0e312260895afc9de021ce9de3c8a857392f0ccc7f19d3a030e4d6136a4ac91e","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"98fc7231d6c846a8ed19bdef026ddffe5e2182cc818be74899287421ad370a87","impliedFormat":1},{"version":"3a40b5d34e014017539acb92f04cf2bc0aa71e49efb33c66039df93be97842a1","impliedFormat":1},{"version":"2bc7aa4fba46df0bd495425a7c8201437a7d465f83854fac859df2d67f664df3","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"8c7e618c2a91ea7f6b5cca272a295864e92c16413be8fc56a943e8c7d5320011","affectsGlobalScope":true,"impliedFormat":1},{"version":"79a85c64bf083c5f4dd7074e804d1000c0c47301b84d48417a224decd681be30","impliedFormat":1},{"version":"9f1e3a76d5f509b5579e567de522b402cb79e201c4f47dcd014451c0580b290d","impliedFormat":1},{"version":"2ddab5b6932f9a6327f71baeb82a1d6b0824e0d23a4c7a5de5d355857113c22f","impliedFormat":1},{"version":"70f3f8b2dcaf7388f26731a59c79437813e3620b594903525a303cb2a7901016","impliedFormat":1},{"version":"62e8f884c3bc6dff6189b6e662ebe8b238a645938f2df7a97b8a82fca56773a4","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"57a0d1b3d59063d4af2d3f8aac27cfe3c20a0f5d1faf0f8598ccf0b779637939","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"97234c5303866576f913d0ccae7d58d6322d9e803c7bf1228a3fda46ab8087b2","affectsGlobalScope":true,"impliedFormat":1},{"version":"93ecf87143cac7b9d05cffc1d6bdc075b7e4fdd48ff05f1fad85043f6ae678d3","impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"6f200afcb82b3e9a54bed6db23f2edf2508cd266801257312c0f124b47f2bdb9","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"39338f84e8c4d0e3de7b3c4a7024fb3925f42100eed5cbe73be58902799dff4d","impliedFormat":1},{"version":"fbf83eb33bf5e329527add92acc65da59323876c702ddccf5f4bf1e848c92369","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"515318bc6e656f75e9e34db625316bfafbafd800dfb1642574af93735a24ad38","impliedFormat":1},{"version":"441b9bb09013654aa3d050e68b06464d8959b473e85868249d9d18f692acd35b","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"55246f15e33ff1e2e9e679b25fa9790a48db55dc63d567fe25fac8b6a0efe911","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"03b7804d69cecd66850abada858ed6d4a59001f8c228a9fe212306ee860a4ff6","impliedFormat":1},{"version":"5b26c4dd672d88336bb929787c9bfb55119e80ba89ec6dc923da1c063892843e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"987fd1f85dc36f4b2c927aa3db814ac6b452e970f4f55d24ed4ecbb7df09be00","impliedFormat":1},{"version":"f12624a4a8d042b68914eac1b0a16571fc1c523173fcdf2517c65d191bd5a86c","impliedFormat":1},{"version":"b4769767f13a1692a66186e01c3aa186ff808d5ff72ed36eda8c37738fb2ac92","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"683edfc4f2b411ebe04729cb6dc09ddd26fbac2c57771a6d7c55964af776e176","impliedFormat":1},{"version":"1ec3f3a5f04cc42df33274fbe5c0937d9a9e06f249a7a26288d7d54f0763ffd4","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"e47f532d6e1617833f13a5b0710c0089d402c89c2f2b54f324e5a20e418d287a","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"8e2577e7262051fd3c5bd6ca2b2056d358ff8853565720f92455860824c25188","impliedFormat":1},{"version":"7ec8d7d483f7394f9da611b10d3a0e402f76ff5c991261e6ce43a15f81ca4258","impliedFormat":1},{"version":"bb9dbb4b2ad81e3e71ec5ba4314973718555b9d04ba2a17dfbf875efecb8e2c0","impliedFormat":1},{"version":"82c3cc48c692438e41b94d936b8acd75ca97b18c50fa1af8a0715eb9d07d18cd","impliedFormat":1},{"version":"045a210189ec63c5488410b33f9fca53d77d051599d0d6506d8048551399c5f3","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"632c45ccb4cdc2c3a80c7a36a63dd7763016e59cac5e07bfb3e37e3548957028","impliedFormat":1},{"version":"c9a2daf6cd1eb854cd5b9e424247c5e306692055738c2effd35f7871d942b76e","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"e50a7130339a951e6da9e968ed5521b0997a5b0479e148914087213839b5474c","impliedFormat":1},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"16fe60bb544cfedfd2b5bb2f7d0b3957be7978706d57d9f06edc9c0c8dbdba23","impliedFormat":99},{"version":"de4a612aa8f1704af486f701e21993c786ba7d8cfed55fffa6684026aea2346e","impliedFormat":99},{"version":"c73fdf42528325dd17940937ed787b15ae3445c6a2dae1a2b74bc4d87d337ca2","impliedFormat":99},{"version":"e8e17dfef3cfa9f0847ac93dd535a9896af7fb57c1a1b164484bb1b0ee4a25d8","impliedFormat":99},{"version":"f2ff36fddc8fdbadde620cdfc653ee3e7b722649e1769a527c84a88aa91a76bf","impliedFormat":99},{"version":"638a22f8e16b31c37297483fa38cfc760ed309b16d4c606a7b4532f4394c9c0c","impliedFormat":99},{"version":"9394183f4c37b8591156f32e41223c9e0dd211eefe7499155d4cdf15268eaea8","impliedFormat":99},{"version":"7cd005825cded848f6aef39302c91906c828b56eb2a871f7ec2905be03c410ee","impliedFormat":99},{"version":"8f5dd83a487a147ef727ea1f134d3270feb6e5820c7cec2f3bea2b1896969987","impliedFormat":99},{"version":"ef4cf7840808d33d454407e836d7186000b25b5132d1e5e5d864a598541839fc","impliedFormat":99},{"version":"7d3e062a778b8f5ea4f0cac7e925e31f88e6739812ebc5f827474324a4048f14","impliedFormat":99},{"version":"c21183546a150db7c0619335e32af4fac9a633156a24c49985bd0c54ef93ae2e","impliedFormat":99},{"version":"6209d9e7e93217ab3ff8cef7357ed16a457d8419038de522dafae421bfeeeaa6","impliedFormat":99},{"version":"738aecb56bf52a994c4e3980f356255c5843b505c66ffa8a3142c8e13d30d2b2","impliedFormat":99},{"version":"e04b33dbc442d710225fdc64ad081a202f8b6ac8c6965a46d34fecf1ba3c2a9b","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"8887e70871f697fa42ad7cdf32168db60ec2d6760c173c97973e35377fe5d83b","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0864480ea083087d705f9405bd6bf59b795e8474c3447f0d6413b2bce535a09","impliedFormat":99},{"version":"e67cbea16f1994af89efd700542dbf3828a46a52b29e4d67e801bd7869dc103c","impliedFormat":99},{"version":"f582b0fcbf1eea9b318ab92fb89ea9ab2ebb84f9b60af89328a91155e1afce72","impliedFormat":99},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"cc4a4903fb698ca1d961d4c10dce658aa3a479faf40509d526f122b044eaf6a4","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"370bde134aa8c2abc926d0e99d3a4d5d5dba65c6ee65459137e4f02670cbf841","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"2977b7884aedc895a1d0c9c210c7cf3272c29d6959a08a6fa3ff71e0aff08175","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"e3cf0611709328b449ec13f8c436712d62003620ce480139fae46ce001c2ee9f","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"3fd8a5aefd8c3feb3936ca66f5aa89dff7bf6e6537b4158dbd0f6e0d65ed3b9e","impliedFormat":1},{"version":"a18642ddf216f162052a16cba0944892c4c4c977d3306a87cb673d46abbb0cbf","impliedFormat":1},{"version":"41c41c6e90133bb2a14f7561f29944771886e5535945b2b372e2f6ed6987746e","impliedFormat":1},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":99},{"version":"960bd764c62ac43edc24eaa2af958a4b4f1fa5d27df5237e176d0143b36a39c6","affectsGlobalScope":true,"impliedFormat":99},{"version":"94325c2597b60c34988a0b335b1b4e94ee758c9cc28fdb3d6837c2b5771d5638","impliedFormat":99},{"version":"e50d04d261120f8f9d07e85698735d5b88f3a66bc395c08ce26c3d817d141a73","affectsGlobalScope":true,"impliedFormat":99},{"version":"27a65fc36588a883248464d29685939a70859d9133db601b696941f518793639","impliedFormat":99},"7427c56ad284f0a61481dac8b11e66b3282aac3674ed9c7bcd91760566157867",{"version":"acc1cfbec259e2d9757c37897193e039c682638c910800ea539659ba97dc6812","signature":"eb02c7c8867cdcf7f7040046e8b57aef92bd814776a267f8bd05fba9f3b4c8f2"},{"version":"fbf47f7bf74f1b02ff88fcafb2d078fc95ee16fd904996819a531381bd259b40","signature":"754e233ac817b8be08782babd95b9a949636d321e33e6f5f551c3dc2eb299c60"},{"version":"20e58eccbf0fd59abb2db10a5e8550089f94c595f94235aa1e5831442516a458","signature":"0690b86569357b2583c089f3570414df97d89dc03361f49197073b0b2b5ab468"},{"version":"2faebfa830ae4cfbfb58e48b0ec20a2a63882d776f0ca36ec7155d45cf1b7f2d","impliedFormat":99},{"version":"dc6e3ce502651ecc523590588213bfb986c04b60f5265d37f76662b824425903","impliedFormat":99},{"version":"2467b00d963828f540f4acd7910f4c04cfe4b489550e6bb682212f65583bca5b","impliedFormat":1},{"version":"854e50b93090b3f8fd6e355b074e1d24dce1ae0240f1ce46563e35fea210a6d5","impliedFormat":99},{"version":"f7e4383f98f1e5b68f8507236fbd60832d391666213bab3ede2dbe4b61417b9d","impliedFormat":99},{"version":"149be55faecff54f412f680211558227bf7dab9d3680f4deac6023fe7cbbd949","impliedFormat":99},{"version":"2ee6918826cb759305128f440bf200073fc0083d499a0c27c0bbdd50c812f53f","impliedFormat":99},{"version":"0488c8ef5e546f2230952237e48f1693ca6ccefe81ffa8dad27c652832013499","impliedFormat":99},{"version":"5b9d2fcfa745b4cb0750e99c340bccb3caedfbbf8e2d1fdcc1558e81d9723ccf","impliedFormat":99},{"version":"53977891ac6dd2f0999c1f87e563d1aaca36a42ed795b9ac8756ddae1220d885","impliedFormat":99},{"version":"18a17db365d40c4eeff41ff1886eaf56d9ca6b9f1c7ea4a7aeff0360a37cbeb9","impliedFormat":99},{"version":"facb3afc979337bc65dfee5aca99672debb63494d290a1a93de5ba0bfe2aaed6","impliedFormat":99},{"version":"4f4f4d55d5877e625861c64c2a36b24e3bc1c0664f0e24d4b4d7289e2af641d1","impliedFormat":99},{"version":"79d3757b73317c225b8378fd80bfa4f31af12ef75f72e344a5b3919fd95ce519","impliedFormat":99},{"version":"c538c581117291675fc3385f93d4eaea9fabac371659b2d5f33fbf1a7995057f","impliedFormat":99},{"version":"672ea9a6a8bc9a5e51e7cea23606a3faecaf720f3ddba23b8c2c91d816f2ffc7","impliedFormat":99},{"version":"870f295d1e4c7b53865a2bccd70acafd9c2bad99f8fa1bdd5e8d63fa79aa0ae3","impliedFormat":99},{"version":"a5c5c45f8479acb992d84421529bb51f57ce760d4a78feab65c4ec1fb26443a5","impliedFormat":99},{"version":"27f7f4347ba66354f67ddfd30477175d6f737e48aa410a66597351ee085d5897","impliedFormat":99},{"version":"9cab09d2fae1eb249a48f699d89164f164d47098bf0496ef48d819d954522be0","impliedFormat":99},{"version":"aed8fdfa1735772a71b641e8b67c5ff071a137d9ccccb3325619d8f3ace1e6b8","impliedFormat":99},{"version":"dcf1cb4cd3b27f0e108d001fc2fed0b8b5259cb35e1d235359b0d641be13110a","impliedFormat":99},{"version":"43ab854546749b24ed1a5c94660c1d4c1e057c7f054cb7ce55685219622a7738","impliedFormat":99},{"version":"ac1ea9507851331f3b2b675c59bc8592198a5cfa98cf074cae126f4cbe1e8527","impliedFormat":99},{"version":"347ac91dc251f916ed60c4359a7ebc7e0fa910bf128d0fd514dadc589a6beb3c","impliedFormat":99},{"version":"35430f542856fbf5d9f84644db699049c591e905c709bfa928f2094c5feb1f7d","impliedFormat":99},{"version":"4f4ca00be6361168ce482f1a8bfd44d37f35548cd7780384fbb0a6c9f25b5439","impliedFormat":99},{"version":"660e17a862d375ae05cee53600bc4e22289376e59a255d6de5ca1b53560ec8b5","impliedFormat":99},{"version":"e16d8f9bd6b01fdad145b7934cdf1b384fea92c0c7cca68776f12ca71feec266","impliedFormat":99},{"version":"f2b98fa6df7305499bf85c66887a3b4ebc0c9e73c24ecfa3ec2d448a02e208f6","impliedFormat":99},{"version":"0204dcd27fad4d0b803909b8c260b145cb947c11c29afe44ceca7a0214d818f1","impliedFormat":99},{"version":"72518f51a9de8d269fc06fe7e812b612fb84f748816fdb8492bcefc358a5a9d0","impliedFormat":99},{"version":"1b0d78ad9e5025e4f87e8f8b64c4ee5f7ab70fd62f4965e89c03a333996a5bdc","impliedFormat":99},{"version":"702ab0e7034b6564557abfa56b3c1b3e6636262e57710abc11ce3ca7451dbe26","impliedFormat":99},{"version":"1a516a7f4bc334d3ad0914f51f0b7438595f71e3979778f91fa98eeece210328","impliedFormat":99},{"version":"00a9f1b94a9cc1d0654bc0ba2ea6c802f59bbc7f81cedab9e352a7e114be232b","impliedFormat":99},{"version":"a6468e004cba50fb5150bfd71221031a521c1141b110fefebf01bb27a2a1eca0","impliedFormat":99},{"version":"816ad2333292d54fb1b764ee3ac7cc86c84f10333d6591d8e5b9b0e82af4c781","impliedFormat":99},{"version":"14d924455728baaf31aa1877d5533689603b9dc5d5f4d4b7224c37320faee815","impliedFormat":99},{"version":"5b9b0308d77913b037d8a98114c81f1d6c59957d74a2828ac4c69d5764ca18e8","impliedFormat":99},{"version":"4dc33f042bc0befa747d78ea308aac831df5fa7aa2bba0cd6b4f0358feac6884","signature":"f2cb8613228d38631e48bd50390519dffbf944012011144058ef2b6c734d748b"},{"version":"fedc60744f04d8a7db4e29cfc4a0d756e95103319acdb14421f0ab5ee3c840e5","signature":"8e72b201f46478a1b85aabc4b8454ab69777f512d6d916e5fad4c7fdc8e72ddb"},{"version":"1a058dcd50e94e7c471db7d66357add40f04a82450d2a7afbd90b5e3d18a67ea","signature":"49f3309e348fdead1954b62f39f74c4d9bc1d547a12cc3b0e0b473acced7d9f6"},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc782ff85b2cb10075ecffc158af7bfb27ff97bf8491c917efea0c3d622d5ac4","impliedFormat":1},{"version":"bc03c3c352f689e38c0ddd50c39b1e65d59273991bfc8858a9e3c0ebb79c023b","impliedFormat":1},{"version":"19df3488557c2fc9b4d8f0bac0fd20fb59aa19dec67c81f93813951a81a867f8","affectsGlobalScope":true,"impliedFormat":1},{"version":"b25350193e103ae90423c5418ddb0ad1168dc9c393c9295ef34980b990030617","affectsGlobalScope":true,"impliedFormat":1},{"version":"703ab6e138e341195708373e108eeba31eb1a23a5f618584159c4302feddfda7","signature":"99c1c891320ed07d31223de5c74053371071c2ea7e79abe08ef2dd4f5a0497c9"},{"version":"6eeafc9e451a22303993850f4bf4188291629a7239a6e01e5cc15e1da355475c","signature":"1510b4d6f80895779e0eff6832519f012229fbd0bd0bd774378d7adc0dad9b0d"},{"version":"93fc3829df844164298ef309f2d80294b26e0c1dfa2e31c31eec2b9bf3a7c405","signature":"dc2d00cdd97f9e637e2a04b1c1e53fdf41a183b30f420d85737d0bd9e0cb05f3"},{"version":"c967e03c8dbb4770f7e2f0b71b5d13593de679a41cc2b60266c4b69f1342a263","impliedFormat":1},{"version":"55dfdf48d02f51b57634939c3c03ab0588a2e6f03ac53bc669b0ca5cafd24c64","signature":"4d3b92f61465a75b4551f4b99eea552a58f60e72f75bcdaefbf9c20193a547c7"},{"version":"a4ddaaef7fc293f9aa2fa8738b9daf6909d9fccfedc73a4e476bf88fa11492fb","signature":"7594c89e58da5cb8cca0b678dead3d963e0166f22a864412c40ba74111fdf4a2"},{"version":"75a990e62ac6bea564ec6b4070bb58f91551759bf93cfbce34b0cf7303957df8","signature":"ac7d0433fdbc4e27cd49935dfdc56ba3ee3fd9fd7670f5a3fbe99fe279e24551"},{"version":"3e6fd76def30965db404c111dc7a11537d1ad0a92eaf21831a4cc362503a773b","signature":"5b3483a0693e49477c7b15f61945ffbe822afed11460f26af060ebb2ac807b15"},{"version":"d628e79de70874945d2b7f93c13551d20beaae2b454a8349bb5ff6e4e9d69e52","signature":"8126af403acc994433119b11a0a9c70b70bcfd643fc8372722f5b60a5c9318c2"},{"version":"03efa38e546999481f92188b74703f72b440c20427ae7d643ba7ef878ef0f9ca","signature":"04074d06a402abc0f0724ca6549afcd06f20d94d2f3dcc6ae453c5411141aacf"},{"version":"4cb3a862982ac87d902fde08eacd8977fc82f41d87f5c111b6cb3608e8039e05","signature":"2fb2ab9bea96527caf97ffd4872d0e695c123040bc82ad582131c24325042e30"},{"version":"1cff5961d25e7cdc5746b2940c325713760a7be70c781cc1407aa47a1fdd3b98","signature":"9c26affd048849fbd46910c2c55348777560eaa5340e8ce8a4a4f1a3e1db0b56"},"17e3af800a58dd7cc1bb2af42de592ef711b8f6c613299711ea81c3b63108130",{"version":"231a77a5f60b4055d36d8007321de7faf5d9d5a845c0c934f7f4fbee437dc3ed","signature":"aac474c4ff87ed1dc35a57387caeb49fa21352d5b29ed00efa809db3a27a2d8c"},{"version":"4048156bb861b1713569f54b8c018ec5e4c5b2db34379189e173c087dd97acff","signature":"dc8b7456101d0e9a14fdae73b1d29781a876642af4f282375d29bff5425367d6"},{"version":"619302ebcb46a29d536a713fb07543d77b4f379d92bd15bd8ee5b7cc024339a7","signature":"aedde8205ee99fa054a063c51ecd576b424758cda1065e5c79a14f3bc9b33043"},{"version":"3d582b786effb42a113b93f8a1afca36c6e48014206836a606ad3b018748512e","signature":"b06cfd25d90b7f2d2430b98187e41c2f24882bcf00a033fdf8059d6ebe91be48"},"ca82ed5bd0e6a6a2ee805fb8ff9f76022342ab3a4830687792b225105117f1d2","914b55a462408dd85c771a10b6981a06a582753fb8ede0b9d3ee8255f8c134e7","fdbb9331c04ff5c43c95576e3f731d7d60606ee7a16fa42088c929d9012ed5b5","b4ac144e1833e4e9615ff5d857f8379fe5be980edc1a9d321666eaf452e07097","7d81fa2c747ede1d7353d14e46a294f8067e3185ab52990748133eb1ecbb8e95","d3421d1c910ed6b9b3b40e81be3f1099176bb7e4d7577c59fc6328cc0af67f6e","5de6efc2ae3929e52daf496f688cfb80931c793003765dd0aa20b21f6156cc90","954496a4abdbf18ad54d15ef7482301b2dccec5144a6b44aec42983f63b22ec4",{"version":"7719a661a691dcf1a84eed5581eb223494502f579aa1e2425178b6f20ec8fcd0","impliedFormat":1},{"version":"4c51e36c9004c2d14a0bba49beb91630da51b15a0c41f91b2b076038126a5806","impliedFormat":1},{"version":"aca6ac8bf8de795cf3b67d450592d0f36356a3dcd0fb6425ac52c910aeb98ce4","impliedFormat":1},{"version":"f6feef58f3338b06119e40473c60553cbd5c75d74545d0aa3522374b6405720a","impliedFormat":1},{"version":"af6e515790bebd2d99ab46c08a3570f9fd74cd8542a4ecd2ca54fc7356680d24","impliedFormat":1},{"version":"5c5d0c9af035f7c920ef604080a6eef0a76cb4067ab4747ad2dc07026bfbfb48","impliedFormat":1},{"version":"6c27d4b5ba01295ef334456d9af4366aca789f228eee70fcb874b903a59b0e5b","impliedFormat":1},{"version":"93aa15a50eb71c40884e6f9b290eba6fb99d602706d21f8facf95c3bb8669abb","impliedFormat":1},{"version":"78ae308b449f2a861b1b1fbdd4aa0ba371c5e9e66aed2c2acf3b851785e652a4","impliedFormat":1},{"version":"d9e5cffcb3a6159f0a1e6fc1ad13abfe496a86cb82e0f59a82c926f8dad9d869","impliedFormat":1},{"version":"4485b7cd73d47ac60ff0a67f9c94f8b600c4d9665a27b268dd623baccc95c4eb","impliedFormat":1},{"version":"3800c5ce959fa102827db5cb875a461a05d43688ef4d85b76855c968a1573830","impliedFormat":1},{"version":"98c771706beebbe0f3720bb0a582b82e7c98cf62da175b8074cabecef2692546","impliedFormat":1},{"version":"9b1b01c85fe22541212ba4fa627d7f2059fa8af782ad6a899c43e9f4ceae4d0a","impliedFormat":1},"18363e751472a5f649e32d5f9603251d045a3b9b266334625e2ec59c1ccf317f","b46fbaff85ea35cfe2ef8dca455fc85394e2e8be592feb827152cfedc57e0262","a81afccd5831e390cd504701da7288714e795151e1df630b5281ccf3774c969b","9a8ba8f4f4be98077c4b7734ee7b805f374fcd71850d77ae6e9cd15b91b6f4bc","d239ddd36ff2760f669f87809db8aca94a749344f3e171a5d1ef122468a9ccc3","d8746f554d940f6522ec6ede961ef38d31a0947100d8f834db7a64f93cef6dd2","59be9348946adc746a9ee5b7c03c1f293ba60d7a6646f45c76fa962207de2f01","1269505d024fe59653f1789b7897073cdb4d29dc99093a1921849c99a30b4080","a6d795d9d6803cbde86e2a30c4ddde6a90ba347a93211e88aa342e914153f832","b7a2a3cc0a5c07d1fe6ce60943a491b44872e3f1e99a96dc28c6384e4b040e97","e62ba68263ee74daa6727e0741273f73bbd8c51d055452404cfcbee6e1a727c9","0640afefa828d574be4b51943041822e739b18a7eeb65ee316908a576dc96806","16f83be6917e40d274663129464b0ff536a82badf5d6dd6b63621a3fcbef3a52","40620ec486318d369901a2266445d8180a85d083c3a2f813fd4dc82767bd4425",{"version":"54885718b5e5904088b4d350d69dd0756ec17cdc94568a306128c9d11d40d077","signature":"94781d8f9b2836e44c499950d715168679b828cf8e85d153e98e8de1db9768c5"}],"root":[[274,276],[317,319],[326,328],[330,337],[339,342],379],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"alwaysStrict":true,"declaration":true,"esModuleInterop":true,"experimentalDecorators":true,"module":99,"noImplicitAny":true,"outDir":"./","preserveConstEnums":true,"removeComments":true,"rootDir":"../../src/compiler","skipLibCheck":true,"sourceMap":false,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"suppressImplicitAnyIndexErrors":false,"target":99,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[338,1],[373,1],[375,2],[350,3],[374,4],[347,5],[346,6],[348,1],[349,7],[371,5],[345,1],[370,1],[365,8],[378,9],[368,1],[369,10],[343,11],[344,12],[372,13],[367,14],[366,1],[377,1],[376,1],[273,1],[363,15],[356,16],[354,17],[360,18],[359,1],[362,19],[352,19],[355,20],[353,21],[361,22],[358,23],[364,24],[351,1],[279,1],[227,1],[229,1],[230,25],[159,26],[160,26],[161,27],[97,28],[162,29],[163,30],[164,31],[165,32],[166,33],[167,34],[168,35],[169,36],[170,37],[171,37],[172,38],[173,39],[174,1],[175,40],[176,41],[98,1],[96,1],[177,42],[178,43],[179,44],[222,45],[180,19],[181,46],[182,19],[183,47],[184,48],[186,49],[187,50],[188,50],[189,50],[190,51],[191,52],[192,53],[193,54],[194,55],[195,56],[196,56],[197,57],[198,1],[199,1],[200,58],[201,59],[202,60],[203,61],[204,62],[205,63],[206,64],[207,65],[208,66],[209,67],[210,68],[211,69],[212,70],[213,71],[214,72],[215,73],[216,74],[217,75],[218,76],[99,19],[100,1],[101,77],[102,78],[103,1],[104,79],[105,1],[150,80],[151,81],[152,82],[153,82],[154,83],[155,1],[156,29],[157,84],[158,81],[219,85],[220,86],[221,87],[323,88],[325,89],[324,90],[320,1],[322,91],[278,92],[277,1],[185,1],[321,1],[241,1],[304,93],[311,94],[309,95],[308,96],[310,95],[306,1],[307,97],[305,96],[284,96],[285,96],[286,96],[287,96],[288,96],[289,96],[290,96],[291,96],[292,95],[293,96],[294,96],[295,96],[281,96],[296,96],[297,96],[298,96],[282,96],[299,96],[300,96],[301,96],[302,96],[303,96],[283,98],[265,1],[267,99],[266,1],[314,1],[95,100],[94,1],[261,101],[259,102],[260,103],[248,104],[249,102],[256,105],[247,106],[252,107],[262,1],[253,108],[258,109],[264,110],[263,111],[246,112],[254,113],[255,114],[250,115],[257,101],[251,116],[270,117],[232,118],[233,119],[236,120],[228,121],[235,122],[231,123],[226,1],[237,124],[238,125],[280,126],[245,1],[357,1],[92,1],[93,1],[16,1],[14,1],[15,1],[21,1],[20,1],[2,1],[22,1],[23,1],[24,1],[25,1],[26,1],[27,1],[28,1],[29,1],[3,1],[30,1],[31,1],[4,1],[32,1],[36,1],[33,1],[34,1],[35,1],[37,1],[38,1],[39,1],[5,1],[40,1],[41,1],[42,1],[43,1],[6,1],[47,1],[44,1],[45,1],[46,1],[48,1],[7,1],[49,1],[54,1],[55,1],[50,1],[51,1],[52,1],[53,1],[8,1],[59,1],[56,1],[57,1],[58,1],[60,1],[9,1],[61,1],[62,1],[63,1],[65,1],[64,1],[66,1],[67,1],[10,1],[68,1],[69,1],[70,1],[11,1],[71,1],[72,1],[73,1],[74,1],[75,1],[76,1],[12,1],[77,1],[78,1],[79,1],[80,1],[81,1],[1,1],[82,1],[83,1],[13,1],[84,1],[85,1],[86,1],[87,1],[88,1],[89,1],[90,1],[91,1],[19,1],[17,1],[18,1],[329,1],[124,127],[138,128],[121,129],[139,20],[148,130],[112,131],[113,132],[111,133],[147,134],[142,135],[146,136],[115,137],[125,138],[135,139],[114,140],[145,141],[109,142],[110,135],[116,138],[117,1],[123,143],[120,138],[107,144],[149,145],[140,146],[128,147],[127,138],[129,148],[132,149],[126,150],[130,151],[143,134],[118,152],[119,153],[133,154],[108,20],[137,155],[136,138],[122,153],[131,156],[134,157],[141,1],[106,1],[144,158],[313,159],[312,160],[316,161],[315,162],[224,163],[272,164],[240,165],[225,163],[223,1],[239,166],[271,1],[269,1],[242,167],[268,168],[234,169],[244,1],[243,170],[337,171],[276,172],[328,173],[326,174],[336,175],[317,176],[332,177],[319,178],[318,179],[379,180],[331,181],[333,182],[330,183],[274,50],[275,184],[334,185],[339,186],[341,187],[342,188],[340,78],[327,1],[335,189]],"version":"6.0.3"}
@@ -4,7 +4,8 @@ export declare const AUTH_EMAILS_LIB_SUBDIR = ".toil/authlib";
4
4
  type AuthName = 'AuthConfirm' | 'AuthReset' | 'Auth2fa';
5
5
  interface AuthEmailSpec {
6
6
  readonly fn: 'confirm' | 'reset' | 'twofa';
7
- readonly token: 'link' | 'code';
7
+ readonly requiredToken: 'link' | 'code';
8
+ readonly providedTokens: readonly string[];
8
9
  readonly purpose: string;
9
10
  readonly defaultSubject: string;
10
11
  readonly defaultText: string;
@@ -8,7 +8,8 @@ export const AUTH_EMAILS_LIB_SUBDIR = '.toil/authlib';
8
8
  const SPECS = {
9
9
  AuthConfirm: {
10
10
  fn: 'confirm',
11
- token: 'link',
11
+ requiredToken: 'link',
12
+ providedTokens: ['link'],
12
13
  purpose: 'verify',
13
14
  subjectFromArg: false,
14
15
  defaultSubject: 'Confirm your account',
@@ -19,7 +20,8 @@ const SPECS = {
19
20
  },
20
21
  AuthReset: {
21
22
  fn: 'reset',
22
- token: 'link',
23
+ requiredToken: 'link',
24
+ providedTokens: ['link'],
23
25
  purpose: 'reset',
24
26
  subjectFromArg: false,
25
27
  defaultSubject: 'Reset your password',
@@ -31,15 +33,16 @@ const SPECS = {
31
33
  },
32
34
  Auth2fa: {
33
35
  fn: 'twofa',
34
- token: 'code',
36
+ requiredToken: 'code',
37
+ providedTokens: ['code', 'action'],
35
38
  purpose: '2fa',
36
39
  subjectFromArg: true,
37
40
  defaultSubject: '',
38
41
  defaultText: 'Your verification code is {{code}}.\n' +
39
- 'It expires in a few minutes. If you did not request it, ignore this email.\n',
42
+ 'Enter it to {{action}}. It expires in a few minutes. If you did not request it, ignore this email.\n',
40
43
  defaultHtml: '<p>Your verification code is:</p>' +
41
44
  '<p style="font-size:28px;font-weight:bold;letter-spacing:4px">{{code}}</p>' +
42
- '<p>It expires in a few minutes. If you did not request it, ignore this email.</p>',
45
+ '<p>Enter it to {{action}}. It expires in a few minutes. If you did not request it, ignore this email.</p>',
43
46
  },
44
47
  };
45
48
  const AUTH_NAMES = Object.keys(SPECS);
@@ -64,27 +67,36 @@ function reservedFilesIn(emailsDir) {
64
67
  return out;
65
68
  }
66
69
  function effectiveFromOverride(name, spec, r) {
67
- if (!r.tokens.includes(spec.token))
68
- warn(`override emails/${name} never uses the {${spec.token}} prop, so the ` +
69
- `${spec.token === 'link' ? 'link' : 'code'} will be missing from the email.`);
70
+ if (!r.tokens.includes(spec.requiredToken))
71
+ warn(`override emails/${name} never uses the {${spec.requiredToken}} prop, so the ` +
72
+ `${spec.requiredToken === 'link' ? 'link' : 'code'} will be missing from the email.`);
70
73
  for (const t of r.tokens)
71
- if (t !== spec.token)
72
- warn(`override emails/${name} uses {${t}}, which auth does not provide ` +
73
- `(only {${spec.token}}); it will render empty.`);
74
+ if (!spec.providedTokens.includes(t))
75
+ warn(`override emails/${name} uses {${t}}, which auth does not provide (only ` +
76
+ `${spec.providedTokens.map((x) => '{' + x + '}').join(', ')}); it will render empty.`);
74
77
  const subject = spec.subjectFromArg || r.subject === name ? spec.defaultSubject : r.subject;
75
78
  return { subject, text: r.text, html: r.html };
76
79
  }
77
80
  function emitFn(spec, eff) {
78
- const subjectExpr = spec.subjectFromArg ? 'subject' : asLit(eff.subject);
79
- const sig = spec.fn === 'twofa'
80
- ? 'twofa(to: string, code: string, subject: string): void'
81
- : `${spec.fn}(to: string, ${spec.token}: string): void`;
81
+ let sig;
82
+ let subjectExpr;
83
+ let sets;
84
+ if (spec.fn === 'twofa') {
85
+ sig = 'twofa(to: string, code: string, subject: string, action: string): void';
86
+ subjectExpr = 'subject';
87
+ sets = ['v.set("code", code);', 'v.set("action", action);'];
88
+ }
89
+ else {
90
+ sig = `${spec.fn}(to: string, ${spec.requiredToken}: string): void`;
91
+ subjectExpr = asLit(eff.subject);
92
+ sets = [`v.set(${asLit(spec.requiredToken)}, ${spec.requiredToken});`];
93
+ }
82
94
  return [
83
95
  ` export function ${sig} {`,
84
96
  ` const T: string = ${asLit(eff.text)};`,
85
97
  ` const H: string = ${asLit(eff.html)};`,
86
98
  ` const v = new Map<string, string>();`,
87
- ` v.set(${asLit(spec.token)}, ${spec.token});`,
99
+ ...sets.map((s) => ` ${s}`),
88
100
  ` new EmailTemplate(${subjectExpr}, T, H).sendDetached(to, v, ${asLit(spec.purpose)});`,
89
101
  ` }`,
90
102
  ];
@@ -1,7 +1,7 @@
1
1
  export const TOIL_DOCS = {
2
2
  "README.md": "# toiljs\n\ntoiljs is a full-stack web framework. You write your **frontend in React** and your **backend in\nTypeScript**, and toiljs turns the backend into a tiny, fast **WebAssembly** program that runs at the edge\n(on servers close to your users, all over the world). One language, one project, one deploy.\n\nIf you have used Next.js, this will feel familiar: file-based routes, server code next to client code, a dev\nserver with hot reload. The difference is what happens underneath. Your server code is compiled by\n**toilscript** (a TypeScript-to-WebAssembly compiler) into a sandboxed `.wasm` module, and it runs on the\n**Dacely edge** with a built-in worldwide database (**ToilDB**), streaming, background jobs, and auth all\nincluded.\n\n## The mental model\n\n```mermaid\nflowchart LR\n A[\"Your project<br/>(TypeScript + React)\"] -->|toiljs build| B[\"client bundle<br/>(React, runs in the browser)\"]\n A -->|toilscript compile| C[\"server.wasm<br/>(your backend, sandboxed)\"]\n B --> U[\"User's browser\"]\n C --> E[\"Dacely edge<br/>(worldwide)\"]\n E --> D[(\"ToilDB<br/>global database\")]\n U <-->|HTTP / WebTransport| E\n```\n\n- **client/** is your React app (pages, components, styles). It runs in the browser.\n- **server/** is your backend (routes, database, auth). It compiles to WebAssembly and runs on the edge.\n- **shared/** is the typed bridge: toiljs generates a client here so the browser calls your server with full\n type safety.\n\n## Hello, toiljs\n\n```ts\n// server/routes/Hello.ts (a backend HTTP route)\nimport { Response } from 'toiljs/server/runtime';\n\n@rest('hello')\nclass Hello {\n @get('/')\n public hi(): Response {\n return Response.text('Hello from the edge!\\n');\n }\n}\n```\n\n```tsx\n// client/routes/index.tsx (a frontend page)\nexport default function Home() {\n return <main><h1>Welcome</h1></main>;\n}\n```\n\nRun `toiljs dev`, open the browser, and both are live with hot reload. That is the whole loop.\n\n## Learn toiljs\n\n**Understand toil first**\n- [Understanding toil](./introduction/README.md): what toil is and the one big idea, then\n [why toil and who it is for](./introduction/why-toil.md),\n [the modern stack you get](./introduction/modern-stack.md),\n [how it works](./introduction/how-it-works.md),\n [what makes it hyper-scalable](./introduction/hyperscale.md),\n [how it is distributed](./introduction/distributed.md),\n [toil versus other frameworks](./introduction/vs-other-frameworks.md), and\n [why it is built this way](./introduction/design-principles.md).\n\n**Start here**\n- [Getting started](./getting-started/README.md): install, create a project, project structure, your first\n app, and migrating an existing React app.\n- [The CLI](./cli/README.md): `dev`, `build`, `create`, `doctor`, and every flag.\n- [Deploy](./getting-started/deploy.md): build for production, self-host it, and how the managed edge fits in.\n\n**Build the frontend**\n- [Frontend overview](./frontend/README.md), [Routing](./frontend/routing.md),\n [Navigation](./frontend/navigation.md), [Components](./frontend/components.md),\n [Rendering and SSR](./frontend/rendering.md), [Styling](./frontend/styling.md),\n [Images](./frontend/images.md), [Metadata and SEO](./frontend/metadata.md),\n [Fetching data](./frontend/data-fetching.md), [Scripts](./frontend/scripts.md),\n [Search](./frontend/search.md), [The Toil global (reference)](./frontend/toil-global.md).\n\n**Build the backend**\n- [Backend overview](./backend/README.md), [HTTP routes (`@rest`)](./backend/rest.md),\n [Typed RPC (`@service`/`@remote`)](./backend/rpc.md), [Data types (`@data`)](./backend/data.md).\n\n**The database (ToilDB)**\n- [Database overview and choosing a family](./database/README.md), [Setup (`@database`)](./database/setup.md),\n [Documents](./database/documents.md), [Unique](./database/unique.md), [Counters](./database/counters.md),\n [Events](./database/events.md), [Views and `@derive`](./database/views.md),\n [Membership](./database/membership.md), [Capacity](./database/capacity.md).\n\n**Auth**: [the full auth guide](./auth/README.md) covers post-quantum login, sessions, and `ToilUserId`;\n[customizing the auth emails](./auth/emails.md) shows how to brand the verification, reset, and 2FA mail.\n\n**Realtime and background**\n- [Streams](./realtime/README.md) and [channels](./realtime/channels.md), [Daemons and scheduled\n jobs](./background/daemons.md), [Derived views (`@derive`)](./background/derive.md).\n\n**Platform services**\n- [Caching](./services/caching.md), [Rate limiting](./services/ratelimit.md),\n [Environment and secrets](./services/environment.md), [Email and 2FA](./services/email.md),\n [Analytics](./services/analytics.md), [Crypto](./services/crypto.md), [Cookies](./services/cookies.md),\n [Time](./services/time.md).\n\n**Concepts and reference**\n- [Writing toiljs correctly (AI + human quick rules)](./concepts/ai-guide.md),\n [Compute tiers (L1 to L4)](./concepts/tiers.md), [Types (u64, u256, and friends)](./concepts/types.md),\n [Every decorator](./concepts/decorators.md), [Configuration](./concepts/config.md),\n [Security and SRI](./concepts/security.md).\n",
3
3
  "auth/configuration.md": "# Configuring auth for production\n\nBuilt-in auth runs locally with **zero configuration**, it falls back to published, insecure DEV secrets\nso `toiljs dev` Just Works. **A deployment MUST replace all three secrets and pin its KEM key.** This page\nis the checklist.\n\n## The secrets\n\nAuth reads these from the tenant environment store (locally, `.env.secrets`; on the edge, the per-host\nsecure env). They resolve **lazily** the first time auth runs, so no startup wiring is needed.\n\n| Key | What it is | Dev fallback |\n| --- | --- | --- |\n| `AUTH_SESSION_SECRET` | HMAC-SHA256 key that signs the session cookie. Must be identical on every edge instance (a cookie minted anywhere must verify everywhere). | a public constant, **anyone can forge a session** |\n| `AUTH_OPRF_SEED` | Master seed for the per-user OPRF salt key. Rotating it invalidates every password (users must re-register). | a hashed public constant |\n| `AUTH_KEM_SK` | The server's ML-KEM-768 **secret** key (hex). Its public half is what the client encapsulates to. | a pinned dev key pair |\n\n```bash\n# .env.secrets (gitignored; mode 0600 on the edge, NEVER under hosts/, NEVER in the .wasm)\nAUTH_SESSION_SECRET=…64 hex chars (32 bytes)…\nAUTH_OPRF_SEED=…64 hex chars (32 bytes)…\nAUTH_KEM_SK=…hex of an ML-KEM-768 secret key…\n```\n\n### Generating them\n\n`AUTH_SESSION_SECRET` and `AUTH_OPRF_SEED` are just 32 random bytes each:\n\n```bash\nnode -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n```\n\n`AUTH_KEM_SK` is an ML-KEM-768 key pair. Generate it and keep BOTH halves, the secret goes in the env, the\npublic half is pinned in the client (next section):\n\n```ts\nimport { ml_kem768 } from '@dacely/noble-post-quantum/ml-kem';\nconst { secretKey, publicKey } = ml_kem768.keygen();\nconsole.log('AUTH_KEM_SK =', Buffer.from(secretKey).toString('hex'));\nconsole.log('client serverKemPublicKey =', Buffer.from(publicKey).toString('hex'));\n```\n\n## Pin the client's KEM public key\n\nThe browser must know the server's genuine KEM public key to run the mutual-auth handshake, this is the\nanti-phishing anchor. The `toiljs/client` `Auth` helper ships with the **dev** key pinned, so a deployment\nMUST pass its own:\n\n```ts\nimport { Auth } from 'toiljs/client';\n\nconst SERVER_KEM_PUBLIC_KEY = /* the publicKey bytes from AUTH_KEM_SK */;\n\nawait Auth.login(username, password, { serverKemPublicKey: SERVER_KEM_PUBLIC_KEY });\nawait Auth.register(username, password, { serverKemPublicKey: SERVER_KEM_PUBLIC_KEY });\n```\n\nShip the public key with your client bundle (it's public, safe to embed). If it doesn't match the server's\n`AUTH_KEM_SK`, login's `serverConfirm` check fails and the client aborts.\n\n## Optional: audience & domain\n\nBoth are optional and have sensible defaults; set them for stability across host aliases:\n\n| Key | Meaning | Default |\n| --- | --- | --- |\n| `TOIL_AUTH_AUDIENCE` | The service audience bound into the signed login message. | `\"toil\"` |\n| `TOIL_AUTH_DOMAIN` | The `domain` input of the stable `ToilUserId` (`sha256(pubkey ‖ username ‖ domain)`). | the request `Host` header, else `localhost` |\n\nSet `TOIL_AUTH_DOMAIN` explicitly if your site answers on multiple hostnames, otherwise the same user could\nget different `ToilUserId`s from different aliases. Once users exist, changing it changes everyone's id, so\npick it before launch.\n\n## Email confirmation\n\nTwo plain env vars (tenant-readable, like `PUBLIC_BASE_URL`) control the built-in email-verification flow. They are separate on purpose: sending a verify email at registration is one decision, blocking login until confirmed is another.\n\n| Key | What it does |\n| --- | --- |\n| `AUTH_EMAIL_CONFIRMATION` | Registration emails a one-time confirm link (`/confirm#token=…`) and stores the account **unconfirmed**. Login is **not** blocked: the user can sign in, and you nudge them to verify. Use this for \"verify at signup, but let people in\". |\n| `AUTH_REQUIRE_EMAIL_CONFIRMATION` | The stricter form: does everything above AND **refuses login** until the email is confirmed (a distinguishable status the client surfaces as `EmailNotConfirmedError`, so the UI can prompt \"confirm your email / resend\"). Implies `AUTH_EMAIL_CONFIRMATION`. On the managed edge this is force-set from the per-domain Dacely setting. |\n\nWith neither set, accounts are auto-confirmed at registration and no confirm email is sent. The one-time link is delivered by email; in `toiljs dev` it is drawn in the console (no mailer needed). Both use the standard non-enumerating responses (a generic 200 that never reveals whether an address exists).\n\n## Argon2id strength (known limitation)\n\nThe built-in controller currently uses **demo-light** Argon2id params (32 MiB, 2 iterations, 1 lane) so it\nstays responsive in a browser tab. These are baked into the shipped controller today; **config-driven\ntuning is a planned follow-up.** For a high-value production deployment you should either wait for the\nconfig knob or hand-write your own controller with `≥ 256 MiB / ≥ 3 iterations`. The OPRF still provides the\nprimary offline-attack resistance regardless, but raise these before protecting anything sensitive.\n\nThe client always derives against whatever params the server returns in `/login/start`, so when the config\nknob lands you can raise them server-side with **no client change**.\n\n## Deploy checklist\n\n- [ ] `AUTH_SESSION_SECRET` set (32 random bytes), identical on every edge instance.\n- [ ] `AUTH_OPRF_SEED` set (32 random bytes).\n- [ ] `AUTH_KEM_SK` set (an ML-KEM-768 secret key), and its **public** half pinned in the client via\n `serverKemPublicKey`.\n- [ ] `TOIL_AUTH_DOMAIN` set if you serve multiple hostnames (stable `ToilUserId`).\n- [ ] (Recommended) Argon2id params reviewed for your threat model.\n\nThe CLI doctor warns when `server.auth` is on and the secrets are missing, run it before you ship.\n",
4
- "auth/emails.md": "# Customizing the auth emails\n\nBuilt-in auth sends three transactional emails: the email-verification link, the password-reset link, and the two-factor code. Each ships with a plain, working default. You can replace any of them with your own branded template, and you never touch the auth code to do it.\n\n## The three emails\n\n| Email | When it sends | The value it gives your template |\n| --- | --- | --- |\n| Email verification | On register, when email confirmation is on | `link` (the confirm URL) |\n| Password reset | On `POST /auth/reset/request` | `link` (the reset URL) |\n| Two-factor code | On login or 2FA setup, for the email method | `code` (the numeric code) |\n\nThe defaults are intentionally minimal so a fresh project sends real, correct mail with no setup. To match your brand, override them.\n\n## How to override\n\nDrop a React template in your project's `emails/` folder with the reserved name for that email. If the file exists, the build uses it; if not, the default stands. This is the same `emails/*.tsx` system you use for your own mail (see [Email](../services/email.md)), so you get full markup and inline CSS.\n\n| Reserved file | Overrides | Prop it must read |\n| --- | --- | --- |\n| `emails/auth-confirm.tsx` | Email verification | `link` |\n| `emails/auth-reset.tsx` | Password reset | `link` |\n| `emails/auth-2fa.tsx` | Two-factor code | `code` |\n\nEach template is a default-exported React component. Read the one prop it is given, and it becomes a `{{token}}` hole the edge fills per send. Reading any other prop renders empty, so the build warns you.\n\n```tsx\n// emails/auth-confirm.tsx -> overrides the email-verification message.\nexport const subject = 'Verify your Acme account';\n\nexport default function AuthConfirm({ link }: { link: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24 }}>\n <h1 style={{ color: '#cb9820' }}>Welcome to Acme</h1>\n <p>Tap below to verify your email and finish signing up.</p>\n <p>\n <a\n href={link}\n style={{ background: '#cb9820', color: '#fff', padding: '10px 18px', borderRadius: 8, textDecoration: 'none' }}\n >\n Verify my email\n </a>\n </p>\n <p style={{ color: '#666', fontSize: 13 }}>Or paste this link: {link}</p>\n </div>\n );\n}\n```\n\nThe reset template works the same way with the `link` prop.\n\n## The subject line\n\nFor verification and reset, set the subject with `export const subject = '...'`. Leave it out and the default subject is used (`Confirm your account`, `Reset your password`).\n\nThe two-factor email is different: its subject is set by the framework because it changes with context (a login code versus a setup code). Your `emails/auth-2fa.tsx` override controls the body and HTML around the `code`, and the subject stays contextual. A `subject` export in that file is ignored.\n\n```tsx\n// emails/auth-2fa.tsx -> overrides the 2FA code message (subject is contextual).\nexport default function Auth2fa({ code }: { code: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24, textAlign: 'center' }}>\n <p>Your Acme verification code:</p>\n <p style={{ fontSize: 32, fontWeight: 700, letterSpacing: 6 }}>{code}</p>\n <p style={{ color: '#666' }}>It expires in a few minutes.</p>\n </div>\n );\n}\n```\n\n## What you can and cannot put in\n\nEach template is rendered once, at build time, into a static string of HTML with your styles inlined, and the prop becomes a fill hole. So a fixed layout and inline styles work, but per-send logic does not: a `{items.map(...)}` or a conditional runs at build, not per email. For these three messages that is all you need, one link or one code.\n\nThe only value auth hands each template is the one in the table above (`link` or `code`). There is no user name, no app name, no expiry value. Write those into the template text directly.\n\nStyling rules are the same as any toiljs email: write inline `style={{ ... }}`, or import a stylesheet and its rules are inlined for you. A bare CSS import with no inlining has no effect in an email client. See [Email](../services/email.md) for the details.\n\n## Delivery stays safe\n\nYou cannot weaken the security of these flows by overriding a template. Every auth email is sent detached (fire-and-forget), so the response time never reveals whether an address maps to an account. That holds whether the message is the default or your override. Overriding only changes what the email looks like, never how it is sent.\n\n## Where the templates go\n\nThere is nothing to import and nothing to register. The build reads `emails/auth-*.tsx`, bakes the effective templates into the compiled server, and the auth controller sends them. Changing a template and rebuilding (or saving under `toiljs dev`) is all it takes.\n\n## Related\n\n- [Email](../services/email.md): the full `emails/*.tsx` system, `EmailService`, and `EmailTemplate`.\n- [Configuration](./configuration.md): the auth secrets and the email provider a deployment must set.\n- [Usage](./usage.md): enabling auth, the client API, and guarding routes.\n",
4
+ "auth/emails.md": "# Customizing the auth emails\n\nBuilt-in auth sends three transactional emails: the email-verification link, the password-reset link, and the two-factor code. Each ships with a plain, working default. You can replace any of them with your own branded template, and you never touch the auth code to do it.\n\n## The three emails\n\n| Email | When it sends | The value it gives your template |\n| --- | --- | --- |\n| Email verification | On register, when email confirmation is on | `link` (the confirm URL) |\n| Password reset | On `POST /auth/reset/request` | `link` (the reset URL) |\n| Two-factor code | On login or 2FA setup, for the email method | `code` (the numeric code) and `action` (the flow phrase) |\n\nThe defaults are intentionally minimal so a fresh project sends real, correct mail with no setup. To match your brand, override them.\n\n## How to override\n\nDrop a React template in your project's `emails/` folder with the reserved name for that email. If the file exists, the build uses it; if not, the default stands. This is the same `emails/*.tsx` system you use for your own mail (see [Email](../services/email.md)), so you get full markup and inline CSS.\n\n| Reserved file | Overrides | Prop it must read |\n| --- | --- | --- |\n| `emails/auth-confirm.tsx` | Email verification | `link` |\n| `emails/auth-reset.tsx` | Password reset | `link` |\n| `emails/auth-2fa.tsx` | Two-factor code | `code`, `action` |\n\nEach template is a default-exported React component. Read the one prop it is given, and it becomes a `{{token}}` hole the edge fills per send. Reading any other prop renders empty, so the build warns you.\n\n```tsx\n// emails/auth-confirm.tsx -> overrides the email-verification message.\nexport const subject = 'Verify your Acme account';\n\nexport default function AuthConfirm({ link }: { link: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24 }}>\n <h1 style={{ color: '#cb9820' }}>Welcome to Acme</h1>\n <p>Tap below to verify your email and finish signing up.</p>\n <p>\n <a\n href={link}\n style={{ background: '#cb9820', color: '#fff', padding: '10px 18px', borderRadius: 8, textDecoration: 'none' }}\n >\n Verify my email\n </a>\n </p>\n <p style={{ color: '#666', fontSize: 13 }}>Or paste this link: {link}</p>\n </div>\n );\n}\n```\n\nThe reset template works the same way with the `link` prop.\n\n## The subject line\n\nFor verification and reset, set the subject with `export const subject = '...'`. Leave it out and the default subject is used (`Confirm your account`, `Reset your password`).\n\nThe two-factor email is different. It serves three flows (signing in, enabling 2FA, and turning 2FA off), so besides the `code` it also gets an `action` prop: the framework fills it with the flow phrase, `sign in`, `enable two-factor authentication`, or `turn off two-factor authentication`. Write it into a sentence like \"Enter this code to {action}.\" and the one template reads correctly for every flow. The subject is likewise set by the framework and stays contextual, so a `subject` export in this file is ignored.\n\n```tsx\n// emails/auth-2fa.tsx -> overrides the 2FA code message (subject is contextual).\nexport default function Auth2fa({ code, action }: { code: string; action: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24, textAlign: 'center' }}>\n <p>Your Acme verification code:</p>\n <p style={{ fontSize: 32, fontWeight: 700, letterSpacing: 6 }}>{code}</p>\n <p>Enter it to {action}.</p>\n <p style={{ color: '#666' }}>It expires in a few minutes.</p>\n </div>\n );\n}\n```\n\n## What you can and cannot put in\n\nEach template is rendered once, at build time, into a static string of HTML with your styles inlined, and the prop becomes a fill hole. So a fixed layout and inline styles work, but per-send logic does not: a `{items.map(...)}` or a conditional runs at build, not per email. For these three messages that is all you need, one link or one code.\n\nThe only values auth hands each template are the ones in the table above (`link`, or `code` plus `action` for 2FA). There is no user name, no app name, no expiry value. Write those into the template text directly.\n\nStyling rules are the same as any toiljs email: write inline `style={{ ... }}`, or import a stylesheet and its rules are inlined for you. A bare CSS import with no inlining has no effect in an email client. See [Email](../services/email.md) for the details.\n\n## Delivery stays safe\n\nYou cannot weaken the security of these flows by overriding a template. Every auth email is sent detached (fire-and-forget), so the response time never reveals whether an address maps to an account. That holds whether the message is the default or your override. Overriding only changes what the email looks like, never how it is sent.\n\n## Where the templates go\n\nThere is nothing to import and nothing to register. The build reads `emails/auth-*.tsx`, bakes the effective templates into the compiled server, and the auth controller sends them. Changing a template and rebuilding (or saving under `toiljs dev`) is all it takes.\n\n## Related\n\n- [Email](../services/email.md): the full `emails/*.tsx` system, `EmailService`, and `EmailTemplate`.\n- [Configuration](./configuration.md): the auth secrets and the email provider a deployment must set.\n- [Usage](./usage.md): enabling auth, the client API, and guarding routes.\n",
5
5
  "auth/extending.md": "# Extending & integrating auth\n\nBuilt-in auth is deliberately opinionated so the common case is one line. This page covers the identity\nyou build ON, `ToilUserId`, and how to go beyond the defaults: keying your own data on a user, a custom\nuser shape, and hand-writing auth from the same primitives.\n\n## `ToilUserId`\n\nThe stable, tenant-scoped user identity: `sha256(mldsaPublicKey ‖ identifier ‖ domain)`, a 256-bit value.\nIt's a **global** (no import), like `crypto`.\n\n```ts\n// Read the current user's id in any handler (gate on hasSession(), see the null note below).\nconst id: ToilUserId = AuthService.userId()!;\n\n// Or derive one yourself.\nconst id2 = ToilUserId.derive(mldsaPublicKey, 'alice@example.com', 'acme.dacely.com');\n```\n\n| Member | Description |\n| --- | --- |\n| `ToilUserId.derive(pk, identifier, domain)` | Derive from an ML-DSA public key + email/username + tenant domain. Deterministic. |\n| `ToilUserId.fromBytes(b)` | Rebuild from a 32-byte digest (from `toBytes()` or storage). |\n| `toBytes(): Uint8Array` | The 32 identity bytes. |\n| `toHex(): string` | Lowercase 64-char hex, a convenient string key. |\n| `isZero(): bool` | True for the unset / anonymous id. |\n| `equals(other): bool` | Value equality. |\n| `a == b` / `a != b` | Overloaded value comparison, **O(1)** (four `u64` word compares, no byte loop, no allocation). |\n\n```ts\nconst a = ToilUserId.derive(pk, 'alice', 'acme.com');\nconst b = ToilUserId.derive(pk, 'alice', 'acme.com');\nconst c = ToilUserId.derive(pk, 'bob', 'acme.com');\na == b; // true, same inputs, same id\na != c; // true, different user\n```\n\n> **Null-check gotcha:** because `ToilUserId` overloads `==`, `AuthService.userId() == null` does NOT\n> type-check (`==` expects a `ToilUserId`). Gate with `AuthService.hasSession()` and then `userId()!`, or\n> compare with `getUser()` (a plain nullable). `===` is reference identity in AssemblyScript and is not\n> overloadable, use `==` for value equality.\n\n## Keying your own data on the user\n\n`toilUserId` is the right key for per-user data, it's stable across sessions/devices and opaque. Use the\nhex as a string key, or the bytes in a `@data` key class:\n\n```ts\n@data\nclass UserKey {\n id: Uint8Array = new Uint8Array(0); // toilUserId bytes\n constructor(id: Uint8Array = new Uint8Array(0)) { this.id = id; }\n}\n\n@data class Profile { displayName: string = ''; bio: string = ''; }\n\n@database\nclass AppDb {\n @collection static profiles: Documents<UserKey, Profile>;\n}\n\n@rest('profile')\nclass ProfileApi {\n @auth\n @post('/')\n public save(ctx: RouteContext): Response {\n const key = new UserKey(AuthService.userId()!.toBytes());\n const p = Profile.decode(ctx.request.body);\n // Save this user's profile. create is insert-only, so the first save creates\n // the record and later saves overwrite the existing one with enqueue.\n if (!AppDb.profiles.create(key, p)) {\n AppDb.profiles.enqueue(key, p);\n }\n return Response.text('saved\\n');\n }\n}\n```\n\n## Extending the user: add your own fields\n\nBuilt-in auth reserves exactly two fields on the authenticated user: `toilUserId` and `username`. To carry\nmore (a role, a display name, a tenant), just declare your OWN `@user` in your server code while\n`server.auth` is on. The build detects it and **extends** it: it injects the reserved `toilUserId` +\n`username` as the first two fields and mints sessions for your shape automatically. You do not opt out of\nanything, and there is still exactly one `@user` per program.\n\n```ts\n@user\nclass Account {\n admin: bool = false;\n displayName: string = '';\n tenant: string = '';\n // toilUserId + username are INJECTED by the build; do not declare them here.\n}\n```\n\nRules:\n\n- Do **not** declare `toilUserId` or `username` yourself. They are reserved and injected; declaring either is\n a compile error (`'username' is reserved by built-in auth`).\n- Your `@user` must be default-constructible (give every field an initializer), like any `@data` class.\n\n`AuthService.getUser()` is now typed to YOUR shape:\n\n```ts\nconst user = AuthService.getUser(); // { toilUserId, username, admin, displayName, tenant } | null\n```\n\n**Populating your fields.** Login fills `toilUserId` + `username`; your extra fields start at their declared\ndefaults (`admin = false`, and so on). The built-in controller cannot know your business fields, so you set\nthem yourself on one of your own `@auth` routes by reading the user, updating it, and re-minting the session:\n\n```ts\n@rest('account')\nclass AccountApi {\n @auth @post('/promote')\n public promote(): Response {\n const user = AuthService.getUser()!;\n user.admin = true;\n const resp = Response.text('promoted\\n');\n resp.setCookie(AuthService.mintSession(user.encode())); // re-sign the session with the new fields\n resp.setCookie(AuthService.userCookie(user.encode())); // update the readable companion cookie\n return resp;\n }\n}\n```\n\nIf you would rather hand-write the whole controller instead, you still can: do **not** enable `server.auth`,\nand build your own `@user` + routes from the [AuthService primitives](#the-authservice-primitive-reference)\nbelow. But for most apps, extending is all you need.\n\n## Adding email verification / 2FA\n\nLayer a second factor on top of the session with `TwoFactor` (stateless email codes, no DB; see\n[email](../services/email.md)). Typical flow: after login, require a verified email before granting access to\nsensitive routes.\n\n```ts\n@rest('2fa')\nclass TwoFactorApi {\n // Step 1: email a code to the logged-in user, hand back the signed token.\n @auth @post('/send')\n public send(): Response {\n const email = /* the user's email, e.g. their username, or a stored profile field */;\n const ch = TwoFactor.send(email, 'login'); // emails the code, returns { token, status }\n return Response.bytes(new DataWriter().writeString(ch.token).toBytes());\n }\n\n // Step 2: verify the code the user typed against the token.\n @auth @post('/verify')\n public verify(ctx: RouteContext): Response {\n const r = new DataReader(ctx.request.body);\n const token = r.readString(); const email = r.readString(); const code = r.readString();\n if (!TwoFactor.verify(token, email, code)) return Response.text('bad code\\n', 401);\n // Mark this session 2FA-verified: re-mint the session with a flag in your own @user, or store a\n // per-user \"verified\" record keyed on AuthService.userId().\n return Response.text('verified\\n');\n }\n}\n```\n\n`TwoFactor` gives integrity + expiry but not single-use (a code re-verifies within its TTL); keep the TTL\nshort. For a branded email, use `TwoFactor.issue(...)` (returns the code without sending) + your own\n`Emails.*` template. Call `TwoFactor.setSecret(...)` once at startup in production.\n\n## The `AuthService` primitive reference\n\nEverything the built-in controller is built from, available for hand-written auth. All are ambient globals\n(no import).\n\n**Sessions & cookies**\n- `mintSession(userData: Uint8Array, ttlSecs?: u64): Cookie`: the signed `__Host-toil_sess` cookie.\n- `userCookie(userData, ttlSecs?): Cookie`: the readable `__Secure-toil_user` companion.\n- `clearSession(): Cookie` / `clearUserCookie(): Cookie`.\n- `hasSession(): bool`: the `@auth` predicate.\n- `getSessionBytes(): Uint8Array | null`: the verified `@user` payload bytes.\n- `getUser(): <your @user> | null`: decoded, typed to your `@user`.\n- `userId(): ToilUserId | null`: the stable id (built-in `@user` layout).\n- `setSecret(secret: Uint8Array)`: override the session HMAC key programmatically.\n\n**Post-quantum login crypto**\n- `oprfEvaluate(username, blinded): Uint8Array`: server-keyed OPRF eval.\n- `buildRegisterMessage(username, pk)` / `verifyRegister(pk, msg, sig): bool`: proof-of-possession.\n- `buildLoginMessage(sub, aud, cid, nonce, iat, exp, ct, memKiB, iterations, parallelism, serverKemKeyId)`\n / `verifyLogin(pk, msg, sig): bool`.\n- `mlkemDecapsulate(ct): Uint8Array`, `serverKemKeyId(): Uint8Array`.\n- `deriveSessionKey(sharedSecret, transcriptHash)`, `serverConfirmTag(sessionKey, transcriptHash)`: the\n mutual-auth confirmation.\n- `sha256(data): Uint8Array`.\n- `setOprfSeed(seed)`, `setServerKemSecretKey(sk)`, `setServerKemPublicKey(pk)`: override the seeds/keys.\n- Sizes: `PUBLIC_KEY_LEN`, `SIGNATURE_LEN`, `OPRF_ELEMENT_LEN`, `KEM_CIPHERTEXT_LEN`, `SHARED_SECRET_LEN`, …\n\n**Related globals**, `TwoFactor` (email codes; see [email](../services/email.md)), `RateLimitService` (used by\n`@ratelimit`), `Environment` (the secret store).\n\n## Two ways in, one behavior\n\nThe config flag and the import are identical at build time, both make the build append the shipped\n`@user` + `@rest('auth')` controller to the toilscript **entry** set, where their decorators weave and the\n`@rest` class self-mounts. (A framework decorator source only weaves as an entry; that's why a plain\n`import` of the controller isn't enough on its own, the marker import is detected by the build, which does\nthe entry injection.) This is why built-in auth needs no runtime registration call.\n",
6
6
  "auth/how-it-works.md": "# How Toil auth works\n\nToil auth is a **post-quantum, password-based, mutually-authenticated** login. The design goal: the user\ntypes a password, but the server never sees it, never stores it, and can't be phished into leaking a\nverifier, and every primitive is quantum-resistant.\n\nThis page explains the protocol. You do not need to understand it to use auth (see [Usage](./usage.md)),\nbut you should understand the guarantees before you ship.\n\n## The building blocks\n\n| Primitive | Role |\n| --- | --- |\n| **OPRF** (RFC 9497, ristretto255-SHA512) | A *server-keyed* salt. The client blinds its password, the server evaluates it under a per-user key, the client unblinds. The result can't be computed without the server, so a stolen database can't be brute-forced offline. |\n| **Argon2id** | Stretches the OPRF output into key material (memory-hard, GPU/ASIC-resistant). Runs in the browser. |\n| **ML-DSA-44** (FIPS 204) | The user's identity key pair is *derived* from the Argon2id output. The server stores only the **public** key. Login is proved by an ML-DSA signature. |\n| **ML-KEM-768** (FIPS 203) | Key encapsulation on login: the server proves it holds its KEM secret by returning a confirmation tag only derivable from the decapsulated shared secret → **mutual** auth (anti-phishing). |\n| **HMAC-SHA256** | Signs the session cookie (`AUTH_SESSION_SECRET`). |\n\n> The whole thing is sometimes called an *aPAKE* (asymmetric password-authenticated key exchange). Do not\n> call it OPAQUE, this is Toil's own OPRF + KEM + signature construction.\n\n## What the server stores\n\nPer account, in ToilDB (`@database AuthDb`):\n\n- `username`, a deterministic `salt`, the **ML-DSA public key**, and the Argon2id params.\n\nThat's it. **No password, no password hash, no verifier that can be brute-forced without the OPRF key.**\nLogin challenges are a second collection, consumed exactly once (atomic `getDelete`).\n\n## Registration\n\n```\n Browser (client) Toil edge (server)\n ───────────────── ──────────────────\n blind(password) OPRF key = f(seed, username)\n │ username, blinded │\n │ ───────── POST /auth/register/start ───────────► │\n │ │ evaluated = OPRF(blinded)\n │ ◄──── {mem,iters,par, salt, evaluated} ───────── │ (salt is deterministic per user)\n │ │\n unblind → oprfOut │\n seed = Argon2id(oprfOut, salt, params) │\n (pk, sk) = ML-DSA-44.keygen(seed) │\n proof = ML-DSA.sign(sk, \"register|username|pk\") │\n │ username, pk, proof │\n │ ───────── POST /auth/register/finish ──────────► │\n │ │ verifyRegister(pk, msg, proof) ✓ proof-of-possession\n │ ◄──────────── {status: 0 ok | 1 taken} ──────── │ store AuthAccount{username, salt, pk, params}\n```\n\nThe server never learns the password or the secret key `sk`, only the public key `pk` and a proof the\nclient holds the matching `sk`. A duplicate username returns a **distinguishable** `status = 1` (so the UI\ncan say \"taken, log in instead\"); everything else fails generically.\n\n## Login (with mutual auth)\n\n```\n Browser (client) Toil edge (server)\n ───────────────── ──────────────────\n blind(password) │\n │ username, blinded │\n │ ───────── POST /auth/login/start ──────────────► │ evaluated = OPRF(blinded) (ALWAYS, even unknown user)\n │ │ if known: store Challenge{cid, nonce, iat, exp}\n │ ◄─ {cid, aud, params, salt, nonce, iat, exp, ── │ (identical response whether the user exists or not)\n │ evaluated} │\n unblind → Argon2id → (pk, sk) = ML-DSA.keygen │\n (ct, ssС) = ML-KEM-768.encapsulate(serverKemPublicKey) │\n msg = \"login|username|aud|cid|nonce|iat|exp|ct|params|kid\" │\n sig = ML-DSA.sign(sk, msg) │\n │ cid, ct, sig │\n │ ───────── POST /auth/login/finish ─────────────► │ ch = challenges.getDelete(cid) (consume once; check exp)\n │ │ rebuild msg from OUR stored values + ct\n │ │ verifyLogin(acct.pk, msg, sig) ✓ it's really this user\n │ │ ssS = ML-KEM.decapsulate(ct) ✓ we hold the KEM key\n │ │ K = deriveSessionKey(ssS, H(msg))\n │ ◄──── {0, sessionToken, serverConfirm} ──────── │ serverConfirm = tag(K, H(msg))\n │ + Set-Cookie: __Host-toil_sess=… │ mint session cookie\n verify serverConfirm using ssC ✓ the server is genuine │\n```\n\nTwo verifications, both required:\n1. **The server verifies the client**: the ML-DSA signature over a message bound to the challenge, the\n Argon2id params, and the server's KEM key id. Replays fail (the challenge is consumed).\n2. **The client verifies the server**: the `serverConfirm` tag is derivable only from the ML-KEM shared\n secret, which only the holder of the KEM secret key can decapsulate. A phishing site can't forge it.\n\n## Anti-enumeration\n\n`/login/start` behaves identically for a known and an unknown user: it always runs the OPRF (a decoy key\nfor unknown users), returns a **deterministic** per-user salt and constant params, and a fresh challenge.\nThe challenge is persisted only for a real account, and `/login/finish` fails generically at consume for an\nunknown user. So an attacker can't probe which usernames exist. Every failure path returns the same\n`401 auth: request failed`.\n\n## Sessions & cookies\n\nOn successful login the server mints **two** cookies:\n\n- **`__Host-toil_sess`**: the authoritative session. HMAC-SHA256 signed with `AUTH_SESSION_SECRET`,\n `HttpOnly`, `Secure`, `SameSite=Lax`. It carries the `@user` codec payload. `@auth` and\n `AuthService.getUser()` open + verify this cookie server-side; a forged or tampered cookie fails.\n- **`__Secure-toil_user`**: a **readable** companion carrying the same payload, so the browser can show\n \"logged in as …\" via the client's `getUser()`. The server **never trusts it**, it is display-only.\n\nEach request runs in a fresh wasm instance, but the signed cookie is self-contained, so no server-side\nsession store is needed. `AUTH_SESSION_SECRET` must be identical across every edge instance (it is, via the\nenv store) so a cookie minted anywhere verifies everywhere.\n\n## The stable user identity: `ToilUserId`\n\nAt login the server derives a stable, tenant-scoped id and stores it in the session (the first field of the\nbuilt-in `@user`):\n\n```\ntoilUserId = SHA-256( mldsaPublicKey ‖ username ‖ domain ) // 256 bits\n```\n\n- **Stable:** same login key + username on the same tenant `domain` → same id, forever, across sessions\n and devices. Key your own data on it.\n- **Opaque + one-way:** it's a hash: safe to store, log, or expose without leaking the key or the address.\n- Read it anywhere with `AuthService.userId()`. See [Extending](./extending.md#toiluserid) for the\n `ToilUserId` API (O(1) `==` / `!=`, `toHex()`, …).\n\n## Threat-model summary\n\n- **Server database stolen** → attacker gets public keys + salts, not passwords. Brute-forcing needs the\n OPRF key (server-side) *and* Argon2id work per guess.\n- **Server compromised / malicious** → still can't recover passwords (only public keys) and can't forge a\n past session without `AUTH_SESSION_SECRET`.\n- **Phishing site** → can't produce the `serverConfirm` tag (no KEM secret), so a correct client aborts.\n- **Quantum adversary** → ML-DSA + ML-KEM are post-quantum; the OPRF/Argon2id/HMAC pieces are classical but\n not the long-term identity or key-exchange.\n- **Replay** → challenges are single-use (`getDelete`) with a short TTL.\n\nResidual responsibilities are yours: set the [secrets](./configuration.md), pin your deployment's KEM\npublic key in the client, and raise the Argon2id params for production.\n",
7
7
  "auth/README.md": "# Authentication\n\nToil ships a complete, **post-quantum password login** you turn on with one line. No passwords on your\nserver, no third-party identity provider, no hand-written crypto: enable it and you get a `/auth/*` API,\nsigned sessions, `@auth`-guarded routes, and a stable per-user identity.\n\n```ts\n// toil.config.ts\nimport { defineConfig } from 'toiljs/compiler';\n\nexport default defineConfig({\n server: { auth: true }, // ← mounts the full /auth/* API + sessions\n});\n```\n\nThat is the whole setup. The build appends the framework's auth controller to your server, so `/auth/*`\nis live and `@auth` works everywhere.\n\n## What you get\n\n| Endpoint | Purpose |\n| --- | --- |\n| `POST /auth/register/start`, `/register/finish` | Create an account (password never leaves the browser) |\n| `POST /auth/login/start`, `/login/finish` | Log in; sets a signed session cookie |\n| `GET /auth/me` *(`@auth`)* | The current user (`toilUserId` + `username`) |\n| `POST /auth/logout` *(`@auth`)* | Clear the session |\n\nPlus, in your own code:\n\n- **`@auth`** on any route (or a whole `@rest` class) → 401 unless there's a valid session.\n- **`AuthService.getUser()`** → the typed logged-in user.\n- **`AuthService.userId()`** → the stable [`ToilUserId`](./extending.md#toiluserid) (a 256-bit id you can\n key your data on).\n- **The client**: `import { Auth } from 'toiljs/client'`, then `Auth.register(username, password)` /\n `Auth.login(username, password)`. It does all the browser-side crypto and talks to `/auth/*` for you.\n\n## A login page in full\n\n```tsx\n// client/routes/login.tsx\nimport { useState } from 'react';\nimport { Auth } from 'toiljs/client';\n\nexport default function Login() {\n const [u, setU] = useState('');\n const [p, setP] = useState('');\n const [msg, setMsg] = useState('');\n\n const register = async () => {\n try { await Auth.register(u, p); setMsg('registered, now log in'); }\n catch (e) { setMsg(parseError(e)); }\n };\n const login = async () => {\n try { await Auth.login(u, p); setMsg('logged in'); } // sets the session cookie\n catch (e) { setMsg(parseError(e)); }\n };\n\n return (\n <main>\n <input value={u} onChange={(e) => setU(e.currentTarget.value)} placeholder=\"username\" />\n <input value={p} type=\"password\" onChange={(e) => setP(e.currentTarget.value)} placeholder=\"password\" />\n <button onClick={register}>Register</button>\n <button onClick={login}>Log in</button>\n <p>{msg}</p>\n </main>\n );\n}\n```\n\n```ts\n// server/routes/Secret.ts, a route only a logged-in user can reach\nimport { Response } from 'toiljs/server/runtime';\n\n@rest('secret')\nclass Secret {\n @auth // 401 without a valid session\n @get('/')\n public secret(): Response {\n const user = AuthService.getUser()!; // typed: { toilUserId, username }\n return Response.text('hello ' + user.username + '\\n');\n }\n}\n```\n\nThat's a real, production-grade auth system, the password is stretched with Argon2id in the browser into\nan ML-DSA-44 key pair, your server only ever stores a public key, and login is a mutually-authenticated\nML-KEM-768 challenge. You didn't write any of it.\n\n## Where to go next\n\n- **[How it works](./how-it-works.md)**: the protocol (OPRF + Argon2id + ML-DSA + ML-KEM), sessions,\n cookies, and the `ToilUserId`, with sequence diagrams.\n- **[Usage](./usage.md)**: enabling it, the client API, guarding routes, reading the user, the full wire\n contract of each endpoint.\n- **[Configuration](./configuration.md)**: the secrets a deployment MUST set, the audience/domain, tuning\n Argon2id, and the deploy checklist.\n- **[Extending & integrating](./extending.md)**: `ToilUserId`, keying your own data on a user, a custom\n user shape / opting out, and the `AuthService` primitive reference.\n- **[Customizing the auth emails](./emails.md)**: replace the verification, password-reset, and 2FA\n emails with your own branded React templates by dropping `emails/auth-*.tsx` files.\n\n> **One rule before you ship:** built-in auth runs with **insecure DEV fallback secrets** so it Just Works\n> locally. A deployment MUST set `AUTH_SESSION_SECRET`, `AUTH_OPRF_SEED`, and `AUTH_KEM_SK`. See\n> [Configuration](./configuration.md).\n",
@@ -8,7 +8,7 @@ Built-in auth sends three transactional emails: the email-verification link, the
8
8
  | --- | --- | --- |
9
9
  | Email verification | On register, when email confirmation is on | `link` (the confirm URL) |
10
10
  | Password reset | On `POST /auth/reset/request` | `link` (the reset URL) |
11
- | Two-factor code | On login or 2FA setup, for the email method | `code` (the numeric code) |
11
+ | Two-factor code | On login or 2FA setup, for the email method | `code` (the numeric code) and `action` (the flow phrase) |
12
12
 
13
13
  The defaults are intentionally minimal so a fresh project sends real, correct mail with no setup. To match your brand, override them.
14
14
 
@@ -20,7 +20,7 @@ Drop a React template in your project's `emails/` folder with the reserved name
20
20
  | --- | --- | --- |
21
21
  | `emails/auth-confirm.tsx` | Email verification | `link` |
22
22
  | `emails/auth-reset.tsx` | Password reset | `link` |
23
- | `emails/auth-2fa.tsx` | Two-factor code | `code` |
23
+ | `emails/auth-2fa.tsx` | Two-factor code | `code`, `action` |
24
24
 
25
25
  Each template is a default-exported React component. Read the one prop it is given, and it becomes a `{{token}}` hole the edge fills per send. Reading any other prop renders empty, so the build warns you.
26
26
 
@@ -53,15 +53,16 @@ The reset template works the same way with the `link` prop.
53
53
 
54
54
  For verification and reset, set the subject with `export const subject = '...'`. Leave it out and the default subject is used (`Confirm your account`, `Reset your password`).
55
55
 
56
- The two-factor email is different: its subject is set by the framework because it changes with context (a login code versus a setup code). Your `emails/auth-2fa.tsx` override controls the body and HTML around the `code`, and the subject stays contextual. A `subject` export in that file is ignored.
56
+ The two-factor email is different. It serves three flows (signing in, enabling 2FA, and turning 2FA off), so besides the `code` it also gets an `action` prop: the framework fills it with the flow phrase, `sign in`, `enable two-factor authentication`, or `turn off two-factor authentication`. Write it into a sentence like "Enter this code to {action}." and the one template reads correctly for every flow. The subject is likewise set by the framework and stays contextual, so a `subject` export in this file is ignored.
57
57
 
58
58
  ```tsx
59
59
  // emails/auth-2fa.tsx -> overrides the 2FA code message (subject is contextual).
60
- export default function Auth2fa({ code }: { code: string }) {
60
+ export default function Auth2fa({ code, action }: { code: string; action: string }) {
61
61
  return (
62
62
  <div style={{ fontFamily: 'system-ui', padding: 24, textAlign: 'center' }}>
63
63
  <p>Your Acme verification code:</p>
64
64
  <p style={{ fontSize: 32, fontWeight: 700, letterSpacing: 6 }}>{code}</p>
65
+ <p>Enter it to {action}.</p>
65
66
  <p style={{ color: '#666' }}>It expires in a few minutes.</p>
66
67
  </div>
67
68
  );
@@ -72,7 +73,7 @@ export default function Auth2fa({ code }: { code: string }) {
72
73
 
73
74
  Each template is rendered once, at build time, into a static string of HTML with your styles inlined, and the prop becomes a fill hole. So a fixed layout and inline styles work, but per-send logic does not: a `{items.map(...)}` or a conditional runs at build, not per email. For these three messages that is all you need, one link or one code.
74
75
 
75
- The only value auth hands each template is the one in the table above (`link` or `code`). There is no user name, no app name, no expiry value. Write those into the template text directly.
76
+ The only values auth hands each template are the ones in the table above (`link`, or `code` plus `action` for 2FA). There is no user name, no app name, no expiry value. Write those into the template text directly.
76
77
 
77
78
  Styling rules are the same as any toiljs email: write inline `style={{ ... }}`, or import a stylesheet and its rules are inlined for you. A bare CSS import with no inlining has no effect in an email client. See [Email](../services/email.md) for the details.
78
79
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "toiljs",
3
3
  "type": "module",
4
- "version": "0.0.109",
4
+ "version": "0.0.110",
5
5
  "author": "Dacely",
6
6
  "description": "The modern React framework: a file-based React frontend and a ToilScript-compiled WebAssembly backend.",
7
7
  "repository": {
@@ -818,6 +818,7 @@ class Auth {
818
818
  ch.username,
819
819
  acct.email,
820
820
  'Your login code',
821
+ 'sign in',
821
822
  );
822
823
  if (codeHash.length == 0) return fail(); // unsupported/misconfigured method
823
824
  const c2 = new TwoFaChallenge();
@@ -1087,12 +1088,19 @@ class Auth {
1087
1088
  // DISABLE (targetMethod == NONE): the CURRENT method (prove you still
1088
1089
  // hold the existing factor before it is removed).
1089
1090
  const deliverMethod: u8 = targetMethod != TWOFA_NONE ? targetMethod : acct.twoFactorMethod;
1091
+ // Action phrase for the 2FA email body (the `{action}` token): enabling proves the
1092
+ // new factor, disabling proves the current one before it is removed.
1093
+ const twoFaAction: string =
1094
+ targetMethod != TWOFA_NONE
1095
+ ? 'enable two-factor authentication'
1096
+ : 'turn off two-factor authentication';
1090
1097
  const codeHash = this.twoFaDeliver(
1091
1098
  h,
1092
1099
  deliverMethod,
1093
1100
  u.username,
1094
1101
  acct.email,
1095
1102
  'Your verification code',
1103
+ twoFaAction,
1096
1104
  );
1097
1105
  if (codeHash.length == 0) return fail(); // unsupported deliver method
1098
1106
 
@@ -1191,16 +1199,17 @@ class Auth {
1191
1199
  username: string,
1192
1200
  email: string,
1193
1201
  subject: string,
1202
+ action: string,
1194
1203
  ): Uint8Array {
1195
1204
  switch (method) {
1196
1205
  case TWOFA_EMAIL: {
1197
1206
  const code = randomCode(TWOFA_DIGITS);
1198
- // The subject is contextual (login vs setup) so AuthController owns it;
1199
- // the body/html come from the generated `AuthEmail` — the built-in
1200
- // default, or an `emails/auth-2fa.tsx` override filling `{code}`. The
1201
- // send is DETACHED (constant-time, no provider-RTT parking), a property
1202
- // the override cannot lose (AuthEmail.twofa uses sendDetached).
1203
- AuthEmail.twofa(email, code, subject);
1207
+ // Subject + action phrase are contextual (login vs enable/disable 2FA), so
1208
+ // AuthController owns them; the body/html come from the generated
1209
+ // `AuthEmail` (built-in default, or an `emails/auth-2fa.tsx` override
1210
+ // filling `{code}` and `{action}`). The send is DETACHED (constant-time,
1211
+ // no provider-RTT parking), which the override cannot lose (sendDetached).
1212
+ AuthEmail.twofa(email, code, subject, action);
1204
1213
  return twoFaCodeHash(host, username, code);
1205
1214
  }
1206
1215
  // >>> case TWOFA_TOTP: { return twoFaSecretBinding(username); } <<<
@@ -54,8 +54,10 @@ type AuthName = 'AuthConfirm' | 'AuthReset' | 'Auth2fa';
54
54
  interface AuthEmailSpec {
55
55
  /** The generated `AuthEmail.<fn>` this feeds. */
56
56
  readonly fn: 'confirm' | 'reset' | 'twofa';
57
- /** The single runtime value the template interpolates. */
58
- readonly token: 'link' | 'code';
57
+ /** The token that MUST be present in an override (the link or code). */
58
+ readonly requiredToken: 'link' | 'code';
59
+ /** Every token the framework fills for this email (an override may use any subset). */
60
+ readonly providedTokens: readonly string[];
59
61
  /** Host dedup/abuse tag; must match what AuthController passed before. */
60
62
  readonly purpose: string;
61
63
  /** Default subject. Empty (and ignored) for `twofa`: AuthController passes login/setup subjects. */
@@ -70,7 +72,8 @@ interface AuthEmailSpec {
70
72
  const SPECS: Record<AuthName, AuthEmailSpec> = {
71
73
  AuthConfirm: {
72
74
  fn: 'confirm',
73
- token: 'link',
75
+ requiredToken: 'link',
76
+ providedTokens: ['link'],
74
77
  purpose: 'verify',
75
78
  subjectFromArg: false,
76
79
  defaultSubject: 'Confirm your account',
@@ -82,7 +85,8 @@ const SPECS: Record<AuthName, AuthEmailSpec> = {
82
85
  },
83
86
  AuthReset: {
84
87
  fn: 'reset',
85
- token: 'link',
88
+ requiredToken: 'link',
89
+ providedTokens: ['link'],
86
90
  purpose: 'reset',
87
91
  subjectFromArg: false,
88
92
  defaultSubject: 'Reset your password',
@@ -95,18 +99,22 @@ const SPECS: Record<AuthName, AuthEmailSpec> = {
95
99
  },
96
100
  Auth2fa: {
97
101
  fn: 'twofa',
98
- token: 'code',
102
+ requiredToken: 'code',
103
+ // `code` is the 6-digit code; `action` is the flow phrase AuthController passes
104
+ // ("sign in" / "enable two-factor authentication" / "turn off two-factor
105
+ // authentication"), so one 2FA template reads correctly for login vs setup.
106
+ providedTokens: ['code', 'action'],
99
107
  purpose: '2fa',
100
108
  subjectFromArg: true,
101
109
  // Subject is supplied by AuthController (login vs setup), so it is not baked.
102
110
  defaultSubject: '',
103
111
  defaultText:
104
112
  'Your verification code is {{code}}.\n' +
105
- 'It expires in a few minutes. If you did not request it, ignore this email.\n',
113
+ 'Enter it to {{action}}. It expires in a few minutes. If you did not request it, ignore this email.\n',
106
114
  defaultHtml:
107
115
  '<p>Your verification code is:</p>' +
108
116
  '<p style="font-size:28px;font-weight:bold;letter-spacing:4px">{{code}}</p>' +
109
- '<p>It expires in a few minutes. If you did not request it, ignore this email.</p>',
117
+ '<p>Enter it to {{action}}. It expires in a few minutes. If you did not request it, ignore this email.</p>',
110
118
  },
111
119
  };
112
120
 
@@ -151,16 +159,16 @@ function reservedFilesIn(emailsDir: string): Map<AuthName, string> {
151
159
  * renderer defaulted to the module name is treated as "no custom subject".
152
160
  */
153
161
  function effectiveFromOverride(name: AuthName, spec: AuthEmailSpec, r: RenderedEmail): Effective {
154
- if (!r.tokens.includes(spec.token))
162
+ if (!r.tokens.includes(spec.requiredToken))
155
163
  warn(
156
- `override emails/${name} never uses the {${spec.token}} prop, so the ` +
157
- `${spec.token === 'link' ? 'link' : 'code'} will be missing from the email.`,
164
+ `override emails/${name} never uses the {${spec.requiredToken}} prop, so the ` +
165
+ `${spec.requiredToken === 'link' ? 'link' : 'code'} will be missing from the email.`,
158
166
  );
159
167
  for (const t of r.tokens)
160
- if (t !== spec.token)
168
+ if (!spec.providedTokens.includes(t))
161
169
  warn(
162
- `override emails/${name} uses {${t}}, which auth does not provide ` +
163
- `(only {${spec.token}}); it will render empty.`,
170
+ `override emails/${name} uses {${t}}, which auth does not provide (only ` +
171
+ `${spec.providedTokens.map((x) => '{' + x + '}').join(', ')}); it will render empty.`,
164
172
  );
165
173
  // For twofa the subject is a runtime arg; for confirm/reset use the template's
166
174
  // subject unless it defaulted to the component name (no `export const subject`).
@@ -170,17 +178,25 @@ function effectiveFromOverride(name: AuthName, spec: AuthEmailSpec, r: RenderedE
170
178
 
171
179
  /** Codegen one `AuthEmail.<fn>` function. `twofa` takes its subject as an arg. */
172
180
  function emitFn(spec: AuthEmailSpec, eff: Effective): string[] {
173
- const subjectExpr = spec.subjectFromArg ? 'subject' : asLit(eff.subject);
174
- const sig =
175
- spec.fn === 'twofa'
176
- ? 'twofa(to: string, code: string, subject: string): void'
177
- : `${spec.fn}(to: string, ${spec.token}: string): void`;
181
+ let sig: string;
182
+ let subjectExpr: string;
183
+ let sets: string[];
184
+ if (spec.fn === 'twofa') {
185
+ // twofa takes its subject AND its action phrase as runtime args (login vs setup).
186
+ sig = 'twofa(to: string, code: string, subject: string, action: string): void';
187
+ subjectExpr = 'subject';
188
+ sets = ['v.set("code", code);', 'v.set("action", action);'];
189
+ } else {
190
+ sig = `${spec.fn}(to: string, ${spec.requiredToken}: string): void`;
191
+ subjectExpr = asLit(eff.subject);
192
+ sets = [`v.set(${asLit(spec.requiredToken)}, ${spec.requiredToken});`];
193
+ }
178
194
  return [
179
195
  ` export function ${sig} {`,
180
196
  ` const T: string = ${asLit(eff.text)};`,
181
197
  ` const H: string = ${asLit(eff.html)};`,
182
198
  ` const v = new Map<string, string>();`,
183
- ` v.set(${asLit(spec.token)}, ${spec.token});`,
199
+ ...sets.map((s) => ` ${s}`),
184
200
  ` new EmailTemplate(${subjectExpr}, T, H).sendDetached(to, v, ${asLit(spec.purpose)});`,
185
201
  ` }`,
186
202
  ];
@@ -7,7 +7,7 @@
7
7
  export const TOIL_DOCS: Record<string, string> = {
8
8
  "README.md": "# toiljs\n\ntoiljs is a full-stack web framework. You write your **frontend in React** and your **backend in\nTypeScript**, and toiljs turns the backend into a tiny, fast **WebAssembly** program that runs at the edge\n(on servers close to your users, all over the world). One language, one project, one deploy.\n\nIf you have used Next.js, this will feel familiar: file-based routes, server code next to client code, a dev\nserver with hot reload. The difference is what happens underneath. Your server code is compiled by\n**toilscript** (a TypeScript-to-WebAssembly compiler) into a sandboxed `.wasm` module, and it runs on the\n**Dacely edge** with a built-in worldwide database (**ToilDB**), streaming, background jobs, and auth all\nincluded.\n\n## The mental model\n\n```mermaid\nflowchart LR\n A[\"Your project<br/>(TypeScript + React)\"] -->|toiljs build| B[\"client bundle<br/>(React, runs in the browser)\"]\n A -->|toilscript compile| C[\"server.wasm<br/>(your backend, sandboxed)\"]\n B --> U[\"User's browser\"]\n C --> E[\"Dacely edge<br/>(worldwide)\"]\n E --> D[(\"ToilDB<br/>global database\")]\n U <-->|HTTP / WebTransport| E\n```\n\n- **client/** is your React app (pages, components, styles). It runs in the browser.\n- **server/** is your backend (routes, database, auth). It compiles to WebAssembly and runs on the edge.\n- **shared/** is the typed bridge: toiljs generates a client here so the browser calls your server with full\n type safety.\n\n## Hello, toiljs\n\n```ts\n// server/routes/Hello.ts (a backend HTTP route)\nimport { Response } from 'toiljs/server/runtime';\n\n@rest('hello')\nclass Hello {\n @get('/')\n public hi(): Response {\n return Response.text('Hello from the edge!\\n');\n }\n}\n```\n\n```tsx\n// client/routes/index.tsx (a frontend page)\nexport default function Home() {\n return <main><h1>Welcome</h1></main>;\n}\n```\n\nRun `toiljs dev`, open the browser, and both are live with hot reload. That is the whole loop.\n\n## Learn toiljs\n\n**Understand toil first**\n- [Understanding toil](./introduction/README.md): what toil is and the one big idea, then\n [why toil and who it is for](./introduction/why-toil.md),\n [the modern stack you get](./introduction/modern-stack.md),\n [how it works](./introduction/how-it-works.md),\n [what makes it hyper-scalable](./introduction/hyperscale.md),\n [how it is distributed](./introduction/distributed.md),\n [toil versus other frameworks](./introduction/vs-other-frameworks.md), and\n [why it is built this way](./introduction/design-principles.md).\n\n**Start here**\n- [Getting started](./getting-started/README.md): install, create a project, project structure, your first\n app, and migrating an existing React app.\n- [The CLI](./cli/README.md): `dev`, `build`, `create`, `doctor`, and every flag.\n- [Deploy](./getting-started/deploy.md): build for production, self-host it, and how the managed edge fits in.\n\n**Build the frontend**\n- [Frontend overview](./frontend/README.md), [Routing](./frontend/routing.md),\n [Navigation](./frontend/navigation.md), [Components](./frontend/components.md),\n [Rendering and SSR](./frontend/rendering.md), [Styling](./frontend/styling.md),\n [Images](./frontend/images.md), [Metadata and SEO](./frontend/metadata.md),\n [Fetching data](./frontend/data-fetching.md), [Scripts](./frontend/scripts.md),\n [Search](./frontend/search.md), [The Toil global (reference)](./frontend/toil-global.md).\n\n**Build the backend**\n- [Backend overview](./backend/README.md), [HTTP routes (`@rest`)](./backend/rest.md),\n [Typed RPC (`@service`/`@remote`)](./backend/rpc.md), [Data types (`@data`)](./backend/data.md).\n\n**The database (ToilDB)**\n- [Database overview and choosing a family](./database/README.md), [Setup (`@database`)](./database/setup.md),\n [Documents](./database/documents.md), [Unique](./database/unique.md), [Counters](./database/counters.md),\n [Events](./database/events.md), [Views and `@derive`](./database/views.md),\n [Membership](./database/membership.md), [Capacity](./database/capacity.md).\n\n**Auth**: [the full auth guide](./auth/README.md) covers post-quantum login, sessions, and `ToilUserId`;\n[customizing the auth emails](./auth/emails.md) shows how to brand the verification, reset, and 2FA mail.\n\n**Realtime and background**\n- [Streams](./realtime/README.md) and [channels](./realtime/channels.md), [Daemons and scheduled\n jobs](./background/daemons.md), [Derived views (`@derive`)](./background/derive.md).\n\n**Platform services**\n- [Caching](./services/caching.md), [Rate limiting](./services/ratelimit.md),\n [Environment and secrets](./services/environment.md), [Email and 2FA](./services/email.md),\n [Analytics](./services/analytics.md), [Crypto](./services/crypto.md), [Cookies](./services/cookies.md),\n [Time](./services/time.md).\n\n**Concepts and reference**\n- [Writing toiljs correctly (AI + human quick rules)](./concepts/ai-guide.md),\n [Compute tiers (L1 to L4)](./concepts/tiers.md), [Types (u64, u256, and friends)](./concepts/types.md),\n [Every decorator](./concepts/decorators.md), [Configuration](./concepts/config.md),\n [Security and SRI](./concepts/security.md).\n",
9
9
  "auth/configuration.md": "# Configuring auth for production\n\nBuilt-in auth runs locally with **zero configuration**, it falls back to published, insecure DEV secrets\nso `toiljs dev` Just Works. **A deployment MUST replace all three secrets and pin its KEM key.** This page\nis the checklist.\n\n## The secrets\n\nAuth reads these from the tenant environment store (locally, `.env.secrets`; on the edge, the per-host\nsecure env). They resolve **lazily** the first time auth runs, so no startup wiring is needed.\n\n| Key | What it is | Dev fallback |\n| --- | --- | --- |\n| `AUTH_SESSION_SECRET` | HMAC-SHA256 key that signs the session cookie. Must be identical on every edge instance (a cookie minted anywhere must verify everywhere). | a public constant, **anyone can forge a session** |\n| `AUTH_OPRF_SEED` | Master seed for the per-user OPRF salt key. Rotating it invalidates every password (users must re-register). | a hashed public constant |\n| `AUTH_KEM_SK` | The server's ML-KEM-768 **secret** key (hex). Its public half is what the client encapsulates to. | a pinned dev key pair |\n\n```bash\n# .env.secrets (gitignored; mode 0600 on the edge, NEVER under hosts/, NEVER in the .wasm)\nAUTH_SESSION_SECRET=…64 hex chars (32 bytes)…\nAUTH_OPRF_SEED=…64 hex chars (32 bytes)…\nAUTH_KEM_SK=…hex of an ML-KEM-768 secret key…\n```\n\n### Generating them\n\n`AUTH_SESSION_SECRET` and `AUTH_OPRF_SEED` are just 32 random bytes each:\n\n```bash\nnode -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n```\n\n`AUTH_KEM_SK` is an ML-KEM-768 key pair. Generate it and keep BOTH halves, the secret goes in the env, the\npublic half is pinned in the client (next section):\n\n```ts\nimport { ml_kem768 } from '@dacely/noble-post-quantum/ml-kem';\nconst { secretKey, publicKey } = ml_kem768.keygen();\nconsole.log('AUTH_KEM_SK =', Buffer.from(secretKey).toString('hex'));\nconsole.log('client serverKemPublicKey =', Buffer.from(publicKey).toString('hex'));\n```\n\n## Pin the client's KEM public key\n\nThe browser must know the server's genuine KEM public key to run the mutual-auth handshake, this is the\nanti-phishing anchor. The `toiljs/client` `Auth` helper ships with the **dev** key pinned, so a deployment\nMUST pass its own:\n\n```ts\nimport { Auth } from 'toiljs/client';\n\nconst SERVER_KEM_PUBLIC_KEY = /* the publicKey bytes from AUTH_KEM_SK */;\n\nawait Auth.login(username, password, { serverKemPublicKey: SERVER_KEM_PUBLIC_KEY });\nawait Auth.register(username, password, { serverKemPublicKey: SERVER_KEM_PUBLIC_KEY });\n```\n\nShip the public key with your client bundle (it's public, safe to embed). If it doesn't match the server's\n`AUTH_KEM_SK`, login's `serverConfirm` check fails and the client aborts.\n\n## Optional: audience & domain\n\nBoth are optional and have sensible defaults; set them for stability across host aliases:\n\n| Key | Meaning | Default |\n| --- | --- | --- |\n| `TOIL_AUTH_AUDIENCE` | The service audience bound into the signed login message. | `\"toil\"` |\n| `TOIL_AUTH_DOMAIN` | The `domain` input of the stable `ToilUserId` (`sha256(pubkey ‖ username ‖ domain)`). | the request `Host` header, else `localhost` |\n\nSet `TOIL_AUTH_DOMAIN` explicitly if your site answers on multiple hostnames, otherwise the same user could\nget different `ToilUserId`s from different aliases. Once users exist, changing it changes everyone's id, so\npick it before launch.\n\n## Email confirmation\n\nTwo plain env vars (tenant-readable, like `PUBLIC_BASE_URL`) control the built-in email-verification flow. They are separate on purpose: sending a verify email at registration is one decision, blocking login until confirmed is another.\n\n| Key | What it does |\n| --- | --- |\n| `AUTH_EMAIL_CONFIRMATION` | Registration emails a one-time confirm link (`/confirm#token=…`) and stores the account **unconfirmed**. Login is **not** blocked: the user can sign in, and you nudge them to verify. Use this for \"verify at signup, but let people in\". |\n| `AUTH_REQUIRE_EMAIL_CONFIRMATION` | The stricter form: does everything above AND **refuses login** until the email is confirmed (a distinguishable status the client surfaces as `EmailNotConfirmedError`, so the UI can prompt \"confirm your email / resend\"). Implies `AUTH_EMAIL_CONFIRMATION`. On the managed edge this is force-set from the per-domain Dacely setting. |\n\nWith neither set, accounts are auto-confirmed at registration and no confirm email is sent. The one-time link is delivered by email; in `toiljs dev` it is drawn in the console (no mailer needed). Both use the standard non-enumerating responses (a generic 200 that never reveals whether an address exists).\n\n## Argon2id strength (known limitation)\n\nThe built-in controller currently uses **demo-light** Argon2id params (32 MiB, 2 iterations, 1 lane) so it\nstays responsive in a browser tab. These are baked into the shipped controller today; **config-driven\ntuning is a planned follow-up.** For a high-value production deployment you should either wait for the\nconfig knob or hand-write your own controller with `≥ 256 MiB / ≥ 3 iterations`. The OPRF still provides the\nprimary offline-attack resistance regardless, but raise these before protecting anything sensitive.\n\nThe client always derives against whatever params the server returns in `/login/start`, so when the config\nknob lands you can raise them server-side with **no client change**.\n\n## Deploy checklist\n\n- [ ] `AUTH_SESSION_SECRET` set (32 random bytes), identical on every edge instance.\n- [ ] `AUTH_OPRF_SEED` set (32 random bytes).\n- [ ] `AUTH_KEM_SK` set (an ML-KEM-768 secret key), and its **public** half pinned in the client via\n `serverKemPublicKey`.\n- [ ] `TOIL_AUTH_DOMAIN` set if you serve multiple hostnames (stable `ToilUserId`).\n- [ ] (Recommended) Argon2id params reviewed for your threat model.\n\nThe CLI doctor warns when `server.auth` is on and the secrets are missing, run it before you ship.\n",
10
- "auth/emails.md": "# Customizing the auth emails\n\nBuilt-in auth sends three transactional emails: the email-verification link, the password-reset link, and the two-factor code. Each ships with a plain, working default. You can replace any of them with your own branded template, and you never touch the auth code to do it.\n\n## The three emails\n\n| Email | When it sends | The value it gives your template |\n| --- | --- | --- |\n| Email verification | On register, when email confirmation is on | `link` (the confirm URL) |\n| Password reset | On `POST /auth/reset/request` | `link` (the reset URL) |\n| Two-factor code | On login or 2FA setup, for the email method | `code` (the numeric code) |\n\nThe defaults are intentionally minimal so a fresh project sends real, correct mail with no setup. To match your brand, override them.\n\n## How to override\n\nDrop a React template in your project's `emails/` folder with the reserved name for that email. If the file exists, the build uses it; if not, the default stands. This is the same `emails/*.tsx` system you use for your own mail (see [Email](../services/email.md)), so you get full markup and inline CSS.\n\n| Reserved file | Overrides | Prop it must read |\n| --- | --- | --- |\n| `emails/auth-confirm.tsx` | Email verification | `link` |\n| `emails/auth-reset.tsx` | Password reset | `link` |\n| `emails/auth-2fa.tsx` | Two-factor code | `code` |\n\nEach template is a default-exported React component. Read the one prop it is given, and it becomes a `{{token}}` hole the edge fills per send. Reading any other prop renders empty, so the build warns you.\n\n```tsx\n// emails/auth-confirm.tsx -> overrides the email-verification message.\nexport const subject = 'Verify your Acme account';\n\nexport default function AuthConfirm({ link }: { link: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24 }}>\n <h1 style={{ color: '#cb9820' }}>Welcome to Acme</h1>\n <p>Tap below to verify your email and finish signing up.</p>\n <p>\n <a\n href={link}\n style={{ background: '#cb9820', color: '#fff', padding: '10px 18px', borderRadius: 8, textDecoration: 'none' }}\n >\n Verify my email\n </a>\n </p>\n <p style={{ color: '#666', fontSize: 13 }}>Or paste this link: {link}</p>\n </div>\n );\n}\n```\n\nThe reset template works the same way with the `link` prop.\n\n## The subject line\n\nFor verification and reset, set the subject with `export const subject = '...'`. Leave it out and the default subject is used (`Confirm your account`, `Reset your password`).\n\nThe two-factor email is different: its subject is set by the framework because it changes with context (a login code versus a setup code). Your `emails/auth-2fa.tsx` override controls the body and HTML around the `code`, and the subject stays contextual. A `subject` export in that file is ignored.\n\n```tsx\n// emails/auth-2fa.tsx -> overrides the 2FA code message (subject is contextual).\nexport default function Auth2fa({ code }: { code: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24, textAlign: 'center' }}>\n <p>Your Acme verification code:</p>\n <p style={{ fontSize: 32, fontWeight: 700, letterSpacing: 6 }}>{code}</p>\n <p style={{ color: '#666' }}>It expires in a few minutes.</p>\n </div>\n );\n}\n```\n\n## What you can and cannot put in\n\nEach template is rendered once, at build time, into a static string of HTML with your styles inlined, and the prop becomes a fill hole. So a fixed layout and inline styles work, but per-send logic does not: a `{items.map(...)}` or a conditional runs at build, not per email. For these three messages that is all you need, one link or one code.\n\nThe only value auth hands each template is the one in the table above (`link` or `code`). There is no user name, no app name, no expiry value. Write those into the template text directly.\n\nStyling rules are the same as any toiljs email: write inline `style={{ ... }}`, or import a stylesheet and its rules are inlined for you. A bare CSS import with no inlining has no effect in an email client. See [Email](../services/email.md) for the details.\n\n## Delivery stays safe\n\nYou cannot weaken the security of these flows by overriding a template. Every auth email is sent detached (fire-and-forget), so the response time never reveals whether an address maps to an account. That holds whether the message is the default or your override. Overriding only changes what the email looks like, never how it is sent.\n\n## Where the templates go\n\nThere is nothing to import and nothing to register. The build reads `emails/auth-*.tsx`, bakes the effective templates into the compiled server, and the auth controller sends them. Changing a template and rebuilding (or saving under `toiljs dev`) is all it takes.\n\n## Related\n\n- [Email](../services/email.md): the full `emails/*.tsx` system, `EmailService`, and `EmailTemplate`.\n- [Configuration](./configuration.md): the auth secrets and the email provider a deployment must set.\n- [Usage](./usage.md): enabling auth, the client API, and guarding routes.\n",
10
+ "auth/emails.md": "# Customizing the auth emails\n\nBuilt-in auth sends three transactional emails: the email-verification link, the password-reset link, and the two-factor code. Each ships with a plain, working default. You can replace any of them with your own branded template, and you never touch the auth code to do it.\n\n## The three emails\n\n| Email | When it sends | The value it gives your template |\n| --- | --- | --- |\n| Email verification | On register, when email confirmation is on | `link` (the confirm URL) |\n| Password reset | On `POST /auth/reset/request` | `link` (the reset URL) |\n| Two-factor code | On login or 2FA setup, for the email method | `code` (the numeric code) and `action` (the flow phrase) |\n\nThe defaults are intentionally minimal so a fresh project sends real, correct mail with no setup. To match your brand, override them.\n\n## How to override\n\nDrop a React template in your project's `emails/` folder with the reserved name for that email. If the file exists, the build uses it; if not, the default stands. This is the same `emails/*.tsx` system you use for your own mail (see [Email](../services/email.md)), so you get full markup and inline CSS.\n\n| Reserved file | Overrides | Prop it must read |\n| --- | --- | --- |\n| `emails/auth-confirm.tsx` | Email verification | `link` |\n| `emails/auth-reset.tsx` | Password reset | `link` |\n| `emails/auth-2fa.tsx` | Two-factor code | `code`, `action` |\n\nEach template is a default-exported React component. Read the one prop it is given, and it becomes a `{{token}}` hole the edge fills per send. Reading any other prop renders empty, so the build warns you.\n\n```tsx\n// emails/auth-confirm.tsx -> overrides the email-verification message.\nexport const subject = 'Verify your Acme account';\n\nexport default function AuthConfirm({ link }: { link: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24 }}>\n <h1 style={{ color: '#cb9820' }}>Welcome to Acme</h1>\n <p>Tap below to verify your email and finish signing up.</p>\n <p>\n <a\n href={link}\n style={{ background: '#cb9820', color: '#fff', padding: '10px 18px', borderRadius: 8, textDecoration: 'none' }}\n >\n Verify my email\n </a>\n </p>\n <p style={{ color: '#666', fontSize: 13 }}>Or paste this link: {link}</p>\n </div>\n );\n}\n```\n\nThe reset template works the same way with the `link` prop.\n\n## The subject line\n\nFor verification and reset, set the subject with `export const subject = '...'`. Leave it out and the default subject is used (`Confirm your account`, `Reset your password`).\n\nThe two-factor email is different. It serves three flows (signing in, enabling 2FA, and turning 2FA off), so besides the `code` it also gets an `action` prop: the framework fills it with the flow phrase, `sign in`, `enable two-factor authentication`, or `turn off two-factor authentication`. Write it into a sentence like \"Enter this code to {action}.\" and the one template reads correctly for every flow. The subject is likewise set by the framework and stays contextual, so a `subject` export in this file is ignored.\n\n```tsx\n// emails/auth-2fa.tsx -> overrides the 2FA code message (subject is contextual).\nexport default function Auth2fa({ code, action }: { code: string; action: string }) {\n return (\n <div style={{ fontFamily: 'system-ui', padding: 24, textAlign: 'center' }}>\n <p>Your Acme verification code:</p>\n <p style={{ fontSize: 32, fontWeight: 700, letterSpacing: 6 }}>{code}</p>\n <p>Enter it to {action}.</p>\n <p style={{ color: '#666' }}>It expires in a few minutes.</p>\n </div>\n );\n}\n```\n\n## What you can and cannot put in\n\nEach template is rendered once, at build time, into a static string of HTML with your styles inlined, and the prop becomes a fill hole. So a fixed layout and inline styles work, but per-send logic does not: a `{items.map(...)}` or a conditional runs at build, not per email. For these three messages that is all you need, one link or one code.\n\nThe only values auth hands each template are the ones in the table above (`link`, or `code` plus `action` for 2FA). There is no user name, no app name, no expiry value. Write those into the template text directly.\n\nStyling rules are the same as any toiljs email: write inline `style={{ ... }}`, or import a stylesheet and its rules are inlined for you. A bare CSS import with no inlining has no effect in an email client. See [Email](../services/email.md) for the details.\n\n## Delivery stays safe\n\nYou cannot weaken the security of these flows by overriding a template. Every auth email is sent detached (fire-and-forget), so the response time never reveals whether an address maps to an account. That holds whether the message is the default or your override. Overriding only changes what the email looks like, never how it is sent.\n\n## Where the templates go\n\nThere is nothing to import and nothing to register. The build reads `emails/auth-*.tsx`, bakes the effective templates into the compiled server, and the auth controller sends them. Changing a template and rebuilding (or saving under `toiljs dev`) is all it takes.\n\n## Related\n\n- [Email](../services/email.md): the full `emails/*.tsx` system, `EmailService`, and `EmailTemplate`.\n- [Configuration](./configuration.md): the auth secrets and the email provider a deployment must set.\n- [Usage](./usage.md): enabling auth, the client API, and guarding routes.\n",
11
11
  "auth/extending.md": "# Extending & integrating auth\n\nBuilt-in auth is deliberately opinionated so the common case is one line. This page covers the identity\nyou build ON, `ToilUserId`, and how to go beyond the defaults: keying your own data on a user, a custom\nuser shape, and hand-writing auth from the same primitives.\n\n## `ToilUserId`\n\nThe stable, tenant-scoped user identity: `sha256(mldsaPublicKey ‖ identifier ‖ domain)`, a 256-bit value.\nIt's a **global** (no import), like `crypto`.\n\n```ts\n// Read the current user's id in any handler (gate on hasSession(), see the null note below).\nconst id: ToilUserId = AuthService.userId()!;\n\n// Or derive one yourself.\nconst id2 = ToilUserId.derive(mldsaPublicKey, 'alice@example.com', 'acme.dacely.com');\n```\n\n| Member | Description |\n| --- | --- |\n| `ToilUserId.derive(pk, identifier, domain)` | Derive from an ML-DSA public key + email/username + tenant domain. Deterministic. |\n| `ToilUserId.fromBytes(b)` | Rebuild from a 32-byte digest (from `toBytes()` or storage). |\n| `toBytes(): Uint8Array` | The 32 identity bytes. |\n| `toHex(): string` | Lowercase 64-char hex, a convenient string key. |\n| `isZero(): bool` | True for the unset / anonymous id. |\n| `equals(other): bool` | Value equality. |\n| `a == b` / `a != b` | Overloaded value comparison, **O(1)** (four `u64` word compares, no byte loop, no allocation). |\n\n```ts\nconst a = ToilUserId.derive(pk, 'alice', 'acme.com');\nconst b = ToilUserId.derive(pk, 'alice', 'acme.com');\nconst c = ToilUserId.derive(pk, 'bob', 'acme.com');\na == b; // true, same inputs, same id\na != c; // true, different user\n```\n\n> **Null-check gotcha:** because `ToilUserId` overloads `==`, `AuthService.userId() == null` does NOT\n> type-check (`==` expects a `ToilUserId`). Gate with `AuthService.hasSession()` and then `userId()!`, or\n> compare with `getUser()` (a plain nullable). `===` is reference identity in AssemblyScript and is not\n> overloadable, use `==` for value equality.\n\n## Keying your own data on the user\n\n`toilUserId` is the right key for per-user data, it's stable across sessions/devices and opaque. Use the\nhex as a string key, or the bytes in a `@data` key class:\n\n```ts\n@data\nclass UserKey {\n id: Uint8Array = new Uint8Array(0); // toilUserId bytes\n constructor(id: Uint8Array = new Uint8Array(0)) { this.id = id; }\n}\n\n@data class Profile { displayName: string = ''; bio: string = ''; }\n\n@database\nclass AppDb {\n @collection static profiles: Documents<UserKey, Profile>;\n}\n\n@rest('profile')\nclass ProfileApi {\n @auth\n @post('/')\n public save(ctx: RouteContext): Response {\n const key = new UserKey(AuthService.userId()!.toBytes());\n const p = Profile.decode(ctx.request.body);\n // Save this user's profile. create is insert-only, so the first save creates\n // the record and later saves overwrite the existing one with enqueue.\n if (!AppDb.profiles.create(key, p)) {\n AppDb.profiles.enqueue(key, p);\n }\n return Response.text('saved\\n');\n }\n}\n```\n\n## Extending the user: add your own fields\n\nBuilt-in auth reserves exactly two fields on the authenticated user: `toilUserId` and `username`. To carry\nmore (a role, a display name, a tenant), just declare your OWN `@user` in your server code while\n`server.auth` is on. The build detects it and **extends** it: it injects the reserved `toilUserId` +\n`username` as the first two fields and mints sessions for your shape automatically. You do not opt out of\nanything, and there is still exactly one `@user` per program.\n\n```ts\n@user\nclass Account {\n admin: bool = false;\n displayName: string = '';\n tenant: string = '';\n // toilUserId + username are INJECTED by the build; do not declare them here.\n}\n```\n\nRules:\n\n- Do **not** declare `toilUserId` or `username` yourself. They are reserved and injected; declaring either is\n a compile error (`'username' is reserved by built-in auth`).\n- Your `@user` must be default-constructible (give every field an initializer), like any `@data` class.\n\n`AuthService.getUser()` is now typed to YOUR shape:\n\n```ts\nconst user = AuthService.getUser(); // { toilUserId, username, admin, displayName, tenant } | null\n```\n\n**Populating your fields.** Login fills `toilUserId` + `username`; your extra fields start at their declared\ndefaults (`admin = false`, and so on). The built-in controller cannot know your business fields, so you set\nthem yourself on one of your own `@auth` routes by reading the user, updating it, and re-minting the session:\n\n```ts\n@rest('account')\nclass AccountApi {\n @auth @post('/promote')\n public promote(): Response {\n const user = AuthService.getUser()!;\n user.admin = true;\n const resp = Response.text('promoted\\n');\n resp.setCookie(AuthService.mintSession(user.encode())); // re-sign the session with the new fields\n resp.setCookie(AuthService.userCookie(user.encode())); // update the readable companion cookie\n return resp;\n }\n}\n```\n\nIf you would rather hand-write the whole controller instead, you still can: do **not** enable `server.auth`,\nand build your own `@user` + routes from the [AuthService primitives](#the-authservice-primitive-reference)\nbelow. But for most apps, extending is all you need.\n\n## Adding email verification / 2FA\n\nLayer a second factor on top of the session with `TwoFactor` (stateless email codes, no DB; see\n[email](../services/email.md)). Typical flow: after login, require a verified email before granting access to\nsensitive routes.\n\n```ts\n@rest('2fa')\nclass TwoFactorApi {\n // Step 1: email a code to the logged-in user, hand back the signed token.\n @auth @post('/send')\n public send(): Response {\n const email = /* the user's email, e.g. their username, or a stored profile field */;\n const ch = TwoFactor.send(email, 'login'); // emails the code, returns { token, status }\n return Response.bytes(new DataWriter().writeString(ch.token).toBytes());\n }\n\n // Step 2: verify the code the user typed against the token.\n @auth @post('/verify')\n public verify(ctx: RouteContext): Response {\n const r = new DataReader(ctx.request.body);\n const token = r.readString(); const email = r.readString(); const code = r.readString();\n if (!TwoFactor.verify(token, email, code)) return Response.text('bad code\\n', 401);\n // Mark this session 2FA-verified: re-mint the session with a flag in your own @user, or store a\n // per-user \"verified\" record keyed on AuthService.userId().\n return Response.text('verified\\n');\n }\n}\n```\n\n`TwoFactor` gives integrity + expiry but not single-use (a code re-verifies within its TTL); keep the TTL\nshort. For a branded email, use `TwoFactor.issue(...)` (returns the code without sending) + your own\n`Emails.*` template. Call `TwoFactor.setSecret(...)` once at startup in production.\n\n## The `AuthService` primitive reference\n\nEverything the built-in controller is built from, available for hand-written auth. All are ambient globals\n(no import).\n\n**Sessions & cookies**\n- `mintSession(userData: Uint8Array, ttlSecs?: u64): Cookie`: the signed `__Host-toil_sess` cookie.\n- `userCookie(userData, ttlSecs?): Cookie`: the readable `__Secure-toil_user` companion.\n- `clearSession(): Cookie` / `clearUserCookie(): Cookie`.\n- `hasSession(): bool`: the `@auth` predicate.\n- `getSessionBytes(): Uint8Array | null`: the verified `@user` payload bytes.\n- `getUser(): <your @user> | null`: decoded, typed to your `@user`.\n- `userId(): ToilUserId | null`: the stable id (built-in `@user` layout).\n- `setSecret(secret: Uint8Array)`: override the session HMAC key programmatically.\n\n**Post-quantum login crypto**\n- `oprfEvaluate(username, blinded): Uint8Array`: server-keyed OPRF eval.\n- `buildRegisterMessage(username, pk)` / `verifyRegister(pk, msg, sig): bool`: proof-of-possession.\n- `buildLoginMessage(sub, aud, cid, nonce, iat, exp, ct, memKiB, iterations, parallelism, serverKemKeyId)`\n / `verifyLogin(pk, msg, sig): bool`.\n- `mlkemDecapsulate(ct): Uint8Array`, `serverKemKeyId(): Uint8Array`.\n- `deriveSessionKey(sharedSecret, transcriptHash)`, `serverConfirmTag(sessionKey, transcriptHash)`: the\n mutual-auth confirmation.\n- `sha256(data): Uint8Array`.\n- `setOprfSeed(seed)`, `setServerKemSecretKey(sk)`, `setServerKemPublicKey(pk)`: override the seeds/keys.\n- Sizes: `PUBLIC_KEY_LEN`, `SIGNATURE_LEN`, `OPRF_ELEMENT_LEN`, `KEM_CIPHERTEXT_LEN`, `SHARED_SECRET_LEN`, …\n\n**Related globals**, `TwoFactor` (email codes; see [email](../services/email.md)), `RateLimitService` (used by\n`@ratelimit`), `Environment` (the secret store).\n\n## Two ways in, one behavior\n\nThe config flag and the import are identical at build time, both make the build append the shipped\n`@user` + `@rest('auth')` controller to the toilscript **entry** set, where their decorators weave and the\n`@rest` class self-mounts. (A framework decorator source only weaves as an entry; that's why a plain\n`import` of the controller isn't enough on its own, the marker import is detected by the build, which does\nthe entry injection.) This is why built-in auth needs no runtime registration call.\n",
12
12
  "auth/how-it-works.md": "# How Toil auth works\n\nToil auth is a **post-quantum, password-based, mutually-authenticated** login. The design goal: the user\ntypes a password, but the server never sees it, never stores it, and can't be phished into leaking a\nverifier, and every primitive is quantum-resistant.\n\nThis page explains the protocol. You do not need to understand it to use auth (see [Usage](./usage.md)),\nbut you should understand the guarantees before you ship.\n\n## The building blocks\n\n| Primitive | Role |\n| --- | --- |\n| **OPRF** (RFC 9497, ristretto255-SHA512) | A *server-keyed* salt. The client blinds its password, the server evaluates it under a per-user key, the client unblinds. The result can't be computed without the server, so a stolen database can't be brute-forced offline. |\n| **Argon2id** | Stretches the OPRF output into key material (memory-hard, GPU/ASIC-resistant). Runs in the browser. |\n| **ML-DSA-44** (FIPS 204) | The user's identity key pair is *derived* from the Argon2id output. The server stores only the **public** key. Login is proved by an ML-DSA signature. |\n| **ML-KEM-768** (FIPS 203) | Key encapsulation on login: the server proves it holds its KEM secret by returning a confirmation tag only derivable from the decapsulated shared secret → **mutual** auth (anti-phishing). |\n| **HMAC-SHA256** | Signs the session cookie (`AUTH_SESSION_SECRET`). |\n\n> The whole thing is sometimes called an *aPAKE* (asymmetric password-authenticated key exchange). Do not\n> call it OPAQUE, this is Toil's own OPRF + KEM + signature construction.\n\n## What the server stores\n\nPer account, in ToilDB (`@database AuthDb`):\n\n- `username`, a deterministic `salt`, the **ML-DSA public key**, and the Argon2id params.\n\nThat's it. **No password, no password hash, no verifier that can be brute-forced without the OPRF key.**\nLogin challenges are a second collection, consumed exactly once (atomic `getDelete`).\n\n## Registration\n\n```\n Browser (client) Toil edge (server)\n ───────────────── ──────────────────\n blind(password) OPRF key = f(seed, username)\n │ username, blinded │\n │ ───────── POST /auth/register/start ───────────► │\n │ │ evaluated = OPRF(blinded)\n │ ◄──── {mem,iters,par, salt, evaluated} ───────── │ (salt is deterministic per user)\n │ │\n unblind → oprfOut │\n seed = Argon2id(oprfOut, salt, params) │\n (pk, sk) = ML-DSA-44.keygen(seed) │\n proof = ML-DSA.sign(sk, \"register|username|pk\") │\n │ username, pk, proof │\n │ ───────── POST /auth/register/finish ──────────► │\n │ │ verifyRegister(pk, msg, proof) ✓ proof-of-possession\n │ ◄──────────── {status: 0 ok | 1 taken} ──────── │ store AuthAccount{username, salt, pk, params}\n```\n\nThe server never learns the password or the secret key `sk`, only the public key `pk` and a proof the\nclient holds the matching `sk`. A duplicate username returns a **distinguishable** `status = 1` (so the UI\ncan say \"taken, log in instead\"); everything else fails generically.\n\n## Login (with mutual auth)\n\n```\n Browser (client) Toil edge (server)\n ───────────────── ──────────────────\n blind(password) │\n │ username, blinded │\n │ ───────── POST /auth/login/start ──────────────► │ evaluated = OPRF(blinded) (ALWAYS, even unknown user)\n │ │ if known: store Challenge{cid, nonce, iat, exp}\n │ ◄─ {cid, aud, params, salt, nonce, iat, exp, ── │ (identical response whether the user exists or not)\n │ evaluated} │\n unblind → Argon2id → (pk, sk) = ML-DSA.keygen │\n (ct, ssС) = ML-KEM-768.encapsulate(serverKemPublicKey) │\n msg = \"login|username|aud|cid|nonce|iat|exp|ct|params|kid\" │\n sig = ML-DSA.sign(sk, msg) │\n │ cid, ct, sig │\n │ ───────── POST /auth/login/finish ─────────────► │ ch = challenges.getDelete(cid) (consume once; check exp)\n │ │ rebuild msg from OUR stored values + ct\n │ │ verifyLogin(acct.pk, msg, sig) ✓ it's really this user\n │ │ ssS = ML-KEM.decapsulate(ct) ✓ we hold the KEM key\n │ │ K = deriveSessionKey(ssS, H(msg))\n │ ◄──── {0, sessionToken, serverConfirm} ──────── │ serverConfirm = tag(K, H(msg))\n │ + Set-Cookie: __Host-toil_sess=… │ mint session cookie\n verify serverConfirm using ssC ✓ the server is genuine │\n```\n\nTwo verifications, both required:\n1. **The server verifies the client**: the ML-DSA signature over a message bound to the challenge, the\n Argon2id params, and the server's KEM key id. Replays fail (the challenge is consumed).\n2. **The client verifies the server**: the `serverConfirm` tag is derivable only from the ML-KEM shared\n secret, which only the holder of the KEM secret key can decapsulate. A phishing site can't forge it.\n\n## Anti-enumeration\n\n`/login/start` behaves identically for a known and an unknown user: it always runs the OPRF (a decoy key\nfor unknown users), returns a **deterministic** per-user salt and constant params, and a fresh challenge.\nThe challenge is persisted only for a real account, and `/login/finish` fails generically at consume for an\nunknown user. So an attacker can't probe which usernames exist. Every failure path returns the same\n`401 auth: request failed`.\n\n## Sessions & cookies\n\nOn successful login the server mints **two** cookies:\n\n- **`__Host-toil_sess`**: the authoritative session. HMAC-SHA256 signed with `AUTH_SESSION_SECRET`,\n `HttpOnly`, `Secure`, `SameSite=Lax`. It carries the `@user` codec payload. `@auth` and\n `AuthService.getUser()` open + verify this cookie server-side; a forged or tampered cookie fails.\n- **`__Secure-toil_user`**: a **readable** companion carrying the same payload, so the browser can show\n \"logged in as …\" via the client's `getUser()`. The server **never trusts it**, it is display-only.\n\nEach request runs in a fresh wasm instance, but the signed cookie is self-contained, so no server-side\nsession store is needed. `AUTH_SESSION_SECRET` must be identical across every edge instance (it is, via the\nenv store) so a cookie minted anywhere verifies everywhere.\n\n## The stable user identity: `ToilUserId`\n\nAt login the server derives a stable, tenant-scoped id and stores it in the session (the first field of the\nbuilt-in `@user`):\n\n```\ntoilUserId = SHA-256( mldsaPublicKey ‖ username ‖ domain ) // 256 bits\n```\n\n- **Stable:** same login key + username on the same tenant `domain` → same id, forever, across sessions\n and devices. Key your own data on it.\n- **Opaque + one-way:** it's a hash: safe to store, log, or expose without leaking the key or the address.\n- Read it anywhere with `AuthService.userId()`. See [Extending](./extending.md#toiluserid) for the\n `ToilUserId` API (O(1) `==` / `!=`, `toHex()`, …).\n\n## Threat-model summary\n\n- **Server database stolen** → attacker gets public keys + salts, not passwords. Brute-forcing needs the\n OPRF key (server-side) *and* Argon2id work per guess.\n- **Server compromised / malicious** → still can't recover passwords (only public keys) and can't forge a\n past session without `AUTH_SESSION_SECRET`.\n- **Phishing site** → can't produce the `serverConfirm` tag (no KEM secret), so a correct client aborts.\n- **Quantum adversary** → ML-DSA + ML-KEM are post-quantum; the OPRF/Argon2id/HMAC pieces are classical but\n not the long-term identity or key-exchange.\n- **Replay** → challenges are single-use (`getDelete`) with a short TTL.\n\nResidual responsibilities are yours: set the [secrets](./configuration.md), pin your deployment's KEM\npublic key in the client, and raise the Argon2id params for production.\n",
13
13
  "auth/README.md": "# Authentication\n\nToil ships a complete, **post-quantum password login** you turn on with one line. No passwords on your\nserver, no third-party identity provider, no hand-written crypto: enable it and you get a `/auth/*` API,\nsigned sessions, `@auth`-guarded routes, and a stable per-user identity.\n\n```ts\n// toil.config.ts\nimport { defineConfig } from 'toiljs/compiler';\n\nexport default defineConfig({\n server: { auth: true }, // ← mounts the full /auth/* API + sessions\n});\n```\n\nThat is the whole setup. The build appends the framework's auth controller to your server, so `/auth/*`\nis live and `@auth` works everywhere.\n\n## What you get\n\n| Endpoint | Purpose |\n| --- | --- |\n| `POST /auth/register/start`, `/register/finish` | Create an account (password never leaves the browser) |\n| `POST /auth/login/start`, `/login/finish` | Log in; sets a signed session cookie |\n| `GET /auth/me` *(`@auth`)* | The current user (`toilUserId` + `username`) |\n| `POST /auth/logout` *(`@auth`)* | Clear the session |\n\nPlus, in your own code:\n\n- **`@auth`** on any route (or a whole `@rest` class) → 401 unless there's a valid session.\n- **`AuthService.getUser()`** → the typed logged-in user.\n- **`AuthService.userId()`** → the stable [`ToilUserId`](./extending.md#toiluserid) (a 256-bit id you can\n key your data on).\n- **The client**: `import { Auth } from 'toiljs/client'`, then `Auth.register(username, password)` /\n `Auth.login(username, password)`. It does all the browser-side crypto and talks to `/auth/*` for you.\n\n## A login page in full\n\n```tsx\n// client/routes/login.tsx\nimport { useState } from 'react';\nimport { Auth } from 'toiljs/client';\n\nexport default function Login() {\n const [u, setU] = useState('');\n const [p, setP] = useState('');\n const [msg, setMsg] = useState('');\n\n const register = async () => {\n try { await Auth.register(u, p); setMsg('registered, now log in'); }\n catch (e) { setMsg(parseError(e)); }\n };\n const login = async () => {\n try { await Auth.login(u, p); setMsg('logged in'); } // sets the session cookie\n catch (e) { setMsg(parseError(e)); }\n };\n\n return (\n <main>\n <input value={u} onChange={(e) => setU(e.currentTarget.value)} placeholder=\"username\" />\n <input value={p} type=\"password\" onChange={(e) => setP(e.currentTarget.value)} placeholder=\"password\" />\n <button onClick={register}>Register</button>\n <button onClick={login}>Log in</button>\n <p>{msg}</p>\n </main>\n );\n}\n```\n\n```ts\n// server/routes/Secret.ts, a route only a logged-in user can reach\nimport { Response } from 'toiljs/server/runtime';\n\n@rest('secret')\nclass Secret {\n @auth // 401 without a valid session\n @get('/')\n public secret(): Response {\n const user = AuthService.getUser()!; // typed: { toilUserId, username }\n return Response.text('hello ' + user.username + '\\n');\n }\n}\n```\n\nThat's a real, production-grade auth system, the password is stretched with Argon2id in the browser into\nan ML-DSA-44 key pair, your server only ever stores a public key, and login is a mutually-authenticated\nML-KEM-768 challenge. You didn't write any of it.\n\n## Where to go next\n\n- **[How it works](./how-it-works.md)**: the protocol (OPRF + Argon2id + ML-DSA + ML-KEM), sessions,\n cookies, and the `ToilUserId`, with sequence diagrams.\n- **[Usage](./usage.md)**: enabling it, the client API, guarding routes, reading the user, the full wire\n contract of each endpoint.\n- **[Configuration](./configuration.md)**: the secrets a deployment MUST set, the audience/domain, tuning\n Argon2id, and the deploy checklist.\n- **[Extending & integrating](./extending.md)**: `ToilUserId`, keying your own data on a user, a custom\n user shape / opting out, and the `AuthService` primitive reference.\n- **[Customizing the auth emails](./emails.md)**: replace the verification, password-reset, and 2FA\n emails with your own branded React templates by dropping `emails/auth-*.tsx` files.\n\n> **One rule before you ship:** built-in auth runs with **insecure DEV fallback secrets** so it Just Works\n> locally. A deployment MUST set `AUTH_SESSION_SECRET`, `AUTH_OPRF_SEED`, and `AUTH_KEM_SK`. See\n> [Configuration](./configuration.md).\n",
@@ -41,7 +41,9 @@ describe('AuthEmail module codegen', () => {
41
41
  expect(src).toContain('export function confirm(to: string, link: string): void');
42
42
  expect(src).toContain('export function reset(to: string, link: string): void');
43
43
  // twofa takes the subject as a runtime arg (login vs setup), not baked.
44
- expect(src).toContain('export function twofa(to: string, code: string, subject: string): void');
44
+ expect(src).toContain(
45
+ 'export function twofa(to: string, code: string, subject: string, action: string): void',
46
+ );
45
47
  // Every send is detached (the anti-enumeration property), never the suspending send.
46
48
  expect(src.match(/\.sendDetached\(/g)).toHaveLength(3);
47
49
  expect(src).not.toContain('.send(to');
@@ -57,10 +59,11 @@ describe('AuthEmail module codegen', () => {
57
59
  expect(src).toContain('new EmailTemplate(subject,'); // twofa uses the arg
58
60
  });
59
61
 
60
- it('interpolates the right token per email (link for confirm/reset, code for twofa)', () => {
62
+ it('interpolates the right token per email (link for confirm/reset, code + action for twofa)', () => {
61
63
  const src = moduleSource(defaultParts());
62
64
  expect(src).toContain('v.set("link", link)');
63
65
  expect(src).toContain('v.set("code", code)');
66
+ expect(src).toContain('v.set("action", action)');
64
67
  });
65
68
 
66
69
  it('escapes baked HTML into a valid string literal', () => {