diff --git a/-la b/-la deleted file mode 100644 index 6eb63b7..0000000 --- a/-la +++ /dev/null @@ -1,9927 +0,0 @@ -diff --git a/960x.js b/960x.js -deleted file mode 120000 -index 1dcabf3..0000000 ---- a/960x.js -+++ /dev/null -@@ -1 +0,0 @@ --dist/scripts/960x.js -\ No newline at end of file -diff --git a/README.md b/README.md -index 1ef1871..d619ef7 100644 ---- a/README.md -+++ b/README.md -@@ -48,44 +48,36 @@ The core of this emulator is also exposed in order to be reused for more specifi - > **NOTE**: currently, there is no documentation available for core utils. Depending on how useful this emulator is for the community, I will consider adding extra documentation for that purpose.  -  - # Building the emulator --Before building this emulator you'll need to install `NodeJS` environment (which you probably have already installed) but in case you don't, you can simply do: -  --> **NOTE**: the following instructions assume you are working from Ubuntu. If you need specific instructions for your OS, search in Google how to install `Node JS v16.x`. -+**NOTE**: before building this emulator, ensure you have the Node JS environment installed (which you likely already have). In case it's not installed, you can [follow these instructions](https://github.com/nodesource/distributions#installation-instructions) for Debian-based systems. For other systems, please search on Google for instructions on how to install Node JS on your specific platform. -  -+If `node` and `npm` are accessible from your path, now you can install all required dependencies: - ``` bash --curl -sL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh -+npm install - ``` -  --If you don't feel comfortable with a direct "blind" install, please check the content: -+After install succeeds, build all application scripts with the following command: - ``` bash --nano nodesource_setup.sh -+npm run build - ``` -  --Finally install it: --``` bash --sudo bash nodesource_setup.sh --``` -- --If `node` and `npm` are accesible from your path, now you can build the entire project by going to the root of this repository and executing: --``` bash --npm i --``` --Thats all. Now, the symlinks named `gss.js` and `960x.js` should be pointing to a valid JavaScript file inside the `build/` directory. -+Thats all. Now, under the `exe/` directory all symlinks should be pointing to a valid JavaScript file inside the `build/` directory. -  - If you want to run those scripts simply tell `node` to execute them, like: - ``` bash --node gss.js -+node exe/gss.js - ``` -  - For more details, see [how to run the emulator](#running-the-emulator). -  - # Setting up the environment --Apart from the emulator itself, this repository also includes additional _CLI_ tools as you'll see in the following sections, so, instead of having to specify the full path of the different scripts or making additional installation steps, you can use the `isbd-env.sh` script located in the root of this repository to load all required environment variables and bash completions. Use the following command to load the Iridium SBD environment: -+Apart from the emulator itself, this repository also contains additional _CLI_ tools, as detailed in the following sections. Instead of specifying the full path for various scripts or undergoing additional installation steps, utilize the `isbd-env.sh` script found at the repository's root to load all necessary environment variables and bash completions. Execute the following command to load the Iridium SBD environment: -+ - ``` bash - source isbd-env.sh - ``` -  --> **NOTE**: if you want to avoid to load the environment each time you open a new terminal, you can use `.bashrc` file located in the home directory of your current user and automatically load the Iridium SBD environment. -+> **NOTE**: to avoid loading the environment each time you open a new terminal, you can utilize the `.bashrc` file located in the home directory of your current user. This allows for the automatic loading of the Iridium SBD environment. -  - Now you should be able to execute things like: - ``` bash -@@ -116,13 +108,14 @@ Usage: 960x [options] - A simple emulator for Iridium SBD 960X transceivers -  - Options: -- -V, --version output the version number -- -p, --path serial port path -- -i, --imei set ISU IMEI (default: "527695889002193") -- --gss-host GSS Socket host (default: "localhost") -- --gss-port GSS Socket port (default: 10801) -- --gss-uri GSS Socket URI -- -h, --help display help for command -+ -V, --version output the version number -+ -l, --log-level Set logging level: 1, 2, 3, 4 (default: 3) -+ -d, --device Serial port path -+ --imei Configure custom IMEI (default: "527695889002193") -+ --gss-host GSS Socket host (default: "localhost") -+ --gss-port GSS Socket port (default: 10802) -+ --gss-uri GSS Socket URI -+ -h, --help display help for command - ``` -  - To finally run the `960x.js` emulator you need to create a virtual serial port in order to communicate with it, you can use `socat` to achieve that: -@@ -133,7 +126,7 @@ socat -dd pty,link=/tmp/tty,raw,echo=0 pty,link=/tmp/960x,raw,echo=0 -  - Leave this executing in the foreground or in a different terminal. Now you can execute: - ``` bash --isbd 960x -vvv -p /tmp/960x -+isbd 960x -l4 -d /tmp/960x - ``` -  - You should see an output like: -@@ -203,7 +196,7 @@ Options: -  - If you want to setup _MO_ transport as _SMTP_ you'll have to specify (at least): `--mo-smtp-host` and `--mo-smtp-user` options: - ``` bash --isbd gss -vvv \ -+isbd gss -l4 \ - --mo-smtp-host smtp.domain.com \ - --mo-smtp-user your@email.com - ``` -@@ -213,7 +206,7 @@ isbd gss -vvv \ -  - If you want to use the _MO_ transport as _TCP_, you'll need a running instance of [Iridium Direct IP compatible server](https://github.com/lromeraj/isbd-server). The required option to enable _TCP_ transport is `--mo-tcp-host`, the port is `10801` by default. For example: - ``` bash --isbd gss -vvv \ -+isbd gss -l4 \ - --mo-tcp-host localhost \ - --mo-tcp-port 10801 - ``` -@@ -228,7 +221,7 @@ Currently you can achieve the same, but requires a few extra steps: -  - Now you can execute the Iridium GSS using Gmail's _SMTP_: - ``` bash --isbd gss -vvv \ -+isbd gss -l4 \ - --mo-smtp-host smtp.gmail.com \ - --mo-smtp-user example@gmail.com \ - --mo-smtp-password XXXXXXXXXXXXXXXX -diff --git a/ascii/gss.txt b/ascii/gss.txt -deleted file mode 100644 -index 4f002db..0000000 ---- a/ascii/gss.txt -+++ /dev/null -@@ -1,14 +0,0 @@ -- ^?57. -- ^P: :7Y55555~ -- ~#&5. ^7Y5555555~ -- !BBJ~^~7JY7. !55555555?. -- !: .^?B@@@@@5. :J55555^ ____ ____ ____ -- Y&&&&@@@@&P! ~Y7. /\ _`\ /\ _`\ /\ _`\ -- :B&&&&&&&&&&Y \ \ \L\_\ \,\L\_\ \,\L\_\ -- ^G&#BB#&&@@&&&BY. \ \ \L_L\/_\__ \\/_\__ \ -- :YY! ~YB##&&@@@@@@&^ \ \ \/, \/\ \L\ \/\ \L\ \ -- 75J?YY?. .^#&&&&@@#~ \ \____/\ `\____\ `\____\ -- :Y5Y???J55~ G&&&&577 . . \/___/ \/_____/\/_____/ --.75J?Y5YYJ!. .P#Y. ^JG. 5G --!5Y?JYJ~. :^..YP: -- .7Y!. 7YYY~ -\ No newline at end of file -diff --git a/decode.js b/decode.js -deleted file mode 120000 -index 4cd410d..0000000 ---- a/decode.js -+++ /dev/null -@@ -1 +0,0 @@ --dist/scripts/decoder.js -\ No newline at end of file -diff --git a/dist/scripts/960x.d.ts b/dist/scripts/960x.d.ts -deleted file mode 100644 -index cb0ff5c..0000000 ---- a/dist/scripts/960x.d.ts -+++ /dev/null -@@ -1 +0,0 @@ --export {}; -diff --git a/dist/scripts/960x.js b/dist/scripts/960x.js -deleted file mode 100644 -index bfeffa6..0000000 ---- a/dist/scripts/960x.js -+++ /dev/null -@@ -1,75 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --Object.defineProperty(exports, "__esModule", { value: true }); --const logger = __importStar(require("../src/logger")); --const commander_1 = require("commander"); --const _960x_1 = require("../src/isu/960x"); --commander_1.program -- .version('0.0.5') -- .description('A simple emulator for Iridium SBD 960X transceivers') -- .option('-v, --verbose', 'Verbosity level', (_, prev) => prev + 1, 1); --commander_1.program.addOption(// TODO: rename --new commander_1.Option('-p, --path ', 'serial port path') -- .makeOptionMandatory()); --commander_1.program.addOption(new commander_1.Option('-i, --imei ', 'set ISU IMEI') -- .default('527695889002193')); --commander_1.program.addOption(new commander_1.Option('--gss-host ', 'GSS Socket host') -- .default('localhost')); --commander_1.program.addOption(new commander_1.Option('--gss-port ', 'GSS Socket port') -- .default(10802).argParser(v => parseInt(v))); --commander_1.program.addOption(new commander_1.Option('--gss-uri ', 'GSS Socket URI') -- .conflicts(['gssPort', 'gssHost'])); --const log = logger.create('main'); --function main() { -- return __awaiter(this, void 0, void 0, function* () { -- commander_1.program.parse(); -- const opts = commander_1.program.opts(); -- logger.setLevel(opts.verbose); -- if (!/[0-9]{15}/.test(opts.imei)) { -- log.error(`Given IMEI is not valid`); -- process.exit(1); -- } -- const modem = new _960x_1.Modem({ -- gss: { -- port: opts.gssPort, -- host: opts.gssHost, -- }, -- dte: { -- path: opts.path, -- }, -- imei: opts.imei, -- }); -- }); --} --main(); -diff --git a/dist/scripts/decoder.d.ts b/dist/scripts/decoder.d.ts -deleted file mode 100644 -index 5b11bd5..0000000 ---- a/dist/scripts/decoder.d.ts -+++ /dev/null -@@ -1,2 +0,0 @@ --#!/usr/bin/node --export {}; -diff --git a/dist/scripts/decoder.js b/dist/scripts/decoder.js -deleted file mode 100644 -index ecbd67c..0000000 ---- a/dist/scripts/decoder.js -+++ /dev/null -@@ -1,91 +0,0 @@ --#!/usr/bin/node --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --const fs_extra_1 = __importDefault(require("fs-extra")); --const logger = __importStar(require("../src/logger")); --const commander_1 = require("commander"); --const decoder_1 = require("../src/gss/msg/decoder"); --const msg_1 = require("../src/gss/msg"); --const utils_1 = require("./utils"); --const log = logger.create('main'); --commander_1.program -- .version('0.0.3') -- .description('Message decoder for Iridium SBD'); --commander_1.program.addArgument(new commander_1.Argument('[file]', 'SBD message file path')); --commander_1.program.addOption(new commander_1.Option('--pretty', 'Output will be more human readable')); --function main() { -- return __awaiter(this, void 0, void 0, function* () { -- commander_1.program.parse(); -- const opts = commander_1.program.opts(); -- logger.setProgramName('decoder'); -- const [srcFilePath] = commander_1.program.args; -- if (!process.stdout.isTTY) { -- logger.disableTTY(); -- } -- let inputStream; -- if (srcFilePath) { -- inputStream = fs_extra_1.default.createReadStream(srcFilePath); -- } -- else { -- inputStream = process.stdin; -- } -- (0, utils_1.collectInputStream)(inputStream).then(buffer => { -- const decoders = [ -- decoder_1.decodeMoMessage, -- decoder_1.decodeMtMessage -- ]; -- let message = null; -- for (let decoder of decoders) { -- message = decoder(buffer); -- if (message) { -- process.stdout.write(msg_1.Message.toJSON(message, opts.pretty) + '\n'); -- break; -- } -- } -- if (message) { -- log.success('Message successfully decoded'); -- } -- else { -- log.error('Decode failed, invalid binary format'); -- } -- }).catch(err => { -- log.error(`Read error => ${err.message}`); -- }); -- }); --} --main(); -diff --git a/dist/scripts/encoder.d.ts b/dist/scripts/encoder.d.ts -deleted file mode 100644 -index 5b11bd5..0000000 ---- a/dist/scripts/encoder.d.ts -+++ /dev/null -@@ -1,2 +0,0 @@ --#!/usr/bin/node --export {}; -diff --git a/dist/scripts/encoder.js b/dist/scripts/encoder.js -deleted file mode 100644 -index fbe9c0e..0000000 ---- a/dist/scripts/encoder.js -+++ /dev/null -@@ -1,121 +0,0 @@ --#!/usr/bin/node --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --const fs_extra_1 = __importDefault(require("fs-extra")); --const colors_1 = __importDefault(require("colors")); --const logger = __importStar(require("../src/logger")); --const commander_1 = require("commander"); --const msg_1 = require("../src/gss/msg"); --const encoder_1 = require("../src/gss/msg/encoder"); --const utils_1 = require("./utils"); --const log = logger.create('main'); --commander_1.program -- .version('0.0.3') -- .description('Message encoder for Iridium SBD'); --commander_1.program.addArgument(new commander_1.Argument('[file]', 'JSON message file')); --function processMtMessage(mtMsg) { -- const encodedBuffer = (0, encoder_1.encodeMtMessage)(mtMsg); -- if (process.stdout.isTTY) { -- let outFileName = 'MT.sbd'; -- if (mtMsg.header) { -- outFileName = `MT_${mtMsg.header.imei}_${mtMsg.header.ucmid.toString('hex').toUpperCase()}.sbd`; -- } -- else if (mtMsg.confirmation) { -- outFileName = `MTC_${mtMsg.confirmation.imei}_${mtMsg.confirmation.autoid}.sbd`; -- } -- return fs_extra_1.default.writeFile(outFileName, encodedBuffer).then(() => { -- log.success(`MT message written to ${colors_1.default.green(outFileName)}`); -- }).catch(err => { -- log.error(`Could not write MT message ${colors_1.default.red(outFileName)} => ${err.message}`); -- }); -- } -- else { -- process.stdout.write(encodedBuffer); -- log.success(`MT message encoded`); -- } --} --function processMoMessage(moMsg) { -- const encodedBuffer = (0, encoder_1.encodeMoMsg)(moMsg); -- if (process.stdout.isTTY) { -- let outFileName = 'MO.sbd'; -- if (moMsg.header) { -- outFileName = `MO_${moMsg.header.imei}_${moMsg.header.momsn.toString().padStart(6, '0')}.sbd`; -- } -- return fs_extra_1.default.writeFile(outFileName, encodedBuffer).then(() => { -- log.success(`MO message written to ${colors_1.default.green(outFileName)}`); -- }).catch(err => { -- log.error(`Could not write MO message ${colors_1.default.red(outFileName)} => ${err.message}`); -- }); -- } -- else { -- process.stdout.write(encodedBuffer); -- log.success(`MO message encoded`); -- } --} --function main() { -- return __awaiter(this, void 0, void 0, function* () { -- commander_1.program.parse(); -- logger.setProgramName('encoder'); -- if (!process.stdout.isTTY) { -- logger.disableTTY(); -- } -- let inputStream; -- const [srcFilePath] = commander_1.program.args; -- if (srcFilePath) { -- inputStream = fs_extra_1.default.createReadStream(srcFilePath); -- } -- else { -- inputStream = process.stdin; -- } -- (0, utils_1.collectInputStream)(inputStream).then(jsonBuffer => { -- const msgObj = msg_1.Message.fromJSON(jsonBuffer.toString()); -- if (msg_1.Message.isMT(msgObj)) { -- processMtMessage(msgObj); -- } -- else if (msg_1.Message.isMO(msgObj)) { -- processMoMessage(msgObj); -- } -- else { -- log.error(`Invalid JSON, could not recognize message type`); -- } -- }).catch(err => { -- log.error(`Read error => ${err.message}`); -- }); -- }); --} --main(); -diff --git a/dist/scripts/gss.d.ts b/dist/scripts/gss.d.ts -deleted file mode 100644 -index cb0ff5c..0000000 ---- a/dist/scripts/gss.d.ts -+++ /dev/null -@@ -1 +0,0 @@ --export {}; -diff --git a/dist/scripts/gss.js b/dist/scripts/gss.js -deleted file mode 100644 -index 853aaa3..0000000 ---- a/dist/scripts/gss.js -+++ /dev/null -@@ -1,114 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --const colors_1 = __importDefault(require("colors")); --const logger = __importStar(require("../src/logger")); --const commander_1 = require("commander"); --const smtp_1 = require("../src/gss/transport/smtp"); --const tcp_1 = require("../src/gss/transport/tcp"); --const gss_1 = require("../src/gss"); --const log = logger.create('main'); --commander_1.program -- .version('0.0.2') -- .description('A simple emulator for Iridium GSS') -- .option('-v, --verbose', 'Verbosity level', (_, prev) => prev + 1, 1); --commander_1.program.addOption(new commander_1.Option('--mo-smtp-host ', 'MO SMTP transport host')); --commander_1.program.addOption(new commander_1.Option('--mo-smtp-port ', 'MO SMTP transport port') -- .default(25).argParser(v => parseInt(v))); --commander_1.program.addOption(new commander_1.Option('--mo-smtp-user ', 'MO SMTP transport username')); --commander_1.program.addOption(new commander_1.Option('--mo-smtp-password ', 'MO SMTP transport password')); --commander_1.program.addOption(new commander_1.Option('--mo-smtp-to ', 'MO SMTP transport destination address')); --commander_1.program.addOption(new commander_1.Option('--mo-tcp-host ', 'MO TCP transport host') -- .default('localhost')); --commander_1.program.addOption(new commander_1.Option('--mo-tcp-port ', 'MO TCP transport port') -- .default(10801).argParser(v => parseInt(v))); --commander_1.program.addOption(new commander_1.Option('--mt-server-port ', 'MT server port') -- .default(10800).argParser(v => parseInt(v))); --commander_1.program.addOption(new commander_1.Option('--mo-server-port ', 'MO server port') -- .default(10802).argParser(v => parseInt(v))); --function main() { -- return __awaiter(this, void 0, void 0, function* () { -- commander_1.program.parse(); -- const opts = commander_1.program.opts(); -- logger.setLevel(opts.verbose); -- const transports = []; -- let smtpTransport = undefined; -- if (opts.moSmtpUser && opts.moSmtpHost) { -- const smtpOpts = { -- host: opts.moSmtpHost, -- port: opts.moSmtpPort, -- user: opts.moSmtpUser, -- password: opts.moSmtpPassword, -- to: opts.moSmtpTo, -- }; -- smtpTransport = new smtp_1.SMTPTransport(smtpOpts); -- transports.push(smtpTransport); -- } -- let tcpTransport = undefined; -- if (opts.moTcpHost && opts.moTcpPort) { -- const tcpOpts = { -- host: opts.moTcpHost, -- port: opts.moTcpPort, -- }; -- tcpTransport = new tcp_1.TCPTransport(tcpOpts); -- transports.push(tcpTransport); -- } -- if (transports.length === 0) { -- log.warn(`No MO transports defined`); -- } -- else { -- if (tcpTransport) { -- log.info(`Using MO TCP transport ${colors_1.default.green(opts.moTcpHost)}:${colors_1.default.yellow(opts.moTcpPort)}`); -- } -- if (smtpTransport) { -- log.info(`Using MO SMTP transport ${colors_1.default.green(opts.moSmtpHost)}:${colors_1.default.yellow(opts.moSmtpPort)}`); -- } -- } -- const gss = new gss_1.GSS({ -- transports: transports, -- mtServer: { -- port: opts.mtServerPort, -- transport: tcpTransport, -- }, -- moServer: { -- port: opts.moServerPort -- }, -- }); -- // console.log( fs.readFileSync( path.join( __dirname, '../../ascii/gss.txt' ), 'ascii' ) ) -- }); --} --main(); -diff --git a/dist/scripts/transport.d.ts b/dist/scripts/transport.d.ts -deleted file mode 100644 -index 5b11bd5..0000000 ---- a/dist/scripts/transport.d.ts -+++ /dev/null -@@ -1,2 +0,0 @@ --#!/usr/bin/node --export {}; -diff --git a/dist/scripts/transport.js b/dist/scripts/transport.js -deleted file mode 100644 -index 042fdae..0000000 ---- a/dist/scripts/transport.js -+++ /dev/null -@@ -1,132 +0,0 @@ --#!/usr/bin/node --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --const fs_extra_1 = __importDefault(require("fs-extra")); --const colors_1 = __importDefault(require("colors")); --const logger = __importStar(require("../src/logger")); --const commander_1 = require("commander"); --const tcp_1 = require("../src/gss/transport/tcp"); --const decoder_1 = require("../src/gss/msg/decoder"); --const utils_1 = require("./utils"); --const log = logger.create('main'); --commander_1.program -- .version('0.0.2') -- .description('Iridium SBD message transporter'); --commander_1.program.addArgument(new commander_1.Argument('[file]', 'SBD binary message file')); --commander_1.program.addOption(new commander_1.Option('--tcp-host ', 'TCP transport host') -- .default('localhost')); --commander_1.program.addOption(new commander_1.Option('--tcp-port ', 'TCP transport port') -- .default(10800).argParser(v => parseInt(v))); --function writeMtConfirmation(mtConfirm, buffer) { -- if (process.stdout.isTTY) { -- const outFileName = `MTC_${mtConfirm.imei}_${mtConfirm.autoid}.sbd`; -- fs_extra_1.default.writeFile(outFileName, buffer).then(() => { -- log.success(`MT confirmation message written to ${colors_1.default.green(outFileName)}`); -- }).catch(err => { -- log.error(`Could not write MT confirmation message => ${err.message}`); -- }); -- } -- else { -- log.success(`MT confirmation received`); -- process.stdout.write(buffer); -- } --} --function processMtMessage(transport, mtReqBuff) { -- log.info(`Sending MT message ...`); -- return transport.sendBuffer(mtReqBuff, { -- waitResponse: true -- }).then(mtRespBuff => { -- const mtMsg = (0, decoder_1.decodeMtMessage)(mtRespBuff); -- if (mtMsg && mtMsg.confirmation) { -- writeMtConfirmation(mtMsg.confirmation, mtRespBuff); -- } -- else { -- log.error(`Could not decode MT confirmation message`); -- } -- }).catch(err => { -- log.error(`Could not send message => ${err.message}`); -- }); --} --function processMoMessage(transport, reqBuff) { -- log.info(`Sending MO message ...`); -- return transport.sendBuffer(reqBuff).then(() => { -- log.success(`MO message sent`); -- }).catch(err => { -- log.error(`Could not send MO message => ${err.message}`); -- }); --} --function main() { -- return __awaiter(this, void 0, void 0, function* () { -- commander_1.program.parse(); -- const programArgs = commander_1.program.args; -- const opts = commander_1.program.opts(); -- logger.setProgramName('transport'); -- if (!process.stdout.isTTY) { -- logger.disableTTY(); -- } -- let inputStream; -- const [srcFilePath] = programArgs; -- if (srcFilePath) { -- inputStream = fs_extra_1.default.createReadStream(srcFilePath); -- } -- else { -- inputStream = process.stdin; -- } -- (0, utils_1.collectInputStream)(inputStream).then(buffer => { -- const transport = new tcp_1.TCPTransport({ -- host: opts.tcpHost, -- port: opts.tcpPort, -- }); -- let decodedMsg = null; -- if ((decodedMsg = (0, decoder_1.decodeMtMessage)(buffer))) { -- // const mtMsg = decodedMsg as Message.MT; -- processMtMessage(transport, buffer); -- } -- else if ((decodedMsg = (0, decoder_1.decodeMoMessage)(buffer))) { -- // const moMsg = decodedMsg as Message.MO; -- processMoMessage(transport, buffer); -- } -- else { -- log.error(`Input message not recognized`); -- } -- }).catch(err => { -- log.error(`Read error => ${err.message}`); -- }); -- }); --} --main(); -diff --git a/dist/scripts/utils.d.ts b/dist/scripts/utils.d.ts -deleted file mode 100644 -index 75cbb3b..0000000 ---- a/dist/scripts/utils.d.ts -+++ /dev/null -@@ -1,4 +0,0 @@ --///  --///  --import { Readable } from "stream"; --export declare function collectInputStream(inputStream: Readable): Promise; -diff --git a/dist/scripts/utils.js b/dist/scripts/utils.js -deleted file mode 100644 -index b1d951c..0000000 ---- a/dist/scripts/utils.js -+++ /dev/null -@@ -1,18 +0,0 @@ --"use strict"; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.collectInputStream = void 0; --function collectInputStream(inputStream) { -- return new Promise((resolve, reject) => { -- const chunks = []; -- inputStream.on('error', err => { -- reject(err); -- }); -- inputStream.on('data', chunk => { -- chunks.push(chunk); -- }); -- inputStream.on('end', () => { -- resolve(Buffer.concat(chunks)); -- }); -- }); --} --exports.collectInputStream = collectInputStream; -diff --git a/dist/src/at/cmd.d.ts b/dist/src/at/cmd.d.ts -deleted file mode 100644 -index 08f2827..0000000 ---- a/dist/src/at/cmd.d.ts -+++ /dev/null -@@ -1,32 +0,0 @@ --import type { ATInterface } from "./interface"; --export declare class ATCmd { -- readonly name: string; -- private regExp; -- private context; -- private cmdHandlers; -- constructor(name: string, context: ContextType); -- /** -- * Fully qualified name -- */ -- get fqn(): string; -- private testHandler; -- test(at: ATInterface, cmdStr: string): undefined | Promise; -- onExec(handler: ATCmd.HandlerCallback): this; -- onExec(regExp: RegExp, handler: ATCmd.HandlerCallback): this; -- onRead(callback: ATCmd.HandlerCallback): this; -- onSet(regexp: RegExp, callback: ATCmd.HandlerCallback): this; -- onTest(callback: ATCmd.HandlerCallback): this; -- static wrapContext(name: string, callback: (cmd: ATCmd) => void): ATCmd.ContextWrapper; --} --export declare namespace ATCmd { -- enum Status { -- OK = 0, -- ERR = 1 -- } -- interface Handler { -- callback: HandlerCallback; -- regexp?: RegExp; -- } -- type HandlerCallback = (this: ContextType, at: ATInterface, match: string[]) => Promise; -- type ContextWrapper = (context: T) => ATCmd; --} -diff --git a/dist/src/at/cmd.js b/dist/src/at/cmd.js -deleted file mode 100644 -index b2d5977..0000000 ---- a/dist/src/at/cmd.js -+++ /dev/null -@@ -1,119 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.ATCmd = void 0; --const logger = __importStar(require("../logger")); --const log = logger.create('at-cmd'); --class ATCmd { -- constructor(name, context) { -- this.cmdHandlers = {}; -- this.name = name; -- this.context = context; -- this.regExp = new RegExp(`^(at${this.name.replace(/[/$&*+#]/g, '\\$&')})(\\=\\?|\\=|\\?)?(.*)\r$`, 'i'); -- } -- /** -- * Fully qualified name -- */ -- get fqn() { -- return 'AT' + this.name.toUpperCase(); -- } -- testHandler(handler, at, strParam) { -- if (handler) { -- if (!handler.regexp && strParam === '') { -- return handler.callback.apply(this.context, [at, []]); -- } -- else if (handler.regexp) { -- const paramMatch = strParam.match(handler.regexp); -- return paramMatch -- ? handler.callback.apply(this.context, [at, paramMatch]) -- : undefined; -- } -- } -- return undefined; -- } -- test(at, cmdStr) { -- const match = cmdStr.match(this.regExp); -- if (match) { -- const [_cmd, _name, type, strParam] = match; -- if (type === '?') { -- return this.testHandler(this.cmdHandlers.onRead, at, strParam); -- } -- else if (type === '=?') { -- return this.testHandler(this.cmdHandlers.onTest, at, strParam); -- } -- else if (type === '=') { -- return this.testHandler(this.cmdHandlers.onSet, at, strParam); -- } -- else if (type === undefined) { -- return this.testHandler(this.cmdHandlers.onExec, at, strParam); -- } -- } -- return undefined; -- } -- onExec(regExpOrCallback, callback) { -- if (regExpOrCallback instanceof RegExp -- && typeof callback === 'function') { -- this.cmdHandlers.onExec = { -- callback, -- regexp: regExpOrCallback, -- }; -- } -- else if (typeof regExpOrCallback === 'function') { -- this.cmdHandlers.onExec = { -- regexp: undefined, -- callback: regExpOrCallback, -- }; -- } -- return this; -- } -- onRead(callback) { -- this.cmdHandlers.onRead = { callback }; -- return this; -- } -- onSet(regexp, callback) { -- this.cmdHandlers.onSet = { regexp, callback }; -- return this; -- } -- onTest(callback) { -- this.cmdHandlers.onTest = { callback }; -- return this; -- } -- static wrapContext(name, callback) { -- return (ctx) => { -- const cmd = new ATCmd(name, ctx); -- callback(cmd); -- return cmd; -- }; -- } --} --exports.ATCmd = ATCmd; --(function (ATCmd) { -- let Status; -- (function (Status) { -- Status[Status["OK"] = 0] = "OK"; -- Status[Status["ERR"] = 1] = "ERR"; -- })(Status = ATCmd.Status || (ATCmd.Status = {})); -- ; --})(ATCmd = exports.ATCmd || (exports.ATCmd = {})); -diff --git a/dist/src/at/commands.d.ts b/dist/src/at/commands.d.ts -deleted file mode 100644 -index de091e3..0000000 ---- a/dist/src/at/commands.d.ts -+++ /dev/null -@@ -1,7 +0,0 @@ --import { ATCmd } from "./cmd"; --export declare const CMD_AT: ATCmd; --export declare const CMD_QUIET: ATCmd; --export declare const CMD_ECHO: ATCmd; --export declare const CMD_VERBOSE: ATCmd; --export declare const CMD_DTR: ATCmd; --export declare const CMD_FLOW_CONTROL: ATCmd; -diff --git a/dist/src/at/commands.js b/dist/src/at/commands.js -deleted file mode 100644 -index 083147b..0000000 ---- a/dist/src/at/commands.js -+++ /dev/null -@@ -1,37 +0,0 @@ --"use strict"; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.CMD_FLOW_CONTROL = exports.CMD_DTR = exports.CMD_VERBOSE = exports.CMD_ECHO = exports.CMD_QUIET = exports.CMD_AT = void 0; --const cmd_1 = require("./cmd"); --exports.CMD_AT = new cmd_1.ATCmd('', undefined) -- .onExec((at) => __awaiter(void 0, void 0, void 0, function* () { })); --exports.CMD_QUIET = new cmd_1.ATCmd('q', undefined) -- .onExec(/^[01]?$/, (at, match) => __awaiter(void 0, void 0, void 0, function* () { -- at.setQuiet(Boolean(parseInt(match[0] || '0'))); --})); --exports.CMD_ECHO = new cmd_1.ATCmd('e', undefined) -- .onExec(/^[01]?$/, (at, match) => __awaiter(void 0, void 0, void 0, function* () { -- at.setEcho(Boolean(parseInt(match[0] || '0'))); --})); --exports.CMD_VERBOSE = new cmd_1.ATCmd('v', undefined) -- .onExec(/^[01]?$/i, (at, match) => __awaiter(void 0, void 0, void 0, function* () { -- at.setVerbose(Boolean(parseInt(match[0] || '0'))); --})); --exports.CMD_DTR = new cmd_1.ATCmd('&d', undefined) -- .onExec(/^[0-3]?$/, (at, match) => __awaiter(void 0, void 0, void 0, function* () { -- const opt = parseInt(match[0] || '0'); -- // TODO: .... --})); --exports.CMD_FLOW_CONTROL = new cmd_1.ATCmd('&k', undefined) -- .onExec(/^[03]?$/, (at, match) => __awaiter(void 0, void 0, void 0, function* () { -- const opt = parseInt(match[0] || '0'); -- at.setFlowControl(opt === 3); --})); -diff --git a/dist/src/at/interface.d.ts b/dist/src/at/interface.d.ts -deleted file mode 100644 -index 136d09b..0000000 ---- a/dist/src/at/interface.d.ts -+++ /dev/null -@@ -1,45 +0,0 @@ --///  --import { SerialPort } from "serialport"; --import { ATCmd } from "./cmd"; --export declare class ATInterface { -- sp: SerialPort; -- private commands; -- private status; -- echo: boolean; -- quiet: boolean; -- verbose: boolean; -- private atCmdStr; -- private atCmdMask; -- private enqueuedLines; -- private requests; -- private requestBuffer; -- constructor(serialPortOpts: ATInterface.SerialPortOptions); -- private processingCmd; -- enqueueLine(str: string, id: string): void; -- private waitingCommand; -- private escapeLine; -- private processCommand; -- private writeEnqueuedLines; -- private getLineStart; -- private getLineEnd; -- setFlowControl(flowControl: boolean): void; -- setEcho(echo: boolean): void; -- setQuiet(quiet: boolean): void; -- setVerbose(verbose: boolean): void; -- readRawUntil(delimiter: ATInterface.Delimiter, timeout: number): Promise; -- writeRaw(buffer: Buffer): void; -- writeLine(line: string): void; -- writeLineStart(line: string): void; -- writeLineEnd(line: string): void; -- registerCommand(atCmd: ATCmd.ContextWrapper | ATCmd, context?: T): void; -- registerCommands(atCmds: ATCmd[]): void; -- registerCommands(atCmds: ATCmd.ContextWrapper[], context: T): void; -- private writeStatus; --} --export declare namespace ATInterface { -- interface SerialPortOptions { -- path: string | null; -- baudRate?: number; -- } -- type Delimiter = (currentByte: number, currentBuf: number[]) => boolean; --} -diff --git a/dist/src/at/interface.js b/dist/src/at/interface.js -deleted file mode 100644 -index 1e81bb2..0000000 ---- a/dist/src/at/interface.js -+++ /dev/null -@@ -1,247 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.ATInterface = void 0; --const logger = __importStar(require("../logger")); --const colors_1 = __importDefault(require("colors")); --const serialport_1 = require("serialport"); --const cmd_1 = require("./cmd"); --const commands_1 = require("./commands"); --var ATIStatus; --(function (ATIStatus) { -- ATIStatus[ATIStatus["WAITING"] = 0] = "WAITING"; -- ATIStatus[ATIStatus["PROCESSING"] = 1] = "PROCESSING"; --})(ATIStatus || (ATIStatus = {})); --; --const log = logger.create('at-interface'); --class ATInterface { -- constructor(serialPortOpts) { -- this.commands = []; -- this.status = ATIStatus.WAITING; -- this.echo = false; // TODO: expose echo -- this.quiet = false; // TODO: expose quiet -- this.verbose = true; // TODO: expose verbose -- this.atCmdStr = ''; -- this.atCmdMask = 'AT'; -- this.requests = []; -- this.requestBuffer = []; -- this.enqueuedLines = {}; -- this.sp = new serialport_1.SerialPort({ -- path: serialPortOpts.path || '/dev/null', -- baudRate: serialPortOpts.baudRate || 115200, -- autoOpen: typeof serialPortOpts.path === 'string', -- }, err => { -- if (err) { -- log.error(err.message); -- } -- else { -- log.success(`AT Interface ready`); -- } -- }); -- this.sp.on('data', (buffer) => { -- if (this.status === ATIStatus.WAITING) { -- // TODO: Considere this possibility -- // if ( this.requestBuffer.length > 0 ) { -- // this.requestBuffer = Buffer.from([]); -- // } -- this.waitingCommand(buffer); -- } -- else if (this.status === ATIStatus.PROCESSING) { -- this.processingCmd(buffer); -- } -- }); -- this.registerCommands([ -- commands_1.CMD_AT, -- commands_1.CMD_ECHO, -- commands_1.CMD_QUIET, -- commands_1.CMD_VERBOSE, -- commands_1.CMD_DTR, -- commands_1.CMD_FLOW_CONTROL, -- ]); -- } -- processingCmd(buffer) { -- buffer.forEach(byte => { -- this.requestBuffer.push(byte); -- const currentReq = this.requests[0]; -- if (currentReq) { -- if (currentReq.delimiter(byte, this.requestBuffer)) { -- currentReq.callback(Buffer.from(this.requestBuffer)); -- this.requestBuffer = []; -- this.requests.shift(); -- } -- } -- }); -- } -- enqueueLine(str, id) { -- if (this.status == ATIStatus.WAITING) { -- this.writeLine(str); -- } -- else { -- this.enqueuedLines[id] = str; -- } -- } -- waitingCommand(buffer) { -- buffer.forEach(byte => { -- let addByte = true; -- if (this.atCmdStr.length < this.atCmdMask.length) { -- const byteCode = String.fromCharCode(byte).toUpperCase(); -- const maskCode = this.atCmdMask.charAt(this.atCmdStr.length); -- if (byteCode !== maskCode) { -- addByte = false; -- } -- } -- if (addByte) { -- const char = String.fromCharCode(byte); -- this.atCmdStr += char; -- if (this.echo) { -- this.sp.write(char); -- } -- if (byte === 13) { -- this.processCommand(this.atCmdStr); -- this.atCmdStr = ''; -- } -- } -- }); -- } -- escapeLine(line) { -- return line -- .replace(/\r/g, '\\r') -- .replace(/\n/g, '\\n'); -- } -- processCommand(atCmdStr) { -- this.status = ATIStatus.PROCESSING; -- for (let cmd of this.commands) { -- const promise = cmd.test(this, atCmdStr); -- if (promise) { -- log.debug(`Processing command: [${colors_1.default.bold.cyan(cmd.fqn.toUpperCase())}] ${colors_1.default.blue(this.escapeLine(atCmdStr))}`); -- promise.then(str => { -- if (typeof str === 'number') { -- this.writeStatus(str); -- } -- else if (typeof str === 'string') { -- this.writeLine(str); -- } -- else { -- this.writeStatus(cmd_1.ATCmd.Status.OK); -- } -- }).catch(err => { -- // TODO: write AT error response ???? -- log.error(`Internal command error => ${err.stack}`); -- }).finally(() => { -- this.writeEnqueuedLines(); -- this.status = ATIStatus.WAITING; -- }); -- // TODO: we could run over other commands to check ambiguity -- return; -- } -- } -- log.error(`Unknown command: ${colors_1.default.red(this.escapeLine(atCmdStr))}`); -- this.status = ATIStatus.WAITING; -- this.writeStatus(cmd_1.ATCmd.Status.ERR); -- } -- writeEnqueuedLines() { -- for (let key in this.enqueuedLines) { -- this.writeLine(this.enqueuedLines[key]); -- } -- this.enqueuedLines = {}; -- } -- getLineStart() { -- return this.verbose ? '\r\n' : ''; -- } -- getLineEnd() { -- return this.verbose ? '\r\n' : '\r'; -- } -- setFlowControl(flowControl) { -- this.sp.settings.rtscts = flowControl; -- } -- setEcho(echo) { -- this.echo = echo; -- } -- setQuiet(quiet) { -- this.quiet = quiet; -- } -- setVerbose(verbose) { -- this.verbose = verbose; -- } -- readRawUntil(delimiter, timeout) { -- return new Promise((resolve, reject) => { -- const timer = setTimeout(() => { -- reject(new Error('Read timeout')); -- }, timeout); -- this.requests.push({ -- delimiter, -- callback: buffer => { -- clearTimeout(timer); -- resolve(buffer); -- } -- }); -- }); -- } -- writeRaw(buffer) { -- this.sp.write(buffer); -- this.sp.drain(); -- } -- writeLine(line) { -- log.debug(`Writing line: ${colors_1.default.blue(this.escapeLine(line))}`); -- this.writeRaw(Buffer.from(this.getLineStart() + line + this.getLineEnd())); -- } -- writeLineStart(line) { -- this.writeRaw(Buffer.from(this.getLineStart() + line)); -- } -- writeLineEnd(line) { -- this.writeRaw(Buffer.from(line + this.getLineEnd())); -- } -- registerCommand(atCmd, context) { -- if (typeof atCmd === 'function' && context) { -- this.commands.push(atCmd(context)); -- } -- else if (atCmd instanceof cmd_1.ATCmd) { -- this.commands.push(atCmd); -- } -- } -- registerCommands(atCmds, context) { -- atCmds.forEach(atCmd => { -- this.registerCommand(atCmd, context); -- }); -- } -- // TODO: accept string as parameter too ?? -- writeStatus(sts) { -- if (this.quiet) -- return; -- if (sts === cmd_1.ATCmd.Status.OK) { -- this.writeLine(this.verbose ? 'OK' : '0'); -- } -- else { -- this.writeLine(this.verbose ? 'ERROR' : '4'); -- } -- } --} --exports.ATInterface = ATInterface; --(function (ATInterface) { -- ; --})(ATInterface = exports.ATInterface || (exports.ATInterface = {})); -diff --git a/dist/src/gss/index.d.ts b/dist/src/gss/index.d.ts -deleted file mode 100644 -index 23d6389..0000000 ---- a/dist/src/gss/index.d.ts -+++ /dev/null -@@ -1,91 +0,0 @@ --///  --import { Transport } from "./transport"; --import { TCPTransport } from "./transport/tcp"; --import { Message } from "./msg"; --export declare class GSS { -- private autoId; -- private subscriberUnits; -- /** -- * This server is to allow emulated ISUs to communicate -- * with the GSS -- */ -- private isuServer; -- /** -- * This server is used to handle incoming MT message requests -- */ -- private mtServer; -- /** -- * This transports are used for every MO message sent by ISUs -- */ -- private transports; -- constructor(options: GSS.Options); -- private getAutoId; -- private mtMsgHandler; -- private sessionMsgWorker; -- private getISU; -- initSession(sessionReq: GSS.SessionRequest): Promise; -- static generateUnitLocation(): GSS.UnitLocation; --} --export declare namespace GSS { -- interface Options { -- mtServer: { -- port: number; -- transport?: TCPTransport; -- }; -- moServer: { -- port: number; -- }; -- transports: Transport[]; -- } -- interface SessionRequest { -- mo: Buffer; -- imei: string; -- momsn: number; -- alert: boolean; -- } -- interface SessionResponse { -- mosts: number; -- momsn: number; -- mtsts: number; -- mtmsn: number; -- mt: Buffer; -- mtq: number; -- } -- interface UnitLocation extends Message.MO.Location { -- } -- namespace Session { -- enum Status { -- /** -- * The SBD session between the ISU and the Iridium Gateway -- * completed successfully. -- */ -- TRANSFER_OK = 0, -- /** -- * The MT message queued at the Iridium Gateway is too large to be -- * transferred within a single SBD session -- */ -- MT_MSG_TOO_LARGE = 1, -- /** -- * The SBD Session timed out before session completion -- */ -- SBD_TIMEOUT = 10, -- /** -- * The MO message being transferred by the ISU is too large to be -- * transferred within a single SBD session -- */ -- MO_MSG_TOO_LARGE = 12, -- /** -- * A RF link loss occurred during the SBD session -- */ -- INCOMPLETE_TRANSFER = 13, -- /** -- * An ISU protocol anomaly occurred during the SBD session -- */ -- SBD_PROTOCOL_ERROR = 14, -- /** -- * The ISU is not allowed to access the system -- */ -- SBD_DENIAL = 15 -- } -- } --} -diff --git a/dist/src/gss/index.js b/dist/src/gss/index.js -deleted file mode 100644 -index 2b991a8..0000000 ---- a/dist/src/gss/index.js -+++ /dev/null -@@ -1,252 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.GSS = void 0; --const fastq = __importStar(require("fastq")); --const moment_1 = __importDefault(require("moment")); --const logger = __importStar(require("../logger")); --const colors_1 = __importDefault(require("colors")); --const isu_1 = require("./servers/isu"); --const mt_1 = require("./servers/mt"); --const msg_1 = require("./msg"); --const log = logger.create('gss'); --class GSS { -- constructor(options) { -- this.autoId = 0; -- this.subscriberUnits = {}; -- this.transports = options.transports; -- this.isuServer = new isu_1.ISUServer({ -- port: options.moServer.port, -- handlers: { -- initSession: this.initSession.bind(this) -- } -- }); -- this.mtServer = new mt_1.MTServer({ -- port: options.mtServer.port, -- handlers: { -- mtMsg: this.mtMsgHandler.bind(this), -- } -- }); -- } -- getAutoId() { -- return this.autoId++; -- } -- mtMsgHandler(msg) { -- return __awaiter(this, void 0, void 0, function* () { -- const flag = msg_1.Message.MT.Header.Flag; -- if (msg.header) { -- const isu = this.getISU(msg.header.imei); -- const confirmation = { -- autoid: this.getAutoId(), -- imei: msg.header.imei, -- ucmid: msg.header.ucmid, -- status: 0 -- }; -- msg.header.flags = msg.header.flags === undefined -- ? flag.NONE -- : msg.header.flags; -- const ringFlag = msg.header.flags & flag.SEND_RING_ALERT; -- const flushFlag = msg.header.flags & flag.FLUSH_MT_QUEUE; -- if (flushFlag) { -- isu.mtMessages = []; -- } -- if (msg.payload) { -- if (isu.mtMessages.length >= 50) { -- confirmation.status = -5; -- } -- else { -- isu.mtMessages.push(msg); -- confirmation.status = isu.mtMessages.length; -- // TODO: send a second ring alert -- this.isuServer.sendRingAlert(msg.header.imei); -- } -- } -- else { -- if (ringFlag) { -- this.isuServer.sendRingAlert(msg.header.imei); -- } -- else if (!flushFlag) { -- confirmation.status = -4; -- } -- } -- const confirmMsg = { -- confirmation, -- }; -- return confirmMsg; -- } -- else { -- const confirmMsg = { -- confirmation: { -- autoid: 0, -- imei: '000000000000000', -- ucmid: Buffer.from([ -- 0x00, 0x00, 0x00, 0x00 -- ]), -- status: -4 -- } -- }; -- return confirmMsg; -- } -- }); -- } -- // private increaseMTMSN( isu: SubscriberUnit ) { -- // isu.mtmsn = ( isu.mtmsn + 1 ) & 0xFFFF; -- // } -- sessionMsgWorker(msg) { -- return __awaiter(this, void 0, void 0, function* () { -- const promises = this.transports.map(transport => transport.sendSessionMessage(msg)); -- return Promise.allSettled(promises).then(results => { -- // If there is at least one transport that was able to transmit -- // the session message, there is no need to retry for every available -- // transports, this is the expected Iridium behavior -- const msgSent = results.some(res => res.status === 'fulfilled'); -- if (msgSent) { -- log.debug(`MO #${colors_1.default.green(msg.momsn.toString())} sent from ISU ${colors_1.default.bold(msg.imei)}`); -- return msg; -- } -- else { -- setTimeout(() => { -- this.subscriberUnits[msg.imei].sessionsQueue.push(msg); -- }, 30000); // TODO: this should be incremental -- log.error(`MO #${colors_1.default.red(msg.momsn.toString())} failed from ISU ${colors_1.default.bold(msg.imei)}`); -- return Promise.reject(); -- } -- }); -- }); -- } -- getISU(imei) { -- let isu = this.subscriberUnits[imei]; -- if (isu === undefined) { -- isu = this.subscriberUnits[imei] = { -- momsn: 0, -- mtmsn: 0, -- location: GSS.generateUnitLocation(), -- sessionsQueue: fastq.promise(this.sessionMsgWorker.bind(this), 1), -- mtMessages: [], -- }; -- } -- return isu; -- } -- initSession(sessionReq) { -- return __awaiter(this, void 0, void 0, function* () { -- const isu = this.getISU(sessionReq.imei); -- isu.momsn = sessionReq.momsn; // update isu momsn -- const sessionResp = { -- mosts: 0, -- momsn: isu.momsn, -- mtsts: 0, -- mtmsn: 0, -- mt: Buffer.from([]), -- mtq: 0, -- }; -- const mtMsg = isu.mtMessages.shift(); -- if (mtMsg === null || mtMsg === void 0 ? void 0 : mtMsg.payload) { -- sessionResp.mtsts = 1; -- sessionResp.mtmsn = isu.mtmsn; -- sessionResp.mt = mtMsg.payload.payload; -- sessionResp.mtq = isu.mtMessages.length; -- isu.mtmsn++; -- } -- const transportMsg = { -- time: (0, moment_1.default)(), -- imei: sessionReq.imei, -- momsn: sessionReq.momsn, -- mtmsn: isu.mtmsn, -- payload: sessionReq.mo, -- location: isu.location, -- status: GSS.Session.Status.TRANSFER_OK, -- }; -- isu.sessionsQueue.push(transportMsg); -- // TODO: handle more error codes -- sessionResp.mosts = 0; -- return sessionResp; -- }); -- } -- static generateUnitLocation() { -- return { -- lat: { -- deg: Math.floor(-90 + Math.random() * 180), -- min: Math.floor(Math.random() * 60000), -- }, -- lon: { -- deg: Math.floor(-90 + Math.random() * 180), -- min: Math.floor(Math.random() * 60000), -- }, -- cepRadius: 1 + Math.floor(Math.random() * 2000), -- }; -- } --} --exports.GSS = GSS; --(function (GSS) { -- let Session; -- (function (Session) { -- let Status; -- (function (Status) { -- /** -- * The SBD session between the ISU and the Iridium Gateway -- * completed successfully. -- */ -- Status[Status["TRANSFER_OK"] = 0] = "TRANSFER_OK"; -- /** -- * The MT message queued at the Iridium Gateway is too large to be -- * transferred within a single SBD session -- */ -- Status[Status["MT_MSG_TOO_LARGE"] = 1] = "MT_MSG_TOO_LARGE"; -- /** -- * The SBD Session timed out before session completion -- */ -- Status[Status["SBD_TIMEOUT"] = 10] = "SBD_TIMEOUT"; -- /** -- * The MO message being transferred by the ISU is too large to be -- * transferred within a single SBD session -- */ -- Status[Status["MO_MSG_TOO_LARGE"] = 12] = "MO_MSG_TOO_LARGE"; -- /** -- * A RF link loss occurred during the SBD session -- */ -- Status[Status["INCOMPLETE_TRANSFER"] = 13] = "INCOMPLETE_TRANSFER"; -- /** -- * An ISU protocol anomaly occurred during the SBD session -- */ -- Status[Status["SBD_PROTOCOL_ERROR"] = 14] = "SBD_PROTOCOL_ERROR"; -- /** -- * The ISU is not allowed to access the system -- */ -- Status[Status["SBD_DENIAL"] = 15] = "SBD_DENIAL"; -- })(Status = Session.Status || (Session.Status = {})); -- })(Session = GSS.Session || (GSS.Session = {})); --})(GSS = exports.GSS || (exports.GSS = {})); -diff --git a/dist/src/gss/msg/decoder.d.ts b/dist/src/gss/msg/decoder.d.ts -deleted file mode 100644 -index 82f81d0..0000000 ---- a/dist/src/gss/msg/decoder.d.ts -+++ /dev/null -@@ -1,13 +0,0 @@ --///  --import { Message } from "./index"; --export declare function decodeMsgHeader(msg: Message, buf: Buffer): number; --/** -- * Decodes Iridium SBD MO Message -- * -- * @param buf Message data buffer -- * -- * @returns Decoded mobile originated message, -- * in case of failure `null` is returned -- */ --export declare function decodeMoMessage(buf: Buffer): Message.MO | null; --export declare function decodeMtMessage(buf: Buffer): Message.MT | null; -diff --git a/dist/src/gss/msg/decoder.js b/dist/src/gss/msg/decoder.js -deleted file mode 100644 -index 777a7f1..0000000 ---- a/dist/src/gss/msg/decoder.js -+++ /dev/null -@@ -1,194 +0,0 @@ --"use strict"; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.decodeMtMessage = exports.decodeMoMessage = exports.decodeMsgHeader = void 0; --const moment_1 = __importDefault(require("moment")); --const index_1 = require("./index"); --function decodeMsgHeader(msg, buf) { -- const msgRev = buf.readUint8(0); -- const msgLength = buf.readUint16BE(1); -- const length = buf.length - index_1.MSG_H_LEN; -- if (msgRev === index_1.MSG_REV && msgLength === length) { -- msg.length = msgLength; -- msg.rev = msgRev; -- } -- else { -- throw new Error('Invalid message header'); -- } -- return index_1.MSG_H_LEN; --} --exports.decodeMsgHeader = decodeMsgHeader; --/** -- * -- * @param msg -- * @param data -- * @param offset -- * @returns The number of bytes read -- */ --function decodeMoHeader(msg, data, offset) { -- const header = { -- id: data.readUint8(offset), -- length: data.readUint16BE(offset + 1), -- cdr: data.readUint32BE(offset + 3), -- imei: data.subarray(offset + 7, offset + 22).toString('ascii'), -- status: data.readUint8(offset + 22), -- momsn: data.readUInt16BE(offset + 23), -- mtmsn: data.readUint16BE(offset + 25), -- time: moment_1.default.unix(data.readUint32BE(offset + 27)), -- }; -- msg.header = header; -- // IE header length + IE length -- return index_1.IE_H_LEN + header.length; --} --function decodeMoLocation(msg, data, offset) { -- const location = { -- id: data.readUint8(offset), -- length: data.readUInt16BE(offset + 1), -- lat: { -- deg: 0, -- min: 0, -- }, -- lon: { -- deg: 0, -- min: 0, -- }, -- latitude: 0, -- longitude: 0, -- cepRadius: data.readUint32BE(offset + 10), -- }; -- const header = data.readUint8(offset + 3); -- const latDeg = data.readUint8(offset + 4); -- const latThoMin = data.readUint16BE(offset + 5); -- const lonDeg = data.readUint8(offset + 7); -- const lonThoMin = data.readUint16BE(offset + 8); -- // north/south indicator -- const ewi = (header & 0x01) ? -1 : 1; -- // east/west indicator -- const nsi = ((header >> 1) & 0x01) ? -1 : 1; -- // this will be removed in a near future -- location.latitude = nsi * (latDeg + (latThoMin / 60000)); -- location.longitude = ewi * (lonDeg + (lonThoMin / 60000)); -- location.lat = { -- deg: nsi * latDeg, -- min: latThoMin, -- }; -- location.lon = { -- deg: ewi * lonDeg, -- min: lonThoMin, -- }; -- msg.location = location; -- return index_1.IE_H_LEN + location.length; --} --function decodeMoPayload(msg, data, offset) { -- const id = data.readUint8(offset); -- const length = data.readUInt16BE(offset + 1); -- const payload = { -- id, -- length, -- payload: data.subarray(offset + 3, offset + 3 + length), -- }; -- msg.payload = payload; -- return index_1.IE_H_LEN + length; --} --/** -- * Decodes Iridium SBD MO Message -- * -- * @param buf Message data buffer -- * -- * @returns Decoded mobile originated message, -- * in case of failure `null` is returned -- */ --function decodeMoMessage(buf) { -- const msg = {}; -- try { -- let offset = decodeMsgHeader(msg, buf); -- for (; offset < buf.length;) { -- if (buf[offset] === index_1.IE_MO_HEADER_ID) { -- offset += decodeMoHeader(msg, buf, offset); -- } -- else if (buf[offset] === index_1.IE_MO_PAYLOAD_ID) { -- offset += decodeMoPayload(msg, buf, offset); -- } -- else if (buf[offset] === index_1.IE_MO_LOCATION_ID) { -- offset += decodeMoLocation(msg, buf, offset); -- } -- else if (buf[offset] === index_1.IE_MO_CONFIRMATION_ID) { -- // TODO: ...  -- } -- else { -- return null; -- } -- } -- } -- catch (e) { -- return null; -- } -- return msg; --} --exports.decodeMoMessage = decodeMoMessage; --function decodeMtPayload(msg, buffer, offset) { -- const id = buffer.readUint8(offset); -- const length = buffer.readUint16BE(offset + 1); -- msg.payload = { -- id, -- length, -- payload: buffer.subarray(offset + 3, offset + 3 + length) -- }; -- // InformationElement + MT Payload -- // 3 (bytes) + N (bytes) = 3 + N bytes -- return index_1.IE_H_LEN + length; --} --function decodeMtHeader(msg, buffer, offset) { -- const header = { -- id: buffer.readUint8(offset), -- length: buffer.readUint16BE(offset + 1), -- ucmid: buffer.subarray(offset + 3, offset + 7), -- imei: buffer.subarray(offset + 7, offset + 22).toString('ascii'), -- flags: buffer.readUint16BE(offset + 22), -- }; -- msg.header = header; -- // InformationElement + MT Header -- // 3 (bytes) + 21 (bytes) = 24 bytes -- return index_1.IE_H_LEN + header.length; --} --function decodeMtConfirmation(msg, buffer, offset) { -- const confirmation = { -- id: buffer.readUint8(offset), -- length: buffer.readUint16BE(offset + 1), -- ucmid: buffer.subarray(offset + 3, offset + 7), -- imei: buffer.subarray(offset + 7, offset + 22).toString('ascii'), -- autoid: buffer.readUint32BE(offset + 22), -- status: buffer.readInt16BE(offset + 26), -- }; -- msg.confirmation = confirmation; -- // InformationElement + MT Header -- // 3 (bytes) + 21 (bytes) = 24 bytes -- return index_1.IE_H_LEN + confirmation.length; --} --function decodeMtMessage(buf) { -- const msg = {}; -- try { -- let offset = decodeMsgHeader(msg, buf); -- for (; offset < buf.length;) { -- if (buf[offset] === index_1.IE_MT_HEADER_ID) { -- offset += decodeMtHeader(msg, buf, offset); -- } -- else if (buf[offset] === index_1.IE_MT_PAYLOAD_ID) { -- offset += decodeMtPayload(msg, buf, offset); -- } -- else if (buf[offset] === index_1.IE_MT_CONFIRMATION_ID) { -- offset += decodeMtConfirmation(msg, buf, offset); -- } -- else { -- return null; -- } -- } -- } -- catch (e) { -- return null; -- } -- return msg; --} --exports.decodeMtMessage = decodeMtMessage; -diff --git a/dist/src/gss/msg/encoder.d.ts b/dist/src/gss/msg/encoder.d.ts -deleted file mode 100644 -index 0592321..0000000 ---- a/dist/src/gss/msg/encoder.d.ts -+++ /dev/null -@@ -1,4 +0,0 @@ --///  --import { Message } from "."; --export declare function encodeMoMsg(msg: Message.MO): Buffer; --export declare function encodeMtMessage(msg: Message.MT): Buffer; -diff --git a/dist/src/gss/msg/encoder.js b/dist/src/gss/msg/encoder.js -deleted file mode 100644 -index 7dd460c..0000000 ---- a/dist/src/gss/msg/encoder.js -+++ /dev/null -@@ -1,133 +0,0 @@ --"use strict"; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.encodeMtMessage = exports.encodeMoMsg = void 0; --const _1 = require("."); --function encodeMsg(payload) { -- let offset = 0; -- const msgHeaderBuf = Buffer.alloc(_1.MSG_H_LEN); -- const msgPayloadLength = payload.reduce((prev, cur) => prev + cur.length, 0); -- offset = msgHeaderBuf.writeUint8(_1.MSG_REV, offset); -- offset = msgHeaderBuf.writeUint16BE(msgPayloadLength, offset); -- return Buffer.concat([msgHeaderBuf, ...payload]); --} --function encodeMoHeader(msg) { -- const buffer = Buffer.alloc(_1.IE_H_LEN + _1.IE_MO_HEADER_LEN); -- let offset = 0; -- offset = buffer.writeUint8(_1.IE_MO_HEADER_ID, offset); -- offset = buffer.writeUint16BE(_1.IE_MO_HEADER_LEN, offset); -- offset = buffer.writeUint32BE(msg.cdr, offset); -- offset += buffer.write(msg.imei, offset, 15, 'ascii'); -- offset = buffer.writeUint8(msg.status, offset); -- offset = buffer.writeUint16BE(msg.momsn, offset); -- offset = buffer.writeUint16BE(msg.mtmsn, offset); -- offset = buffer.writeUint32BE(msg.time.unix(), offset); -- return buffer; --} --function encodeMoPayload(msg) { -- const buffer = Buffer.alloc(_1.IE_H_LEN + msg.payload.length); -- let offset = 0; -- offset = buffer.writeUInt8(_1.IE_MO_PAYLOAD_ID, offset); -- offset = buffer.writeUint16BE(msg.payload.length, offset); -- offset += msg.payload.copy(buffer, offset); -- return buffer; --} --function encodeMoLocation(msg) { -- const buffer = Buffer.alloc(_1.IE_H_LEN + _1.IE_MO_LOCATION_LEN); -- let nsi, // north south indicator  -- ewi; // east west indicator -- let latDeg, // latitude degrees -- lonDeg; // longitue degrees -- let latThoMin, // latitude thousand minutes -- lonThoMin; // longitude thousand minutes -- if (msg.latitude && msg.longitude) { -- nsi = Number(msg.latitude < 0) << 1; -- ewi = Number(msg.longitude < 0); -- latDeg = Math.abs(Math.trunc(msg.latitude)); -- lonDeg = Math.abs(Math.trunc(msg.longitude)); -- latThoMin = Math.abs(msg.latitude) % 1; -- lonThoMin = Math.abs(msg.longitude) % 1; -- latThoMin = Math.round(latThoMin * 60000); -- lonThoMin = Math.round(lonThoMin * 60000); -- } -- else { -- nsi = Number(msg.lat.deg < 0) << 1; -- ewi = Number(msg.lon.deg < 0); -- latDeg = Math.abs(msg.lat.deg); -- lonDeg = Math.abs(msg.lon.deg); -- latThoMin = msg.lat.min; -- lonThoMin = msg.lon.min; -- } -- let offset = 0; -- offset = buffer.writeUint8(_1.IE_MO_LOCATION_ID, offset); -- offset = buffer.writeUint16BE(_1.IE_MO_LOCATION_LEN, offset); -- offset = buffer.writeUint8(nsi | ewi, offset); -- offset = buffer.writeUint8(latDeg, offset); -- offset = buffer.writeUint16BE(latThoMin, offset); -- offset = buffer.writeUint8(lonDeg, offset); -- offset = buffer.writeUint16BE(lonThoMin, offset); -- offset = buffer.writeUint32BE(msg.cepRadius, offset); -- return buffer; --} --function encodeMoMsg(msg) { -- let payload = []; -- if (msg.header) { -- payload.push(encodeMoHeader(msg.header)); -- } -- if (msg.location) { -- payload.push(encodeMoLocation(msg.location)); -- } -- if (msg.payload) { -- payload.push(encodeMoPayload(msg.payload)); -- } -- if (msg.confirmation) { -- // TODO: ... -- } -- return encodeMsg(payload); --} --exports.encodeMoMsg = encodeMoMsg; --function encodeMtPayload(msg) { -- let offset = 0; -- const buffer = Buffer.alloc(_1.IE_H_LEN + msg.payload.length); -- offset = buffer.writeUint8(_1.IE_MT_PAYLOAD_ID, offset); -- offset = buffer.writeUint16BE(msg.payload.length, offset); -- offset += msg.payload.copy(buffer, offset); -- return buffer; --} --function encodeMtHeader(msg) { -- let offset = 0; -- const buffer = Buffer.alloc(_1.IE_H_LEN + _1.IE_MT_HEADER_LEN); -- if (msg.flags === undefined) { -- msg.flags = _1.Message.MT.Header.Flag.NONE; -- } -- offset = buffer.writeUint8(_1.IE_MT_HEADER_ID, offset); -- offset = buffer.writeUint16BE(_1.IE_MT_HEADER_LEN, offset); -- offset += msg.ucmid.copy(buffer, offset); -- offset += buffer.write(msg.imei, offset, 15, 'ascii'); -- offset = buffer.writeUint16BE(msg.flags, offset); -- return buffer; --} --function encodeMtConfirmation(msg) { -- let offset = 0; -- const buffer = Buffer.alloc(_1.IE_H_LEN + _1.IE_MT_CONFIRMATION_LEN); -- offset = buffer.writeUint8(_1.IE_MT_CONFIRMATION_ID, offset); -- offset = buffer.writeUint16BE(_1.IE_MT_CONFIRMATION_LEN, offset); -- offset += msg.ucmid.copy(buffer, offset); -- offset += buffer.write(msg.imei, offset, 15, 'ascii'); -- offset = buffer.writeUint32BE(msg.autoid, offset); -- offset = buffer.writeInt16BE(msg.status, offset); -- return buffer; --} --function encodeMtMessage(msg) { -- const msgChunks = []; -- if (msg.header) { -- msgChunks.push(encodeMtHeader(msg.header)); -- } -- if (msg.payload) { -- msgChunks.push(encodeMtPayload(msg.payload)); -- } -- if (msg.confirmation) { -- msgChunks.push(encodeMtConfirmation(msg.confirmation)); -- } -- return encodeMsg(msgChunks); --} --exports.encodeMtMessage = encodeMtMessage; -diff --git a/dist/src/gss/msg/index.d.ts b/dist/src/gss/msg/index.d.ts -deleted file mode 100644 -index 285486e..0000000 ---- a/dist/src/gss/msg/index.d.ts -+++ /dev/null -@@ -1,153 +0,0 @@ --///  --import { Moment } from "moment"; --export declare const MSG_REV = 1; --export declare const MSG_H_LEN = 3; --export declare const IE_H_LEN = 3; --export declare const IE_MO_HEADER_ID = 1; --export declare const IE_MO_HEADER_LEN = 28; --export declare const IE_MO_LOCATION_ID = 3; --export declare const IE_MO_LOCATION_LEN = 11; --export declare const IE_MO_CONFIRMATION_ID = 5; --export declare const IE_MO_CONFIRMATION_LEN = 1; --export declare const IE_MO_PAYLOAD_ID = 2; --export declare const IE_MT_HEADER_ID = 65; --export declare const IE_MT_HEADER_LEN = 21; --export declare const IE_MT_CONFIRMATION_ID = 68; --export declare const IE_MT_CONFIRMATION_LEN = 25; --export declare const IE_MT_PAYLOAD_ID = 66; --export declare const IE_MT_PRIORITY_ID = 70; --export interface Message { -- rev?: number; -- length?: number; --} --export declare namespace Message { -- interface IE { -- id?: number; -- length?: number; -- } -- export interface MO extends Message { -- header?: MO.Header; -- payload?: MO.Payload; -- location?: MO.Location; -- confirmation?: MO.Confirmation; -- } -- export namespace MO { -- interface Header extends IE { -- /** -- * Each call data record (CDR) maintained in the Iridium Gateway Database is given a unique value -- * independent of all other information in order to absolutely guarantee that each CDR is able to be -- * differentiated from all others. This reference number, also called the auto ID, is included should the need for -- * such differentiation and reference arise. -- */ -- cdr: number; -- /** -- * International Mobile Equipment Identity -- */ -- imei: string; -- /** -- * Message status -- */ -- status: number; -- /** -- * Mobile Originated Message Sequence Number -- */ -- momsn: number; -- /** -- * Mobile Terminated Message Sequence Number -- */ -- mtmsn: number; -- /** -- * Indicated the time when the message was processed (first arrived) -- * by the Iridium GSS -- */ -- time: Moment; -- } -- interface Payload extends IE { -- payload: Buffer; -- } -- interface Location extends IE { -- /** -- * @deprecated Use `lon` instead -- */ -- longitude?: number; -- /** -- * @deprecated Use `lat` instead -- */ -- latitude?: number; -- lat: { -- deg: number; -- min: number; -- }; -- lon: { -- deg: number; -- min: number; -- }; -- cepRadius: number; -- } -- interface Confirmation extends IE { -- status: number; -- } -- } -- export interface MT extends Message { -- header?: MT.Header; -- payload?: MT.Payload; -- confirmation?: MT.Confirmation; -- } -- export namespace MT { -- interface Header extends IE { -- /** -- * Unique Client Message ID -- */ -- ucmid: Buffer; -- /** -- * International Mobile Equipment Identity -- */ -- imei: string; -- flags?: number; -- } -- namespace Header { -- enum Flag { -- NONE = 0, -- FLUSH_MT_QUEUE = 1, -- SEND_RING_ALERT = 2 -- } -- } -- interface Payload extends IE { -- payload: Buffer; -- } -- interface Confirmation extends IE { -- /** -- * Unique Client Message ID -- */ -- ucmid: Buffer; -- /** -- * International Mobile Equipment Identity -- */ -- imei: string; -- autoid: number; -- status: number; -- } -- } -- /** -- * Converts the given mobile orginated message location -- * into a decimal degreee coordinate representation -- * -- * @param location -- * @returns Decimal degree coordiante representation -- */ -- export function getDDLocation(location: Message.MO.Location): { -- latitude: number; -- longitude: number; -- }; -- export function isMO(object: { -- [key: string]: any; -- }): boolean; -- export function isMT(object: { -- [key: string]: any; -- }): boolean; -- export function toJSON(object: { -- [key: string]: any; -- }, pretty?: boolean): string; -- export function fromJSON(jsonStr: string): any; -- export {}; --} -diff --git a/dist/src/gss/msg/index.js b/dist/src/gss/msg/index.js -deleted file mode 100644 -index edc2c29..0000000 ---- a/dist/src/gss/msg/index.js -+++ /dev/null -@@ -1,129 +0,0 @@ --"use strict"; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.Message = exports.IE_MT_PRIORITY_ID = exports.IE_MT_PAYLOAD_ID = exports.IE_MT_CONFIRMATION_LEN = exports.IE_MT_CONFIRMATION_ID = exports.IE_MT_HEADER_LEN = exports.IE_MT_HEADER_ID = exports.IE_MO_PAYLOAD_ID = exports.IE_MO_CONFIRMATION_LEN = exports.IE_MO_CONFIRMATION_ID = exports.IE_MO_LOCATION_LEN = exports.IE_MO_LOCATION_ID = exports.IE_MO_HEADER_LEN = exports.IE_MO_HEADER_ID = exports.IE_H_LEN = exports.MSG_H_LEN = exports.MSG_REV = void 0; --const moment_1 = __importDefault(require("moment")); --exports.MSG_REV = 0x01; --exports.MSG_H_LEN = 3; --exports.IE_H_LEN = 3; --exports.IE_MO_HEADER_ID = 0x01; --exports.IE_MO_HEADER_LEN = 28; --exports.IE_MO_LOCATION_ID = 0x03; --exports.IE_MO_LOCATION_LEN = 11; --exports.IE_MO_CONFIRMATION_ID = 0x05; --exports.IE_MO_CONFIRMATION_LEN = 1; --exports.IE_MO_PAYLOAD_ID = 0x02; --exports.IE_MT_HEADER_ID = 0x41; --exports.IE_MT_HEADER_LEN = 21; --exports.IE_MT_CONFIRMATION_ID = 0x44; --exports.IE_MT_CONFIRMATION_LEN = 25; --exports.IE_MT_PAYLOAD_ID = 0x42; --exports.IE_MT_PRIORITY_ID = 0x46; --var Message; --(function (Message) { -- let MT; -- (function (MT) { -- let Header; -- (function (Header) { -- let Flag; -- (function (Flag) { -- Flag[Flag["NONE"] = 0] = "NONE"; -- Flag[Flag["FLUSH_MT_QUEUE"] = 1] = "FLUSH_MT_QUEUE"; -- Flag[Flag["SEND_RING_ALERT"] = 2] = "SEND_RING_ALERT"; -- })(Flag = Header.Flag || (Header.Flag = {})); -- })(Header = MT.Header || (MT.Header = {})); -- })(MT = Message.MT || (Message.MT = {})); -- /** -- * Converts the given mobile orginated message location -- * into a decimal degreee coordinate representation -- * -- * @param location -- * @returns Decimal degree coordiante representation -- */ -- function getDDLocation(location) { -- const latitude = location.lat.deg -- + Math.sign(location.lat.deg) * (location.lat.min / 60000); -- const longitude = location.lon.deg -- + Math.sign(location.lon.deg) * (location.lon.min / 60000); -- return { -- latitude, -- longitude, -- }; -- } -- Message.getDDLocation = getDDLocation; -- function isMO(object) { -- if (object.header) { -- if (object.header.cdr !== undefined) { -- return true; -- } -- } -- return false; -- } -- Message.isMO = isMO; -- function isMT(object) { -- if (object.header) { -- if (object.header.ucmid !== undefined) { -- return true; -- } -- } -- else if (object.confirmation) { -- if (object.confirmation.ucmid !== undefined -- && object.confirmation.autoid !== undefined) { -- return true; -- } -- } -- return false; -- } -- Message.isMT = isMT; -- function toJSONObject(object) { -- for (let key in object) { -- const val = object[key]; -- if (val instanceof Buffer) { -- object[key] = [...val]; -- } -- else if (typeof val === 'string' && key === 'payload') { -- object[key] = [...Buffer.from(val)]; -- } -- else if (moment_1.default.isMoment(val)) { -- object[key] = val.unix(); -- } -- else if (typeof val === 'object') { -- toJSONObject(val); -- } -- } -- } -- function toJSON(object, pretty = false) { -- const objCopy = Object.assign({}, object); -- toJSONObject(objCopy); -- if (pretty) { -- return JSON.stringify(objCopy, null, '\t'); -- } -- else { -- return JSON.stringify(objCopy); -- } -- } -- Message.toJSON = toJSON; -- function fromJSONObject(object) { -- for (let key in object) { -- const val = object[key]; -- if (val instanceof Array -- || (typeof val === 'string' && key === 'payload')) { -- object[key] = Buffer.from(val); -- } -- else if (typeof val === 'number' && key === 'time') { -- object[key] = moment_1.default.unix(val); -- } -- else if (typeof val === 'object') { -- fromJSONObject(val); -- } -- } -- } -- function fromJSON(jsonStr) { -- const obj = JSON.parse(jsonStr); -- fromJSONObject(obj); -- return obj; -- } -- Message.fromJSON = fromJSON; --})(Message = exports.Message || (exports.Message = {})); -diff --git a/dist/src/gss/servers/isu/index.d.ts b/dist/src/gss/servers/isu/index.d.ts -deleted file mode 100644 -index 0c94920..0000000 ---- a/dist/src/gss/servers/isu/index.d.ts -+++ /dev/null -@@ -1,21 +0,0 @@ --///  --import EventEmitter from "events"; --import { GSS } from "../.."; --export declare class ISUServer extends EventEmitter { -- private httpServer; -- private socketServer; -- private sockets; -- private handlers; -- constructor(options: MOServer.Options); -- sendRingAlert(imei: string): void; --} --export declare namespace MOServer { -- interface Handlers { -- initSession: InitSessionHandler; -- } -- interface Options { -- port: number; -- handlers: Handlers; -- } -- type InitSessionHandler = (req: GSS.SessionRequest) => Promise; --} -diff --git a/dist/src/gss/servers/isu/index.js b/dist/src/gss/servers/isu/index.js -deleted file mode 100644 -index 64d5aa8..0000000 ---- a/dist/src/gss/servers/isu/index.js -+++ /dev/null -@@ -1,88 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.ISUServer = void 0; --const http_1 = __importDefault(require("http")); --const socket_io_1 = __importDefault(require("socket.io")); --const colors_1 = __importDefault(require("colors")); --const events_1 = __importDefault(require("events")); --const logger = __importStar(require("../../../logger")); --const log = logger.create('isu-server'); --// https://stackoverflow.com/a/39145058 --// export declare interface SUServer { --// on( --// event: 'initSession',  --// listener: ( --// req: GSS.SessionRequest,  --// callback: ( res: GSS.SessionResponse ) => void  --// ) => void  --// ): this; --// } --class ISUServer extends events_1.default { -- constructor(options) { -- super(); -- this.sockets = {}; -- this.handlers = { -- initSession: () => Promise.reject(new Error('Not implemented')) -- }; -- Object.assign(this.handlers, options.handlers); -- this.httpServer = http_1.default.createServer(); -- this.socketServer = new socket_io_1.default.Server(this.httpServer); -- this.httpServer.listen(options.port, () => { -- log.success(`ISU server ready, port: ${colors_1.default.yellow(options.port.toString())}`); -- }); -- this.socketServer.on('connect', socket => { -- const imei = socket.handshake.query.imei; -- if (typeof imei === 'string') { -- this.sockets[imei] = socket; -- socket.on('initSession', (sessionReq, callback) => { -- this.handlers.initSession(sessionReq).then(callback) -- .catch(err => { -- log.error(`Init session failed => ${err.stack}`); -- }); -- }); -- socket.on('disconnect', () => { -- delete this.sockets[imei]; -- log.debug(`ISU ${colors_1.default.bold(imei)} disconnected`); -- }); -- log.debug(`ISU ${colors_1.default.bold(imei)} connected`); -- } -- else { -- socket.disconnect(); -- } -- }); -- } -- sendRingAlert(imei) { -- const socket = this.sockets[imei]; -- log.debug(`Sending ring alert to ${imei}`); -- if (socket) { -- socket.emit('ring'); -- } -- } --} --exports.ISUServer = ISUServer; -diff --git a/dist/src/gss/servers/mt/index.d.ts b/dist/src/gss/servers/mt/index.d.ts -deleted file mode 100644 -index 2f0548e..0000000 ---- a/dist/src/gss/servers/mt/index.d.ts -+++ /dev/null -@@ -1,21 +0,0 @@ --///  --import { EventEmitter } from "events"; --import { Message } from "../../msg"; --export declare class MTServer extends EventEmitter { -- private tcpServer; -- private handlers; -- private mtMsgQueue; -- constructor(options: MTServer.Options); -- private mtMsgWorker; -- private socketHandler; --} --export declare namespace MTServer { -- interface Handlers { -- mtMsg: Handler; -- } -- type Handler = (msg: Message.MT) => Promise; -- interface Options { -- port: number; -- handlers?: Handlers; -- } --} -diff --git a/dist/src/gss/servers/mt/index.js b/dist/src/gss/servers/mt/index.js -deleted file mode 100644 -index 2cf9e19..0000000 ---- a/dist/src/gss/servers/mt/index.js -+++ /dev/null -@@ -1,130 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.MTServer = void 0; --const net_1 = __importDefault(require("net")); --const colors_1 = __importDefault(require("colors")); --const events_1 = require("events"); --const logger = __importStar(require("../../../logger")); --const fastq_1 = __importDefault(require("fastq")); --const decoder_1 = require("../../msg/decoder"); --const encoder_1 = require("../../msg/encoder"); --const log = logger.create('mt-server'); --class MTServer extends events_1.EventEmitter { -- constructor(options) { -- super(); -- this.handlers = { -- mtMsg: () => Promise.reject(new Error('Not implemented')) -- }; -- Object.assign(this.handlers, options.handlers); -- this.mtMsgQueue = fastq_1.default.promise(this.mtMsgWorker.bind(this), 1); -- this.tcpServer = net_1.default.createServer(); -- this.tcpServer.listen(options.port, () => { -- log.success(`MT server ready, port: ${colors_1.default.yellow(options.port.toString())}`); -- }); -- this.tcpServer.on('connection', this.socketHandler.bind(this)); -- } -- mtMsgWorker(buffers) { -- return __awaiter(this, void 0, void 0, function* () { -- const buffer = Buffer.concat(buffers); -- log.debug(`Decoding incoming MT message size=${colors_1.default.yellow(buffer.length.toString())}`); -- const mtMsg = (0, decoder_1.decodeMtMessage)(buffer); -- if (mtMsg) { -- return this.handlers.mtMsg(mtMsg); -- } -- else { -- throw new Error(`Could not decode MT message`); -- } -- }); -- } -- socketHandler(socket) { -- return __awaiter(this, void 0, void 0, function* () { -- const MAX_MSG_LEN = 1024; // maximum message length -- const SOCKET_TIMEOUT = 8000; // milliseconds -- const PROTO_HEADER_LEN = 3; // protocol header length -- let bytesRead = 0; -- let bytesToRead = MAX_MSG_LEN; // this works as a maximum limit too -- let buffersRead = []; -- let headerBuffer = null; -- socket.setTimeout(SOCKET_TIMEOUT); -- socket.on('timeout', () => { -- socket.destroy(); -- }); -- socket.on('data', buffer => { -- buffersRead.push(buffer); -- bytesRead += buffer.length; -- if (headerBuffer === null -- && bytesRead >= PROTO_HEADER_LEN) { -- headerBuffer = buffersRead.length > 1 -- ? Buffer.concat(buffersRead) -- : buffersRead[0]; -- buffersRead = [headerBuffer]; -- const protoRev = headerBuffer.readUint8(0); -- const msgLen = headerBuffer.readUint16BE(1); -- if (protoRev === 0x01 && msgLen <= MAX_MSG_LEN) { -- // PROTO HEADER LENGTH + MSG LEN -- // 3 bytes N bytes = 3 + N -- bytesToRead = PROTO_HEADER_LEN + msgLen; -- } -- else { -- socket.destroy(); -- return; -- } -- } -- const sendConfirmation = (mtConfirm) => { -- socket.write((0, encoder_1.encodeMtMessage)(mtConfirm), err => { -- socket.end(); -- }); -- }; -- if (bytesRead === bytesToRead) { -- this.mtMsgQueue.push(buffersRead).then(sendConfirmation) -- .catch(err => { -- socket.destroy(); -- log.error(`Error processing MT message => ${err.message}`); -- }); -- } -- else if (bytesRead > bytesToRead) { -- socket.destroy(); -- } -- }); -- }); -- } --} --exports.MTServer = MTServer; --(function (MTServer) { -- ; --})(MTServer = exports.MTServer || (exports.MTServer = {})); -diff --git a/dist/src/gss/transport/file.d.ts b/dist/src/gss/transport/file.d.ts -deleted file mode 100644 -index c35761f..0000000 ---- a/dist/src/gss/transport/file.d.ts -+++ /dev/null -@@ -1,14 +0,0 @@ --///  --import { Transport } from "."; --export declare class FileTransport extends Transport { -- private options; -- private readonly READ_TIMEOUT; -- constructor(options: FileTransport.Options); -- sendBuffer(buffer: Buffer): Promise; -- sendSessionMessage(msg: Transport.SessionMessage): Promise; --} --export declare namespace FileTransport { -- interface Options { -- path: string; -- } --} -diff --git a/dist/src/gss/transport/file.js b/dist/src/gss/transport/file.js -deleted file mode 100644 -index 2d62fbd..0000000 ---- a/dist/src/gss/transport/file.js -+++ /dev/null -@@ -1,38 +0,0 @@ --"use strict"; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.FileTransport = void 0; --const fs_extra_1 = __importDefault(require("fs-extra")); --const _1 = require("."); --class FileTransport extends _1.Transport { -- constructor(options) { -- super(); -- this.READ_TIMEOUT = 5000; -- this.options = options; -- } -- sendBuffer(buffer) { -- return __awaiter(this, void 0, void 0, function* () { -- // const writeStream = fs.createWriteStream( this.options.path ); -- return fs_extra_1.default.writeFile(this.options.path, buffer).then(() => { -- return Buffer.from([]); -- }); -- }); -- } -- sendSessionMessage(msg) { -- return __awaiter(this, void 0, void 0, function* () { -- return msg; -- }); -- } --} --exports.FileTransport = FileTransport; -diff --git a/dist/src/gss/transport/index.d.ts b/dist/src/gss/transport/index.d.ts -deleted file mode 100644 -index 53f62b4..0000000 ---- a/dist/src/gss/transport/index.d.ts -+++ /dev/null -@@ -1,18 +0,0 @@ --///  --import { Moment } from "moment"; --import type { GSS } from "../index"; --export declare abstract class Transport { -- abstract sendSessionMessage(msg: Transport.SessionMessage): Promise; -- abstract sendBuffer(buffer: Buffer): Promise; --} --export declare namespace Transport { -- interface SessionMessage { -- imei: string; -- momsn: number; -- mtmsn: number; -- payload: Buffer; -- time: Moment; -- status: GSS.Session.Status; -- location: GSS.UnitLocation; -- } --} -diff --git a/dist/src/gss/transport/index.js b/dist/src/gss/transport/index.js -deleted file mode 100644 -index 8b298a5..0000000 ---- a/dist/src/gss/transport/index.js -+++ /dev/null -@@ -1,7 +0,0 @@ --"use strict"; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.Transport = void 0; --class Transport { --} --exports.Transport = Transport; --// TODO: create FILE transport -diff --git a/dist/src/gss/transport/smtp.d.ts b/dist/src/gss/transport/smtp.d.ts -deleted file mode 100644 -index addb3fd..0000000 ---- a/dist/src/gss/transport/smtp.d.ts -+++ /dev/null -@@ -1,22 +0,0 @@ --///  --import { Transport } from "."; --export declare class SMTPTransport extends Transport { -- private transporter; -- private readonly options; -- constructor(options: SMTPTransport.Options); -- sendBuffer(buffer: Buffer): Promise; -- private getStatusFromMsg; -- private getTextFromMsg; -- private getSubjectFromMsg; -- private getFilenameFromMsg; -- sendSessionMessage(msg: Transport.SessionMessage): Promise; --} --export declare namespace SMTPTransport { -- interface Options { -- host: string; -- port: number; -- user: string; -- password?: string; -- to?: string; -- } --} -diff --git a/dist/src/gss/transport/smtp.js b/dist/src/gss/transport/smtp.js -deleted file mode 100644 -index 9f6ca87..0000000 ---- a/dist/src/gss/transport/smtp.js -+++ /dev/null -@@ -1,71 +0,0 @@ --"use strict"; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.SMTPTransport = void 0; --const nodemailer_1 = __importDefault(require("nodemailer")); --const _1 = require("."); --const index_1 = require("../index"); --const msg_1 = require("../msg"); --class SMTPTransport extends _1.Transport { -- constructor(options) { -- super(); -- this.options = options; -- this.transporter = nodemailer_1.default.createTransport({ -- host: options.host, -- port: options.port, -- auth: { -- user: options.user, -- pass: options.password || '', -- } -- }); -- } -- sendBuffer(buffer) { -- return Promise.resolve(Buffer.from([])); -- } -- getStatusFromMsg(msg) { -- const stsText = { -- [index_1.GSS.Session.Status.TRANSFER_OK]: 'Transfer OK', -- [index_1.GSS.Session.Status.MT_MSG_TOO_LARGE]: 'MT Message Too Large', -- [index_1.GSS.Session.Status.SBD_TIMEOUT]: 'SBD Timeout', -- [index_1.GSS.Session.Status.MO_MSG_TOO_LARGE]: 'MO Message Too Large', -- [index_1.GSS.Session.Status.INCOMPLETE_TRANSFER]: 'Incomplete Transfer', -- [index_1.GSS.Session.Status.SBD_PROTOCOL_ERROR]: 'SBD Protocol Error', -- [index_1.GSS.Session.Status.SBD_DENIAL]: 'SBD Denial', -- }; -- return `${String(msg.status).padStart(2, '0')} - ${stsText[msg.status]}`; -- } -- getTextFromMsg(msg) { -- const decDeglocation = msg_1.Message.getDDLocation(msg.location); -- return `MOMSN: ${msg.momsn}\n` -- + `MTMSN: ${msg.mtmsn}\n` -- + `Time of Session (UTC): ${msg.time.utc().format('ddd MMM D HH:mm:ss YYYY')}\n` -- + `${this.getStatusFromMsg(msg)}\n` -- + `Message Size (bytes): ${msg.payload.length}\n\n` -- + `Unit Location: Lat = ${decDeglocation.latitude.toFixed(5)} Long = ${decDeglocation.longitude.toFixed(5)}\n` -- + `CEPRadius = ${msg.location.cepRadius.toFixed(0)}`; -- } -- getSubjectFromMsg(msg) { -- return `SBD Msg From Unit: ${msg.imei}`; -- } -- getFilenameFromMsg(msg) { -- return `${msg.imei}_${String(msg.momsn).padStart(6, '0')}.sbd`; -- } -- sendSessionMessage(msg) { -- const mailOpts = { -- text: this.getTextFromMsg(msg), -- to: this.options.to || this.options.user, -- subject: this.getSubjectFromMsg(msg), -- }; -- if (msg.payload.length > 0) { -- mailOpts.attachments = [{ -- filename: this.getFilenameFromMsg(msg), -- content: msg.payload -- }]; -- } -- return this.transporter.sendMail(mailOpts) -- .then(() => msg); -- } --} --exports.SMTPTransport = SMTPTransport; -diff --git a/dist/src/gss/transport/tcp.d.ts b/dist/src/gss/transport/tcp.d.ts -deleted file mode 100644 -index 4d67dd3..0000000 ---- a/dist/src/gss/transport/tcp.d.ts -+++ /dev/null -@@ -1,21 +0,0 @@ --///  --import { Transport } from "."; --export declare class TCPTransport extends Transport { -- private options; -- private readonly SOCKET_TIMEOUT; -- constructor(options: TCPTransport.Options); -- sendBuffer(buffer: Buffer, _opts?: { -- waitResponse: boolean; -- }): Promise; -- sendMessage(msg: T, encoder: (msg: T) => Buffer, _opts?: { -- waitResponse: boolean; -- }): Promise; -- sendSessionMessage(sessionMsg: Transport.SessionMessage): Promise; -- private encodeSessionMessage; --} --export declare namespace TCPTransport { -- interface Options { -- port: number; -- host: string; -- } --} -diff --git a/dist/src/gss/transport/tcp.js b/dist/src/gss/transport/tcp.js -deleted file mode 100644 -index 9d9dd79..0000000 ---- a/dist/src/gss/transport/tcp.js -+++ /dev/null -@@ -1,99 +0,0 @@ --"use strict"; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.TCPTransport = void 0; --const net_1 = __importDefault(require("net")); --const _1 = require("."); --const encoder_1 = require("../msg/encoder"); --class TCPTransport extends _1.Transport { -- constructor(options) { -- super(); -- this.SOCKET_TIMEOUT = 5000; -- this.options = options; -- } -- sendBuffer(buffer, _opts) { -- return __awaiter(this, void 0, void 0, function* () { -- const opts = { -- waitResponse: (_opts === null || _opts === void 0 ? void 0 : _opts.waitResponse) || false -- }; -- return new Promise((resolve, reject) => { -- const respChunks = []; -- const client = new net_1.default.Socket().connect({ -- host: this.options.host, -- port: this.options.port, -- }, () => { -- client.write(buffer, err => { -- if (err) { -- rejectSending(err); -- } -- else { -- if (!opts.waitResponse) { -- resolveSending(Buffer.alloc(0)); -- } -- } -- }); -- }); -- const rejectSending = (err) => { -- client.destroy(); -- reject(err); -- }; -- const resolveSending = (response) => { -- client.end(() => { -- resolve(response); -- }); -- }; -- client.setTimeout(this.SOCKET_TIMEOUT); -- client.on('data', data => { -- respChunks.push(data); -- }); -- client.on('close', () => { -- resolveSending(Buffer.concat(respChunks)); -- }); -- client.on('timeout', () => { -- rejectSending(new Error('Socket timeout')); -- }); -- client.on('error', rejectSending); -- }); -- }); -- } -- // TODO: split this function -- sendMessage(msg, encoder, _opts) { -- return this.sendBuffer(encoder(msg), _opts); -- } -- sendSessionMessage(sessionMsg) { -- return this.sendMessage(sessionMsg, this.encodeSessionMessage.bind(this)).then(() => sessionMsg); -- } -- encodeSessionMessage(msg) { -- const moMsg = { -- header: { -- cdr: 0, -- // TODO: this field should be included in the SessionMessage type -- momsn: msg.momsn, -- mtmsn: msg.mtmsn, -- imei: msg.imei, -- status: msg.status, -- time: msg.time, -- }, -- location: msg.location, -- }; -- if (msg.payload.length > 0) { -- moMsg.payload = { -- payload: msg.payload, -- length: msg.payload.length, -- }; -- } -- return (0, encoder_1.encodeMoMsg)(moMsg); -- } --} --exports.TCPTransport = TCPTransport; -diff --git a/dist/src/index.d.ts b/dist/src/index.d.ts -deleted file mode 100644 -index 02092d5..0000000 ---- a/dist/src/index.d.ts -+++ /dev/null -@@ -1,16 +0,0 @@ --import * as msg from "./gss/msg"; --import * as decoder from "./gss/msg/decoder"; --import * as encoder from "./gss/msg/encoder"; --import { TCPTransport } from "./gss/transport/tcp"; --import { SMTPTransport } from "./gss/transport/smtp"; --export declare namespace GSS { -- const Decoder: typeof decoder; -- const Encoder: typeof encoder; -- export import Message = msg.Message; -- namespace MessageUtils { -- } -- namespace Transport { -- const TCP: typeof TCPTransport; -- const SMTP: typeof SMTPTransport; -- } --} -diff --git a/dist/src/index.js b/dist/src/index.js -deleted file mode 100644 -index 51b804a..0000000 ---- a/dist/src/index.js -+++ /dev/null -@@ -1,42 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.GSS = void 0; --const msg = __importStar(require("./gss/msg")); --const decoder = __importStar(require("./gss/msg/decoder")); --const encoder = __importStar(require("./gss/msg/encoder")); --const tcp_1 = require("./gss/transport/tcp"); --const smtp_1 = require("./gss/transport/smtp"); --var GSS; --(function (GSS) { -- GSS.Decoder = decoder; -- GSS.Encoder = encoder; -- GSS.Message = msg.Message; -- let Transport; -- (function (Transport) { -- Transport.TCP = tcp_1.TCPTransport; -- Transport.SMTP = smtp_1.SMTPTransport; -- })(Transport = GSS.Transport || (GSS.Transport = {})); --})(GSS = exports.GSS || (exports.GSS = {})); -diff --git a/dist/src/isu/960x.d.ts b/dist/src/isu/960x.d.ts -deleted file mode 100644 -index 2776379..0000000 ---- a/dist/src/isu/960x.d.ts -+++ /dev/null -@@ -1,65 +0,0 @@ --///  --import { ATInterface } from "../at/interface"; --import { GSS } from "../gss"; --import * as sio from "socket.io-client"; --export interface ModemOptions { -- imei?: string; -- dte: { -- path: string; -- }; -- gss: { -- uri?: string; -- host?: string; -- port?: number; -- }; -- volatile?: boolean; --} --export interface MobileBuffer { -- buffer: Buffer; -- checksum: number; --} --interface CIEV { -- svca: number; -- sigq: number; --} --export declare class Modem { -- imei: string; -- at: ATInterface; -- ciev: CIEV; -- cier: { -- mode: number; -- sigind: number; -- svcind: number; -- }; -- momsn: number; -- mtmsn: number; -- moBuffer: MobileBuffer; -- mtBuffer: MobileBuffer; -- socket: sio.Socket; -- updateCIEV(ciev: Partial): void; -- constructor(options: ModemOptions); -- private increaseMOMSN; -- initSession(opts: { -- alert?: boolean; -- }): Promise; -- static clearMobileBuffer(mobBuf: MobileBuffer): void; -- static updateMobileBuffer(mobBuf: MobileBuffer, buffer: Buffer, checksum?: number): void; --} --export declare function computeChecksum(message: Buffer): number; --/** -- * Checks if the given mobile buffer checksum is valid -- * -- * @param buffer Full message including trailing checksum -- * @param payloadLength The length of the payload (excluding checksum) -- * @returns Checksum validity -- */ --export declare function validateMB(mo: MobileBuffer): boolean; --/** -- * Reads a mobile buffer from the given AT interface -- * -- * @param at -- * @param payloadLength -- * @returns -- */ --export declare function readMB(at: ATInterface, payloadLength: number): Promise; --export {}; -diff --git a/dist/src/isu/960x.js b/dist/src/isu/960x.js -deleted file mode 100644 -index 94faae0..0000000 ---- a/dist/src/isu/960x.js -+++ /dev/null -@@ -1,190 +0,0 @@ --"use strict"; --var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- var desc = Object.getOwnPropertyDescriptor(m, k); -- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { -- desc = { enumerable: true, get: function() { return m[k]; } }; -- } -- Object.defineProperty(o, k2, desc); --}) : (function(o, m, k, k2) { -- if (k2 === undefined) k2 = k; -- o[k2] = m[k]; --})); --var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { -- Object.defineProperty(o, "default", { enumerable: true, value: v }); --}) : function(o, v) { -- o["default"] = v; --}); --var __importStar = (this && this.__importStar) || function (mod) { -- if (mod && mod.__esModule) return mod; -- var result = {}; -- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); -- __setModuleDefault(result, mod); -- return result; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.readMB = exports.validateMB = exports.computeChecksum = exports.Modem = void 0; --const logger = __importStar(require("../logger")); --const interface_1 = require("../at/interface"); --const commands_1 = require("./commands"); --const sio = __importStar(require("socket.io-client")); --; --const log = logger.create('960x'); --// TODO: create a parent class named Modem and rename this to SBDModem --class Modem { -- updateCIEV(ciev) { -- Object.assign(this.ciev, ciev); -- if (this.cier.mode) { -- if (this.cier.sigind && ciev.sigq !== undefined) { -- this.at.enqueueLine(`+CIEV:0,${ciev.sigq}`, 'sigq'); -- } -- if (this.cier.svcind && ciev.svca !== undefined) { -- this.at.enqueueLine(`+CIEV:1,${ciev.svca}`, 'svca'); -- } -- } -- } -- constructor(options) { -- this.moBuffer = { -- buffer: Buffer.alloc(0), -- checksum: 0, -- }; -- this.mtBuffer = { -- buffer: Buffer.alloc(0), -- checksum: 0, -- }; -- this.at = new interface_1.ATInterface({ -- baudRate: 19200, -- path: options.dte.path, -- }); -- this.cier = { -- mode: 0, -- sigind: 0, -- svcind: 0, // service indicator -- }; -- this.ciev = { -- sigq: 0, -- svca: 0, -- }; -- const uri = options.gss.uri -- ? options.gss.uri -- : `ws://${options.gss.host}:${options.gss.port}`; -- this.momsn = 0; -- this.mtmsn = 0; -- this.imei = options.imei || '527695889002193'; -- this.at.registerCommands([ -- commands_1.CMD_CGSN, -- commands_1.CMD_SBDTC, -- commands_1.CMD_SBDRB, -- commands_1.CMD_SBDWB, -- commands_1.CMD_SBDIX, -- commands_1.CMD_SBDIXA, -- commands_1.CMD_SBDD, -- commands_1.CMD_SBDWT, -- commands_1.CMD_SBDRT, -- commands_1.CMD_CIER, -- commands_1.CMD_SBDMTA, -- ], this); -- this.socket = sio.connect(uri, { -- query: { -- imei: this.imei, -- } -- }); -- this.socket.on('connect', () => { -- this.updateCIEV({ -- svca: 1, -- sigq: 5, -- }); -- log.debug(`GSS reached`); -- }); -- this.socket.on('disconnect', () => { -- this.updateCIEV({ -- svca: 0, -- sigq: 0, -- }); -- log.debug(`GSS lost`); -- }); -- this.socket.on('ring', () => { -- this.at.enqueueLine(`SBDRING`, 'ring'); -- }); -- } -- increaseMOMSN() { -- this.momsn = (this.momsn + 1) & 0xFFFF; -- } -- initSession(opts) { -- return new Promise((resolve, reject) => { -- const sessionReq = { -- imei: this.imei, -- mo: this.moBuffer.buffer, -- momsn: this.momsn, -- alert: opts.alert || false, -- }; -- this.socket.timeout(15000).emit('initSession', sessionReq, (err, sessionResp) => { -- if (err) { -- resolve({ -- mosts: 32, -- mtsts: 2, -- momsn: this.momsn, -- mtmsn: this.mtmsn, -- mt: Buffer.from([]), -- mtq: 0 -- }); -- } -- else { -- if (this.moBuffer.buffer.length > 0) { -- this.increaseMOMSN(); -- } -- this.mtmsn = sessionResp.mtmsn; -- if (sessionResp.mtsts === 1) { -- Modem.updateMobileBuffer(this.mtBuffer, sessionResp.mt); -- } -- resolve(sessionResp); -- } -- }); -- }); -- } -- static clearMobileBuffer(mobBuf) { -- mobBuf.checksum = 0; -- mobBuf.buffer = Buffer.alloc(0); -- } -- static updateMobileBuffer(mobBuf, buffer, checksum) { -- mobBuf.buffer = buffer; -- mobBuf.checksum = checksum === undefined -- ? computeChecksum(buffer) -- : checksum; -- } --} --exports.Modem = Modem; --function computeChecksum(message) { -- let payloadChecksum = 0; -- for (let i = 0; i < message.length; i++) { -- payloadChecksum += message[i]; -- } -- return (payloadChecksum & 0xFFFF); --} --exports.computeChecksum = computeChecksum; --/** -- * Checks if the given mobile buffer checksum is valid -- * -- * @param buffer Full message including trailing checksum -- * @param payloadLength The length of the payload (excluding checksum) -- * @returns Checksum validity -- */ --function validateMB(mo) { -- return mo.checksum === computeChecksum(mo.buffer); --} --exports.validateMB = validateMB; --/** -- * Reads a mobile buffer from the given AT interface -- * -- * @param at -- * @param payloadLength -- * @returns -- */ --function readMB(at, payloadLength) { -- const delimiter = (byte, buf) => buf.length >= payloadLength + 2; -- return at.readRawUntil(delimiter, 60000).then(buffer => ({ -- buffer: buffer.subarray(0, payloadLength), -- checksum: buffer.readUInt16BE(payloadLength) -- })); --} --exports.readMB = readMB; -diff --git a/dist/src/isu/commands.d.ts b/dist/src/isu/commands.d.ts -deleted file mode 100644 -index f855c05..0000000 ---- a/dist/src/isu/commands.d.ts -+++ /dev/null -@@ -1,32 +0,0 @@ --import { ATCmd } from "../at/cmd"; --import { Modem } from "./960x"; --/** -- * 5.21 +CGSN – Serial Number -- */ --export declare const CMD_CGSN: ATCmd.ContextWrapper; --/** -- * 5.21 +CGSN – Serial Number -- */ --export declare const CMD_CIER: ATCmd.ContextWrapper; --export declare const CMD_SBDMTA: ATCmd.ContextWrapper; --/** -- * Transfer mobile terminated originated buffer -- * to mobile terminated buffer -- */ --export declare const CMD_SBDTC: ATCmd.ContextWrapper; --/** -- * 5.38 +SBDIX – Short Burst Data: Initiate an SBD Session Extended -- */ --export declare const CMD_SBDIX: ATCmd.ContextWrapper; --export declare const CMD_SBDIXA: ATCmd.ContextWrapper; --/** -- * 5.42 +SBDD – Short Burst Data: Clear SBD Message Buffer(s) -- */ --export declare const CMD_SBDD: ATCmd.ContextWrapper; --export declare const CMD_SBDRT: ATCmd.ContextWrapper; --export declare const CMD_SBDWT: ATCmd.ContextWrapper; --/** -- * Read mobile terminated buffer -- */ --export declare const CMD_SBDRB: ATCmd.ContextWrapper; --export declare const CMD_SBDWB: ATCmd.ContextWrapper; -diff --git a/dist/src/isu/commands.js b/dist/src/isu/commands.js -deleted file mode 100644 -index a7f637f..0000000 ---- a/dist/src/isu/commands.js -+++ /dev/null -@@ -1,196 +0,0 @@ --"use strict"; --var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { -- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } -- return new (P || (P = Promise))(function (resolve, reject) { -- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } -- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } -- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } -- step((generator = generator.apply(thisArg, _arguments || [])).next()); -- }); --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.CMD_SBDWB = exports.CMD_SBDRB = exports.CMD_SBDWT = exports.CMD_SBDRT = exports.CMD_SBDD = exports.CMD_SBDIXA = exports.CMD_SBDIX = exports.CMD_SBDTC = exports.CMD_SBDMTA = exports.CMD_CIER = exports.CMD_CGSN = void 0; --const sprintf_js_1 = require("sprintf-js"); --const cmd_1 = require("../at/cmd"); --const _960x_1 = require("./960x"); --/** -- * 5.21 +CGSN – Serial Number -- */ --exports.CMD_CGSN = cmd_1.ATCmd.wrapContext('+cgsn', cmd => { -- cmd.onExec(function (at) { -- return __awaiter(this, void 0, void 0, function* () { -- at.writeLine(this.imei); -- }); -- }); --}); --/** -- * 5.21 +CGSN – Serial Number -- */ --exports.CMD_CIER = cmd_1.ATCmd.wrapContext('+cier', cmd => { -- cmd.onSet(/(\d),(\d),(\d)/, function (at, match) { -- return __awaiter(this, void 0, void 0, function* () { -- this.cier.mode = parseInt(match[1]); -- this.cier.sigind = parseInt(match[2]); -- this.cier.svcind = parseInt(match[3]); -- // this actually enqueues events because we are currently -- // processing a command -- this.updateCIEV(this.ciev); -- }); -- }); --}); --exports.CMD_SBDMTA = cmd_1.ATCmd.wrapContext('+sbdmta', cmd => { -- cmd.onSet(/\d/, function (at, match) { -- return __awaiter(this, void 0, void 0, function* () { -- this.cier.mode = parseInt(match[0]); -- }); -- }); --}); --/** -- * Transfer mobile terminated originated buffer -- * to mobile terminated buffer -- */ --exports.CMD_SBDTC = cmd_1.ATCmd.wrapContext('+sbdtc', cmd => { -- cmd.onExec(function (at) { -- return __awaiter(this, void 0, void 0, function* () { -- this.mtBuffer = Object.assign({}, this.moBuffer); -- at.writeLine(`SBDTC: Outbound SBD Copied to Inbound SBD: size = ${this.moBuffer.buffer.length}`); -- }); -- }); --}); --function writeExtSessionResp(at, sessionResp) { -- const resp = (0, sprintf_js_1.sprintf)('%s:%d,%d,%d,%d,%d,%d', '+SBDIX', sessionResp.mosts, sessionResp.momsn, sessionResp.mtsts, sessionResp.mtmsn, sessionResp.mt.length, sessionResp.mtq); -- at.writeLine(resp); --} --/** -- * 5.38 +SBDIX – Short Burst Data: Initiate an SBD Session Extended -- */ --exports.CMD_SBDIX = cmd_1.ATCmd.wrapContext('+sbdix', cmd => { -- cmd.onExec(function (at) { -- return __awaiter(this, void 0, void 0, function* () { -- return this.initSession({ alert: false }).then(session => { -- writeExtSessionResp.apply(this, [at, session]); -- }); -- }); -- }); --}); --exports.CMD_SBDIXA = cmd_1.ATCmd.wrapContext('+sbdixa', cmd => { -- cmd.onExec(function (at) { -- return __awaiter(this, void 0, void 0, function* () { -- return this.initSession({ alert: true }).then(session => { -- writeExtSessionResp.apply(this, [at, session]); -- }); -- }); -- }); --}); --/** -- * 5.42 +SBDD – Short Burst Data: Clear SBD Message Buffer(s) -- */ --exports.CMD_SBDD = cmd_1.ATCmd.wrapContext('+sbdd', cmd => { -- cmd.onExec(/^[012]$/, function (at, [opt]) { -- return __awaiter(this, void 0, void 0, function* () { -- const code = { -- OK: '0', -- ERR: '1', -- }; -- if (opt === '0') { -- _960x_1.Modem.clearMobileBuffer(this.moBuffer); -- } -- else if (opt === '1') { -- _960x_1.Modem.clearMobileBuffer(this.mtBuffer); -- } -- else if (opt === '2') { -- _960x_1.Modem.clearMobileBuffer(this.moBuffer); -- _960x_1.Modem.clearMobileBuffer(this.mtBuffer); -- } -- at.writeLine(code.OK); -- }); -- }); --}); --// 5.34 +SBDRT – Short Burst Data: Read a Text Message from the Module --// ! Iridium has a mistake in their manual (or in the implementation) --// ! The modem should respond with +SBDRT:{MT buffer} --// ! but it is responding with +SBDRT:{MT buffer} --exports.CMD_SBDRT = cmd_1.ATCmd.wrapContext('+sbdrt', cmd => { -- cmd.onExec(function (at) { -- return __awaiter(this, void 0, void 0, function* () { -- at.writeLineStart(`${cmd.name.toUpperCase()}:\r\n`); -- at.writeRaw(this.mtBuffer.buffer); -- }); -- }); --}); --exports.CMD_SBDWT = cmd_1.ATCmd.wrapContext('+sbdwt', cmd => { -- cmd.onSet(/.+/, function (at, [txt]) { -- return __awaiter(this, void 0, void 0, function* () { -- if (txt.length > 120) { -- return cmd_1.ATCmd.Status.ERR; -- } -- _960x_1.Modem.updateMobileBuffer(this.moBuffer, Buffer.from(txt)); -- }); -- }); -- cmd.onExec(function (at) { -- return __awaiter(this, void 0, void 0, function* () { -- const code = { -- OK: '0', -- ERR_TIMEOUT: '1', -- }; -- at.writeLine('READY'); -- const delimiter = byte => byte === 0x0D; -- return at.readRawUntil(delimiter, 60000).then(buffer => { -- _960x_1.Modem.updateMobileBuffer(this.moBuffer, buffer.subarray(0, -1)); -- at.writeLine(code.OK); -- }).catch(err => { -- at.writeLine(code.ERR_TIMEOUT); -- }); -- }); -- }); --}); --/** -- * Read mobile terminated buffer -- */ --exports.CMD_SBDRB = cmd_1.ATCmd.wrapContext('+sbdrb', cmd => { -- cmd.onExec(function (at) { -- return __awaiter(this, void 0, void 0, function* () { -- let offset = 0; -- const mtBuf = this.mtBuffer; -- // LENGTH (2 bytes) + MESSAGE (LENGTH bytes) + CHECKSUM (2 bytes) -- const totalLength = 2 + mtBuf.buffer.length + 2; -- const buffer = Buffer.alloc(totalLength); -- offset = buffer.writeUint16BE(mtBuf.buffer.length, offset); -- // copy() do not returns an offset, returns the -- // number of bytes copied instead -- offset += mtBuf.buffer.copy(buffer, offset); -- offset = buffer.writeUInt16BE(mtBuf.checksum, offset); -- at.writeRaw(buffer); -- }); -- }); --}); --exports.CMD_SBDWB = cmd_1.ATCmd.wrapContext('+sbdwb', cmd => { -- cmd.onSet(/\d+/, function (at, match) { -- return __awaiter(this, void 0, void 0, function* () { -- const code = { -- OK: '0', -- ERR_TIMEOUT: '1', -- ERR_CHECKSUM: '2', -- ERR_LENGTH: '3', // message length is out of bounds [1, 340] -- }; -- const payloadLength = parseInt(match[0]); -- if (payloadLength < 1 || payloadLength > 340) { -- at.writeLine(code.ERR_LENGTH); -- } -- else { -- at.writeLine('READY'); -- return (0, _960x_1.readMB)(at, payloadLength).then(mobBuf => { -- if ((0, _960x_1.validateMB)(mobBuf)) { // message is valid -- _960x_1.Modem.updateMobileBuffer(this.moBuffer, mobBuf.buffer, mobBuf.checksum); -- at.writeLine(code.OK); -- } -- else { -- at.writeLine(code.ERR_CHECKSUM); -- } -- }).catch(err => { -- at.writeLine(code.ERR_TIMEOUT); -- }); -- } -- }); -- }); --}); -diff --git a/dist/src/logger.d.ts b/dist/src/logger.d.ts -deleted file mode 100644 -index 525ff77..0000000 ---- a/dist/src/logger.d.ts -+++ /dev/null -@@ -1,11 +0,0 @@ --import { LeveledLogMethod, Logger } from "winston"; --interface CustomLogger extends Logger { -- success: LeveledLogMethod; -- setLevel: (lvl: number | string) => CustomLogger; --} --declare const logger: CustomLogger; --export declare function disableTTY(): CustomLogger; --export declare function setLevel(targetLevel: number | string): CustomLogger; --export declare function create(moduleName?: string): CustomLogger; --export declare function setProgramName(name: string): void; --export default logger; -diff --git a/dist/src/logger.js b/dist/src/logger.js -deleted file mode 100644 -index 9d219bb..0000000 ---- a/dist/src/logger.js -+++ /dev/null -@@ -1,103 +0,0 @@ --"use strict"; --var __rest = (this && this.__rest) || function (s, e) { -- var t = {}; -- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) -- t[p] = s[p]; -- if (s != null && typeof Object.getOwnPropertySymbols === "function") -- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { -- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) -- t[p[i]] = s[p[i]]; -- } -- return t; --}; --var __importDefault = (this && this.__importDefault) || function (mod) { -- return (mod && mod.__esModule) ? mod : { "default": mod }; --}; --Object.defineProperty(exports, "__esModule", { value: true }); --exports.setProgramName = exports.create = exports.setLevel = exports.disableTTY = void 0; --const colors_1 = __importDefault(require("colors")); --const winston_1 = __importDefault(require("winston")); --let programName = ''; --const levels = { -- error: 0, -- success: 1, -- warn: 2, -- info: 3, -- debug: 4, --}; --const levelFormat = { -- "error": `[ ${colors_1.default.bold.red("ER")} ]`, -- "info": `[${colors_1.default.bold.blue("INFO")}]`, -- "warn": `[${colors_1.default.bold.yellow("WARN")}]`, -- "success": `[ ${colors_1.default.bold.green("OK")} ]`, -- "debug": `[${colors_1.default.bold.magenta("DBUG")}]`, --}; --const consoleTransport = new winston_1.default.transports.Console({ -- stderrLevels: ['error', 'success', 'warn', 'info', 'debug'] --}); --const ttyConsoleTransport = new winston_1.default.transports.Console({ -- stderrLevels: ['error'] --}); --const logger = winston_1.default.createLogger({ -- level: 'debug', -- levels, -- format: winston_1.default.format.combine( -- // winston.format.label({ label: 'immoliste' }), -- // winston.format.colorize({ message: true }), -- // winston.format.colorize(), -- winston_1.default.format.timestamp({ -- // format: 'YYYY-MM-DD HH:mm:ss' -- }),  -- // winston.format.align(), -- winston_1.default.format.printf(info => { -- const { timestamp, moduleName, level, message } = info, args = __rest(info, ["timestamp", "moduleName", "level", "message"]); -- let progNameFormat = '@'; -- if (programName) { -- progNameFormat = `${colors_1.default.bold(programName)}`; -- } -- let moduleNameFormat = ''; -- if (moduleName) { -- moduleNameFormat = `${colors_1.default.magenta(moduleName)}`; -- } -- return `${timestamp} ${levelFormat[level]} ${progNameFormat} ${moduleNameFormat}: ${message} ${Object.keys(args).length ? JSON.stringify(args, null, 2) : ''}`; -- })), -- transports: [ -- ttyConsoleTransport -- ], -- exitOnError: false --}); --function disableTTY() { -- logger.remove(ttyConsoleTransport).add(consoleTransport); -- return logger; --} --exports.disableTTY = disableTTY; --function setLevel(targetLevel) { -- let level = 'debug'; -- if (typeof targetLevel === 'string') { -- level = targetLevel; -- } -- else { -- for (let key in levels) { -- if (levels[key] === targetLevel) { -- level = key; -- break; -- } -- } -- } -- logger.level = level; -- return logger; --} --exports.setLevel = setLevel; --function create(moduleName) { -- return logger.child({ -- moduleName -- }); --} --exports.create = create; --; --function setProgramName(name) { -- programName = name; --} --exports.setProgramName = setProgramName; --; --exports.default = logger; -diff --git a/encode.js b/encode.js -deleted file mode 120000 -index 1460a5c..0000000 ---- a/encode.js -+++ /dev/null -@@ -1 +0,0 @@ --dist/scripts/encoder.js -\ No newline at end of file -diff --git a/gss.js b/gss.js -deleted file mode 120000 -index 2003510..0000000 ---- a/gss.js -+++ /dev/null -@@ -1 +0,0 @@ --dist/scripts/gss.js -\ No newline at end of file -diff --git a/isbd-env.sh b/isbd-env.sh -index 9f8de20..bffce24 100644 ---- a/isbd-env.sh -+++ b/isbd-env.sh -@@ -3,7 +3,7 @@ SCRIPT_NAME=$(basename ${BASH_SOURCE[0]}) -  - function isbd { - NODE_SCRIPT_NAME=$1 -- NODE_SCRIPT_PATH=$SCRIPT_DIR/$NODE_SCRIPT_NAME.js -+ NODE_SCRIPT_PATH=$SCRIPT_DIR/exe/$NODE_SCRIPT_NAME.js - shift - if [ -n "$NODE_SCRIPT_NAME" ]; then - if [ -e $NODE_SCRIPT_PATH ]; then -diff --git a/jest.config.js b/jest.config.js -index 1b05265..7ae7950 100644 ---- a/jest.config.js -+++ b/jest.config.js -@@ -125,7 +125,7 @@ module.exports = { -  - // A list of paths to directories that Jest should use to search for files in - roots: [ -- "./build/test/" -+ "./build/test" - ], -  - // Allows you to use a custom runner instead of Jest's default test runner -diff --git a/package-lock.json b/package-lock.json -index 2e23597..3b9ea7f 100644 ---- a/package-lock.json -+++ b/package-lock.json -@@ -9,35 +9,36 @@ - "version": "0.0.1", - "license": "ISC", - "dependencies": { -- "@types/fs-extra": "^11.0.1", -- "@types/jest": "^29.5.0", -- "@types/nodemailer": "^6.4.7", -- "@types/sprintf-js": "^1.1.2", - "chalk": "^5.2.0", - "colors": "^1.4.0", - "commander": "^10.0.0", - "fastq": "^1.15.0", - "fs-extra": "^11.1.1", -- "jest": "^29.5.0", - "moment": "^2.29.4", - "nodemailer": "^6.9.1", - "serialport": "^10.5.0", - "socket.io": "^4.6.1", - "socket.io-client": "^4.6.1", - "sprintf-js": "^1.1.2", -- "ts-jest": "^29.1.0", -- "typescript": "^5.0.2", - "winston": "^3.8.2" - }, - "devDependencies": { -+ "@types/fs-extra": "^11.0.1", -+ "@types/jest": "^29.5.0", - "@types/node": "^18.15.11", -- "rimraf": "^5.0.5" -+ "@types/nodemailer": "^6.4.7", -+ "@types/sprintf-js": "^1.1.2", -+ "jest": "^29.5.0", -+ "rimraf": "^5.0.5", -+ "ts-jest": "^29.1.0", -+ "typescript": "^5.0.2" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", -+ "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" -@@ -50,6 +51,7 @@ - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", -+ "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" -@@ -62,6 +64,7 @@ - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", -+ "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, -@@ -73,6 +76,7 @@ - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", -@@ -86,6 +90,7 @@ - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", -+ "dev": true, - "engines": { - "node": ">=0.8.0" - } -@@ -94,6 +99,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", -+ "dev": true, - "engines": { - "node": ">=4" - } -@@ -102,6 +108,7 @@ - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", -+ "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, -@@ -113,6 +120,7 @@ - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", -+ "dev": true, - "engines": { - "node": ">=6.9.0" - } -@@ -121,6 +129,7 @@ - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.6.tgz", - "integrity": "sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw==", -+ "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", -@@ -149,12 +158,14 @@ - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", -- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" -+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", -+ "dev": true - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", -+ "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", -@@ -169,6 +180,7 @@ - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", -+ "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", -@@ -182,6 +194,7 @@ - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", -+ "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-validator-option": "^7.22.5", -@@ -200,6 +213,7 @@ - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", -+ "dev": true, - "engines": { - "node": ">=6.9.0" - } -@@ -208,6 +222,7 @@ - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", -+ "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" -@@ -220,6 +235,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", -+ "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, -@@ -231,6 +247,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", -+ "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, -@@ -242,6 +259,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", -+ "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", -@@ -260,6 +278,7 @@ - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", -+ "dev": true, - "engines": { - "node": ">=6.9.0" - } -@@ -268,6 +287,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", -+ "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, -@@ -279,6 +299,7 @@ - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", -+ "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, -@@ -290,6 +311,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", -+ "dev": true, - "engines": { - "node": ">=6.9.0" - } -@@ -298,6 +320,7 @@ - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", -+ "dev": true, - "engines": { - "node": ">=6.9.0" - } -@@ -306,6 +329,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", -+ "dev": true, - "engines": { - "node": ">=6.9.0" - } -@@ -314,6 +338,7 @@ - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", -+ "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", -@@ -327,6 +352,7 @@ - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", -+ "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", -@@ -340,6 +366,7 @@ - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", -+ "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, -@@ -351,6 +378,7 @@ - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", -@@ -364,6 +392,7 @@ - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", -+ "dev": true, - "engines": { - "node": ">=0.8.0" - } -@@ -372,6 +401,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", -+ "dev": true, - "engines": { - "node": ">=4" - } -@@ -380,6 +410,7 @@ - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", -+ "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, -@@ -391,6 +422,7 @@ - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", -+ "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, -@@ -402,6 +434,7 @@ - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, -@@ -413,6 +446,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, -@@ -424,6 +458,7 @@ - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, -@@ -435,6 +470,7 @@ - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, -@@ -446,6 +482,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, -@@ -457,6 +494,7 @@ - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, -@@ -471,6 +509,7 @@ - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, -@@ -482,6 +521,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, -@@ -493,6 +533,7 @@ - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, -@@ -504,6 +545,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, -@@ -515,6 +557,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, -@@ -526,6 +569,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, -@@ -537,6 +581,7 @@ - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, -@@ -551,6 +596,7 @@ - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, -@@ -565,6 +611,7 @@ - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", -+ "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", -@@ -578,6 +625,7 @@ - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", -+ "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", -@@ -598,6 +646,7 @@ - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", -+ "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", -@@ -610,7 +659,8 @@ - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", -- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" -+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", -+ "dev": true - }, - "node_modules/@colors/colors": { - "version": "1.5.0", -@@ -730,6 +780,7 @@ - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", -+ "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", -@@ -745,6 +796,7 @@ - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -753,6 +805,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", -+ "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", -@@ -769,6 +822,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -784,6 +838,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", -+ "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", -@@ -830,6 +885,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -845,6 +901,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", -+ "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -859,6 +916,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", -+ "dev": true, - "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" -@@ -871,6 +929,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", -+ "dev": true, - "dependencies": { - "jest-get-type": "^29.4.3" - }, -@@ -882,6 +941,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", -+ "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@sinonjs/fake-timers": "^10.0.2", -@@ -898,6 +958,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", -+ "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", -@@ -912,6 +973,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", -+ "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", -@@ -954,6 +1016,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -969,6 +1032,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", -+ "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, -@@ -980,6 +1044,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", -+ "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", -@@ -993,6 +1058,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", -+ "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -1007,6 +1073,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", -+ "dev": true, - "dependencies": { - "@jest/test-result": "^29.5.0", - "graceful-fs": "^4.2.9", -@@ -1021,6 +1088,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", -+ "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", -@@ -1046,6 +1114,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -1061,6 +1130,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", -+ "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", -@@ -1077,6 +1147,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -1092,6 +1163,7 @@ - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", -+ "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" -@@ -1104,6 +1176,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", -+ "dev": true, - "engines": { - "node": ">=6.0.0" - } -@@ -1112,6 +1185,7 @@ - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", -+ "dev": true, - "engines": { - "node": ">=6.0.0" - } -@@ -1119,12 +1193,14 @@ - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", -- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" -+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", -+ "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", -+ "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" -@@ -1134,6 +1210,7 @@ - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", -+ "dev": true, - "bin": { - "semver": "bin/semver.js" - } -@@ -1315,12 +1392,14 @@ - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", -- "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" -+ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", -+ "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", -+ "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } -@@ -1329,6 +1408,7 @@ - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", -+ "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" - } -@@ -1342,6 +1422,7 @@ - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", -+ "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", -@@ -1354,6 +1435,7 @@ - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", -+ "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } -@@ -1362,6 +1444,7 @@ - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", -+ "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" -@@ -1371,6 +1454,7 @@ - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", -+ "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } -@@ -1392,6 +1476,7 @@ - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", - "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", -+ "dev": true, - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" -@@ -1401,6 +1486,7 @@ - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", -+ "dev": true, - "dependencies": { - "@types/node": "*" - } -@@ -1408,12 +1494,14 @@ - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", -- "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" -+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", -+ "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", -+ "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } -@@ -1422,6 +1510,7 @@ - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", -+ "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } -@@ -1430,6 +1519,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", -+ "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" -@@ -1439,6 +1529,7 @@ - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", - "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", -+ "dev": true, - "dependencies": { - "@types/node": "*" - } -@@ -1452,6 +1543,7 @@ - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.7.tgz", - "integrity": "sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==", -+ "dev": true, - "dependencies": { - "@types/node": "*" - } -@@ -1459,17 +1551,20 @@ - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", -- "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" -+ "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", -+ "dev": true - }, - "node_modules/@types/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/sprintf-js/-/sprintf-js-1.1.2.tgz", -- "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==" -+ "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==", -+ "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", -- "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" -+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", -+ "dev": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.2", -@@ -1480,6 +1575,7 @@ - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", -+ "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } -@@ -1487,7 +1583,8 @@ - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", -- "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" -+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", -+ "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", -@@ -1505,6 +1602,7 @@ - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", -+ "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, -@@ -1519,6 +1617,7 @@ - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -1527,6 +1626,7 @@ - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", -+ "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, -@@ -1541,6 +1641,7 @@ - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", -+ "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, -@@ -1551,12 +1652,14 @@ - "node_modules/ansi-styles/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", -- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" -+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", -+ "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", -+ "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" -@@ -1569,6 +1672,7 @@ - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", -+ "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } -@@ -1576,7 +1680,8 @@ - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", -- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" -+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", -+ "dev": true - }, - "node_modules/async": { - "version": "3.2.4", -@@ -1587,6 +1692,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", -+ "dev": true, - "dependencies": { - "@jest/transform": "^29.5.0", - "@types/babel__core": "^7.1.14", -@@ -1607,6 +1713,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -1622,6 +1729,7 @@ - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", -+ "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", -@@ -1637,6 +1745,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", -+ "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", -@@ -1651,6 +1760,7 @@ - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", -+ "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", -@@ -1673,6 +1783,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", -+ "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" -@@ -1687,7 +1798,8 @@ - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", -- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" -+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", -+ "dev": true - }, - "node_modules/base64id": { - "version": "2.0.0", -@@ -1701,6 +1813,7 @@ - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", -+ "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" -@@ -1710,6 +1823,7 @@ - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", -+ "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, -@@ -1721,6 +1835,7 @@ - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", -+ "dev": true, - "funding": [ - { - "type": "opencollective", -@@ -1752,6 +1867,7 @@ - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", -+ "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, -@@ -1763,6 +1879,7 @@ - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", -+ "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } -@@ -1770,12 +1887,14 @@ - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", -- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" -+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", -+ "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -1784,6 +1903,7 @@ - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -1792,6 +1912,7 @@ - "version": "1.0.30001512", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", - "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", -+ "dev": true, - "funding": [ - { - "type": "opencollective", -@@ -1822,6 +1943,7 @@ - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", -+ "dev": true, - "engines": { - "node": ">=10" - } -@@ -1830,6 +1952,7 @@ - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", -+ "dev": true, - "funding": [ - { - "type": "github", -@@ -1843,12 +1966,14 @@ - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", -- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" -+ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", -+ "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", -+ "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", -@@ -1862,6 +1987,7 @@ - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", -+ "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" -@@ -1870,7 +1996,8 @@ - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", -- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" -+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", -+ "dev": true - }, - "node_modules/color": { - "version": "3.2.1", -@@ -1921,9 +2048,9 @@ - } - }, - "node_modules/commander": { -- "version": "10.0.0", -- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", -- "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", -+ "version": "10.0.1", -+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", -+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" - } -@@ -1931,12 +2058,14 @@ - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", -- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" -+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", -+ "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", -- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" -+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", -+ "dev": true - }, - "node_modules/cookie": { - "version": "0.4.2", -@@ -1962,6 +2091,7 @@ - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", -+ "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", -@@ -1990,12 +2120,14 @@ - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", -- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" -+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", -+ "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", -+ "dev": true, - "engines": { - "node": ">=0.10.0" - } -@@ -2004,6 +2136,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -2012,6 +2145,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", -+ "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } -@@ -2025,12 +2159,14 @@ - "node_modules/electron-to-chromium": { - "version": "1.4.449", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.449.tgz", -- "integrity": "sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ==" -+ "integrity": "sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ==", -+ "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", -+ "dev": true, - "engines": { - "node": ">=12" - }, -@@ -2041,7 +2177,8 @@ - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", -- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" -+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", -+ "dev": true - }, - "node_modules/enabled": { - "version": "2.0.0", -@@ -2092,6 +2229,7 @@ - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", -+ "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } -@@ -2099,12 +2237,14 @@ - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", -- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" -+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", -+ "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -2113,6 +2253,7 @@ - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -2121,6 +2262,7 @@ - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", -+ "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" -@@ -2133,6 +2275,7 @@ - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", -+ "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", -@@ -2155,6 +2298,7 @@ - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", -+ "dev": true, - "engines": { - "node": ">= 0.8.0" - } -@@ -2163,6 +2307,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", -+ "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", -@@ -2177,7 +2322,8 @@ - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", -- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" -+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", -+ "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", -@@ -2191,6 +2337,7 @@ - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", -+ "dev": true, - "dependencies": { - "bser": "2.1.1" - } -@@ -2204,6 +2351,7 @@ - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", -+ "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, -@@ -2215,6 +2363,7 @@ - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", -+ "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" -@@ -2272,12 +2421,14 @@ - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", -- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" -+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", -+ "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", -+ "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ -@@ -2290,12 +2441,14 @@ - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", -- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" -+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", -+ "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", -+ "dev": true, - "engines": { - "node": ">=6.9.0" - } -@@ -2304,6 +2457,7 @@ - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", -+ "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } -@@ -2312,6 +2466,7 @@ - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", -+ "dev": true, - "engines": { - "node": ">=8.0.0" - } -@@ -2320,6 +2475,7 @@ - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", -+ "dev": true, - "engines": { - "node": ">=10" - }, -@@ -2331,6 +2487,7 @@ - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", -+ "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", -@@ -2350,6 +2507,7 @@ - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", -+ "dev": true, - "engines": { - "node": ">=4" - } -@@ -2363,6 +2521,7 @@ - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", -+ "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, -@@ -2374,6 +2533,7 @@ - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -2381,12 +2541,14 @@ - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", -- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" -+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", -+ "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", -+ "dev": true, - "engines": { - "node": ">=10.17.0" - } -@@ -2395,6 +2557,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", -+ "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" -@@ -2413,6 +2576,7 @@ - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", -+ "dev": true, - "engines": { - "node": ">=0.8.19" - } -@@ -2421,6 +2585,7 @@ - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", -+ "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" -@@ -2440,6 +2605,7 @@ - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", -+ "dev": true, - "dependencies": { - "has": "^1.0.3" - }, -@@ -2451,6 +2617,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -2459,6 +2626,7 @@ - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -2467,6 +2635,7 @@ - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", -+ "dev": true, - "engines": { - "node": ">=0.12.0" - } -@@ -2485,12 +2654,14 @@ - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", -- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" -+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", -+ "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -2499,6 +2670,7 @@ - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", -+ "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", -@@ -2514,6 +2686,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", -+ "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", -@@ -2527,6 +2700,7 @@ - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", -+ "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", -@@ -2540,6 +2714,7 @@ - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", -+ "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" -@@ -2570,6 +2745,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", -+ "dev": true, - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -2595,6 +2771,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", -+ "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" -@@ -2607,6 +2784,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", -+ "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", -@@ -2637,6 +2815,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -2652,6 +2831,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", -+ "dev": true, - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", -@@ -2685,6 +2865,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -2700,6 +2881,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", -+ "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", -@@ -2744,6 +2926,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -2759,6 +2942,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", -+ "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", -@@ -2773,6 +2957,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -2788,6 +2973,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", -+ "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, -@@ -2799,6 +2985,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", -+ "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", -@@ -2814,6 +3001,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -2829,6 +3017,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", -+ "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", -@@ -2845,6 +3034,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", -+ "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } -@@ -2853,6 +3043,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", -+ "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", -@@ -2877,6 +3068,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", -+ "dev": true, - "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" -@@ -2889,6 +3081,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", -+ "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", -@@ -2903,6 +3096,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -2918,6 +3112,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", -+ "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", -@@ -2937,6 +3132,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -2952,6 +3148,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", -+ "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", -@@ -2965,6 +3162,7 @@ - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", -+ "dev": true, - "engines": { - "node": ">=6" - }, -@@ -2981,6 +3179,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", -+ "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } -@@ -2989,6 +3188,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", -+ "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", -@@ -3008,6 +3208,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", -+ "dev": true, - "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" -@@ -3020,6 +3221,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -3035,6 +3237,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", -+ "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", -@@ -3066,6 +3269,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -3081,6 +3285,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", -+ "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", -@@ -3113,6 +3318,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -3128,6 +3334,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", -+ "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", -@@ -3161,6 +3368,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -3176,6 +3384,7 @@ - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", -+ "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, -@@ -3187,6 +3396,7 @@ - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", -+ "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, -@@ -3200,12 +3410,14 @@ - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", -- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" -+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", -+ "dev": true - }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", -+ "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", -@@ -3222,6 +3434,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -3237,6 +3450,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", -+ "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", -@@ -3253,6 +3467,7 @@ - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", -+ "dev": true, - "engines": { - "node": ">=10" - }, -@@ -3264,6 +3479,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -3279,6 +3495,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", -+ "dev": true, - "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -3297,6 +3514,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -3312,6 +3530,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", -+ "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", -@@ -3326,6 +3545,7 @@ - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", -+ "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, -@@ -3339,12 +3559,14 @@ - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", -- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" -+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", -+ "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", -+ "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" -@@ -3357,6 +3579,7 @@ - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", -+ "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, -@@ -3367,12 +3590,14 @@ - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", -- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" -+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", -+ "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", -+ "dev": true, - "bin": { - "json5": "lib/cli.js" - }, -@@ -3395,6 +3620,7 @@ - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -3408,6 +3634,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -3415,12 +3642,14 @@ - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", -- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" -+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", -+ "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", -+ "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, -@@ -3431,7 +3660,8 @@ - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", -- "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" -+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", -+ "dev": true - }, - "node_modules/logform": { - "version": "2.5.1", -@@ -3450,6 +3680,7 @@ - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", -+ "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } -@@ -3458,6 +3689,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", -+ "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, -@@ -3471,12 +3703,14 @@ - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", -- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" -+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", -+ "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", -+ "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } -@@ -3484,12 +3718,14 @@ - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", -- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" -+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", -+ "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", -+ "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" -@@ -3521,6 +3757,7 @@ - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -3529,6 +3766,7 @@ - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", -+ "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, -@@ -3561,7 +3799,8 @@ - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", -- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" -+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", -+ "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", -@@ -3589,12 +3828,14 @@ - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", -- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" -+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", -+ "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", -- "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" -+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", -+ "dev": true - }, - "node_modules/nodemailer": { - "version": "6.9.1", -@@ -3608,6 +3849,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", -+ "dev": true, - "engines": { - "node": ">=0.10.0" - } -@@ -3616,6 +3858,7 @@ - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", -+ "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, -@@ -3635,6 +3878,7 @@ - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", -+ "dev": true, - "dependencies": { - "wrappy": "1" - } -@@ -3651,6 +3895,7 @@ - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", -+ "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, -@@ -3665,6 +3910,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", -+ "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, -@@ -3679,6 +3925,7 @@ - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", -+ "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, -@@ -3690,6 +3937,7 @@ - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", -+ "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, -@@ -3704,6 +3952,7 @@ - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -3712,6 +3961,7 @@ - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", -+ "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", -@@ -3729,6 +3979,7 @@ - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -3737,6 +3988,7 @@ - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", -+ "dev": true, - "engines": { - "node": ">=0.10.0" - } -@@ -3745,6 +3997,7 @@ - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -3752,7 +4005,8 @@ - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", -- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" -+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", -+ "dev": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", -@@ -3782,12 +4036,14 @@ - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", -- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" -+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", -+ "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", -+ "dev": true, - "engines": { - "node": ">=8.6" - }, -@@ -3799,6 +4055,7 @@ - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", -+ "dev": true, - "engines": { - "node": ">= 6" - } -@@ -3807,6 +4064,7 @@ - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", -+ "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, -@@ -3818,6 +4076,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", -+ "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", -@@ -3831,6 +4090,7 @@ - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", -+ "dev": true, - "engines": { - "node": ">=10" - }, -@@ -3842,6 +4102,7 @@ - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", -+ "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" -@@ -3854,6 +4115,7 @@ - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", -+ "dev": true, - "funding": [ - { - "type": "individual", -@@ -3868,7 +4130,8 @@ - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", -- "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" -+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", -+ "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", -@@ -3887,6 +4150,7 @@ - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", -+ "dev": true, - "engines": { - "node": ">=0.10.0" - } -@@ -3895,6 +4159,7 @@ - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", -+ "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", -@@ -3911,6 +4176,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", -+ "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, -@@ -3922,6 +4188,7 @@ - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -3930,6 +4197,7 @@ - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", -+ "dev": true, - "engines": { - "node": ">=10" - } -@@ -4038,6 +4306,7 @@ - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", -+ "dev": true, - "bin": { - "semver": "bin/semver.js" - } -@@ -4073,6 +4342,7 @@ - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", -+ "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, -@@ -4084,6 +4354,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -4091,7 +4362,8 @@ - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", -- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" -+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", -+ "dev": true - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", -@@ -4104,12 +4376,14 @@ - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", -- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" -+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", -+ "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -4168,6 +4442,7 @@ - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", -+ "dev": true, - "engines": { - "node": ">=0.10.0" - } -@@ -4176,6 +4451,7 @@ - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", -+ "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" -@@ -4198,6 +4474,7 @@ - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", -+ "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, -@@ -4217,6 +4494,7 @@ - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", -+ "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" -@@ -4229,6 +4507,7 @@ - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", -+ "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", -@@ -4257,6 +4536,7 @@ - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", -+ "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, -@@ -4281,6 +4561,7 @@ - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", -+ "dev": true, - "engines": { - "node": ">=8" - } -@@ -4289,6 +4570,7 @@ - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", -+ "dev": true, - "engines": { - "node": ">=6" - } -@@ -4297,6 +4579,7 @@ - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", -+ "dev": true, - "engines": { - "node": ">=8" - }, -@@ -4308,6 +4591,7 @@ - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", -+ "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, -@@ -4319,6 +4603,7 @@ - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", -+ "dev": true, - "engines": { - "node": ">= 0.4" - }, -@@ -4330,6 +4615,7 @@ - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", -+ "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", -@@ -4347,12 +4633,14 @@ - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", -- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" -+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", -+ "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", -+ "dev": true, - "engines": { - "node": ">=4" - } -@@ -4361,6 +4649,7 @@ - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", -+ "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, -@@ -4377,6 +4666,7 @@ - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", -+ "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", -@@ -4419,6 +4709,7 @@ - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", -+ "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, -@@ -4430,6 +4721,7 @@ - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", -+ "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, -@@ -4443,12 +4735,14 @@ - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", -- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" -+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", -+ "dev": true - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", -+ "dev": true, - "engines": { - "node": ">=4" - } -@@ -4457,6 +4751,7 @@ - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", -+ "dev": true, - "engines": { - "node": ">=10" - }, -@@ -4468,6 +4763,7 @@ - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", -+ "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" -@@ -4488,6 +4784,7 @@ - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", -+ "dev": true, - "funding": [ - { - "type": "opencollective", -@@ -4522,6 +4819,7 @@ - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", -+ "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", -@@ -4534,7 +4832,8 @@ - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", -- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" -+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", -+ "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", -@@ -4548,6 +4847,7 @@ - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", -+ "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } -@@ -4556,6 +4856,7 @@ - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", -+ "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, -@@ -4604,6 +4905,7 @@ - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", -+ "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", -@@ -4637,12 +4939,14 @@ - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", -- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" -+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", -+ "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", -+ "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" -@@ -4683,6 +4987,7 @@ - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", -+ "dev": true, - "engines": { - "node": ">=10" - } -@@ -4690,12 +4995,14 @@ - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", -- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" -+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", -+ "dev": true - }, - "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", -+ "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", -@@ -4713,6 +5020,7 @@ - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", -+ "dev": true, - "engines": { - "node": ">=12" - } -@@ -4721,6 +5029,7 @@ - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", -+ "dev": true, - "engines": { - "node": ">=10" - }, -@@ -4734,6 +5043,7 @@ - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", -+ "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" -@@ -4743,6 +5053,7 @@ - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", -+ "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" -@@ -4752,6 +5063,7 @@ - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", -+ "dev": true, - "requires": { - "color-convert": "^1.9.0" - } -@@ -4760,6 +5072,7 @@ - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", -+ "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", -@@ -4769,17 +5082,20 @@ - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", -- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" -+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", -+ "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", -- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" -+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", -+ "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", -+ "dev": true, - "requires": { - "has-flag": "^3.0.0" - } -@@ -4789,12 +5105,14 @@ - "@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", -- "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==" -+ "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", -+ "dev": true - }, - "@babel/core": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.6.tgz", - "integrity": "sha512-HPIyDa6n+HKw5dEuway3vVAhBboYCtREBMp+IWeseZy6TFtzn6MHkCH2KKYUOC/vKKwgSMHQW4htBOrmuRPXfw==", -+ "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", -@@ -4816,7 +5134,8 @@ - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", -- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" -+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", -+ "dev": true - } - } - }, -@@ -4824,6 +5143,7 @@ - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", -+ "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", -@@ -4835,6 +5155,7 @@ - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", -+ "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", -@@ -4847,6 +5168,7 @@ - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", -+ "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-validator-option": "^7.22.5", -@@ -4858,12 +5180,14 @@ - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", -- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" -+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", -+ "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", -+ "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" -@@ -4873,6 +5197,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", -+ "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } -@@ -4881,6 +5206,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", -+ "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } -@@ -4889,6 +5215,7 @@ - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", -+ "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", -@@ -4903,12 +5230,14 @@ - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", -- "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" -+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", -+ "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", -+ "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } -@@ -4917,6 +5246,7 @@ - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", -+ "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } -@@ -4924,22 +5254,26 @@ - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", -- "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" -+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", -+ "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", -- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" -+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", -+ "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", -- "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==" -+ "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", -+ "dev": true - }, - "@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", -+ "dev": true, - "requires": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", -@@ -4950,6 +5284,7 @@ - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", -+ "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", -@@ -4960,6 +5295,7 @@ - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", -+ "dev": true, - "requires": { - "color-convert": "^1.9.0" - } -@@ -4968,6 +5304,7 @@ - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", -+ "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", -@@ -4977,17 +5314,20 @@ - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", -- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" -+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", -+ "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", -- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" -+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", -+ "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", -+ "dev": true, - "requires": { - "has-flag": "^3.0.0" - } -@@ -4997,12 +5337,14 @@ - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", -- "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" -+ "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", -+ "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } -@@ -5011,6 +5353,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } -@@ -5019,6 +5362,7 @@ - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } -@@ -5027,6 +5371,7 @@ - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } -@@ -5035,6 +5380,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } -@@ -5043,6 +5389,7 @@ - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } -@@ -5051,6 +5398,7 @@ - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } -@@ -5059,6 +5407,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } -@@ -5067,6 +5416,7 @@ - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } -@@ -5075,6 +5425,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } -@@ -5083,6 +5434,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } -@@ -5091,6 +5443,7 @@ - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } -@@ -5099,6 +5452,7 @@ - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } -@@ -5107,6 +5461,7 @@ - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } -@@ -5115,6 +5470,7 @@ - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", -+ "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", -@@ -5125,6 +5481,7 @@ - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", -+ "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", -@@ -5142,6 +5499,7 @@ - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", -+ "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", -@@ -5151,7 +5509,8 @@ - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", -- "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" -+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", -+ "dev": true - }, - "@colors/colors": { - "version": "1.5.0", -@@ -5237,6 +5596,7 @@ - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", -+ "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", -@@ -5248,12 +5608,14 @@ - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", -- "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" -+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", -+ "dev": true - }, - "@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", -+ "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", -@@ -5267,6 +5629,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -5278,6 +5641,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", -+ "dev": true, - "requires": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", -@@ -5313,6 +5677,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -5324,6 +5689,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", -+ "dev": true, - "requires": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -5335,6 +5701,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", -+ "dev": true, - "requires": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" -@@ -5344,6 +5711,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", -+ "dev": true, - "requires": { - "jest-get-type": "^29.4.3" - } -@@ -5352,6 +5720,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", -+ "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@sinonjs/fake-timers": "^10.0.2", -@@ -5365,6 +5734,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", -+ "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", -@@ -5376,6 +5746,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", -+ "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", -@@ -5407,6 +5778,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -5418,6 +5790,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", -+ "dev": true, - "requires": { - "@sinclair/typebox": "^0.25.16" - } -@@ -5426,6 +5799,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", -+ "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", -@@ -5436,6 +5810,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", -+ "dev": true, - "requires": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -5447,6 +5822,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", -+ "dev": true, - "requires": { - "@jest/test-result": "^29.5.0", - "graceful-fs": "^4.2.9", -@@ -5458,6 +5834,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", -+ "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", -@@ -5480,6 +5857,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -5491,6 +5869,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", -+ "dev": true, - "requires": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", -@@ -5504,6 +5883,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -5515,6 +5895,7 @@ - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", -+ "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" -@@ -5523,22 +5904,26 @@ - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", -- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" -+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", -+ "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", -- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" -+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", -+ "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", -- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" -+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", -+ "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", -+ "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" -@@ -5547,7 +5932,8 @@ - "@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", -- "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==" -+ "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", -+ "dev": true - }, - "@pkgjs/parseargs": { - "version": "0.11.0", -@@ -5647,12 +6033,14 @@ - "@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", -- "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" -+ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", -+ "dev": true - }, - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", -+ "dev": true, - "requires": { - "type-detect": "4.0.8" - } -@@ -5661,6 +6049,7 @@ - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", -+ "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0" - } -@@ -5674,6 +6063,7 @@ - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", -+ "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", -@@ -5686,6 +6076,7 @@ - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", -+ "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } -@@ -5694,6 +6085,7 @@ - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", -+ "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" -@@ -5703,6 +6095,7 @@ - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", -+ "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } -@@ -5724,6 +6117,7 @@ - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", - "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", -+ "dev": true, - "requires": { - "@types/jsonfile": "*", - "@types/node": "*" -@@ -5733,6 +6127,7 @@ - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", -+ "dev": true, - "requires": { - "@types/node": "*" - } -@@ -5740,12 +6135,14 @@ - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", -- "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" -+ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", -+ "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", -+ "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } -@@ -5754,6 +6151,7 @@ - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", -+ "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } -@@ -5762,6 +6160,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", -+ "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" -@@ -5771,6 +6170,7 @@ - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", - "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", -+ "dev": true, - "requires": { - "@types/node": "*" - } -@@ -5784,6 +6184,7 @@ - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.7.tgz", - "integrity": "sha512-f5qCBGAn/f0qtRcd4SEn88c8Fp3Swct1731X4ryPKqS61/A3LmmzN8zaEz7hneJvpjFbUUgY7lru/B/7ODTazg==", -+ "dev": true, - "requires": { - "@types/node": "*" - } -@@ -5791,17 +6192,20 @@ - "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", -- "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" -+ "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", -+ "dev": true - }, - "@types/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/sprintf-js/-/sprintf-js-1.1.2.tgz", -- "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==" -+ "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==", -+ "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", -- "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" -+ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", -+ "dev": true - }, - "@types/triple-beam": { - "version": "1.3.2", -@@ -5812,6 +6216,7 @@ - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", -+ "dev": true, - "requires": { - "@types/yargs-parser": "*" - } -@@ -5819,7 +6224,8 @@ - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", -- "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" -+ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", -+ "dev": true - }, - "accepts": { - "version": "1.3.8", -@@ -5834,6 +6240,7 @@ - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", -+ "dev": true, - "requires": { - "type-fest": "^0.21.3" - } -@@ -5841,12 +6248,14 @@ - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", -- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" -+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", -+ "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", -+ "dev": true, - "requires": { - "color-convert": "^2.0.1" - }, -@@ -5855,6 +6264,7 @@ - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", -+ "dev": true, - "requires": { - "color-name": "~1.1.4" - } -@@ -5862,7 +6272,8 @@ - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", -- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" -+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", -+ "dev": true - } - } - }, -@@ -5870,6 +6281,7 @@ - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", -+ "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" -@@ -5879,6 +6291,7 @@ - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", -+ "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, -@@ -5886,7 +6299,8 @@ - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", -- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" -+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", -+ "dev": true - } - } - }, -@@ -5899,6 +6313,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", -+ "dev": true, - "requires": { - "@jest/transform": "^29.5.0", - "@types/babel__core": "^7.1.14", -@@ -5913,6 +6328,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -5924,6 +6340,7 @@ - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", -+ "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", -@@ -5936,6 +6353,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", -+ "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", -@@ -5947,6 +6365,7 @@ - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", -+ "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", -@@ -5966,6 +6385,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", -+ "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" -@@ -5974,7 +6394,8 @@ - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", -- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" -+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", -+ "dev": true - }, - "base64id": { - "version": "2.0.0", -@@ -5985,6 +6406,7 @@ - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", -+ "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" -@@ -5994,6 +6416,7 @@ - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", -+ "dev": true, - "requires": { - "fill-range": "^7.0.1" - } -@@ -6002,6 +6425,7 @@ - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", -+ "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", -@@ -6013,6 +6437,7 @@ - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", -+ "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } -@@ -6021,6 +6446,7 @@ - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", -+ "dev": true, - "requires": { - "node-int64": "^0.4.0" - } -@@ -6028,22 +6454,26 @@ - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", -- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" -+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", -+ "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", -- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" -+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", -+ "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", -- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" -+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", -+ "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001512", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", -- "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==" -+ "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", -+ "dev": true - }, - "chalk": { - "version": "5.2.0", -@@ -6053,22 +6483,26 @@ - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", -- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==" -+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", -+ "dev": true - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", -- "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" -+ "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", -+ "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", -- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" -+ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", -+ "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", -+ "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", -@@ -6078,12 +6512,14 @@ - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", -- "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" -+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", -+ "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", -- "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" -+ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", -+ "dev": true - }, - "color": { - "version": "3.2.1", -@@ -6131,19 +6567,21 @@ - } - }, - "commander": { -- "version": "10.0.0", -- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", -- "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==" -+ "version": "10.0.1", -+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", -+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", -- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" -+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", -+ "dev": true - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", -- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" -+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", -+ "dev": true - }, - "cookie": { - "version": "0.4.2", -@@ -6163,6 +6601,7 @@ - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", -+ "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", -@@ -6180,22 +6619,26 @@ - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", -- "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" -+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", -+ "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", -- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" -+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", -+ "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", -- "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" -+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", -+ "dev": true - }, - "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", -- "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==" -+ "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", -+ "dev": true - }, - "eastasianwidth": { - "version": "0.2.0", -@@ -6206,17 +6649,20 @@ - "electron-to-chromium": { - "version": "1.4.449", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.449.tgz", -- "integrity": "sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ==" -+ "integrity": "sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ==", -+ "dev": true - }, - "emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", -- "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==" -+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", -+ "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", -- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" -+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", -+ "dev": true - }, - "enabled": { - "version": "2.0.0", -@@ -6261,6 +6707,7 @@ - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", -+ "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - }, -@@ -6268,29 +6715,34 @@ - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", -- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" -+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", -+ "dev": true - } - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", -- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" -+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", -+ "dev": true - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", -- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" -+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", -+ "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", -- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" -+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", -+ "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", -+ "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", -@@ -6306,12 +6758,14 @@ - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", -- "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" -+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", -+ "dev": true - }, - "expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", -+ "dev": true, - "requires": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", -@@ -6323,7 +6777,8 @@ - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", -- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" -+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", -+ "dev": true - }, - "fastq": { - "version": "1.15.0", -@@ -6337,6 +6792,7 @@ - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", -+ "dev": true, - "requires": { - "bser": "2.1.1" - } -@@ -6350,6 +6806,7 @@ - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", -+ "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } -@@ -6358,6 +6815,7 @@ - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", -+ "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" -@@ -6399,43 +6857,51 @@ - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", -- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" -+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", -+ "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", -+ "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", -- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" -+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", -+ "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", -- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" -+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", -+ "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", -- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" -+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", -+ "dev": true - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", -- "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" -+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", -+ "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", -- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" -+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", -+ "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", -+ "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", -@@ -6448,7 +6914,8 @@ - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", -- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" -+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", -+ "dev": true - }, - "graceful-fs": { - "version": "4.2.11", -@@ -6459,6 +6926,7 @@ - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", -+ "dev": true, - "requires": { - "function-bind": "^1.1.1" - } -@@ -6466,22 +6934,26 @@ - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", -- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" -+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", -+ "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", -- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" -+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", -+ "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", -- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" -+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", -+ "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", -+ "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" -@@ -6490,12 +6962,14 @@ - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", -- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" -+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", -+ "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", -+ "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" -@@ -6515,6 +6989,7 @@ - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", -+ "dev": true, - "requires": { - "has": "^1.0.3" - } -@@ -6522,17 +6997,20 @@ - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", -- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" -+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", -+ "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", -- "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" -+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", -+ "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", -- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" -+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", -+ "dev": true - }, - "is-stream": { - "version": "2.0.1", -@@ -6542,17 +7020,20 @@ - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", -- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" -+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", -+ "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", -- "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" -+ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", -+ "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", -+ "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", -@@ -6565,6 +7046,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", -+ "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", -@@ -6575,6 +7057,7 @@ - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", -+ "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", -@@ -6585,6 +7068,7 @@ - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", -+ "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" -@@ -6604,6 +7088,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", -+ "dev": true, - "requires": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -6615,6 +7100,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", -+ "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" -@@ -6624,6 +7110,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", -+ "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", -@@ -6651,6 +7138,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6662,6 +7150,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", -+ "dev": true, - "requires": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", -@@ -6681,6 +7170,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6692,6 +7182,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", -+ "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", -@@ -6721,6 +7212,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6732,6 +7224,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", -+ "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", -@@ -6743,6 +7236,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6754,6 +7248,7 @@ - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", -+ "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } -@@ -6762,6 +7257,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", -+ "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", -@@ -6774,6 +7270,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6785,6 +7282,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", -+ "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", -@@ -6797,12 +7295,14 @@ - "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", -- "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==" -+ "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", -+ "dev": true - }, - "jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", -+ "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", -@@ -6822,6 +7322,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", -+ "dev": true, - "requires": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" -@@ -6831,6 +7332,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", -+ "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", -@@ -6842,6 +7344,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6853,6 +7356,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", -+ "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", -@@ -6869,6 +7373,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6880,6 +7385,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", -+ "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", -@@ -6890,17 +7396,20 @@ - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", -+ "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", -- "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==" -+ "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", -+ "dev": true - }, - "jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", -+ "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", -@@ -6917,6 +7426,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6928,6 +7438,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", -+ "dev": true, - "requires": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" -@@ -6937,6 +7448,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", -+ "dev": true, - "requires": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", -@@ -6965,6 +7477,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -6976,6 +7489,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", -+ "dev": true, - "requires": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", -@@ -7005,6 +7519,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -7016,6 +7531,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", -+ "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", -@@ -7046,6 +7562,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -7055,6 +7572,7 @@ - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", -+ "dev": true, - "requires": { - "yallist": "^4.0.0" - } -@@ -7063,6 +7581,7 @@ - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", -+ "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } -@@ -7070,7 +7589,8 @@ - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", -- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" -+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", -+ "dev": true - } - } - }, -@@ -7078,6 +7598,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", -+ "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "@types/node": "*", -@@ -7091,6 +7612,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -7102,6 +7624,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", -+ "dev": true, - "requires": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", -@@ -7114,12 +7637,14 @@ - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", -- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" -+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", -+ "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -7131,6 +7656,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", -+ "dev": true, - "requires": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", -@@ -7146,6 +7672,7 @@ - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" -@@ -7157,6 +7684,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", -+ "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.5.0", -@@ -7168,6 +7696,7 @@ - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", -+ "dev": true, - "requires": { - "has-flag": "^4.0.0" - } -@@ -7177,12 +7706,14 @@ - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", -- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" -+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", -+ "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", -+ "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" -@@ -7191,17 +7722,20 @@ - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", -- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" -+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", -+ "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", -- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" -+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", -+ "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", -- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" -+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", -+ "dev": true - }, - "jsonfile": { - "version": "6.1.0", -@@ -7215,7 +7749,8 @@ - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", -- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" -+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", -+ "dev": true - }, - "kuler": { - "version": "2.0.0", -@@ -7225,17 +7760,20 @@ - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", -- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" -+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", -+ "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", -- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" -+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", -+ "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", -+ "dev": true, - "requires": { - "p-locate": "^4.1.0" - } -@@ -7243,7 +7781,8 @@ - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", -- "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" -+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", -+ "dev": true - }, - "logform": { - "version": "2.5.1", -@@ -7262,6 +7801,7 @@ - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", -+ "dev": true, - "requires": { - "yallist": "^3.0.2" - } -@@ -7270,6 +7810,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", -+ "dev": true, - "requires": { - "semver": "^6.0.0" - } -@@ -7277,12 +7818,14 @@ - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", -- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" -+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", -+ "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", -+ "dev": true, - "requires": { - "tmpl": "1.0.5" - } -@@ -7290,12 +7833,14 @@ - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", -- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" -+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", -+ "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", -+ "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" -@@ -7317,12 +7862,14 @@ - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", -- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" -+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", -+ "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", -+ "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } -@@ -7346,7 +7893,8 @@ - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", -- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" -+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", -+ "dev": true - }, - "negotiator": { - "version": "0.6.3", -@@ -7366,12 +7914,14 @@ - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", -- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" -+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", -+ "dev": true - }, - "node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", -- "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" -+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", -+ "dev": true - }, - "nodemailer": { - "version": "6.9.1", -@@ -7381,12 +7931,14 @@ - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", -- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" -+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", -+ "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", -+ "dev": true, - "requires": { - "path-key": "^3.0.0" - } -@@ -7400,6 +7952,7 @@ - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", -+ "dev": true, - "requires": { - "wrappy": "1" - } -@@ -7416,6 +7969,7 @@ - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", -+ "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } -@@ -7424,6 +7978,7 @@ - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", -+ "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } -@@ -7432,6 +7987,7 @@ - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", -+ "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, -@@ -7440,6 +7996,7 @@ - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", -+ "dev": true, - "requires": { - "p-try": "^2.0.0" - } -@@ -7449,12 +8006,14 @@ - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", -- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" -+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", -+ "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", -+ "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", -@@ -7465,22 +8024,26 @@ - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", -- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" -+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", -+ "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", -- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" -+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", -+ "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", -- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" -+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", -+ "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", -- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" -+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", -+ "dev": true - }, - "path-scurry": { - "version": "1.10.1", -@@ -7503,22 +8066,26 @@ - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", -- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" -+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", -+ "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", -- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" -+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", -+ "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", -- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" -+ "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", -+ "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", -+ "dev": true, - "requires": { - "find-up": "^4.0.0" - } -@@ -7527,6 +8094,7 @@ - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", -+ "dev": true, - "requires": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", -@@ -7536,7 +8104,8 @@ - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", -- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" -+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", -+ "dev": true - } - } - }, -@@ -7544,6 +8113,7 @@ - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", -+ "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" -@@ -7552,12 +8122,14 @@ - "pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", -- "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==" -+ "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", -+ "dev": true - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", -- "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" -+ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", -+ "dev": true - }, - "readable-stream": { - "version": "3.6.2", -@@ -7572,12 +8144,14 @@ - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", -- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" -+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", -+ "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", -+ "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", -@@ -7588,6 +8162,7 @@ - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", -+ "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } -@@ -7595,12 +8170,14 @@ - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", -- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" -+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", -+ "dev": true - }, - "resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", -- "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==" -+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", -+ "dev": true - }, - "reusify": { - "version": "1.0.4", -@@ -7662,7 +8239,8 @@ - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", -- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" -+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", -+ "dev": true - }, - "serialport": { - "version": "10.5.0", -@@ -7689,6 +8267,7 @@ - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", -+ "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } -@@ -7696,12 +8275,14 @@ - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", -- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" -+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", -+ "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", -- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" -+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", -+ "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", -@@ -7714,12 +8295,14 @@ - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", -- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" -+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", -+ "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", -- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" -+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", -+ "dev": true - }, - "socket.io": { - "version": "4.6.1", -@@ -7765,12 +8348,14 @@ - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", -- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" -+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", -+ "dev": true - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", -+ "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" -@@ -7790,6 +8375,7 @@ - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", -+ "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } -@@ -7806,6 +8392,7 @@ - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", -+ "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" -@@ -7815,6 +8402,7 @@ - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", -+ "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", -@@ -7836,6 +8424,7 @@ - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", -+ "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } -@@ -7852,22 +8441,26 @@ - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", -- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==" -+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", -+ "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", -- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" -+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", -+ "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", -- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" -+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", -+ "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", -+ "dev": true, - "requires": { - "has-flag": "^4.0.0" - } -@@ -7875,12 +8468,14 @@ - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", -- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" -+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", -+ "dev": true - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", -+ "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", -@@ -7895,17 +8490,20 @@ - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", -- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" -+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", -+ "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", -- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" -+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", -+ "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", -+ "dev": true, - "requires": { - "is-number": "^7.0.0" - } -@@ -7919,6 +8517,7 @@ - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", -+ "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", -@@ -7934,6 +8533,7 @@ - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", -+ "dev": true, - "requires": { - "yallist": "^4.0.0" - } -@@ -7942,6 +8542,7 @@ - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", -+ "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } -@@ -7949,24 +8550,28 @@ - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", -- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" -+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", -+ "dev": true - } - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", -- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" -+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", -+ "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", -- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" -+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", -+ "dev": true - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", -- "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==" -+ "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", -+ "dev": true - }, - "universalify": { - "version": "2.0.0", -@@ -7977,6 +8582,7 @@ - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", -+ "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" -@@ -7991,6 +8597,7 @@ - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", -+ "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", -@@ -8000,7 +8607,8 @@ - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", -- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" -+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", -+ "dev": true - } - } - }, -@@ -8013,6 +8621,7 @@ - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", -+ "dev": true, - "requires": { - "makeerror": "1.0.12" - } -@@ -8021,6 +8630,7 @@ - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", -+ "dev": true, - "requires": { - "isexe": "^2.0.0" - } -@@ -8057,6 +8667,7 @@ - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", -+ "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", -@@ -8077,12 +8688,14 @@ - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", -- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" -+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", -+ "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", -+ "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" -@@ -8102,17 +8715,20 @@ - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", -- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" -+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", -+ "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", -- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" -+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", -+ "dev": true - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", -+ "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", -@@ -8126,12 +8742,14 @@ - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", -- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" -+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", -+ "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", -- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" -+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", -+ "dev": true - } - } - } -diff --git a/package.json b/package.json -index ccdf84f..86e7f85 100644 ---- a/package.json -+++ b/package.json -@@ -1,8 +1,8 @@ - { - "name": "isbd-emu", - "version": "0.0.1", -- "description": "A simple emulator for Iridium SBD 9602/9603 transceivers", -- "main": "dist/src/index.js", -+ "description": "A simple emulator for Iridium SBD GSS and 960x transceivers", -+ "main": "dist/index.js", - "scripts": { - "test": "npm run build && jest", - "build": "rimraf build/ && tsc --project tsconfig.json", -@@ -10,6 +10,7 @@ - }, - "keywords": [ - "iridium", -+ "gss", - "sbd", - "cli" - ], -diff --git a/scripts/960x.ts b/scripts/960x.ts -deleted file mode 100644 -index bceb4ad..0000000 ---- a/scripts/960x.ts -+++ /dev/null -@@ -1,61 +0,0 @@ --import colors from "colors"; --import * as logger from "../src/logger"; --import { Argument, Command, Option, program } from "commander"; --import { Modem } from "../src/isu/960x"; -- --program -- .version( '0.0.5' ) -- .description( 'A simple emulator for Iridium SBD 960X transceivers' ) -- .option( '-v, --verbose', 'Verbosity level',  -- (_, prev) => prev + 1, 1 ) -- --program.addOption( // TODO: rename -- new Option( '-p, --path ', 'serial port path' ) -- .makeOptionMandatory() ) -- --program.addOption(  -- new Option( '-i, --imei ', 'set ISU IMEI' ) -- .default( '527695889002193' ) ) -- --program.addOption( -- new Option( '--gss-host ', 'GSS Socket host' ) -- .default( 'localhost' ) ) -- --program.addOption( -- new Option( '--gss-port ', 'GSS Socket port' ) -- .default( 10802 ).argParser( v => parseInt( v ) ) ) -- --program.addOption( -- new Option( '--gss-uri ', 'GSS Socket URI' ) -- .conflicts([ 'gssPort', 'gssHost' ]) ) -- --const log = logger.create( 'main' ); -- --async function main() { -- -- program.parse(); -- const opts = program.opts(); -- -- logger.setLevel( opts.verbose ); -- -- if ( !/[0-9]{15}/.test( opts.imei ) ) { -- log.error( `Given IMEI is not valid` ); -- process.exit( 1 ); -- } -- -- const modem = new Modem({ -- gss: { -- port: opts.gssPort, -- host: opts.gssHost, -- }, -- dte: { -- path: opts.path, -- }, -- imei: opts.imei, -- }); -- --} -- --main(); -- -- -diff --git a/scripts/decoder.ts b/scripts/decoder.ts -deleted file mode 100644 -index cbb8500..0000000 ---- a/scripts/decoder.ts -+++ /dev/null -@@ -1,75 +0,0 @@ --#!/usr/bin/node -- --import fs from "fs-extra"; --import colors from "colors"; --import * as logger from "../src/logger" --import { Argument, Command, Option, program } from "commander"; --import { decodeMoMessage, decodeMtMessage } from "../src/gss/msg/decoder"; --import { Message } from "../src/gss/msg"; --import { Readable } from "stream"; --import { collectInputStream } from "./utils"; -- --const log = logger.create( 'main' ); -- --program -- .version( '0.0.3' ) -- .description( 'Message decoder for Iridium SBD' ) -- --program.addArgument(  -- new Argument( '[file]', 'SBD message file path' ) ) -- --program.addOption(  -- new Option( '--pretty', 'Output will be more human readable' ) ) -- --async function main() { -- -- program.parse(); -- const opts = program.opts(); -- -- logger.setProgramName( 'decoder' ); -- -- const [ srcFilePath ] = program.args; -- -- if ( !process.stdout.isTTY ) { -- logger.disableTTY(); -- } --  -- let inputStream: Readable; --  -- if ( srcFilePath ) { -- inputStream = fs.createReadStream( srcFilePath ); -- } else { -- inputStream = process.stdin; -- } -- -- collectInputStream( inputStream ).then( buffer => { -- -- const decoders = [ -- decodeMoMessage, -- decodeMtMessage -- ]; -- -- let message: Message | null = null; -- -- for ( let decoder of decoders ) { -- message = decoder( buffer ); -- if ( message ) { -- process.stdout.write( -- Message.toJSON( message, opts.pretty ) + '\n' ); -- break; -- } -- } -- -- if ( message ) { -- log.success( 'Message successfully decoded' ); -- } else { -- log.error( 'Decode failed, invalid binary format' ); -- } -- -- }).catch( err => { -- log.error( `Read error => ${ err.message }` ); -- })  -- --} -- --main(); -\ No newline at end of file -diff --git a/scripts/encoder.ts b/scripts/encoder.ts -deleted file mode 100644 -index b0cccc8..0000000 ---- a/scripts/encoder.ts -+++ /dev/null -@@ -1,134 +0,0 @@ --#!/usr/bin/node -- --import fs from "fs-extra"; --import colors from "colors"; --import * as logger from "../src/logger" --import { Argument, Command, Option, program } from "commander"; --import { Message } from "../src/gss/msg"; --import { TCPTransport } from "../src/gss/transport/tcp"; --import { encodeMoMsg, encodeMtMessage } from "../src/gss/msg/encoder"; --import { Readable } from "stream"; --import { collectInputStream } from "./utils"; -- --const log = logger.create( 'main' ); -- --program -- .version( '0.0.3' ) -- .description( 'Message encoder for Iridium SBD' ) -- --program.addArgument(  -- new Argument( '[file]', 'JSON message file' ) ); -- --function processMtMessage( mtMsg: Message.MT ) { --  -- const encodedBuffer = encodeMtMessage( mtMsg ); -- -- if ( process.stdout.isTTY ) { -- -- let outFileName = 'MT.sbd'; -- -- if ( mtMsg.header ) { -- outFileName = `MT_${  -- mtMsg.header.imei  -- }_${  -- mtMsg.header.ucmid.toString( 'hex' ).toUpperCase() -- }.sbd` -- } else if ( mtMsg.confirmation ) { -- outFileName = `MTC_${ -- mtMsg.confirmation.imei -- }_${ -- mtMsg.confirmation.autoid -- }.sbd` -- } -- -- return fs.writeFile( outFileName, encodedBuffer ).then( () => { -- log.success( `MT message written to ${ colors.green( outFileName ) }` ); -- }).catch( err => { -- log.error( `Could not write MT message ${  -- colors.red( outFileName )  -- } => ${ err.message }` ); -- }) -- -- } else { -- process.stdout.write( encodedBuffer ); -- log.success( `MT message encoded` ); -- } -- --} -- -- --function processMoMessage( moMsg: Message.MO ) { --  -- const encodedBuffer = encodeMoMsg( moMsg ); -- -- if ( process.stdout.isTTY ) { -- -- let outFileName = 'MO.sbd'; -- -- if ( moMsg.header ) { -- outFileName = `MO_${  -- moMsg.header.imei  -- }_${  -- moMsg.header.momsn.toString().padStart( 6, '0' ) -- }.sbd` -- } -- -- return fs.writeFile( outFileName, encodedBuffer ).then( () => { --  -- log.success( `MO message written to ${  -- colors.green( outFileName )  -- }` ); -- -- }).catch( err => { -- log.error( `Could not write MO message ${  -- colors.red( outFileName )  -- } => ${ err.message }` ); -- }) -- -- } else { -- process.stdout.write( encodedBuffer ); -- log.success( `MO message encoded` ); -- } -- --} -- --async function main() { -- -- program.parse(); -- -- logger.setProgramName( 'encoder' ); --  -- if ( !process.stdout.isTTY ) { -- logger.disableTTY(); -- } --  -- let inputStream: Readable; -- const [ srcFilePath ] = program.args; --  -- if ( srcFilePath ) { -- inputStream = fs.createReadStream( srcFilePath ); -- } else { -- inputStream = process.stdin; -- } -- -- collectInputStream( inputStream ).then( jsonBuffer => { -- -- const msgObj = Message.fromJSON( jsonBuffer.toString() ); -- -- if ( Message.isMT( msgObj ) ) { -- processMtMessage( msgObj as Message.MT ); -- } else if ( Message.isMO( msgObj ) ) { -- processMoMessage( msgObj as Message.MO ); -- } else { -- log.error( `Invalid JSON, could not recognize message type` ); -- } -- -- }).catch( err => { -- log.error( `Read error => ${ err.message }` ); -- }) -- --} -- -- -- --main(); -\ No newline at end of file -diff --git a/scripts/gss.ts b/scripts/gss.ts -deleted file mode 100644 -index 4ebff68..0000000 ---- a/scripts/gss.ts -+++ /dev/null -@@ -1,128 +0,0 @@ --import colors from "colors"; --import * as logger from "../src/logger"; --import { Argument, Command, Option, program } from "commander"; --import { Transport } from "../src/gss/transport"; --import { SMTPTransport } from "../src/gss/transport/smtp"; --import { TCPTransport } from "../src/gss/transport/tcp"; --import { GSS } from "../src/gss"; -- --const log = logger.create( 'main' ); -- --program -- .version( '0.0.2' ) -- .description( 'A simple emulator for Iridium GSS' ) -- .option( '-v, --verbose', 'Verbosity level',  -- (_, prev) => prev + 1, 1 ) -- --program.addOption( -- new Option( '--mo-smtp-host ', 'MO SMTP transport host' ) ) -- --program.addOption( -- new Option( '--mo-smtp-port ', 'MO SMTP transport port' ) -- .default( 25 ).argParser( v => parseInt( v ) ) ) -- --program.addOption( -- new Option( '--mo-smtp-user ', 'MO SMTP transport username' ) ) -- --program.addOption( -- new Option( '--mo-smtp-password ', 'MO SMTP transport password' ) ) -- --program.addOption( -- new Option( '--mo-smtp-to ', 'MO SMTP transport destination address' ) ) -- --program.addOption( -- new Option( '--mo-tcp-host ', 'MO TCP transport host' ) -- .default( 'localhost' ) ) -- --program.addOption( -- new Option( '--mo-tcp-port ', 'MO TCP transport port' ) -- .default( 10801 ).argParser( v => parseInt( v ) ) ) -- --program.addOption( -- new Option( '--mt-server-port ', 'MT server port' ) -- .default( 10800 ).argParser( v => parseInt( v ) ) ) -- --program.addOption( -- new Option( '--mo-server-port ', 'MO server port' ) -- .default( 10802 ).argParser( v => parseInt( v ) ) ) -- --async function main() { -- -- program.parse(); -- const opts = program.opts(); -- -- logger.setLevel( opts.verbose ); -- -- const transports: Transport[] = [] -- -- -- let smtpTransport: SMTPTransport | undefined = undefined; -- -- if ( opts.moSmtpUser && opts.moSmtpHost ) { -- -- const smtpOpts = { -- host: opts.moSmtpHost, -- port: opts.moSmtpPort, -- user: opts.moSmtpUser, -- password: opts.moSmtpPassword, -- to: opts.moSmtpTo, -- } as SMTPTransport.Options; --  -- smtpTransport = new SMTPTransport( smtpOpts ) -- transports.push( smtpTransport ); -- -- } -- -- let tcpTransport: TCPTransport | undefined = undefined; -- -- if ( opts.moTcpHost && opts.moTcpPort ) { --  -- const tcpOpts: TCPTransport.Options = { -- host: opts.moTcpHost, -- port: opts.moTcpPort, -- } -- -- tcpTransport = new TCPTransport( tcpOpts ); -- transports.push( tcpTransport ); --  -- } -- -- if ( transports.length === 0 ) { -- log.warn( `No MO transports defined` ); -- } else { -- -- if ( tcpTransport ) { -- log.info( `Using MO TCP transport ${ -- colors.green( opts.moTcpHost ) -- }:${ -- colors.yellow( opts.moTcpPort ) -- }` ) -- } -- -- if ( smtpTransport ) { -- log.info( `Using MO SMTP transport ${ -- colors.green( opts.moSmtpHost ) -- }:${ -- colors.yellow( opts.moSmtpPort ) -- }` ) -- } -- } -- -- const gss = new GSS({ // gss instance -- transports: transports, -- mtServer: { -- port: opts.mtServerPort, -- transport: tcpTransport, -- }, -- moServer: { -- port: opts.moServerPort -- }, -- }) -- -- // console.log( fs.readFileSync( path.join( __dirname, '../../ascii/gss.txt' ), 'ascii' ) ) -- --} -- --main(); -- -- -diff --git a/scripts/transport.ts b/scripts/transport.ts -deleted file mode 100644 -index daef69a..0000000 ---- a/scripts/transport.ts -+++ /dev/null -@@ -1,143 +0,0 @@ --#!/usr/bin/node -- --import fs from "fs-extra"; --import colors from "colors"; --import * as logger from "../src/logger" --import { Argument, Command, Option, program } from "commander"; --import { Message } from "../src/gss/msg"; --import { TCPTransport } from "../src/gss/transport/tcp"; --import { decodeMoMessage, decodeMtMessage } from "../src/gss/msg/decoder"; --import { encodeMoMsg, encodeMtMessage } from "../src/gss/msg/encoder"; --import { Readable, Stream } from "stream"; --import { ReadStream } from "fs"; --import { collectInputStream } from "./utils"; -- --const log = logger.create( 'main' ); -- --program -- .version( '0.0.2' ) -- .description( 'Iridium SBD message transporter' ) -- --program.addArgument(  -- new Argument( '[file]', 'SBD binary message file' ) ); -- --program.addOption( -- new Option( '--tcp-host ', 'TCP transport host' ) -- .default( 'localhost' ) ) -- --program.addOption( -- new Option( '--tcp-port ', 'TCP transport port' ) -- .default( 10800 ).argParser( v => parseInt( v ) ) ) -- --function writeMtConfirmation( mtConfirm: Message.MT.Confirmation, buffer: Buffer ) { -- -- if ( process.stdout.isTTY ) { --  -- const outFileName = `MTC_${  -- mtConfirm.imei -- }_${  -- mtConfirm.autoid  -- }.sbd` -- -- fs.writeFile( outFileName, buffer ).then( () => { -- -- log.success( `MT confirmation message written to ${  -- colors.green( outFileName )  -- }` ); -- -- }).catch( err => { -- log.error( `Could not write MT confirmation message => ${ err.message }`) -- }) -- -- } else { -- log.success( `MT confirmation received` ); -- process.stdout.write( buffer ); -- } -- --} -- --function processMtMessage( transport: TCPTransport, mtReqBuff: Buffer ) { -- -- log.info( `Sending MT message ...` ); -- -- return transport.sendBuffer( mtReqBuff, { -- waitResponse: true -- }).then( mtRespBuff => { -- -- const mtMsg = decodeMtMessage( mtRespBuff ); -- -- if ( mtMsg && mtMsg.confirmation ) { -- writeMtConfirmation( mtMsg.confirmation, mtRespBuff ); -- } else { -- log.error( `Could not decode MT confirmation message` ); -- } -- -- }).catch( err => { -- log.error( `Could not send message => ${ err.message }` ); -- }) -- --} -- --function processMoMessage( transport: TCPTransport, reqBuff: Buffer ) { -- -- log.info( `Sending MO message ...` ); -- -- return transport.sendBuffer( reqBuff ).then(() => { -- log.success( `MO message sent` ); -- }).catch( err => { -- log.error( `Could not send MO message => ${ err.message }` ); -- }) -- --} -- -- --async function main() { --  -- program.parse(); --  -- const programArgs = program.args; -- const opts = program.opts(); -- -- logger.setProgramName( 'transport' ); --  -- if ( !process.stdout.isTTY ) { -- logger.disableTTY(); -- } --  -- let inputStream: Readable; -- const [ srcFilePath ] = programArgs; -- -- if ( srcFilePath ) { -- inputStream = fs.createReadStream( srcFilePath ); -- } else { -- inputStream = process.stdin; -- } -- -- collectInputStream( inputStream ).then( buffer => { -- -- const transport = new TCPTransport({ -- host: opts.tcpHost, -- port: opts.tcpPort, -- }) -- -- let decodedMsg: Message | null = null -- -- if ( ( decodedMsg = decodeMtMessage( buffer ) ) ) { -- // const mtMsg = decodedMsg as Message.MT; -- processMtMessage( transport, buffer ); -- } else if ( ( decodedMsg = decodeMoMessage( buffer ) )) { -- // const moMsg = decodedMsg as Message.MO; -- processMoMessage( transport, buffer ); -- } else { -- log.error( `Input message not recognized` ); -- } -- -- }).catch( err => { -- log.error( `Read error => ${ err.message }` ); -- }) --  --} -- -- -- --main(); -\ No newline at end of file -diff --git a/scripts/utils.ts b/scripts/utils.ts -deleted file mode 100644 -index e13e94b..0000000 ---- a/scripts/utils.ts -+++ /dev/null -@@ -1,23 +0,0 @@ --import { Readable } from "stream"; -- --export function collectInputStream( inputStream: Readable ) { --  -- return new Promise( (resolve, reject) => { --  -- const chunks: Buffer[] = []; --  -- inputStream.on( 'error', err => { -- reject( err ); -- }) --  -- inputStream.on( 'data', chunk => { -- chunks.push( chunk ); -- }) --  -- inputStream.on( 'end', () => { -- resolve( Buffer.concat( chunks ) ); -- }); -- -- }); -- --} -\ No newline at end of file -diff --git a/src/at/cmd.ts b/src/at/cmd.ts -index 0f896bb..8cfcf1f 100644 ---- a/src/at/cmd.ts -+++ b/src/at/cmd.ts -@@ -1,7 +1,7 @@ - import * as logger from "../logger"; - import type { ATInterface } from "./interface"; -  --const log = logger.create( 'at-cmd' ); -+const log = logger.create( __filename ); -  - export class ATCmd { -  -diff --git a/src/at/interface.ts b/src/at/interface.ts -index e16ca1c..092ab16 100644 ---- a/src/at/interface.ts -+++ b/src/at/interface.ts -@@ -1,5 +1,5 @@ - import * as logger from "../logger" --import colors, { underline } from "colors"; -+import Colors from "colors"; - import { SerialPort } from "serialport"; - import { ATCmd } from "./cmd"; -  -@@ -17,7 +17,7 @@ enum ATIStatus { - PROCESSING, - }; -  --const log = logger.create( 'at-interface' ); -+const log = logger.create( __filename ); -  - export class ATInterface { -  -@@ -48,14 +48,19 @@ export class ATInterface { - this.enqueuedLines = {} -  - this.sp = new SerialPort({  -- path: serialPortOpts.path || '/dev/null',  -+ path: serialPortOpts.path || '/tmp/tty',  - baudRate: serialPortOpts.baudRate || 115200, - autoOpen: typeof serialPortOpts.path === 'string', - }, err => { -+ - if ( err ) { -- log.error( err.message ) -+ log.error( `AT interface failed on ${  -+ Colors.red( this.sp.path )  -+ }: ${ err.message }` ); - } else { -- log.success( `AT Interface ready` ); -+ log.info( `AT interface ready on ${  -+ Colors.yellow( this.sp.path )  -+ }` ); - } - }); -  -@@ -166,9 +171,9 @@ export class ATInterface { - if ( promise ) { -  - log.debug( `Processing command: [${ -- colors.bold.cyan( cmd.fqn.toUpperCase() ) -+ Colors.bold.cyan( cmd.fqn.toUpperCase() ) - }] ${ -- colors.blue( this.escapeLine( atCmdStr ) ) -+ Colors.blue( this.escapeLine( atCmdStr ) ) - }` ) -  - promise.then( str => { -@@ -198,7 +203,7 @@ export class ATInterface { - } -  - log.error( `Unknown command: ${ -- colors.red( this.escapeLine( atCmdStr ) ) -+ Colors.red( this.escapeLine( atCmdStr ) ) - }` ) -  - this.status = ATIStatus.WAITING; -@@ -266,7 +271,7 @@ export class ATInterface { - writeLine( line: string ) { -  - log.debug( `Writing line: ${  -- colors.blue( this.escapeLine( line ) )  -+ Colors.blue( this.escapeLine( line ) )  - }` ) -  - this.writeRaw( Buffer.from(  -diff --git a/src/gss/index.ts b/src/gss/index.ts -index 4888b7e..e5cf943 100644 ---- a/src/gss/index.ts -+++ b/src/gss/index.ts -@@ -10,6 +10,8 @@ import { MTServer } from "./servers/mt"; - import { TCPTransport } from "./transport/tcp"; - import { IE_MO_CONFIRMATION_LEN, Message } from "./msg"; -  -+const log = logger.create( __filename ); -+ - interface SubscriberUnit { - momsn: number; - mtmsn: number; -@@ -18,8 +20,6 @@ interface SubscriberUnit { - sessionsQueue: queueAsPromised; - } -  --const log = logger.create( 'gss' ); -- - export class GSS { -  - private autoId: number = 0; -diff --git a/src/gss/servers/isu/index.ts b/src/gss/servers/isu/index.ts -index a4ac518..5736ea7 100644 ---- a/src/gss/servers/isu/index.ts -+++ b/src/gss/servers/isu/index.ts -@@ -10,7 +10,7 @@ import EventEmitter from "events"; - import * as logger from "../../../logger"; - import { GSS } from "../.."; -  --const log = logger.create( 'isu-server' ); -+const log = logger.create( __filename ); -  - // https://stackoverflow.com/a/39145058 - // export declare interface SUServer { -@@ -48,7 +48,7 @@ export class ISUServer extends EventEmitter { - this.socketServer = new sio.Server( this.httpServer ); -  - this.httpServer.listen( options.port, () => { -- log.success( `ISU server ready, port: ${ -+ log.info( `ISU server ready, port: ${ - colors.yellow( options.port.toString() ) - }` ); - }) -diff --git a/src/gss/servers/mt/index.ts b/src/gss/servers/mt/index.ts -index 9c5c731..0c4dc8f 100644 ---- a/src/gss/servers/mt/index.ts -+++ b/src/gss/servers/mt/index.ts -@@ -9,7 +9,7 @@ import { decodeMtMessage } from "../../msg/decoder"; - import { Message } from "../../msg"; - import { encodeMtMessage } from "../../msg/encoder"; -  --const log = logger.create( 'mt-server' ); -+const log = logger.create( __filename ); -  - export class MTServer extends EventEmitter { -  -@@ -34,7 +34,7 @@ export class MTServer extends EventEmitter { - this.tcpServer = net.createServer(); -  - this.tcpServer.listen( options.port, () => { -- log.success( `MT server ready, port: ${ -+ log.info( `MT server ready, port: ${ - colors.yellow( options.port.toString() ) - }` ); - }) -diff --git a/src/gss/transport/file.ts b/src/gss/transport/file.ts -index 5431788..86c17e8 100644 ---- a/src/gss/transport/file.ts -+++ b/src/gss/transport/file.ts -@@ -1,11 +1,5 @@ - import fs from "fs-extra"; --import colors from "colors"; --import net, { Socket } from "net"; -- - import { Transport } from "."; --import { encodeMoMsg } from "../msg/encoder"; --import { Message } from "../msg"; --import stream from "stream"; -  -  - export class FileTransport extends Transport { -diff --git a/src/isu/960x.ts b/src/isu/960x.ts -index 904daec..5329142 100644 ---- a/src/isu/960x.ts -+++ b/src/isu/960x.ts -@@ -13,10 +13,12 @@ import { - CMD_SBDWB,  - CMD_SBDWT  - } from "./commands"; --import { GSS } from "../gss"; -  -+import { GSS } from "../gss"; - import * as sio from "socket.io-client"; -  -+const log = logger.create( __filename ); -+ - export interface ModemOptions { -  - imei?: string; -@@ -44,8 +46,6 @@ interface CIEV { - sigq: number; - }; -  --const log = logger.create( '960x' ); -- - // TODO: create a parent class named Modem and rename this to SBDModem - export class Modem { -  -@@ -115,7 +115,6 @@ export class Modem { - ? options.gss.uri - : `ws://${ options.gss.host }:${ options.gss.port }`; -  -- - this.momsn = 0; - this.mtmsn = 0; -  -diff --git a/src/logger.ts b/src/logger.ts -index 7a7cf3f..f157097 100644 ---- a/src/logger.ts -+++ b/src/logger.ts -@@ -1,18 +1,16 @@ --import colors from "colors" --import winston, { LeveledLogMethod, Logger } from "winston"; -+import path from "path"; -+import Colors from "colors"; -+import winston, { Logger } from "winston"; -  - interface CustomLogger extends Logger { -- success: LeveledLogMethod, -+// success: LeveledLogMethod, - setLevel: ( lvl: number | string ) => CustomLogger, - } -  --let programName = ''; -- --const levels: { -+export const levels: { - [key: string]: number - } = { -- error: 0, -- success: 1, -+ error: 1, - warn: 2, - info: 3, - debug: 4, -@@ -21,24 +19,22 @@ const levels: { - const levelFormat: { - [key: string]: string - } = { -- "error": `[ ${colors.bold.red("ER")} ]`, -- "info": `[${colors.bold.blue("INFO")}]`, -- "warn": `[${colors.bold.yellow("WARN")}]`, -- "success": `[ ${colors.bold.green("OK")} ]`, -- "debug": `[${colors.bold.magenta("DBUG")}]`, -+ "error": `[${Colors.bold.red("ERR")}]`, -+ "info": `[${Colors.bold.blue("INF")}]`, -+ "warn": `[${Colors.bold.yellow("WRN")}]`, -+ "debug": `[${Colors.bold.magenta("DBG")}]`, - } -  - const consoleTransport = new winston.transports.Console({  -- stderrLevels: [ 'error', 'success', 'warn', 'info', 'debug' ]  -+ stderrLevels: [ 'error', 'warn', 'info', 'debug' ]  - }) -  - const ttyConsoleTransport = new winston.transports.Console({ - stderrLevels: [ 'error' ]  - }) -  -- - const logger = winston.createLogger({ -- level: 'debug', -+ level: 'info', - levels, - format: winston.format.combine( - // winston.format.label({ label: 'immoliste' }), -@@ -55,27 +51,21 @@ const logger = winston.createLogger({ - timestamp, moduleName, level, message, ...args - } = info; -  -- let progNameFormat = '@'; -- -- if ( programName ) { -- progNameFormat = `${ colors.bold( programName ) }` -- } -+ // if ( programName ) { -+ // progNameFormat = `${ colors.bold( programName ) }` -+ // } -  - let moduleNameFormat = '' -  -- if ( moduleName ) { -- moduleNameFormat = `${ colors.magenta( moduleName ) }` -+ if ( moduleName && logger.level === 'debug' ) { -+ moduleNameFormat = ` ${ Colors.magenta( moduleName ) }:` - } -  -- return `${  -- timestamp  -- } ${  -+ return `${ - levelFormat[ level ]  -- } ${  -- progNameFormat  -- } ${  -- moduleNameFormat  -- }: ${ message } ${ -+ }${ -+ moduleNameFormat -+ } ${ message } ${ - Object.keys( args ).length ? JSON.stringify( args, null, 2 ) : '' - }`; -  -@@ -90,40 +80,36 @@ const logger = winston.createLogger({ -  - }) as CustomLogger; -  -- - export function disableTTY() { -- logger.remove( ttyConsoleTransport ).add( consoleTransport ); -+ logger.remove( ttyConsoleTransport ) -+ .add( consoleTransport ); - return logger; - } -  - export function setLevel( targetLevel: number | string ) { -  -- let level = 'debug'; -+ let strLevel = 'debug'; -  - if ( typeof targetLevel === 'string' ) { -- level = targetLevel; -- } else {  -+ strLevel = targetLevel; -+ } else { - for ( let key in levels ) { - if ( levels[ key ] === targetLevel ) { -- level = key; -+ strLevel = key; - break; - } - } - } -  -- logger.level = level; -+ logger.level = strLevel; -  - return logger; - } -  --export function create( moduleName?: string ) { -+export function create( moduleName: string ) { - return logger.child({ -- moduleName -+ moduleName: path.relative( __filename, moduleName ) - }) as CustomLogger; - }; -  --export function setProgramName( name: string ) { -- programName = name; --}; -- --export default logger; -\ No newline at end of file -+export default logger; -diff --git a/test/at-cmd-test.ts b/test/at-cmd-test.ts -deleted file mode 100644 -index cc9185d..0000000 ---- a/test/at-cmd-test.ts -+++ /dev/null -@@ -1,49 +0,0 @@ --import { ATCmd } from '../src/at/cmd'; --import { ATInterface } from '../src/at/interface'; --import { CMD_AT, CMD_ECHO, CMD_VERBOSE } from '../src/at/commands'; -- --describe( 'AT Interface command test', () => { --  -- // logger.transports.forEach( t => t.silent = true ) -- -- const atInterface = new ATInterface({ -- path: null, -- baudRate: 19200, -- }); -- -- const expectCmd = (  -- cmd: ATCmd, cmdStr: string -- ) => {  -- return expect( cmd.test( atInterface, cmdStr ) ) -- } -- -- test( 'AT test', () => { -- expectCmd( CMD_AT, 'at\r' ).toBeTruthy(); -- expectCmd( CMD_AT, 'AT\r' ).toBeTruthy(); -- expectCmd( CMD_AT, 'a\r' ).toBeUndefined(); -- expectCmd( CMD_AT, 't\r' ).toBeUndefined(); -- expectCmd( CMD_AT, '\r' ).toBeUndefined(); -- }); --  -- test( 'AT echo', () => { -- expectCmd( CMD_ECHO, 'ate\r' ).toBeTruthy() -- expect( atInterface.echo ).toBeFalsy() --  -- expectCmd( CMD_ECHO, 'ate0\r' ).toBeTruthy() -- expect( atInterface.echo ).toBeFalsy() --  -- expectCmd( CMD_ECHO, 'ate1\r' ).toBeTruthy() -- expect( atInterface.echo ).toBeTruthy() -- -- expectCmd( CMD_ECHO, 'ate1o\r' ).toBeUndefined() -- }) -- -- test( 'AT verbose', () => { -- expectCmd( CMD_VERBOSE, 'atv0\r' ).toBeTruthy() -- expect( atInterface.verbose ).toBeFalsy() --  -- expectCmd( CMD_VERBOSE, 'atv\r' ).toBeTruthy() -- expect( atInterface.verbose ).toBeFalsy() -- }) -- --}); -diff --git a/test/decode-test.ts b/test/decode-test.ts -deleted file mode 100644 -index 5e50abf..0000000 ---- a/test/decode-test.ts -+++ /dev/null -@@ -1,54 +0,0 @@ --import moment from 'moment'; --import { GSS } from '../src/gss'; --import { Message } from '../src/gss/msg'; --import { encodeMoMsg } from '../src/gss/msg/encoder'; --import { decodeMoMessage } from '../src/gss/msg/decoder'; -- --describe( 'ISBD Direct IP message decoding tests', () => { --  -- const sampleData = { -- imei: "105170868074050", -- location: GSS.generateUnitLocation(), -- payload: Buffer.from( "This is a test message" ), -- }; -- -- test( 'MO message bijection test', () => { -- -- const moMsg: Message.MO = { -- header: { -- cdr: 0, -- imei: sampleData.imei, -- status: 0, -- momsn: 0, -- mtmsn: 0, -- time: moment() -- }, -- location: sampleData.location, -- payload: { -- payload: sampleData.payload, -- } -- } -- -- let oldDecodedMsg = moMsg; -- -- for ( let i=0; i < 10; i++ ) { -- const moEncoded = encodeMoMsg( oldDecodedMsg ); -- const moDecoded = decodeMoMessage( moEncoded ); --  -- expect( moDecoded ).toBeTruthy(); --  -- if ( moDecoded ) { -- oldDecodedMsg = moDecoded -- } -- -- } --  -- expect( oldDecodedMsg.header?.imei ).toBe( sampleData.imei ) -- expect( oldDecodedMsg.location?.cepRadius ).toBe( sampleData.location.cepRadius ); -- -- expect( oldDecodedMsg.location?.lat ).toStrictEqual( sampleData.location.lat ); -- expect( oldDecodedMsg.location?.lon ).toStrictEqual( sampleData.location.lon ); -- -- }) -- --}); -diff --git a/test/encode-test.ts b/test/encode-test.ts -deleted file mode 100644 -index 8f998fb..0000000 ---- a/test/encode-test.ts -+++ /dev/null -@@ -1,44 +0,0 @@ --import {  -- IE_H_LEN,  -- IE_MO_HEADER_LEN,  -- IE_MO_LOCATION_LEN,  -- MSG_H_LEN,  -- Message  --} from '../src/gss/msg'; --import moment from 'moment'; --import { GSS } from '../src/gss'; --import { encodeMoMsg } from '../src/gss/msg/encoder'; -- --describe( 'ISBD Direct IP message encoding tests', () => { --  -- const moMsgPayload = Buffer.from( "This is a test message" ); -- -- const moMsg: Message.MO = { -- header: { -- cdr: 0, -- imei: "000000000000000", -- status: 0, -- momsn: 15, -- mtmsn: 25, -- time: moment() -- }, -- location: GSS.generateUnitLocation(), -- payload: { -- payload: moMsgPayload, -- } -- } -- -- test( 'MO message length', () => { -- -- const encoded = encodeMoMsg( moMsg ); --  -- expect( encoded.length ) -- .toBe(  -- MSG_H_LEN  -- + IE_H_LEN + IE_MO_HEADER_LEN  -- + IE_H_LEN + IE_MO_LOCATION_LEN -- + IE_H_LEN + moMsgPayload.length ); -- -- }) -- --}); -diff --git a/transport.js b/transport.js -deleted file mode 120000 -index c3693e4..0000000 ---- a/transport.js -+++ /dev/null -@@ -1 +0,0 @@ --dist/scripts/transport.js -\ No newline at end of file -diff --git a/tsconfig.dist.json b/tsconfig.dist.json -index 059284e..b48a658 100644 ---- a/tsconfig.dist.json -+++ b/tsconfig.dist.json -@@ -9,8 +9,11 @@ - "sourceMap": false - }, - "include": [ -- "./src/**/*.ts", -- "./scripts/**/*.ts", -+ "./src/**/*.ts" - ], -- "exclude": ["node_modules"] -+ "exclude": [ -+ "node_modules", -+ "./src/test/**/*.ts", -+ "./src/scripts/**/*.ts" -+ ] - } -diff --git a/tsconfig.json b/tsconfig.json -index 1aa396b..62f0491 100644 ---- a/tsconfig.json -+++ b/tsconfig.json -@@ -10,8 +10,6 @@ - }, - "include": [ - "./src/**/*.ts", -- "./test/**/*.ts", -- "./scripts/**/*.ts" - ], - "exclude": ["node_modules"] - } diff --git a/dist/at/interface.js b/dist/at/interface.js index f54bd2c..5547f9c 100644 --- a/dist/at/interface.js +++ b/dist/at/interface.js @@ -39,6 +39,7 @@ var ATIStatus; })(ATIStatus || (ATIStatus = {})); ; const log = logger.create(__filename); +// TODO: rename to AT Server ... class ATInterface { constructor(serialPortOpts) { this.commands = []; diff --git a/socat.sh b/socat.sh deleted file mode 100755 index 61bc347..0000000 --- a/socat.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -socat -dd pty,link=/tmp/tty,raw,echo=0 pty,link=/tmp/960x,raw,echo=0