@saws/bullmq-service 2.0.0-beta.11

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.
@@ -0,0 +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.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.collection.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.esnext.temporal.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../core/dist/utils/stage-outputs.d.ts","../../core/dist/secrets-manager.d.ts","../../core/dist/servicedefinition.d.ts","../../core/dist/find-service-definition.d.ts","../../core/dist/get-saws-config.d.ts","../../core/dist/host-readiness.d.ts","../../core/dist/host.d.ts","../../core/dist/global-hosts.d.ts","../../core/dist/index.d.ts","../../core/dist/utils/dependency-management.d.ts","../../core/dist/utils/file-exists.d.ts","../../docker-service/dist/dockerservice.d.ts","../../docker-service/dist/index.d.ts","../../redis-service/dist/redisservice.d.ts","../../redis-service/dist/index.d.ts","../src/bullmqservice.ts","../../../node_modules/bullmq/dist/esm/classes/async-fifo-queue.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/backoff-options.d.ts","../../../node_modules/bullmq/dist/esm/types/keep-jobs.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/parent-options.d.ts","../../../node_modules/cron-parser/types/common.d.ts","../../../node_modules/cron-parser/types/index.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/repeat-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/base-job-options.d.ts","../../../node_modules/bullmq/dist/esm/types/deduplication-options.d.ts","../../../node_modules/bullmq/dist/esm/types/job-options.d.ts","../../../node_modules/bullmq/dist/esm/types/job-progress.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/parent.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/job-json.d.ts","../../../node_modules/bullmq/dist/esm/types/job-json-sandbox.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/minimal-job.d.ts","../../../node_modules/bullmq/dist/esm/types/backoff-strategy.d.ts","../../../node_modules/bullmq/dist/esm/classes/backoffs.d.ts","../../../node_modules/bullmq/dist/esm/types/repeat-strategy.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/advanced-options.d.ts","../../../node_modules/bullmq/dist/esm/enums/parent-command.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/child-message.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/redis-client.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/connection.d.ts","../../../node_modules/bullmq/dist/esm/types/database-type.d.ts","../../../node_modules/bullmq/dist/esm/types/finished-status.d.ts","../../../node_modules/bullmq/dist/esm/types/job-scheduler-template-options.d.ts","../../../node_modules/bullmq/dist/esm/types/job-type.d.ts","../../../node_modules/bullmq/dist/esm/types/index.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/@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/bullmq/node_modules/ioredis/built/types.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/command.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/scanstream.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/utils/rediscommander.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/transaction.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/utils/commander.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/connectors/abstractconnector.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/connectors/connectorconstructor.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/connectors/sentinelconnector/types.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/connectors/sentinelconnector/sentineliterator.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/connectors/sentinelconnector/index.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/connectors/standaloneconnector.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/redis/redisoptions.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/cluster/util.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/cluster/clusteroptions.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/cluster/index.d.ts","../../../node_modules/denque/index.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/subscriptionset.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/datahandler.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/redis.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/pipeline.d.ts","../../../node_modules/bullmq/node_modules/ioredis/built/index.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/redis-options.d.ts","../../../node_modules/bullmq/dist/esm/enums/child-command.d.ts","../../../node_modules/bullmq/dist/esm/enums/error-code.d.ts","../../../node_modules/bullmq/dist/esm/enums/metrics-time.d.ts","../../../node_modules/bullmq/dist/esm/enums/telemetry-attributes.d.ts","../../../node_modules/bullmq/dist/esm/enums/index.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/telemetry.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/queue-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/flow-job.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/ioredis-events.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/job-scheduler-json.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/lock-manager-worker-context.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/metrics-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/metrics.d.ts","../../../node_modules/bullmq/dist/esm/classes/queue-keys.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/script-queue-context.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/minimal-queue.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/parent-message.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/queue-meta.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/rate-limiter-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/redis-streams.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/repeatable-job.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/repeatable-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/retry-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/sandboxed-job.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/sandboxed-job-processor.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/sandboxed-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/worker-options.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/receiver.d.ts","../../../node_modules/bullmq/dist/esm/interfaces/index.d.ts","../../../node_modules/bullmq/dist/esm/classes/child.d.ts","../../../node_modules/bullmq/dist/esm/classes/child-pool.d.ts","../../../node_modules/bullmq/dist/esm/classes/child-processor.d.ts","../../../node_modules/bullmq/dist/esm/classes/errors/connection-closed-error.d.ts","../../../node_modules/bullmq/dist/esm/classes/errors/delayed-error.d.ts","../../../node_modules/bullmq/dist/esm/classes/errors/rate-limit-error.d.ts","../../../node_modules/bullmq/dist/esm/classes/errors/unrecoverable-error.d.ts","../../../node_modules/bullmq/dist/esm/classes/errors/waiting-children-error.d.ts","../../../node_modules/bullmq/dist/esm/classes/errors/waiting-error.d.ts","../../../node_modules/bullmq/dist/esm/classes/errors/index.d.ts","../../../node_modules/bullmq/dist/esm/classes/scripts.d.ts","../../../node_modules/bullmq/dist/esm/classes/redis-connection.d.ts","../../../node_modules/bullmq/dist/esm/classes/queue-base.d.ts","../../../node_modules/bullmq/dist/esm/classes/queue-events.d.ts","../../../node_modules/bullmq/dist/esm/classes/job.d.ts","../../../node_modules/bullmq/dist/esm/classes/flow-producer.d.ts","../../../node_modules/bullmq/dist/esm/classes/ioredis-client.d.ts","../../../node_modules/bullmq/dist/esm/classes/node-redis-client.d.ts","../../../node_modules/bullmq/dist/esm/classes/bun-redis-client.d.ts","../../../node_modules/bullmq/dist/esm/classes/job-scheduler.d.ts","../../../node_modules/node-abort-controller/index.d.ts","../../../node_modules/bullmq/dist/esm/classes/abort-controller.d.ts","../../../node_modules/bullmq/dist/esm/classes/lock-manager.d.ts","../../../node_modules/bullmq/dist/esm/classes/queue-events-producer.d.ts","../../../node_modules/bullmq/dist/esm/classes/queue-getters.d.ts","../../../node_modules/bullmq/dist/esm/classes/repeat.d.ts","../../../node_modules/bullmq/dist/esm/classes/queue.d.ts","../../../node_modules/bullmq/dist/esm/classes/sandbox.d.ts","../../../node_modules/bullmq/dist/esm/types/processor.d.ts","../../../node_modules/bullmq/dist/esm/classes/worker.d.ts","../../../node_modules/bullmq/dist/esm/classes/index.d.ts","../../../node_modules/bullmq/dist/esm/utils/index.d.ts","../../../node_modules/bullmq/dist/esm/utils/create-scripts.d.ts","../../../node_modules/bullmq/dist/esm/index.d.ts","../src/jobs.ts","../src/index.ts","../../../node_modules/@types/find-package-json/package-json.d.ts","../../../node_modules/@types/find-package-json/index.d.ts"],"fileIdsList":[[125,190,198,203,206,208,209,210,222,249,338],[125,190,198,203,206,208,209,210,222],[125,187,188,190,198,203,206,208,209,210,222],[125,189,190,198,203,206,208,209,210,222],[190,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,231],[125,190,191,196,198,201,203,206,208,209,210,212,222,227,240],[125,190,191,192,198,201,203,206,208,209,210,222],[125,190,193,198,203,206,208,209,210,222,241],[125,190,194,195,198,203,206,208,209,210,213,222],[125,190,195,198,203,206,208,209,210,222,227,237],[125,190,196,198,201,203,206,208,209,210,212,222],[125,189,190,197,198,203,206,208,209,210,222],[125,190,198,199,203,206,208,209,210,222],[125,190,198,200,201,203,206,208,209,210,222],[125,189,190,198,201,203,206,208,209,210,222],[125,190,198,201,203,204,206,208,209,210,222,227,240],[125,190,198,201,203,204,206,208,209,210,222,227,229,231],[125,177,190,198,201,203,205,206,208,209,210,212,222,227,240],[125,190,198,201,203,205,206,208,209,210,212,222,227,237,240],[125,190,198,203,205,206,207,208,209,210,222,227,237,240],[124,125,126,127,128,129,130,131,132,133,178,179,180,181,182,183,184,185,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,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248],[125,190,198,201,203,206,208,209,210,222],[125,190,198,203,206,208,210,222],[125,190,198,203,206,208,209,210,211,222,240],[125,190,198,201,203,206,208,209,210,212,222,227],[125,190,198,203,206,208,209,210,213,222],[125,190,198,203,206,208,209,210,214,222],[125,190,198,201,203,206,208,209,210,217,222],[125,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,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247],[125,190,198,203,206,208,209,210,219,222],[125,190,198,203,206,208,209,210,220,222],[125,190,195,198,203,206,208,209,210,212,222,231],[125,190,198,201,203,206,208,209,210,222,223],[125,190,198,203,206,208,209,210,222,224,241,244],[125,190,198,201,203,206,208,209,210,222,227,229,230,231],[125,190,198,203,206,208,209,210,222,228,231],[125,190,198,201,203,206,208,209,210,222,227,229],[125,190,198,201,203,206,208,209,210,222,227,230,231],[125,190,198,203,206,208,209,210,222,231,241],[125,190,198,203,206,208,209,210,222,232],[125,187,190,198,203,206,208,209,210,222,227,234,240],[125,190,198,203,206,208,209,210,222,227,233],[125,190,198,201,203,206,208,209,210,222,235,236],[125,190,198,203,206,208,209,210,222,235,236],[125,190,195,198,203,206,208,209,210,212,222,227,237],[125,190,198,203,206,208,209,210,222,238],[125,190,198,203,206,208,209,210,212,222,239],[125,190,198,203,205,206,208,209,210,220,222,240],[125,190,198,203,206,208,209,210,222,241,242],[125,190,195,198,203,206,208,209,210,222,242],[125,190,198,203,206,208,209,210,222,227,243],[125,190,198,203,206,208,209,210,211,222,244],[125,190,198,203,206,208,209,210,222,245],[125,190,193,198,203,206,208,209,210,222],[125,190,195,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,241],[125,177,190,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,240],[125,190,198,203,206,208,209,210,222,246],[125,190,198,203,206,208,209,210,217,222],[125,190,198,203,206,208,209,210,222,236],[125,177,190,198,201,203,204,206,208,209,210,217,222,227,231,240,243,244,246],[125,190,198,203,206,208,209,210,222,227,247],[125,190,198,203,206,208,209,210,222,229,248],[125,190,198,203,206,208,209,210,222,322],[97,110,111,125,190,198,203,206,208,209,210,222],[117,125,190,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,301,302],[123,125,190,198,203,206,208,209,210,222,301],[125,190,191,198,201,203,206,208,209,210,222,246,301],[125,190,198,203,206,208,209,210,222,305,306,307,308,309,310],[125,190,198,201,203,206,208,209,210,222,286,301,313,316],[96,112,125,190,198,203,206,208,209,210,222,286,302,303,304,311,312,313,314,315,316,317,318,319,320,321,324,325,326,327,328,329,331],[117,125,190,198,203,206,208,209,210,222,271],[123,125,190,198,203,206,208,209,210,222,301,313,314,316],[123,125,190,198,203,206,208,209,210,222,301,312,315],[125,190,198,203,206,208,209,210,222,301,323],[119,125,190,198,201,203,206,208,209,210,222,277,286,301,312,313,316],[125,190,198,203,206,208,209,210,222,301,313,314],[123,125,190,198,203,206,208,209,210,222,301,313,314],[123,125,190,198,203,206,208,209,210,222,301,314,316],[123,125,190,198,203,206,208,209,210,222,301,313,316,321,326,327],[117,123,125,190,198,201,203,206,208,209,210,222,301],[125,190,198,203,206,208,209,210,222,303,316],[123,125,190,198,203,206,208,209,210,222,240,301,313,314,316,321,323,324,327,330],[115,125,190,198,203,206,208,209,210,222,273,274,275,276],[123,125,190,198,203,206,208,209,210,222,277,301,330,332,333,334],[111,113,125,190,198,203,206,208,209,210,222],[97,98,99,102,125,190,198,203,206,208,209,210,222],[115,125,190,198,203,206,208,209,210,222],[117,125,190,198,201,203,206,208,209,210,222],[123,125,190,198,203,206,208,209,210,222,279],[97,99,102,103,107,108,110,114,116,117,118,125,190,198,203,206,208,209,210,222,272,278,279,280,281,282,283,284,285,287,288,289,290,291,292,293,294,295,296,297,298,299,300],[105,106,107,125,190,198,203,206,208,209,210,222],[123,125,190,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,277,278],[99,105,106,107,108,109,125,190,198,203,206,208,209,210,222],[118,125,190,198,203,206,208,209,210,222,276,278,287],[108,125,190,198,203,206,208,209,210,222,273],[105,125,190,198,203,206,208,209,210,222],[103,114,125,190,198,203,206,208,209,210,222,272,278],[125,190,198,203,206,208,209,210,222,227],[101,125,190,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,296],[110,123,125,190,198,203,206,208,209,210,222],[125,190,191,198,203,206,208,209,210,222,246],[118,119,125,190,198,203,206,208,209,210,222,279,286],[125,190,198,203,206,208,209,210,222,277],[98,114,125,190,198,203,206,208,209,210,222,278,279,284,291,298],[110,125,190,198,203,206,208,209,210,222],[98,104,105,106,109,111,113,119,120,121,122,125,190,198,203,206,208,209,210,222],[108,125,190,198,203,206,208,209,210,222],[103,104,125,190,198,203,206,208,209,210,222],[120,125,190,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,316],[102,125,190,198,203,206,208,209,210,222],[125,190,198,203,206,208,209,210,222,301,312],[123,125,190,198,203,206,208,209,210,222,271,277,301,323],[125,190,198,203,206,208,209,210,222,249,255,262,263],[125,190,198,201,203,206,208,209,210,222,249,250,251,252,254,255,263,264,269],[125,190,198,203,206,208,209,210,222,249],[125,190,198,203,206,208,209,210,222,249,250],[125,190,198,203,206,208,209,210,222,250],[125,190,198,203,206,208,209,210,222,256],[125,190,198,201,203,206,208,209,210,222,237,249,250,256,258,259,264],[125,190,198,203,206,208,209,210,222,258],[125,190,198,203,206,208,209,210,222,262],[125,190,198,203,206,208,209,210,212,222,237,249,250,256],[125,190,198,201,203,206,208,209,210,222,249,250,266,267],[125,190,198,203,206,208,209,210,222,250,251,252,253,256,260,261,262,263,264,265,269,270],[125,190,198,203,206,208,209,210,222,251,255,265,269],[125,190,198,201,203,206,208,209,210,222,249,250,251,252,254,255,262,265,266,268],[125,190,198,203,206,208,209,210,222,255,257,260,261],[125,190,198,203,206,208,209,210,222,227,249],[125,190,198,203,206,208,209,210,222,251],[125,190,198,203,206,208,209,210,222,253],[125,190,198,203,206,208,209,210,212,222,237,249],[125,190,198,203,206,208,209,210,222,250,251,253],[100,125,190,198,203,206,208,209,210,222],[125,140,143,146,147,190,198,203,206,208,209,210,222,240],[125,143,190,198,203,206,208,209,210,222,227,240],[125,143,147,190,198,203,206,208,209,210,222,240],[125,137,190,198,203,206,208,209,210,222],[125,141,190,198,203,206,208,209,210,222],[125,139,140,143,190,198,203,206,208,209,210,222,240],[125,190,198,203,206,208,209,210,212,222,237],[125,137,190,198,203,206,208,209,210,222,249],[125,139,143,190,198,203,206,208,209,210,212,222,240],[125,134,135,136,138,142,190,198,201,203,206,208,209,210,222,227,240],[125,143,190,198,203,206,208,209,210,222],[125,143,152,161,190,198,203,206,208,209,210,222],[125,135,141,190,198,203,206,208,209,210,222],[125,143,171,172,190,198,203,206,208,209,210,222],[125,135,138,143,190,198,203,206,208,209,210,222,231,240,249],[125,139,143,190,198,203,206,208,209,210,222,240],[125,134,190,198,203,206,208,209,210,222],[125,137,138,139,141,142,143,144,145,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,172,173,174,175,176,190,198,203,206,208,209,210,222],[125,143,164,167,190,198,203,206,208,209,210,222],[125,143,152,154,155,190,198,203,206,208,209,210,222],[125,141,143,154,156,190,198,203,206,208,209,210,222],[125,142,190,198,203,206,208,209,210,222],[125,135,137,143,190,198,203,206,208,209,210,222],[125,143,147,154,156,190,198,203,206,208,209,210,222],[125,147,190,198,203,206,208,209,210,222],[125,141,143,146,190,198,203,206,208,209,210,222,240],[125,135,139,143,152,190,198,203,206,208,209,210,222],[125,143,164,190,198,203,206,208,209,210,222],[125,156,190,198,203,206,208,209,210,222],[125,135,139,143,147,190,198,203,206,208,209,210,222],[125,137,143,171,190,198,203,206,208,209,210,222,231,246,249],[88,89,90,92,94,125,190,191,198,203,204,206,208,209,210,214,222],[95,125,190,198,203,206,208,209,210,222,336],[125,190,195,198,203,206,208,209,210,214,222,240,335],[82,125,190,198,203,206,208,209,210,222],[81,86,125,190,198,203,206,208,209,210,222],[81,85,125,190,198,203,206,208,209,210,222],[81,82,83,84,85,86,87,125,190,198,203,206,208,209,210,222],[80,81,125,190,198,203,206,208,209,210,222,227],[88,125,190,191,198,203,206,208,209,210,222],[91,125,190,198,203,206,208,209,210,222],[93,125,190,198,203,206,208,209,210,222],[88,92,125,190,198,203,206,208,209,210,222]],"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":"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":"db59a81f070c1880ad645b2c0275022baa6a0c4f0acdc58d29d349c6efcf0903","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ffedae1d1c2d53fdbca1c96d3c7dda544281f7d262f99b6880634f8fd8d9820","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"b507173a7718609bb52011f33e6fc61b0f3de62ec38c935b38dcfbb68223dea9","impliedFormat":99},{"version":"ed03f7587c6405bca4aa5cd0e13c159ba6a38d29438bf368174cbc12b7952990","impliedFormat":99},{"version":"c2c45e23c9ade84835e6589a92f4b1e0d959f4aad517ca2b9f306d505c8c186b","impliedFormat":99},{"version":"d5f72b73663996558032aae95128fd1c003dbc2a3c7c9616a4b9582885554547","impliedFormat":99},{"version":"db04ab7cf477c959b90d137c9150114e93ab293f7a82068813e62596e514c8b9","impliedFormat":99},{"version":"d096b43d56e50a815348abdc7f505bff20b7326edd25d5ceab70be8ae550b216","impliedFormat":99},{"version":"f4b14039ec5893b0c7691e5695493a13207b5a6e7ea07e9d58fe3f112e9e87fd","impliedFormat":99},{"version":"7e7edbefeefa7d89d7d0e3b51e4361ff4cbafd2f0b8691af8f00d4ec7a2d0dbb","impliedFormat":99},{"version":"b5a012b8d2b5aedaa0284247fe44638a60a00afb8a4727aa86567f401ae06b1d","impliedFormat":99},{"version":"f65327e250d4fbac1ad1b516c28c5ec07e112cde36839a71ff88712c0bf67a9e","impliedFormat":99},{"version":"cb5c7d71525f231186e6533d1777efaca83cc03f270ba9f723ee8e4eb6e502d2","impliedFormat":99},{"version":"1ef4d20b196cea0b21d8f6a8a62108355283f839b9e4796b5ac9a6c09d559e83","impliedFormat":99},{"version":"41c2effc93c4a7c1143353cdd450d9f8b91c091630764c5654727bcb5af3cfce","impliedFormat":99},{"version":"12471b1247fe7e82f20ac55e075d815e4bf9e568d6f233d750340f0847abb61f","impliedFormat":99},{"version":"3ef0a0a3f3bf212481f8bac44b4da821c1d4522889be662d442d04d374cf0332","impliedFormat":99},{"version":"e8034795a6a0769ecef2eebf097b870ebdaf3afabdf09e08da974a7d124ffc1e","signature":"fa6538d386d40545617d939bfa18a08e50a31c2e83cb8f178c099fd812d78880","impliedFormat":99},{"version":"663266b8782a8b327a5196efa1b3627805e3e4fc712d6a4380f5e6571e45a813","impliedFormat":1},{"version":"5aa42b32993e161aaf93d992300494377d38c8883e15fde44d5c7949313058af","impliedFormat":1},{"version":"b75dd83280bdfd4880c04cadd7f5edf6b23305850e436b1e5b92c3847090d031","impliedFormat":1},{"version":"eae784573a5c4c55c65b86accb356b21b5f597c3484c1bd344e647bc92ebe572","impliedFormat":1},{"version":"827eb54656695635a6e25543f711f0fe86d1083e5e1c0e84f394ffc122bd3ad7","impliedFormat":1},{"version":"2309cee540edc190aa607149b673b437cb8807f4e8d921bf7f5a50e6aa8d609c","impliedFormat":1},{"version":"901de16fbacf42f8cbe7fb2e3dc7d33cd91548a54459438fdface0b30a6a29cd","impliedFormat":1},{"version":"90071b0bc39a1aee56e64a5ee1a94065f010d80a0d5124ff50b13e62adee8996","impliedFormat":1},{"version":"243248596db650ce6f8907cbb3a8076a5ab6888a39c37debc11a81c2f9f9d247","impliedFormat":1},{"version":"1460f16c4b7fc66d2dde3ce1a4ab97d480c27fb84a4e429355a21e76cd471e19","impliedFormat":1},{"version":"c5d73bf762b7b0e75fcdf691e21e31c9db9913931b200b9990f07f49ab2edff3","impliedFormat":1},{"version":"de38157a9f1be75a02ea8358be48a4d50ba31785fedd6a4f9ce7387d77ac9a22","impliedFormat":1},{"version":"76a5f88a99d386a1ea9209a9f8f33a3f2c2f17bc445a4078950a49c0624bae3d","impliedFormat":1},{"version":"65357b3849688962f59c625718650ad31ff59e6c23f244b4086f0d96558405d6","impliedFormat":1},{"version":"3f2fed2d0130ee5356cc1cb8782d7c974d37eccce4f1de871f7744ce61463eb4","impliedFormat":1},{"version":"471486ab7c5c95c3df63c0fbebe6871b9535eedff8b582557dfd66fcbf946d5b","impliedFormat":1},{"version":"45e82f28a80d855bab2355d5e46cc8edd7f2679fc5bfb0905dcf01ce59a5c347","impliedFormat":1},{"version":"48f7cd72c6f8ec5b2f70f50a8d4e6f47494e0d228015efb50c36fc6eab33c7ff","impliedFormat":1},{"version":"a8aa7a344599265ef9c2aba0433a805227b2c9b0e743106fab4d6f0c6966f536","impliedFormat":1},{"version":"806bed2ed4bf1c6ebb74a391531e98d361a0e23a31601fddb33dd90e31436b6d","impliedFormat":1},{"version":"9b92a4d989efc3eeefdca5f95f10267504abc7748ecff400b533cdf54dcdbd68","impliedFormat":1},{"version":"16e6feb2ea29757a0cdd16c8fe2bdf059a612a5474ea30019ae60d9fe309442a","impliedFormat":1},{"version":"2f45dc6e152333f5d28bb660e4543bfd41412b5af16b9a6331b7fd0b4982885e","impliedFormat":1},{"version":"ea4eadfe3d8b0447ecea1cbbf7aad70423cca9350bc9103a1d80cebc37e6bdb3","impliedFormat":1},{"version":"b88645280562793af76ab59052d87e4846ac5ef19af054c729fbb87c73481a59","impliedFormat":1},{"version":"a1f43b06dd37b1f6c5c7821881960dfe55038b468eafb324ad90ce5e9b448d2a","impliedFormat":1},{"version":"15b142d522e96e1962bd54c75560f6994cc8fe9a1640a36de2268fdb95e58fb5","impliedFormat":1},{"version":"de79263f32ea34b3f9282b19251626eeb3a3aef8d96491b731a3c0fb5cca2e77","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":"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":"332680a9475bd631519399f9796c59502aa499aa6f6771734eec82fa40c6d654","impliedFormat":1},{"version":"191bee6605de2b5210f29f22df04f5b5e6bdcc1f6e21fb07091d40eeeb75fd72","impliedFormat":1},{"version":"d83f3c0362467589b3a65d3a83088c068099c665a39061bf9b477f16708fa0f9","impliedFormat":1},{"version":"180e527dbc1f5ae2bbb79d0a3db1ada49258783d7e6299559e0f2ed663b4afec","impliedFormat":1},{"version":"29994a97447d10d003957bcc0c9355c272d8cf0f97143eb1ade331676e860945","impliedFormat":1},{"version":"f4260022f7af38e533d364ea62eb7ae01b0a32050033d7f6772073e1dc908025","impliedFormat":1},{"version":"9cddf06f2bc6753a8628670a737754b5c7e93e2cfe982a300a0b43cf98a7d032","impliedFormat":1},{"version":"3f8e68bd94e82fe4362553aa03030fcf94c381716ce3599d242535b0d9953e49","impliedFormat":1},{"version":"63e628515ec7017458620e1624c594c9bd76382f606890c8eebf2532bcab3b7c","impliedFormat":1},{"version":"355d5e2ba58012bc059e347a70aa8b72d18d82f0c3491e9660adaf852648f032","impliedFormat":1},{"version":"311cc121259b3e0c3c08304fc25b525aa02ba0f9bf55b3e7c60b0dbb7422014e","impliedFormat":1},{"version":"74c269b43d39e5ece20b2cca49c14e64c05b01e46407200d7558301d0fcaabf4","impliedFormat":1},{"version":"ec09bd95866efe38cd00ebb79dfa7a26563d600fa4a30db0f7c6d68f8f6d2b06","impliedFormat":1},{"version":"482d0ac70d56aa79941be30da6df28e926a007f835eed70cf7b5f3135368d1f6","impliedFormat":1},{"version":"7dd19397d5a090c9f8cd762bae67bd0ad6f782abe422594fb71168fb578673b0","impliedFormat":1},{"version":"84cbf6204ada0ee2f80493e55e45befa079954788718efd6dcc103183104e3c0","impliedFormat":1},{"version":"ed849d616865076f44a41c87f27698f7cdf230290c44bafc71d7c2bc6919b202","impliedFormat":1},{"version":"9a0a0af04065ddfecc29d2b090659fce57f46f64c7a04a9ba63835ef2b2d0efa","impliedFormat":1},{"version":"10297d22a9209a718b9883a384db19249b206a0897e95f2b9afeed3144601cb0","impliedFormat":1},{"version":"034b8b5912823744c986986f24432bf3fa7bfa671e69316b672f3f2db5166ce4","impliedFormat":1},{"version":"34d206f6ba993e601dade2791944bdf742ab0f7a8caccc661106c87438f4f904","impliedFormat":1},{"version":"05ca49cc7ba9111f6c816ecfadb9305fffeb579840961ee8286cc89749f06ebd","impliedFormat":1},{"version":"14bad5bea17b4e0f2495b5dac89a936e139338e2c87716bffd3c281ae7a9fec6","impliedFormat":1},{"version":"b8a122e51c2ee902b44d86ff806011d216af54be75844a4d3c366d80776a4d33","impliedFormat":1},{"version":"0850c98ca2cccae6ce2aad363f6eb370c401fbc279a64607fff90c0f87973a91","impliedFormat":1},{"version":"d0f62192ec787f1592a5b86760a44350d1c925883a573eadc12d60862890dffe","impliedFormat":1},{"version":"4ef34562ac49a16a1681d51d6e8ece677657782cf1a464e010224cbbe0bb071f","impliedFormat":1},{"version":"a66ad696f2785dd00374b8dee6fab5c58c049c0efe24b3c214fbe6aec3f53d6e","impliedFormat":1},{"version":"f226f29f5594bd479f27648f42423ffa1a1460cafc7b1ba04bd013b28cba710f","impliedFormat":1},{"version":"63f859a315e9711f383d06b7a2b940804e51078d85e896980816f46f1b6021a8","impliedFormat":1},{"version":"f8da2a3bec435c09f9a10d9f150949bf0ebb0c3508f074887dbb2d3e33ce302b","impliedFormat":1},{"version":"397b46c6a95826d26714b5481addc606de72d8229b092e236f0d78a9e7226d29","impliedFormat":1},{"version":"5f47fb5b000c03fdcae71e6e017261898a37f0892532cb713ce95c8950462d80","impliedFormat":1},{"version":"8142d5eaa44b4dbb68dbe87b5f05b148c5a74a6fa7abd3cb3aa80a7ed4a05150","impliedFormat":1},{"version":"6c66369276512eac5b53eaca735d7472b5ffca417977c3976a66b84059f2af2b","impliedFormat":1},{"version":"225deff02f4d1c91e2d6c71dec9f18feae510aa729a9774024f30278f4c6b8fe","impliedFormat":1},{"version":"6c24f6dcbb3bf8235bf8da995a7290ffbd9d557a760cf2deb380ce91a989b765","impliedFormat":1},{"version":"e48415a5a97a5e6c22cc4fdcb3172805ce68a1d41d0a056d71bff9ced2186d43","impliedFormat":1},{"version":"adec507ee458a691b72254991a7903a10c052019d8cdc7ffe359d9f373e7401f","impliedFormat":1},{"version":"9b74326515d17f03809cfbea6de789772ff7d0c759a08a59bfa5242bda98d35b","impliedFormat":1},{"version":"09788d0d992a6d2471f35019ab68b39105c44ebf17f2051cf3e228a39e91885a","impliedFormat":1},{"version":"0ea47413eaffe144782a44058205c31130b382dee0e2f66b62b5188eac57039e","impliedFormat":1},{"version":"c0591738dbfe11a36959f16ab40bc98b2a430c4565770ef6257574546079d791","impliedFormat":1},{"version":"3cf3dc0f53d71795cd7c461346e9aa3c713f8a5138015776aa6d4b8ff9e0cb26","impliedFormat":1},{"version":"ca73451ec7771379b6b1271dcda0d0b2146da80b329136a09ad692529a073965","impliedFormat":1},{"version":"fad74233657c4e0346822942ac3716a20b16fb053ca00c1260a08a81cc76df89","impliedFormat":1},{"version":"43f0a7dead8b25e1c101a060ea31d6df548a9303c58aa7498d0285fd4ecaac1c","impliedFormat":1},{"version":"fced7c59acecb0ac631505fcbc5a1ce0c6420e2494a256321e9359093efb7a1f","impliedFormat":1},{"version":"8c42fbcae55a41f9c48f644ff9743fab827a9d38f5a6bd486f17c6460f8a099b","impliedFormat":1},{"version":"793c2b5a225ca7569320b2f9f3a43cc20a08e83fbd6587f5c24c7a05feaee6d0","impliedFormat":1},{"version":"cf841c4bfb05b4b1d3826773ff77a47bb0dc17c665a4dbff7d6c4a6d9042d50c","impliedFormat":1},{"version":"597b9bd9363840016d7e8c6839cccd22f85079484bae7e444e80cf24645529af","impliedFormat":1},{"version":"bd15222c3f016a97d7062a0018f7fe0d130be508ca276b43dcafa8c9032a3ea4","impliedFormat":1},{"version":"4f5f11b73282262904f4c1bc5ffb76631b40ac8b54ae01bde274cb9242d6cb2f","impliedFormat":1},{"version":"9e6dcb736749cc84304b38c5a1101b299659dbc3871bab5d1544ee8f8dc73e5b","impliedFormat":1},{"version":"3f8f36996bff2e0d4f6bb2b11e1a684489b511032473180f44d0b23f38a53800","impliedFormat":1},{"version":"4e4559e8e4ea7d87f914014074559e515de78308bacc733a7ea76f795de178a3","impliedFormat":1},{"version":"13ecb31795209aa56b1837b9d46cc5494da392f594132bc5b3a56c067e12ea1c","impliedFormat":1},{"version":"e34a28e978cf430e062c91d03987f2b42360b33e6207738b40494acd4a97004b","impliedFormat":1},{"version":"5cc10d0295e594c961bd020cc76845097928f550fa3d58468114e5225054f76c","impliedFormat":1},{"version":"99c4cd704c85c3b9a215977d1d10ad34f1c6bbc5784e0ddaaf6fe8090030eaf3","impliedFormat":1},{"version":"7dc695c4ab01309d1d1b43201700560054feadddf8d0bbfc79d981bff03c1db0","impliedFormat":1},{"version":"ab0db8d8a821582e3f49739e5267466d964b64f4aeea5ba379ac7759c7adc531","impliedFormat":1},{"version":"f6e9e0411de308207892802c52be06bf25df281ace623cbf7870583e28b3f12b","impliedFormat":1},{"version":"307067699cff7c3c8a77d9e69aef5291f0141cfbbbeb0954804589e6701238cc","impliedFormat":1},{"version":"11741962da8818dfe175a7e01a483149d085b569dc5e021c83a94203d686996a","impliedFormat":1},{"version":"43e4de859903a03dfc018748ca5cb673df9cf43df17f379fda7da85eabf7883f","impliedFormat":1},{"version":"e3e78772154f790f8b0a6eaeaba5b4c816567d9d30f9c8655ed29cb9438e5455","impliedFormat":1},{"version":"e17369650fdfac36437e8559b86b2d6172d090594696976082903ba856a2a979","impliedFormat":1},{"version":"69cab7f70e702f3a517d6e47428b4d2d76b56bc355e6f85e305d1b6f6d700f7b","impliedFormat":1},{"version":"8a95a499afe7cd2aa6161b68aa3f7599e9ae7d12697171384f540e268d846746","impliedFormat":1},{"version":"2967840927e96b345f7b8250ad35e7436aae73c77d9767a2b43f2606ab107cf3","impliedFormat":1},{"version":"0e6387b87925a10ba52cd0de685a4f7e2d9dd402dbac560dce8934e8e34007d0","impliedFormat":1},{"version":"77515d8e0ceb4f4bae7d0c9aafe9fd764a5f25601569ecbac3240cacfe136f14","impliedFormat":1},{"version":"b07d72a408bfcf125c24cfba3db38207687711b800b98ab417e5ada59438c554","impliedFormat":1},{"version":"ef5aa9871f3b8dac96d4ef93e22eec539527d739c6a7e0c7fa7101fa343bfd77","impliedFormat":1},{"version":"47507ff33fbe83627bdf11136400594a249e8012508425bb2846b7268f966f00","impliedFormat":1},{"version":"4a1a0f21b3c4fc0d217392d82445a34fcc8c9ed6f79fdc4d14b8353e3c74eaf3","impliedFormat":1},{"version":"e041d566f765b48ddf66ffd085fb120951cf28e92d129751351e72f8c96d99fa","impliedFormat":1},{"version":"5a59c1315ed5ca8f899fc6527f23a15dc9a38107175a5fffd473db25bcd1fd4a","impliedFormat":1},{"version":"20a5515b81a828fc10b066aa5f88a5eb68323d23b8a10d8e9dc7edb6ebdd2bd7","impliedFormat":1},{"version":"f2c24a1e4bc555e203dab5b749b718b1cdf73ecf57d8a8872ff163cbc03b1a68","impliedFormat":1},{"version":"0dcea4e3a40e7408ec9a6aeacb721ce8289fc99d5f2be600146a472d6d1590b8","impliedFormat":1},{"version":"2093f341c5cba3058c29f9344e59ecfa22dc6559c7eb9f00497a108e09301a55","impliedFormat":1},{"version":"15aba6a4199ce9e4f3c1ec397a468f6aaaeba973649ca4f1c016225b46a5feaf","impliedFormat":1},{"version":"a1ca7f7788853a2ff3670bf1112a92fa503686b10d58339318fec5862bd209a6","impliedFormat":1},{"version":"d021346cbc461627bf07138b02210f546f8a2051dc8c5cb533a8463365ed18b5","signature":"68881bbf1ad817b8921e09d6010cd0076bf633c00172919222478b3f8fcde922","impliedFormat":99},{"version":"083449cf56ef5c6f0f4a9dc7fcde7c28f59fbf012f4f8c97ae2f1eca9c8ea65f","impliedFormat":99},{"version":"990db7c9743d636fd3b2820ec8c40b512879da4c82e00488e7a352e2d005fc39","impliedFormat":1},{"version":"f091ed534c92e6408336f94323ecfe1890c0b5e0166154120712ed97ac9754a1","impliedFormat":1}],"root":[95,336,337],"options":{"composite":true,"esModuleInterop":true,"module":199,"outDir":"./","rootDir":"../src","skipLibCheck":true,"target":12,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[339,1],[338,2],[187,3],[188,3],[189,4],[125,5],[190,6],[191,7],[192,8],[193,9],[194,10],[195,11],[196,12],[197,13],[198,14],[199,14],[200,15],[201,16],[202,2],[203,17],[204,18],[126,2],[124,2],[205,19],[206,20],[207,21],[249,22],[208,23],[209,24],[210,23],[211,25],[212,26],[213,27],[214,28],[215,28],[216,28],[217,29],[218,30],[219,31],[220,32],[221,33],[222,34],[223,34],[224,35],[225,2],[226,2],[227,36],[228,37],[229,38],[230,39],[231,40],[232,41],[233,42],[234,43],[235,44],[236,45],[237,46],[238,47],[239,48],[240,49],[241,50],[242,51],[243,52],[244,53],[245,54],[127,23],[128,2],[129,55],[130,56],[131,2],[132,57],[133,2],[178,58],[179,59],[180,60],[181,60],[182,61],[183,2],[184,6],[185,62],[186,59],[246,63],[247,64],[248,65],[323,66],[96,2],[112,67],[320,68],[303,69],[304,70],[302,71],[305,2],[306,2],[311,72],[307,2],[308,2],[309,2],[310,2],[317,73],[332,74],[318,75],[321,76],[316,77],[324,78],[319,68],[314,79],[325,80],[315,81],[326,82],[286,2],[328,83],[313,84],[327,76],[329,85],[312,70],[331,86],[273,2],[274,2],[277,87],[275,2],[115,2],[276,2],[335,88],[114,89],[97,2],[103,90],[116,91],[118,92],[280,93],[301,94],[281,2],[108,95],[282,96],[283,97],[284,2],[285,2],[110,98],[288,99],[289,100],[99,2],[107,101],[290,2],[279,102],[291,2],[300,2],[117,103],[272,75],[292,2],[102,104],[293,2],[294,2],[295,2],[297,105],[296,106],[298,107],[287,108],[278,109],[299,110],[111,111],[119,2],[104,2],[120,2],[123,112],[109,113],[105,114],[106,2],[121,101],[122,115],[98,2],[330,116],[113,117],[334,118],[333,119],[264,120],[265,121],[263,122],[251,123],[256,124],[257,125],[260,126],[259,127],[258,128],[261,129],[268,130],[271,131],[270,132],[269,133],[262,134],[252,135],[267,136],[254,137],[250,138],[255,139],[253,123],[100,2],[101,140],[266,2],[322,2],[78,2],[79,2],[14,2],[13,2],[2,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[21,2],[22,2],[3,2],[23,2],[24,2],[4,2],[25,2],[29,2],[26,2],[27,2],[28,2],[30,2],[31,2],[32,2],[5,2],[33,2],[34,2],[35,2],[36,2],[6,2],[40,2],[37,2],[38,2],[39,2],[41,2],[7,2],[42,2],[47,2],[48,2],[43,2],[44,2],[45,2],[46,2],[8,2],[52,2],[49,2],[50,2],[51,2],[53,2],[9,2],[54,2],[55,2],[56,2],[58,2],[57,2],[59,2],[60,2],[10,2],[61,2],[62,2],[63,2],[11,2],[64,2],[65,2],[66,2],[67,2],[68,2],[69,2],[12,2],[70,2],[71,2],[72,2],[73,2],[74,2],[1,2],[75,2],[76,2],[77,2],[152,141],[166,142],[149,143],[167,103],[176,144],[140,145],[141,146],[139,147],[175,122],[170,148],[174,149],[143,150],[153,151],[163,152],[142,153],[173,154],[137,155],[138,148],[144,151],[145,2],[151,156],[148,151],[135,157],[177,158],[168,159],[156,160],[155,151],[157,161],[160,162],[154,163],[158,164],[171,122],[146,165],[147,166],[161,167],[136,103],[165,168],[164,151],[150,166],[159,169],[162,170],[169,2],[134,2],[172,171],[95,172],[337,173],[336,174],[83,175],[84,175],[87,176],[85,2],[86,177],[88,178],[81,2],[82,179],[89,175],[90,2],[80,2],[91,180],[92,181],[94,182],[93,183]],"latestChangedDtsFile":"./index.d.ts","version":"6.0.3"}
@@ -0,0 +1,22 @@
1
+ import { type ServiceEnvironmentTarget } from "@saws/core";
2
+ import { DockerService, type DockerServiceConfig } from "@saws/docker-service";
3
+ import { RedisService } from "@saws/redis-service";
4
+ export interface BullMQServiceConfig extends Omit<DockerServiceConfig, "image" | "dockerfile" | "buildContext" | "ports" | "command" | "healthCheck"> {
5
+ /** Redis instance used by this worker and its queue clients. */
6
+ redis: RedisService;
7
+ /** Queue name. Defaults to this service's name. */
8
+ queue?: string;
9
+ }
10
+ export declare class BullMQService extends DockerService {
11
+ readonly redis: RedisService;
12
+ readonly queue: string;
13
+ protected readonly serviceType = "bullmq";
14
+ private bullMQDevProcess?;
15
+ constructor(config: BullMQServiceConfig);
16
+ init(): Promise<void>;
17
+ dev(): Promise<void>;
18
+ exit(): void;
19
+ getEnvironmentVariables(stage: string, target?: ServiceEnvironmentTarget): Promise<Record<string, string>>;
20
+ protected getContainerEnvironment(stage: string): Promise<Record<string, string>>;
21
+ private observeBullMQDevProcess;
22
+ }
@@ -0,0 +1,178 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { ServiceDefinition } from "@saws/core";
5
+ import { installDependencies } from "@saws/core/utils/dependency-management";
6
+ import { fileExists } from "@saws/core/utils/file-exists";
7
+ import { DockerService } from "@saws/docker-service";
8
+ export class BullMQService extends DockerService {
9
+ redis;
10
+ queue;
11
+ serviceType = "bullmq";
12
+ bullMQDevProcess;
13
+ constructor(config) {
14
+ super({
15
+ ...config,
16
+ dependencies: [...(config.dependencies ?? []), config.redis],
17
+ dockerfile: path.join(config.name, "Dockerfile"),
18
+ buildContext: ".",
19
+ healthCheck: false,
20
+ });
21
+ this.redis = config.redis;
22
+ this.queue = config.queue ?? config.name;
23
+ }
24
+ async init() {
25
+ await super.init();
26
+ await mkdir(path.resolve(this.name, "src", "jobs"), { recursive: true });
27
+ await writeFileIfMissing(path.resolve(this.name, "package.json"), JSON.stringify({ name: this.name, type: "module" }, null, 2) + "\n");
28
+ await writeFileIfMissing(path.resolve(this.name, "tsconfig.json"), JSON.stringify({
29
+ extends: "@tsconfig/node26/tsconfig.json",
30
+ compilerOptions: {
31
+ composite: true,
32
+ outDir: "./dist",
33
+ rootDir: "./src",
34
+ types: ["node"],
35
+ },
36
+ }, null, 2) + "\n");
37
+ await writeFileIfMissing(path.resolve(this.name, "src", "index.ts"), workerIndexTemplate());
38
+ await writeFileIfMissing(path.resolve(this.name, "Dockerfile"), dockerfileTemplate(this.name));
39
+ await addWorkspace(this.name);
40
+ await addTsconfigReference(`./${this.name}/tsconfig.json`);
41
+ await installDependencies(["bullmq", "@saws/bullmq-service"], {
42
+ workspace: this.name,
43
+ logSink: this.getRuntimeLogSink(),
44
+ serviceName: this.name,
45
+ });
46
+ await installDependencies(["typescript", "tsx", "@tsconfig/node26", "@types/node"], {
47
+ workspace: this.name,
48
+ development: true,
49
+ logSink: this.getRuntimeLogSink(),
50
+ serviceName: this.name,
51
+ });
52
+ }
53
+ async dev() {
54
+ await ServiceDefinition.prototype.dev.call(this);
55
+ const environment = {
56
+ ...(await this.getDependenciesEnvironmentVariables("local", "host")),
57
+ ...(await this.getStageEnvironmentVariables("local")),
58
+ ...(await this.getEnvironmentVariables("local", "host")),
59
+ REDIS_URL: (await this.redis.getConnectionInfo("local", "host")).url,
60
+ QUEUE_NAME: this.queue,
61
+ };
62
+ this.writeRuntimeLog(`Start BullMQ worker ${this.name} for queue ${this.queue}\n`);
63
+ this.bullMQDevProcess = spawn("npx", ["tsx", "watch", "src/index.ts"], {
64
+ cwd: path.resolve(this.name),
65
+ env: {
66
+ ...process.env,
67
+ ...environment,
68
+ NODE_ENV: "development",
69
+ },
70
+ stdio: ["ignore", "pipe", "pipe"],
71
+ });
72
+ this.observeBullMQDevProcess(this.bullMQDevProcess);
73
+ }
74
+ exit() {
75
+ super.exit();
76
+ this.bullMQDevProcess?.kill();
77
+ this.bullMQDevProcess = undefined;
78
+ }
79
+ async getEnvironmentVariables(stage, target = "container") {
80
+ return {
81
+ [this.parameterizedEnvVarName("REDIS_URL")]: (await this.redis.getConnectionInfo(stage, target)).url,
82
+ [this.parameterizedEnvVarName("QUEUE_NAME")]: this.queue,
83
+ };
84
+ }
85
+ async getContainerEnvironment(stage) {
86
+ return {
87
+ ...(await super.getContainerEnvironment(stage)),
88
+ ...(await this.getEnvironmentVariables(stage, "container")),
89
+ REDIS_URL: (await this.redis.getConnectionInfo(stage, "container")).url,
90
+ QUEUE_NAME: this.queue,
91
+ };
92
+ }
93
+ observeBullMQDevProcess(process) {
94
+ process.stdout?.on("data", (chunk) => this.writeRuntimeLog(chunk.toString("utf8")));
95
+ process.stderr?.on("data", (chunk) => this.writeRuntimeLog(chunk.toString("utf8"), "stderr"));
96
+ process.once("error", (error) => {
97
+ this.writeRuntimeLog(`${error.stack ?? error.message}\n`, "stderr");
98
+ });
99
+ process.once("exit", (code, signal) => {
100
+ if (this.bullMQDevProcess === process)
101
+ this.bullMQDevProcess = undefined;
102
+ if (code !== 0 && signal !== "SIGTERM" && signal !== "SIGINT") {
103
+ this.writeRuntimeLog(`BullMQ worker exited with code ${code ?? "unknown"}${signal == null ? "" : ` (${signal})`}\n`, "stderr");
104
+ }
105
+ });
106
+ }
107
+ }
108
+ async function writeFileIfMissing(filePath, contents) {
109
+ if (await fileExists(filePath))
110
+ return;
111
+ await writeFile(filePath, contents);
112
+ }
113
+ async function addWorkspace(workspace) {
114
+ const packageJsonPath = path.resolve("package.json");
115
+ const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
116
+ if (Array.isArray(packageJson.workspaces)) {
117
+ if (!packageJson.workspaces.includes(workspace))
118
+ packageJson.workspaces.push(workspace);
119
+ }
120
+ else {
121
+ packageJson.workspaces = {
122
+ ...packageJson.workspaces,
123
+ packages: [...new Set([...(packageJson.workspaces?.packages ?? []), workspace])],
124
+ };
125
+ }
126
+ await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + "\n");
127
+ }
128
+ async function addTsconfigReference(reference) {
129
+ const tsconfigPath = path.resolve("tsconfig.json");
130
+ const tsconfig = JSON.parse(await readFile(tsconfigPath, "utf8"));
131
+ tsconfig.references = tsconfig.references ?? [];
132
+ if (!tsconfig.references.some((entry) => entry.path === reference || entry.path === `./${reference}`)) {
133
+ tsconfig.references.push({ path: reference });
134
+ }
135
+ await writeFile(tsconfigPath, JSON.stringify(tsconfig, null, 2) + "\n");
136
+ }
137
+ function workerIndexTemplate() {
138
+ return `import {
139
+ createWorker,
140
+ type BackgroundJobConstructor,
141
+ type JobsFromMapping,
142
+ } from "@saws/bullmq-service";
143
+
144
+ const jobs = {
145
+ // Register jobs here, for example: "send-email": SendEmailJob,
146
+ } satisfies Record<string, BackgroundJobConstructor>;
147
+
148
+ export type Jobs = JobsFromMapping<typeof jobs>;
149
+
150
+ createWorker(jobs);
151
+ `;
152
+ }
153
+ function dockerfileTemplate(servicePath) {
154
+ const dockerServicePath = servicePath.split(path.sep).join(path.posix.sep);
155
+ return `FROM node:26-slim AS build
156
+ WORKDIR /app
157
+
158
+ COPY package*.json ./
159
+ COPY ${dockerServicePath}/package*.json ./${dockerServicePath}/
160
+ RUN npm ci --workspace ./${dockerServicePath} --include-workspace-root=false
161
+
162
+ COPY ${dockerServicePath} ./${dockerServicePath}
163
+ RUN npx --no-install tsc -p ${dockerServicePath}/tsconfig.json
164
+
165
+ FROM node:26-slim AS runtime
166
+ WORKDIR /app
167
+ ENV NODE_ENV=production
168
+
169
+ COPY package*.json ./
170
+ COPY ${dockerServicePath}/package*.json ./${dockerServicePath}/
171
+ RUN npm ci --omit=dev --workspace ./${dockerServicePath} --include-workspace-root=false
172
+
173
+ COPY --from=build /app/${dockerServicePath}/dist ./${dockerServicePath}/dist
174
+
175
+ WORKDIR /app/${dockerServicePath}
176
+ CMD ["node", "dist/index.js"]
177
+ `;
178
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./BullMQService.js";
2
+ export * from "./jobs.js";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./BullMQService.js";
2
+ export * from "./jobs.js";
package/dist/jobs.d.ts ADDED
@@ -0,0 +1,64 @@
1
+ import { FlowProducer, Job, Queue, Worker, type ConnectionOptions, type JobNode, type JobsOptions, type WorkerOptions } from "bullmq";
2
+ export type BackgroundJobConstructor<DataType = any, ReturnType = any, JobDataType = DataType> = new (data: DataType, job?: Job<JobDataType>) => BackgroundJob<DataType, ReturnType, JobDataType>;
3
+ type AnyBackgroundJobConstructor = BackgroundJobConstructor<any, any, any>;
4
+ type FlowInputType<Jobs extends readonly AnyBackgroundJobConstructor[]> = Jobs extends readonly [
5
+ infer FirstJob extends AnyBackgroundJobConstructor,
6
+ ...AnyBackgroundJobConstructor[]
7
+ ] ? ConstructorParameters<FirstJob>[0] : never;
8
+ /** A discriminated union used by BullMQClient for type-safe job enqueueing. */
9
+ export type JobsFromMapping<Mapping extends Record<string, AnyBackgroundJobConstructor>> = {
10
+ [Name in keyof Mapping]: {
11
+ name: Name;
12
+ data: ConstructorParameters<Mapping[Name]>[0];
13
+ };
14
+ }[keyof Mapping];
15
+ export type FlowEnqueueOptions = {
16
+ jobs?: JobsOptions | readonly (JobsOptions | undefined)[];
17
+ flowId?: string;
18
+ };
19
+ export declare function getRedisConnection(): ConnectionOptions;
20
+ export declare const getPrefixedQueueName: (baseName: string) => string;
21
+ export declare const createQueue: (baseName: string) => Queue<any, any, string, any, any, string>;
22
+ /**
23
+ * Returns the queue configured for the current BullMQ worker service.
24
+ *
25
+ * BullMQService injects QUEUE_NAME from its `queue` setting, which defaults to
26
+ * the service name in saws.ts.
27
+ */
28
+ export declare function getConfiguredQueueName(): string;
29
+ /** Creates a queue for the BullMQService that is running this job. */
30
+ export declare function createConfiguredQueue(): Queue<any, any, string, any, any, string>;
31
+ export declare const createFlowProducer: () => FlowProducer;
32
+ export declare function createSandboxedWorker(queueName: string, filePath: string | URL, options?: Partial<WorkerOptions>): Worker<any, any, string>;
33
+ export declare function createWorker(jobMapping: Record<string, BackgroundJobConstructor>, options?: Partial<WorkerOptions>): Worker;
34
+ /** @deprecated Pass the job mapping directly; BullMQService injects the queue name. */
35
+ export declare function createWorker(queueName: string, jobMapping: Record<string, BackgroundJobConstructor>, options?: Partial<WorkerOptions>): Worker;
36
+ export declare const createProcessor: (jobMapping: Record<string, BackgroundJobConstructor>) => (job: Job, token?: string) => Promise<any>;
37
+ export declare abstract class BackgroundJob<DataType = any, ReturnType = any, JobDataType = DataType> {
38
+ abstract name: string;
39
+ /**
40
+ * The queue configured by the owning BullMQService. Subclasses normally only
41
+ * need to provide a name and run implementation.
42
+ */
43
+ readonly queue: Queue<any, any, string, any, any, string>;
44
+ data: DataType;
45
+ job?: Job<JobDataType>;
46
+ constructor(data: DataType, job?: Job<JobDataType>);
47
+ abstract run(): Promise<ReturnType>;
48
+ log(logLine: string): void;
49
+ protected debug(message: string, details?: unknown): void;
50
+ enqueue(options?: JobsOptions): Promise<Job<JobDataType, any, string>>;
51
+ retry(): Promise<void>;
52
+ remove(): Promise<void>;
53
+ }
54
+ export declare class Flow<const Jobs extends readonly [AnyBackgroundJobConstructor, ...AnyBackgroundJobConstructor[]]> {
55
+ private readonly jobs;
56
+ private readonly flowProducer;
57
+ constructor(jobs: Jobs, flowProducer?: FlowProducer);
58
+ enqueue(data: FlowInputType<Jobs>, options?: JobsOptions | FlowEnqueueOptions): Promise<JobNode>;
59
+ close(): Promise<void>;
60
+ disconnect(): Promise<void>;
61
+ private createNode;
62
+ }
63
+ export declare function getProcessorPath(from: string | URL): string;
64
+ export {};
package/dist/jobs.js ADDED
@@ -0,0 +1,257 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { extname } from "node:path";
3
+ import * as path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { FlowProducer, Queue, UnrecoverableError, Worker, } from "bullmq";
6
+ const THIRTY_DAYS_SECONDS = 30 * 24 * 60 * 60;
7
+ const FLOW_DATA_MARKER = "__aiFlow";
8
+ export function getRedisConnection() {
9
+ return { url: process.env.REDIS_URL };
10
+ }
11
+ export const getPrefixedQueueName = (baseName) => {
12
+ const prefix = process.env.QUEUE_NAME_PREFIX;
13
+ return prefix ? `${prefix}-${baseName}` : baseName;
14
+ };
15
+ export const createQueue = (baseName) => new Queue(getPrefixedQueueName(baseName), { connection: getRedisConnection() });
16
+ const configuredQueues = new Map();
17
+ /**
18
+ * Returns the queue configured for the current BullMQ worker service.
19
+ *
20
+ * BullMQService injects QUEUE_NAME from its `queue` setting, which defaults to
21
+ * the service name in saws.ts.
22
+ */
23
+ export function getConfiguredQueueName() {
24
+ const queueName = process.env.QUEUE_NAME;
25
+ if (queueName == null || queueName.trim().length === 0) {
26
+ throw new UnrecoverableError("QUEUE_NAME must be set by a BullMQService before background jobs can be enqueued");
27
+ }
28
+ return queueName;
29
+ }
30
+ /** Creates a queue for the BullMQService that is running this job. */
31
+ export function createConfiguredQueue() {
32
+ const queueName = getConfiguredQueueName();
33
+ let queue = configuredQueues.get(queueName);
34
+ if (queue == null) {
35
+ queue = new Queue(queueName, { connection: getRedisConnection() });
36
+ configuredQueues.set(queueName, queue);
37
+ }
38
+ return queue;
39
+ }
40
+ export const createFlowProducer = () => new FlowProducer({ connection: getRedisConnection() });
41
+ export function createSandboxedWorker(queueName, filePath, options = {}) {
42
+ const worker = new Worker(queueName, filePath, {
43
+ connection: getRedisConnection(),
44
+ ...options,
45
+ });
46
+ attachWorkerDebugLogging(worker, queueName);
47
+ worker.on("error", errorHandler(queueName));
48
+ worker.on("failed", reportPermanentFailure(queueName));
49
+ return worker;
50
+ }
51
+ export function createWorker(queueNameOrJobMapping, jobMappingOrOptions = {}, options = {}) {
52
+ const queueName = typeof queueNameOrJobMapping === "string" ? queueNameOrJobMapping : getConfiguredQueueName();
53
+ const jobMapping = typeof queueNameOrJobMapping === "string"
54
+ ? jobMappingOrOptions
55
+ : queueNameOrJobMapping;
56
+ const workerOptions = typeof queueNameOrJobMapping === "string"
57
+ ? options
58
+ : jobMappingOrOptions;
59
+ const worker = new Worker(queueName, createProcessor(jobMapping), {
60
+ connection: getRedisConnection(),
61
+ ...workerOptions,
62
+ });
63
+ attachWorkerDebugLogging(worker, queueName);
64
+ worker.on("error", errorHandler(queueName));
65
+ worker.on("failed", reportPermanentFailure(queueName));
66
+ return worker;
67
+ }
68
+ const attachWorkerDebugLogging = (worker, queueName) => {
69
+ worker.on("active", (job) => {
70
+ console.log(`[jobs] active queue=${queueName} jobId=${job.id ?? "unknown"} name=${job.name} attemptsMade=${job.attemptsMade} data=${safeStringify(job.data)}`);
71
+ });
72
+ worker.on("completed", (job, result) => {
73
+ console.log(`[jobs] completed queue=${queueName} jobId=${job.id ?? "unknown"} name=${job.name} result=${safeStringify(result)}`);
74
+ });
75
+ worker.on("failed", (job, error) => {
76
+ console.error(`[jobs] failed queue=${queueName} jobId=${job?.id ?? "unknown"} name=${job?.name ?? "unknown"} attemptsMade=${job?.attemptsMade ?? "unknown"} error=${formatError(error)}`);
77
+ });
78
+ };
79
+ const errorHandler = (queueName) => (error) => {
80
+ console.error(`[jobs] worker-error queue=${queueName} error=${formatError(error)}`);
81
+ };
82
+ const reportPermanentFailure = (queueName) => (job, error) => {
83
+ if (job &&
84
+ (isFinalAttempt(job) ||
85
+ error.name === "UnrecoverableError" ||
86
+ error instanceof UnrecoverableError)) {
87
+ console.error(`[jobs] permanent-failure queue=${queueName} jobId=${job.id ?? "unknown"} name=${job.name} attemptsMade=${job.attemptsMade} error=${formatError(error)}`);
88
+ }
89
+ };
90
+ const isFinalAttempt = (job) => job.attemptsMade >= (job.opts.attempts ?? 0);
91
+ export const createProcessor = (jobMapping) => {
92
+ return async (job, token) => {
93
+ job.token = token;
94
+ console.log(`[jobs] dispatch queue=${job.queueName} jobId=${job.id ?? "unknown"} name=${job.name} tokenPresent=${token != null} data=${safeStringify(job.data)}`);
95
+ const JobClass = jobMapping[job.name];
96
+ if (JobClass == null) {
97
+ throw new UnrecoverableError(`${job.name} can not be handled by this worker`);
98
+ }
99
+ const data = await resolveJobData(job);
100
+ return new JobClass(data, job).run();
101
+ };
102
+ };
103
+ export class BackgroundJob {
104
+ /**
105
+ * The queue configured by the owning BullMQService. Subclasses normally only
106
+ * need to provide a name and run implementation.
107
+ */
108
+ queue = createConfiguredQueue();
109
+ data;
110
+ job;
111
+ constructor(data, job) {
112
+ this.data = data;
113
+ this.job = job;
114
+ }
115
+ log(logLine) {
116
+ if (this.job == null) {
117
+ console.log(logLine);
118
+ return;
119
+ }
120
+ this.job.log(logLine);
121
+ }
122
+ debug(message, details) {
123
+ const prefix = `[jobs] name=${this.name} queue=${this.queue?.name ?? "unknown"} jobId=${this.job?.id ?? "unassigned"}`;
124
+ const detailSuffix = details === undefined ? "" : ` details=${safeStringify(details)}`;
125
+ this.log(`${prefix} ${message}${detailSuffix}`);
126
+ }
127
+ async enqueue(options) {
128
+ if (this.name === "background-job") {
129
+ throw new UnrecoverableError('The job name must be set to something other than "background-job"');
130
+ }
131
+ if (this.queue == null) {
132
+ throw new UnrecoverableError("The queue must be set on the inheriting class");
133
+ }
134
+ this.job = await this.queue.add(this.name, this.data, withDefaultJobOptions(options));
135
+ this.debug("enqueued", {
136
+ data: this.data,
137
+ options,
138
+ attempts: this.job.opts.attempts ?? 0,
139
+ delay: this.job.delay,
140
+ });
141
+ return this.job;
142
+ }
143
+ async retry() {
144
+ if (this.job == null)
145
+ throw new Error("Can not retry without a job");
146
+ return this.job.retry();
147
+ }
148
+ async remove() {
149
+ if (this.job == null)
150
+ throw new Error("Can not remove without a job");
151
+ return this.job.remove();
152
+ }
153
+ }
154
+ export class Flow {
155
+ jobs;
156
+ flowProducer;
157
+ constructor(jobs, flowProducer = createFlowProducer()) {
158
+ if (jobs.length === 0)
159
+ throw new UnrecoverableError("A flow must include at least one job");
160
+ this.jobs = jobs;
161
+ this.flowProducer = flowProducer;
162
+ }
163
+ async enqueue(data, options) {
164
+ const flowOptions = normalizeFlowEnqueueOptions(options);
165
+ const flowId = flowOptions.flowId ?? randomUUID();
166
+ return this.flowProducer.add(this.createNode(this.jobs.length - 1, data, flowId, flowOptions));
167
+ }
168
+ async close() {
169
+ return this.flowProducer.close();
170
+ }
171
+ async disconnect() {
172
+ return this.flowProducer.disconnect();
173
+ }
174
+ createNode(index, data, flowId, options) {
175
+ const JobClass = this.jobs[index];
176
+ const job = new JobClass(index === 0 ? data : createFlowWrappedJobData(flowId, index));
177
+ if (job.name === "background-job") {
178
+ throw new UnrecoverableError('The job name must be set to something other than "background-job"');
179
+ }
180
+ if (job.queue == null) {
181
+ throw new UnrecoverableError("The queue must be set on every flow job class");
182
+ }
183
+ const node = {
184
+ name: job.name,
185
+ queueName: job.queue.name,
186
+ data: job.data,
187
+ opts: withDefaultJobOptions(getFlowJobOptions(options, index)),
188
+ };
189
+ if (index > 0)
190
+ node.children = [this.createNode(index - 1, data, flowId, options)];
191
+ return node;
192
+ }
193
+ }
194
+ export function getProcessorPath(from) {
195
+ const filename = fileURLToPath(from);
196
+ const dirname = path.dirname(filename);
197
+ const extension = extname(filename).slice(1) || process.env.PROCESSOR_EXTENSION || "js";
198
+ return path.resolve(dirname, `./processor.${extension}`);
199
+ }
200
+ function safeStringify(value) {
201
+ try {
202
+ return JSON.stringify(value) ?? String(value);
203
+ }
204
+ catch {
205
+ return String(value);
206
+ }
207
+ }
208
+ function normalizeFlowEnqueueOptions(options) {
209
+ if (options == null)
210
+ return {};
211
+ return isFlowEnqueueOptions(options)
212
+ ? { jobs: options.jobs, flowId: options.flowId }
213
+ : { jobs: options };
214
+ }
215
+ function getFlowJobOptions(options, index) {
216
+ return isJobsOptionsArray(options.jobs) ? options.jobs[index] : options.jobs;
217
+ }
218
+ function isFlowEnqueueOptions(options) {
219
+ return "jobs" in options || "flowId" in options;
220
+ }
221
+ function isJobsOptionsArray(jobs) {
222
+ return Array.isArray(jobs);
223
+ }
224
+ function createFlowWrappedJobData(flowId, step) {
225
+ return { [FLOW_DATA_MARKER]: { version: 1, flowId, step } };
226
+ }
227
+ async function resolveJobData(job) {
228
+ if (!isFlowWrappedJobData(job.data))
229
+ return job.data;
230
+ const resultValues = Object.values(await job.getChildrenValues());
231
+ if (resultValues.length !== 1) {
232
+ throw new UnrecoverableError(`Flow job ${job.name} expected exactly one completed child result, received ${resultValues.length}`);
233
+ }
234
+ return resultValues[0];
235
+ }
236
+ function isFlowWrappedJobData(data) {
237
+ return (typeof data === "object" &&
238
+ data != null &&
239
+ FLOW_DATA_MARKER in data &&
240
+ typeof data[FLOW_DATA_MARKER] === "object" &&
241
+ data[FLOW_DATA_MARKER] != null);
242
+ }
243
+ function withDefaultJobOptions(options) {
244
+ return {
245
+ ...options,
246
+ delay: options?.delay ?? 0,
247
+ keepLogs: 1000,
248
+ removeOnComplete: { age: THIRTY_DAYS_SECONDS },
249
+ removeOnFail: { age: THIRTY_DAYS_SECONDS },
250
+ };
251
+ }
252
+ function formatError(error) {
253
+ if (error instanceof Error) {
254
+ return safeStringify({ name: error.name, message: error.message, stack: error.stack });
255
+ }
256
+ return safeStringify(error);
257
+ }
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@saws/bullmq-service",
3
+ "version": "2.0.0-beta.11",
4
+ "description": "",
5
+ "license": "ISC",
6
+ "author": "",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/shichongrui/saws.git"
10
+ },
11
+ "files": [
12
+ "./dist"
13
+ ],
14
+ "type": "module",
15
+ "types": "./dist/index.d.ts",
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ }
21
+ },
22
+ "dependencies": {
23
+ "@saws/core": "2.0.0-beta.11",
24
+ "@saws/docker-service": "2.0.0-beta.11",
25
+ "@saws/redis-service": "2.0.0-beta.11",
26
+ "bullmq": "^5.69.0"
27
+ }
28
+ }