From 2160bf540ee04f2f6cd8870da5e6ce28b7228215 Mon Sep 17 00:00:00 2001 From: blackholegalaxy Date: Mon, 20 Jan 2020 12:13:23 -0500 Subject: [PATCH] feat(init): create api --- .editorconfig | 13 + .github/workflows/branch-master.yml | 82 + .gitignore | 4 + .nvmrc | 1 + LICENSE | 30 + README.md | 79 + jest.config.js | 24 + nodemon.json | 19 + package.json | 53 + scripts/clean-pkg.js | 14 + src/api.ts | 85 + src/lib/convert/apply-conversion.ts | 33 + src/lib/convert/helpers/hexadecimal.ts | 16 + src/lib/convert/mappings/engine-type.ts | 18 + src/lib/convert/mappings/index.ts | 33 + src/lib/convert/mappings/lights.ts | 17 + .../convert/mappings/nearest-airports-ids.ts | 27 + .../convert/mappings/precipitation-type.ts | 12 + .../mappings/runway-surface-condition.ts | 14 + src/lib/convert/mappings/seasons.ts | 14 + src/lib/convert/mappings/units/ftsec-kt.ts | 9 + src/lib/convert/mappings/units/index.ts | 1 + src/lib/offsets/airport/pushback.ts | 50 + src/lib/offsets/airport/runway.ts | 28 + src/lib/offsets/environment/environment.ts | 173 + src/lib/offsets/environment/weather.ts | 155 + src/lib/offsets/index.ts | 57 + src/lib/offsets/plane/autopilot.ts | 267 + src/lib/offsets/plane/cockpit.ts | 141 + src/lib/offsets/plane/controls.ts | 42 + src/lib/offsets/plane/engines.ts | 45 + src/lib/offsets/plane/helicopter.ts | 79 + src/lib/offsets/plane/icing.ts | 26 + src/lib/offsets/plane/plane.ts | 156 + src/lib/offsets/plane/pressurisation.ts | 49 + src/lib/offsets/plane/radios.ts | 416 ++ .../position-attitude/position-attitude.ts | 214 + src/lib/offsets/simulation/simulation.ts | 359 ++ src/shared/converted-offset-values.ts | 5 + src/shared/offset-category.ts | 17 + src/shared/offset-list.ts | 5 + src/shared/offset-values.ts | 5 + src/shared/offset.ts | 53 + src/shared/plane/engine-type.ts | 8 + src/shared/runway/runway-surface-condition.ts | 6 + src/shared/weather/precipitation-type.ts | 5 + src/shared/weather/season.ts | 6 + src/tsconfig.app.json | 30 + src/tsconfig.prod.json | 31 + tests/api.spec.ts | 438 ++ tests/convert/apply-conversion.spec.ts | 133 + tests/convert/helpers/hexadecimal.spec.ts | 16 + .../__snapshots__/mappings.spec.ts.snap | 14 + tests/convert/mappings/engine-type.spec.ts | 19 + tests/convert/mappings/lights.spec.ts | 21 + tests/convert/mappings/mappings.spec.ts | 7 + .../mappings/nearest-airport-id.spec.ts | 41 + .../mappings/precipitation-type.spec.ts | 16 + .../mappings/runway-surface-condition.spec.ts | 17 + tests/convert/mappings/seasons.spec.ts | 17 + tests/convert/mappings/units/ftsec-kt.spec.ts | 13 + .../offsets/__snapshots__/offset.spec.ts.snap | 2525 +++++++++ .../__snapshots__/pushback.spec.ts.snap | 61 + .../airport/__snapshots__/runway.spec.ts.snap | 28 + tests/offsets/airport/pushback.spec.ts | 25 + tests/offsets/airport/runway.spec.ts | 25 + .../__snapshots__/environment.spec.ts.snap | 226 + .../__snapshots__/weather.spec.ts.snap | 193 + tests/offsets/environment/environment.spec.ts | 9 + tests/offsets/environment/weather.spec.ts | 31 + tests/offsets/offset.spec.ts | 7 + .../__snapshots__/autopilot.spec.ts.snap | 325 ++ .../plane/__snapshots__/cockpit.spec.ts.snap | 171 + .../plane/__snapshots__/controls.spec.ts.snap | 50 + .../plane/__snapshots__/engines.spec.ts.snap | 50 + .../__snapshots__/helicopter.spec.ts.snap | 94 + .../plane/__snapshots__/icing.spec.ts.snap | 28 + .../plane/__snapshots__/plane.spec.ts.snap | 182 + .../__snapshots__/pressurisation.spec.ts.snap | 61 + .../plane/__snapshots__/radios.spec.ts.snap | 512 ++ tests/offsets/plane/autopilot.spec.ts | 71 + tests/offsets/plane/cockpit.spec.ts | 41 + tests/offsets/plane/controls.spec.ts | 27 + tests/offsets/plane/engines.spec.ts | 27 + tests/offsets/plane/helicopter.spec.ts | 27 + tests/offsets/plane/icing.spec.ts | 25 + tests/offsets/plane/plane.spec.ts | 41 + tests/offsets/plane/pressurisation.spec.ts | 25 + tests/offsets/plane/radios.spec.ts | 63 + .../position-attitude.spec.ts.snap | 259 + .../position-attitude.spec.ts | 46 + .../__snapshots__/simulation.spec.ts.snap | 468 ++ tests/offsets/simulation/simulation.spec.ts | 45 + tests/shared/offset.spec.ts | 189 + tests/tsconfig.spec.json | 30 + tsconfig.json | 39 + tslint.json | 40 + yarn.lock | 4880 +++++++++++++++++ 98 files changed, 14724 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/workflows/branch-master.yml create mode 100644 .gitignore create mode 100644 .nvmrc create mode 100644 LICENSE create mode 100644 README.md create mode 100644 jest.config.js create mode 100644 nodemon.json create mode 100644 package.json create mode 100644 scripts/clean-pkg.js create mode 100644 src/api.ts create mode 100644 src/lib/convert/apply-conversion.ts create mode 100644 src/lib/convert/helpers/hexadecimal.ts create mode 100644 src/lib/convert/mappings/engine-type.ts create mode 100644 src/lib/convert/mappings/index.ts create mode 100644 src/lib/convert/mappings/lights.ts create mode 100644 src/lib/convert/mappings/nearest-airports-ids.ts create mode 100644 src/lib/convert/mappings/precipitation-type.ts create mode 100644 src/lib/convert/mappings/runway-surface-condition.ts create mode 100644 src/lib/convert/mappings/seasons.ts create mode 100644 src/lib/convert/mappings/units/ftsec-kt.ts create mode 100644 src/lib/convert/mappings/units/index.ts create mode 100644 src/lib/offsets/airport/pushback.ts create mode 100644 src/lib/offsets/airport/runway.ts create mode 100644 src/lib/offsets/environment/environment.ts create mode 100644 src/lib/offsets/environment/weather.ts create mode 100644 src/lib/offsets/index.ts create mode 100644 src/lib/offsets/plane/autopilot.ts create mode 100644 src/lib/offsets/plane/cockpit.ts create mode 100644 src/lib/offsets/plane/controls.ts create mode 100644 src/lib/offsets/plane/engines.ts create mode 100644 src/lib/offsets/plane/helicopter.ts create mode 100644 src/lib/offsets/plane/icing.ts create mode 100644 src/lib/offsets/plane/plane.ts create mode 100644 src/lib/offsets/plane/pressurisation.ts create mode 100644 src/lib/offsets/plane/radios.ts create mode 100644 src/lib/offsets/position-attitude/position-attitude.ts create mode 100644 src/lib/offsets/simulation/simulation.ts create mode 100644 src/shared/converted-offset-values.ts create mode 100644 src/shared/offset-category.ts create mode 100644 src/shared/offset-list.ts create mode 100644 src/shared/offset-values.ts create mode 100644 src/shared/offset.ts create mode 100644 src/shared/plane/engine-type.ts create mode 100644 src/shared/runway/runway-surface-condition.ts create mode 100644 src/shared/weather/precipitation-type.ts create mode 100644 src/shared/weather/season.ts create mode 100644 src/tsconfig.app.json create mode 100644 src/tsconfig.prod.json create mode 100644 tests/api.spec.ts create mode 100644 tests/convert/apply-conversion.spec.ts create mode 100644 tests/convert/helpers/hexadecimal.spec.ts create mode 100644 tests/convert/mappings/__snapshots__/mappings.spec.ts.snap create mode 100644 tests/convert/mappings/engine-type.spec.ts create mode 100644 tests/convert/mappings/lights.spec.ts create mode 100644 tests/convert/mappings/mappings.spec.ts create mode 100644 tests/convert/mappings/nearest-airport-id.spec.ts create mode 100644 tests/convert/mappings/precipitation-type.spec.ts create mode 100644 tests/convert/mappings/runway-surface-condition.spec.ts create mode 100644 tests/convert/mappings/seasons.spec.ts create mode 100644 tests/convert/mappings/units/ftsec-kt.spec.ts create mode 100644 tests/offsets/__snapshots__/offset.spec.ts.snap create mode 100644 tests/offsets/airport/__snapshots__/pushback.spec.ts.snap create mode 100644 tests/offsets/airport/__snapshots__/runway.spec.ts.snap create mode 100644 tests/offsets/airport/pushback.spec.ts create mode 100644 tests/offsets/airport/runway.spec.ts create mode 100644 tests/offsets/environment/__snapshots__/environment.spec.ts.snap create mode 100644 tests/offsets/environment/__snapshots__/weather.spec.ts.snap create mode 100644 tests/offsets/environment/environment.spec.ts create mode 100644 tests/offsets/environment/weather.spec.ts create mode 100644 tests/offsets/offset.spec.ts create mode 100644 tests/offsets/plane/__snapshots__/autopilot.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/cockpit.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/controls.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/engines.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/helicopter.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/icing.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/plane.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/pressurisation.spec.ts.snap create mode 100644 tests/offsets/plane/__snapshots__/radios.spec.ts.snap create mode 100644 tests/offsets/plane/autopilot.spec.ts create mode 100644 tests/offsets/plane/cockpit.spec.ts create mode 100644 tests/offsets/plane/controls.spec.ts create mode 100644 tests/offsets/plane/engines.spec.ts create mode 100644 tests/offsets/plane/helicopter.spec.ts create mode 100644 tests/offsets/plane/icing.spec.ts create mode 100644 tests/offsets/plane/plane.spec.ts create mode 100644 tests/offsets/plane/pressurisation.spec.ts create mode 100644 tests/offsets/plane/radios.spec.ts create mode 100644 tests/offsets/position-attitude/__snapshots__/position-attitude.spec.ts.snap create mode 100644 tests/offsets/position-attitude/position-attitude.spec.ts create mode 100644 tests/offsets/simulation/__snapshots__/simulation.spec.ts.snap create mode 100644 tests/offsets/simulation/simulation.spec.ts create mode 100644 tests/shared/offset.spec.ts create mode 100644 tests/tsconfig.spec.json create mode 100644 tsconfig.json create mode 100644 tslint.json create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e717f5e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.github/workflows/branch-master.yml b/.github/workflows/branch-master.yml new file mode 100644 index 0000000..09dc481 --- /dev/null +++ b/.github/workflows/branch-master.yml @@ -0,0 +1,82 @@ +name: branch-master +on: + pull_request: + branches: + - master + push: + branches: + - master + +jobs: + test: + name: test + runs-on: windows-latest + timeout-minutes: 5 + steps: + - name: setup:checkout + uses: actions/checkout@master + - name: setup:python3.7 + uses: actions/setup-python@v1 + with: + python-version: '3.7' + architecture: x64 + - name: setup:cache:node + uses: actions/cache@v1.1.0 + with: + path: ${{ github.workspace }}/node_modules + key: ${{ runner.os }}-api-test-node-${{ hashFiles('yarn.lock') }} + restore-keys: | + ${{ runner.os }}-api-test-node- + ${{ runner.os }}-api- + - name: deps:install + shell: bash + run: | + yarn + - name: test:lint + shell: bash + run: | + yarn tslint + - name: test:unit + shell: bash + run: | + yarn test:ci + - name: test:coverage + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + path-to-lcov: ${{ github.workspace }}/coverage/lcov.info + + build: + name: build + runs-on: windows-latest + timeout-minutes: 5 + steps: + - name: setup:checkout + uses: actions/checkout@master + - name: setup:python3.7 + uses: actions/setup-python@v1 + with: + python-version: '3.7' + architecture: x64 + - name: setup:cache + uses: actions/cache@v1.1.0 + with: + path: ${{ github.workspace }}/node_modules + key: ${{ runner.os }}-api-build-node-${{ hashFiles('yarn.lock') }} + restore-keys: | + ${{ runner.os }}-api-build-node- + ${{ runner.os }}-api- + - name: deps:install + shell: bash + run: | + yarn + - name: build:prod + shell: bash + run: | + yarn compile:prod + - name: build:upload:artifacts + if: github.base_ref == 0 + uses: actions/upload-artifact@v1 + with: + name: fsuipc-api-${{ github.sha }} + path: ${{ github.workspace }}/dist diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f290f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +coverage/ +dist/ +.jest-cache/ diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..7f976a5 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +12.12.0 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cd282bb --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +The MIT License + +Copyright (c) 2017-2020 Exalif Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +----- + +This repository and its package are not related and not affialiated with original FSUIPC/WIDEFS creator or FSUIPC/WIDEFS software. + +You can find information about FSUIPC on their official website: http://www.fsuipc.com/ or on dedicated forum: https://forum.simflight.com/forum/30-fsuipc-support-pete-dowson-modules/ + +Please use this current library in accordance with FSUIPC terms, conditions and license. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb63a97 --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# @fsuipc/api - FSUIPC Node API + +[![Coverage Status](https://coveralls.io/repos/github/fsuipc-node/api/badge.svg?branch=master)](https://coveralls.io/github/fsuipc-node/api?branch=master) + +Tooling to use FSUIPC external application interface, with nodeJS. + +## Disclamer + +This API is a wrapper around [fsuipc-node adapter by koesie10](https://github.com/koesie10/fsuipc-node) meant to create a simple API around all available fsuipc offsets. + +Please find any information about FSUIPC on [their website](http://www.fsuipc.com/). + +## Requirements +In order for [`fsuipc`](https://github.com/koesie10/fsuipc-node) (fsuipc-node) and `@fsuipc/api` (this package) to work, and so this API, you must have on your machine: + - Windows 10 64bits + - node 12+ + - python 3.7 (don't forget to add it to your PATH) + - visualstudio 2017+ with desktop C++ package + - fsuipc installed as flight simulator plugin + +Node API usage requirements: + - `rxjs` >= 6.5.0 + +## Installation +``` +npm i --save @fsuipc/api +or +yarn add @fsuipc/api +``` + +## API Usage + +After import, you can use `FsuipcApi` to listen to provided values. + +### Import + +```typescript +import { FsuipcApi } from '@fsuipc/api'; +``` + +### Instantiate + +```typescript +const fsuipcApi = new FsuipcApi(Simulator.FSX); +``` +### Init + +`FsuipcApi.init()` returns a promise when you are properly connected to FSUIPC stream. In case your flight simulator isn't running, this will throw an error. + +### Listen to offsets values + +`FsuipcApi.listen()` methods takes 2-3 arguments: + - `interval` [*number*]: interval at which values will be polled from FSUIPC stream + - `offsetsList` [*string[]*]: a list of string representing offsets you want to subscribe on + - `terminateOnError` [*boolean* = *true*]: if set to true, if any value is errored, you will be disconnected from FSUIPC stream + +This method returns a `ConvertedOffsetValues` observable. You can subscribe to this observable to handle values polled from stream. + +### Complete example + +```typescript +import { FsuipcApi } from '@fsuipc/api'; + +const fsuipcApi = new FsuipcApi(Simulator.FSX); + +fsuipcApi.init().then(() => { + fsuipcApi.listen(1000, [ + 'gs', + 'altitude', + 'comFreq', + 'lights', + ]).subscribe((result) => { + // Use the result here + console.log(JSON.stringify(result)); + }); +}).catch((e) => + console.error(e) +); +``` diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..4f659a0 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + globals: { + 'ts-jest': { + tsConfig: 'tests/tsconfig.spec.json', + } + }, + cacheDirectory: '.jest-cache', + moduleNameMapper: { + '@shared/(.*)': '/src/shared/$1', + '@offsets/(.*)': '/src/lib/offsets/$1', + '@offsets': '/src/lib/offsets/index.ts', + '@mappings/(.*)': '/src/lib/convert/mappings/$1', + '@convert/(.*)': '/src/lib/convert/$1', + }, + collectCoverageFrom: [ + '**/*.ts', + '!**/node_modules/**', + '!**/*.d.ts', + '!**/index.ts', + '!**/types/**/*.ts', + ], +}; diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..dc3fb50 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,19 @@ +{ + "env": { + "NODE_ENV": "development" + }, + "watch": [ + "tsconfig.json", + "tsconfig.app.json", + "tslint.json", + "src/**/*.ts" + ], + "execMap": { + "ts": "ts-node --files --type-check --project tsconfig.app.json -r tsconfig-paths/register" + }, + "events": { + "start": "tslint -p tsconfig.app.json -c tslint.json", + "restart": "tslint -p tsconfig.app.json -c tslint.json" + }, + "delay": "500" +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a0b349e --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "@fsuipc/api", + "version": "0.1.0", + "author": { + "name": "FSUIPC-Node Opensource Team", + "url": "https://github.com/fsuipc-node" + }, + "repository": { + "type" : "git", + "url" : "https://github.com/fsuipc-node/api" + }, + "homepage": "https://github.com/fsuipc-node", + "license": "MIT", + "main": "./api.js", + "types": "./lib/index.d.ts", + "scripts": { + "start": "nodemon --exec cross-env TS_NODE_FILES=true TS_NODE_TYPE_CHECK=true TS_NODE_PROJECT=src/tsconfig.app.json node --inspect -r tsconfig-paths/register -r ts-node/register ./src/api.ts", + "compile:dev": "tsc --declaration -p src/tsconfig.app.json", + "compile:prod": "tsc --declaration -p src/tsconfig.prod.json", + "postcompile:dev": "npx tscpaths -v -r -p src/tsconfig.app.json -s ./dist", + "postcompile:prod": "npx tscpaths -v -r -p src/tsconfig.prod.json -s ./dist && yarn copy:docs && yarn copy:package", + "copy:docs": "cp README.md LICENSE dist/", + "copy:package": "node scripts/clean-pkg", + "test": "jest --watch", + "test:ci": "jest --coverage", + "tslint": "tslint -p src/tsconfig.app.json -c tslint.json && tslint -p tests/tsconfig.spec.json -c tslint.json", + "changelog": "npx conventional-changelog -p angular -i CHANGELOG.md -s" + }, + "dependencies": { + "fsuipc": "0.3.0", + "rxjs": "6.5.4", + "vm2": "3.8.4" + }, + "peerDependencies": { + "fsuipc": "^0.3.0", + "rxjs": "^6.5.0", + "vm2": "^3.8.0" + }, + "devDependencies": { + "@exalif/tscpaths": "0.1.3", + "@types/jest": "24.0.25", + "@types/node": "13.1.6", + "conventional-changelog-cli": "2.0.31", + "cross-env": "6.0.3", + "jest": "24.9.0", + "nodemon": "2.0.2", + "ts-jest": "24.3.0", + "ts-node": "8.6.1", + "tsconfig-paths": "3.9.0", + "tslint": "5.20.1", + "typescript": "3.7.4" + } +} diff --git a/scripts/clean-pkg.js b/scripts/clean-pkg.js new file mode 100644 index 0000000..9c437d9 --- /dev/null +++ b/scripts/clean-pkg.js @@ -0,0 +1,14 @@ +const fs = require('fs'); +const path = require('path'); + +const ORIG_PKG_PATH = path.resolve(__dirname, '../package.json'); +const DEST = path.resolve(__dirname, '../dist/package.json'); + +const pkgData = require(ORIG_PKG_PATH); + +delete pkgData.scripts; +delete pkgData.devDependencies; + +fs.writeFileSync(DEST, JSON.stringify(pkgData, null, 2), (err) => { + if (err) throw err; +}); diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..8632887 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,85 @@ +import { FSUIPC, Simulator, Type, FSUIPCError } from 'fsuipc'; +import { timer, from, Observable, throwError } from 'rxjs'; +import { switchMap, catchError, map } from 'rxjs/operators'; + +import { Offset } from '@shared/offset'; +import { OffsetValues } from '@shared/offset-values'; +import { ConvertedOffsetValues } from '@shared/converted-offset-values'; +import { OFFSETS } from '@offsets'; +import { applyConversion } from '@convert/apply-conversion'; + +export class FsuipcApi { + private fsuipcGlobalInstance: FSUIPC; + private fsuipc: FSUIPC; + private watchedOffsetCache: any[] = []; + + constructor(private simulator: Simulator = Simulator.FSX) {} + + public async init() { + this.fsuipcGlobalInstance = new FSUIPC(); + + try { + this.fsuipc = await this.fsuipcGlobalInstance.open(this.simulator); + return true; + } catch (error) { + throw new FSUIPCError(error.message, error.code); + } + } + + public listen(interval: number, offsetList: string[], terminateOnError: boolean = true): Observable { + if (!this.fsuipc) { + return throwError('NO_FSUIPC_INSTANCE'); + } + + this.watchOffsets(offsetList); + + return timer(interval, interval).pipe( + switchMap(() => + from(this.fsuipc.process()).pipe( + map((result: object) => { + const rawOffsetValues: OffsetValues = { ...result }; + let offsetValues: ConvertedOffsetValues = {}; + + for (let offsetName of Object.keys(rawOffsetValues)) { + offsetValues = { ...offsetValues, [offsetName]: applyConversion(OFFSETS[offsetName], rawOffsetValues[offsetName]) }; + } + + return offsetValues; + }), + catchError((error: FSUIPCError) => { + if (terminateOnError) { + this.fsuipc.close(); + } + + return throwError(error); + }), + ) + ) + ); + } + + private watchOffsets(offsetList: string[]): void { + if (this.shouldUpdateCache(offsetList)) { + this.watchedOffsetCache = offsetList; + } + + for (const offsetName of this.watchedOffsetCache) { + const offset: Offset = OFFSETS[offsetName]; + + if (offset.type === Type.ByteArray || offset.type === Type.String || offset.type === Type.BitArray ) { + const offsetType = offset.type as Type.ByteArray | Type.String | Type.BitArray; + this.fsuipc.add(offset.name, offset.value, offsetType, offset.length); + } else { + const offsetType = offset.type as Type.Byte | Type.SByte | Type.Int16 | Type.Int32 | Type.Int64 | Type.UInt16 | Type.UInt32 | Type.UInt64 | Type.Double | Type.Single; + this.fsuipc.add(offset.name, offset.value, offsetType); + } + } + } + + private shouldUpdateCache(offsetList: string[] = []): boolean { + return offsetList.length > 0 && ( + !this.watchedOffsetCache.length || + !this.watchedOffsetCache.every(item => offsetList.includes(item) ) + ); + } +} diff --git a/src/lib/convert/apply-conversion.ts b/src/lib/convert/apply-conversion.ts new file mode 100644 index 0000000..7add8b2 --- /dev/null +++ b/src/lib/convert/apply-conversion.ts @@ -0,0 +1,33 @@ +import { VM } from 'vm2'; + +import { Offset } from '@shared/offset'; +import { RawOffsetValue } from '@shared/offset-values'; +import { ConvertedOffsetValue } from '@shared/converted-offset-values'; + +export const applyConversion = (offset: Offset, rawOffsetValue: RawOffsetValue): ConvertedOffsetValue => { + if (!offset.convert) { + return rawOffsetValue; + } + + if (offset.hasMapping) { + if (offset.isMappingInvalid) { + return 'INVALID_MAPPING_FUNCTION'; + } + + return offset.mappingFunction(rawOffsetValue); + } else { + // tslint:disable-next-line:no-eval + if (offset.isInvalidConvertExpression) { + return 'UNSUPPORTED_CONVERSION_EXPRESSION'; + } + + const convertExpression: string = offset.convert.replace( + '{VAL}', + Array.isArray(rawOffsetValue) + ? `${JSON.stringify(rawOffsetValue)}` + : rawOffsetValue.toString() + ); + + return new VM().run(convertExpression); + } +}; diff --git a/src/lib/convert/helpers/hexadecimal.ts b/src/lib/convert/helpers/hexadecimal.ts new file mode 100644 index 0000000..be4a374 --- /dev/null +++ b/src/lib/convert/helpers/hexadecimal.ts @@ -0,0 +1,16 @@ +export class HexadecimalHelper { + public static binToHex(value: number): string { + return value.toString(16); + } + + public static hex2string(hex: string | number): string { + const hexStr = hex.toString(); + let str = ''; + + for (let i = 0; i < hexStr.length; i += 2) { + str += String.fromCharCode(parseInt(hexStr.substr(i, 2), 16)); + } + + return str; + } +} diff --git a/src/lib/convert/mappings/engine-type.ts b/src/lib/convert/mappings/engine-type.ts new file mode 100644 index 0000000..2772428 --- /dev/null +++ b/src/lib/convert/mappings/engine-type.ts @@ -0,0 +1,18 @@ +import { EngineType } from '@shared/plane/engine-type'; + +export const engineType = (value: number): EngineType => { + switch (value) { + case 0: + return EngineType.PISTON; + case 1: + return EngineType.JET; + case 2: + return EngineType.SAILPLANE; + case 3: + return EngineType.HELO; + case 4: + return EngineType.ROCKET; + case 5: + return EngineType.TURBOPROP; + } +}; diff --git a/src/lib/convert/mappings/index.ts b/src/lib/convert/mappings/index.ts new file mode 100644 index 0000000..bbcf85e --- /dev/null +++ b/src/lib/convert/mappings/index.ts @@ -0,0 +1,33 @@ +import { lightsMapping } from './lights'; +import { runwaySurfaceCondition } from './runway-surface-condition'; +import { precipitationType } from './precipitation-type'; +import { seasons } from './seasons'; +import { ftsecToKt, ktToFtsec } from './units'; +import { engineType } from './engine-type'; +import { nearestAirportsIds } from './nearest-airports-ids'; + +export const MAPPINGS: { [key: string]: (_: any) => any } = { + lightsMapping, + runwaySurfaceCondition, + + // weather + precipitationType, + seasons, + + // units + ftsecToKt, + ktToFtsec, + + // plane + engineType, + + // environment + nearestAirportsIds, +}; + +export * from './lights'; +export * from './runway-surface-condition'; +export * from './precipitation-type'; +export * from './seasons'; +export * from './units'; +export * from './engine-type'; diff --git a/src/lib/convert/mappings/lights.ts b/src/lib/convert/mappings/lights.ts new file mode 100644 index 0000000..42c2dc1 --- /dev/null +++ b/src/lib/convert/mappings/lights.ts @@ -0,0 +1,17 @@ +const Lights = ['nav', 'beacon', 'land', 'taxi', 'strobe', 'panel', 'recognition', 'wing', 'logo', 'cabin']; + +export const lightsMapping = (values: number[]): { [key: string]: boolean } => { + const lights: { [key: string]: boolean } = {}; + + values.forEach((value, index) => { + const lightName: string = Lights[index]; + + if (!lightName) { + return; + } + + lights[lightName] = !!value; + }); + + return lights; +}; diff --git a/src/lib/convert/mappings/nearest-airports-ids.ts b/src/lib/convert/mappings/nearest-airports-ids.ts new file mode 100644 index 0000000..37746d7 --- /dev/null +++ b/src/lib/convert/mappings/nearest-airports-ids.ts @@ -0,0 +1,27 @@ +import { HexadecimalHelper } from '@convert/helpers/hexadecimal'; + +const NEAREST_AIRPORTS_COUNT = 6; +const AIRPORT_OFFSET_SIZE = 4; +const PADDING = 16; +const TOTAL_AIRPORT_OFFSET_SIZE = AIRPORT_OFFSET_SIZE + PADDING; + +export const nearestAirportsIds = (values: number[]): string[] => { + let airports: string[] = []; + + for (let i = 0; i < TOTAL_AIRPORT_OFFSET_SIZE * NEAREST_AIRPORTS_COUNT; i += TOTAL_AIRPORT_OFFSET_SIZE) { + + const airportBinValue = values.slice(i, i + AIRPORT_OFFSET_SIZE); + if (airportBinValue.join('') === '0000') { + airports.push(''); + } else { + const airportCode = values + .slice(i, i + AIRPORT_OFFSET_SIZE) + .map(HexadecimalHelper.binToHex) + .map(HexadecimalHelper.hex2string) + .join(''); + airports.push(airportCode); + } + } + + return airports; +}; diff --git a/src/lib/convert/mappings/precipitation-type.ts b/src/lib/convert/mappings/precipitation-type.ts new file mode 100644 index 0000000..85dfd92 --- /dev/null +++ b/src/lib/convert/mappings/precipitation-type.ts @@ -0,0 +1,12 @@ +import { PrecipitationType } from '@shared/weather/precipitation-type'; + +export const precipitationType = (value: number): PrecipitationType => { + switch (value) { + case 0: + return PrecipitationType.NONE; + case 1: + return PrecipitationType.RAIN; + case 2: + return PrecipitationType.SNOW; + } +}; diff --git a/src/lib/convert/mappings/runway-surface-condition.ts b/src/lib/convert/mappings/runway-surface-condition.ts new file mode 100644 index 0000000..b404cb1 --- /dev/null +++ b/src/lib/convert/mappings/runway-surface-condition.ts @@ -0,0 +1,14 @@ +import { SurfaceCondition } from '@shared/runway/runway-surface-condition'; + +export const runwaySurfaceCondition = (value: number): SurfaceCondition => { + switch (value) { + case 0: + return SurfaceCondition.NORMAL; + case 1: + return SurfaceCondition.WET; + case 2: + return SurfaceCondition.ICY; + case 3: + return SurfaceCondition.SNOW; + } +}; diff --git a/src/lib/convert/mappings/seasons.ts b/src/lib/convert/mappings/seasons.ts new file mode 100644 index 0000000..2f8ee79 --- /dev/null +++ b/src/lib/convert/mappings/seasons.ts @@ -0,0 +1,14 @@ +import { Season } from '@shared/weather/season'; + +export const seasons = (value: number): Season => { + switch (value) { + case 0: + return Season.WINTER; + case 1: + return Season.SPRING; + case 2: + return Season.SUMMER; + case 3: + return Season.AUTUMN; + } +}; diff --git a/src/lib/convert/mappings/units/ftsec-kt.ts b/src/lib/convert/mappings/units/ftsec-kt.ts new file mode 100644 index 0000000..846f938 --- /dev/null +++ b/src/lib/convert/mappings/units/ftsec-kt.ts @@ -0,0 +1,9 @@ +const FEET_BY_SEC_TO_KT: number = 0.592484; + +export const ftsecToKt = (value: number): number => { + return +(value * FEET_BY_SEC_TO_KT).toFixed(2); +}; + +export const ktToFtsec = (value: number): number => { + return +(value / FEET_BY_SEC_TO_KT).toFixed(2); +}; diff --git a/src/lib/convert/mappings/units/index.ts b/src/lib/convert/mappings/units/index.ts new file mode 100644 index 0000000..604b08d --- /dev/null +++ b/src/lib/convert/mappings/units/index.ts @@ -0,0 +1 @@ +export * from './ftsec-kt'; diff --git a/src/lib/offsets/airport/pushback.ts b/src/lib/offsets/airport/pushback.ts new file mode 100644 index 0000000..1bbb6f0 --- /dev/null +++ b/src/lib/offsets/airport/pushback.ts @@ -0,0 +1,50 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const pushback: OffsetList = { + pushbackAngle: new Offset({ + value: 0x334, + name: 'pushbackAngle', + category: OffsetCategory.PUSHBACK, + description: 'pushback angle - radians', + type: Type.Single, + permission: 'r', + }), + pushbackXContact: new Offset({ + value: 0x338, + name: 'pushbackXContact', + category: OffsetCategory.PUSHBACK, + description: 'pushback X contact - ft', + type: Type.Single, + permission: 'r', + }), + pushbackYContact: new Offset({ + value: 0x33C, + name: 'pushbackYContact', + category: OffsetCategory.PUSHBACK, + description: 'pushback Y contact - ft', + type: Type.Single, + permission: 'r', + }), + pushbackZContact: new Offset({ + value: 0x340, + name: 'pushbackZContact', + category: OffsetCategory.PUSHBACK, + description: 'pushback Z contact - ft', + type: Type.Single, + permission: 'r', + }), + pushbackWaitFlag: new Offset({ + value: 0x344, + name: 'pushbackWaitFlag', + category: OffsetCategory.PUSHBACK, + description: 'pushback wait flag', + convert: '!!{VAL}', + type: Type.UInt16, + permission: 'r', + }), +}; + diff --git a/src/lib/offsets/airport/runway.ts b/src/lib/offsets/airport/runway.ts new file mode 100644 index 0000000..5a3ca17 --- /dev/null +++ b/src/lib/offsets/airport/runway.ts @@ -0,0 +1,28 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const runway: OffsetList = { + runwaySurfaceCondition: new Offset({ + value: 0x346, + name: 'runwaySurfaceCondition', + category: OffsetCategory.RUNWAY, + description: 'surface condition', + type: Type.Byte, + mapping: true, + convert: 'runwaySurfaceCondition', + permission: 'r', + }), + runwaySurfaceConditionValid: new Offset({ + value: 0x347, + name: 'runwaySurfaceConditionValid', + category: OffsetCategory.RUNWAY, + description: 'surface condition valid flag', + type: Type.Byte, + convert: '!!{VAL}', + permission: 'r', + }), +}; + diff --git a/src/lib/offsets/environment/environment.ts b/src/lib/offsets/environment/environment.ts new file mode 100644 index 0000000..b0cc891 --- /dev/null +++ b/src/lib/offsets/environment/environment.ts @@ -0,0 +1,173 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const environment: OffsetList = { + clockHour: new Offset({ + value: 0x238, + name: 'clockHour', + category: OffsetCategory.ENVIRONMENT, + description: '0-23', + type: Type.Byte, + permission: 'rw', + }), + clockMin: new Offset({ + value: 0x239, + name: 'clockMin', + category: OffsetCategory.ENVIRONMENT, + description: '0-59', + type: Type.Byte, + permission: 'rw', + }), + clockSec: new Offset({ + value: 0x23A, + name: 'clockSec', + category: OffsetCategory.ENVIRONMENT, + description: '0-59', + type: Type.Byte, + permission: 'rw', + }), + zuluHour: new Offset({ + value: 0x23B, + name: 'zuluHour', + category: OffsetCategory.ENVIRONMENT, + description: '0-23 UTC', + type: Type.Byte, + permission: 'rw', + }), + zuluMin: new Offset({ + value: 0x23C, + name: 'zuluMin', + category: OffsetCategory.ENVIRONMENT, + description: '0-59 UTC', + type: Type.Byte, + permission: 'rw', + }), + zuluDayOfMonth: new Offset({ + value: 0x23D, + name: 'zuluDayOfMonth', + category: OffsetCategory.ENVIRONMENT, + description: 'day of month UTC - FSX only - count from 1', + type: Type.Byte, + permission: 'r' + }), + dayOfYear: new Offset({ + value: 0x23E, + name: 'dayOfYear', + category: OffsetCategory.ENVIRONMENT, + description: 'day of year - count from 1', + type: Type.UInt16, + permission: 'rw', + }), + zuluYear: new Offset({ + value: 0x240, + name: 'zuluYear', + category: OffsetCategory.ENVIRONMENT, + description: 'year UTC', + type: Type.UInt16, + permission: 'rw', + }), + zuluMonthOfYear: new Offset({ + value: 0x242, + name: 'zuluMonthOfYear', + category: OffsetCategory.ENVIRONMENT, + description: 'month of year UTC - FSX only', + type: Type.Byte, + permission: 'r', + }), + zuluDayOfWeek: new Offset({ + value: 0x243, + name: 'zuluDayOfWeek', + category: OffsetCategory.ENVIRONMENT, + description: 'day of week UTC - FSX only', + type: Type.Byte, + permission: 'r', + }), + localMonthOfYear: new Offset({ + value: 0x244, + name: 'localMonthOfYear', + category: OffsetCategory.ENVIRONMENT, + description: 'local month of year - FSX only', + type: Type.Byte, + permission: 'r', + }), + localDayOfMonth: new Offset({ + value: 0x245, + name: 'localDayOfMonth', + category: OffsetCategory.ENVIRONMENT, + description: 'local day of month - FSX only', + type: Type.Byte, + permission: 'r', + }), + timezoneOffsetToZulu: new Offset({ + value: 0x246, + name: 'timezoneOffsetToZulu', + category: OffsetCategory.ENVIRONMENT, + description: 'timezone offset minutes to zulu - determines aircraft position (+ve = behind zulu, -ve = ahead zulu)', + type: Type.Int16, + permission: 'rw', + }), + season: new Offset({ + value: 0x248, + name: 'season', + category: OffsetCategory.ENVIRONMENT, + description: 'local season', + convert: 'seasons', + mapping: true, + type: Type.UInt16, + permission: 'rw', + }), + localYear: new Offset({ + value: 0x24A, + name: 'localYear', + category: OffsetCategory.ENVIRONMENT, + description: 'local year', + type: Type.UInt16, + permission: 'rw', + }), + nearestAirportId: new Offset({ + value: 0x658, + name: 'nearestAirportId', + category: OffsetCategory.ENVIRONMENT, + description: 'nearest airport', + type: Type.ByteArray, + length: 128, + convert: 'nearestAirportsIds', + mapping: true, + permission: 'r', + }), + nearestAirportLatitude: new Offset({ + value: 0x65C, + name: 'nearestAirportLatitude', + category: OffsetCategory.ENVIRONMENT, + description: 'nearest airport latitude', + type: Type.Single, + permission: 'r', + }), + nearestAirportLongitude: new Offset({ + value: 0x660, + name: 'nearestAirportLongitude', + category: OffsetCategory.ENVIRONMENT, + description: 'nearest airport longitude', + type: Type.Single, + permission: 'r', + }), + nearestAirportAltitude: new Offset({ + value: 0x664, + name: 'nearestAirportAltitude', + category: OffsetCategory.ENVIRONMENT, + description: 'nearest airport altitude - ft', + type: Type.Single, + permission: 'r', + }), + nearestAirportDistance: new Offset({ + value: 0x668, + name: 'nearestAirportDistance', + category: OffsetCategory.ENVIRONMENT, + description: 'nearest airport distance - NM', + type: Type.Single, + permission: 'r', + }), +}; diff --git a/src/lib/offsets/environment/weather.ts b/src/lib/offsets/environment/weather.ts new file mode 100644 index 0000000..6209446 --- /dev/null +++ b/src/lib/offsets/environment/weather.ts @@ -0,0 +1,155 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const weather: OffsetList = { + metarStationAltitude: new Offset({ + value: 0x4B4, + name: 'metarStationAltitude', + category: OffsetCategory.WEATHER, + description: 'METAR station altitude - ft', + type: Type.UInt16, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + windSurfaceTurbulenceGustSpeed: new Offset({ + value: 0x4BA, + name: 'windSurfaceTurbulenceGustSpeed', + category: OffsetCategory.WEATHER, + description: 'METAR station altitude - kt', + type: Type.UInt16, + convert: '+({VAL}).toFixed(2)', + permission: 'r', + }), + metarBarometricDrift: new Offset({ + value: 0x4BC, + name: 'metarBarometricDrift', + category: OffsetCategory.WEATHER, + description: 'METAR barometric drift - difference between aircraft/METAR QNH. Adding drift withll give correct value for ATIS report', + type: Type.UInt16, + convert: '{VAL} / 16', + permission: 'r', + }), + metarVisibility: new Offset({ + value: 0x4C0, + name: 'metarVisibility', + category: OffsetCategory.WEATHER, + description: 'METAR visibility - sm', + type: Type.UInt16, + convert: '{VAL} / 100', + permission: 'r', + }), + metarCloudThunderBase: new Offset({ + value: 0x4C2, + name: 'metarCloudThunderBase', + category: OffsetCategory.WEATHER, + description: 'METAR visibility - ft', + type: Type.UInt16, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + metarCloudBaseLow: new Offset({ + value: 0x4C4, + name: 'metarCloudBaseLow', + category: OffsetCategory.WEATHER, + description: 'METAR cloud base low - ft', + type: Type.UInt16, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + metarCloudBaseHigh: new Offset({ + value: 0x4C6, + name: 'metarCloudBaseHigh', + category: OffsetCategory.WEATHER, + description: 'METAR cloud base high - ft', + type: Type.UInt16, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + dewPoint: new Offset({ + value: 0x4C8, + name: 'dewPoint', + category: OffsetCategory.WEATHER, + description: 'dew point - FS2000+', + type: Type.Int16, + convert: '{VAL} / 256', + permission: 'r', + }), + precipitationRate: new Offset({ + value: 0x4C8, + name: 'precipitationRate', + category: OffsetCategory.WEATHER, + description: 'precipitation rate - FS2000+ - 0 to 5', + type: Type.Byte, + permission: 'r', + }), + precipitationType: new Offset({ + value: 0x4CC, + name: 'precipitationType', + category: OffsetCategory.WEATHER, + description: 'precipitation type - FS2000+ - 0 to 5', + type: Type.Byte, + convert: 'precipitationType', + mapping: true, + permission: 'r', + }), + cloudThunderCoverage: new Offset({ + value: 0x4CD, + name: 'cloudThunderCoverage', + category: OffsetCategory.WEATHER, + description: 'cloud thunder coverage - octa', + type: Type.Byte, + permission: 'r', + }), + cloudLowCoverage: new Offset({ + value: 0x4CE, + name: 'cloudLowCoverage', + category: OffsetCategory.WEATHER, + description: 'cloud low coverage - octa', + type: Type.Byte, + permission: 'r', + }), + cloudHighCoverage: new Offset({ + value: 0x4CF, + name: 'cloudHighCoverage', + category: OffsetCategory.WEATHER, + description: 'cloud high coverage - octa', + type: Type.Byte, + permission: 'r', + }), + precipitationControl: new Offset({ + value: 0x4D2, + name: 'precipitationControl', + category: OffsetCategory.WEATHER, + description: 'hi-byte type 0-2 - low-byte rate 0-5 - writing 0xFFFF release control', + type: Type.UInt16, + permission: 'w', + }), + dewPointControl: new Offset({ + value: 0x4D4, + name: 'dewPointControl', + category: OffsetCategory.WEATHER, + description: 'degrees / 256 - 0x8000 release control', + type: Type.UInt16, + permission: 'w', + }), + surfaceWindSpeed: new Offset({ + value: 0x4D8, + name: 'surfaceWindSpeed', + category: OffsetCategory.WEATHER, + description: 'surface wind speed - FS2000+ - kts', + type: Type.UInt16, + permission: 'r', + }), + surfaceWindDirection: new Offset({ + value: 0x4DA, + name: 'surfaceWindDirection', + category: OffsetCategory.WEATHER, + description: 'surface wind direction - FS2000+ - deg MAG', + type: Type.UInt16, + convert: '+({VAL} * 360 / 65536).toFixed(2)', + permission: 'r', + }), +}; diff --git a/src/lib/offsets/index.ts b/src/lib/offsets/index.ts new file mode 100644 index 0000000..1b1db12 --- /dev/null +++ b/src/lib/offsets/index.ts @@ -0,0 +1,57 @@ +import { OffsetList } from '@shared/offset-list'; + +import { positionAttitude } from './position-attitude/position-attitude'; +import { simulation } from './simulation/simulation'; +import { runway } from './airport/runway'; +import { pushback } from './airport/pushback'; +import { environment } from './environment/environment'; +import { weather } from './environment/weather'; +import { plane } from './plane/plane'; +import { controls } from './plane/controls'; +import { cockpit } from './plane/cockpit'; +import { radios } from './plane/radios'; +import { pressurisation } from './plane/pressurisation'; +import { icing } from './plane/icing'; +import { engines } from './plane/engines'; +import { autopilot } from './plane/autopilot'; + +export const OFFSETS: OffsetList = { + // Position and Attitude + ...positionAttitude, + + // Simulation + ...simulation, + + // Airport + ...pushback, + ...runway, + + // Environment + ...environment, + ...weather, + + // Plane + ...plane, + ...controls, + ...cockpit, + ...radios, + ...pressurisation, + ...icing, + ...engines, + ...autopilot, +}; + +export * from './airport/runway'; +export * from './airport/pushback'; +export * from './environment/environment'; +export * from './environment/weather'; +export * from './position-attitude/position-attitude'; +export * from './plane/plane'; +export * from './plane/controls'; +export * from './plane/cockpit'; +export * from './plane/radios'; +export * from './plane/pressurisation'; +export * from './plane/icing'; +export * from './plane/engines'; +export * from './plane/autopilot'; +export * from './simulation/simulation'; diff --git a/src/lib/offsets/plane/autopilot.ts b/src/lib/offsets/plane/autopilot.ts new file mode 100644 index 0000000..0e0df0b --- /dev/null +++ b/src/lib/offsets/plane/autopilot.ts @@ -0,0 +1,267 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const autopilot: OffsetList = { + autoPilotAvailable: new Offset({ + value: 0x764, + name: 'autoPilotAvailable', + category: OffsetCategory.AUTOPILOT, + description: 'autopilot available', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + flyByWireELACSwitch: new Offset({ + value: 0x7B6, + name: 'flyByWireELACSwitch', + category: OffsetCategory.AUTOPILOT, + description: 'fly by wire ELAC switch', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + flyByWireELACCompFailFlag: new Offset({ + value: 0x7B7, + name: 'flyByWireELACCompFailFlag', + category: OffsetCategory.AUTOPILOT, + description: 'fly by wire ELAC comp fail flag (read only)', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'r', + }), + flyByWireFACSwitch: new Offset({ + value: 0x7B8, + name: 'flyByWireFACSwitch', + category: OffsetCategory.AUTOPILOT, + description: 'fly by wire FAC switch', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + flyByWireFACCompFailFlag: new Offset({ + value: 0x7B9, + name: 'flyByWireFACCompFailFlag', + category: OffsetCategory.AUTOPILOT, + description: 'fly by wire FAC comp fail flag (read only)', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'r', + }), + flyByWireSECSwitch: new Offset({ + value: 0x7BA, + name: 'flyByWireSECSwitch', + category: OffsetCategory.AUTOPILOT, + description: 'fly by wire SEC switch', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + flyByWireSECCompFailFlag: new Offset({ + value: 0x7BB, + name: 'flyByWireSECCompFailFlag', + category: OffsetCategory.AUTOPILOT, + description: 'fly by wire SEC comp fail flag (read only)', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'r', + }), + apMasterSwitch: new Offset({ + value: 0x7BC, + name: 'apMasterSwitch', + category: OffsetCategory.AUTOPILOT, + description: 'AP master switch', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apWingLevel: new Offset({ + value: 0x7C0, + name: 'apWingLevel', + category: OffsetCategory.AUTOPILOT, + description: 'AP wing level', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apNav1Hold: new Offset({ + value: 0x7C4, + name: 'apNav1Hold', + category: OffsetCategory.AUTOPILOT, + description: 'AP NAV1 hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apHeadingHold: new Offset({ + value: 0x7C8, + name: 'apHeadingHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP heading hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apHeadingValue: new Offset({ + value: 0x7CC, + name: 'apHeadingValue', + category: OffsetCategory.AUTOPILOT, + description: 'AP heading value - degrees', + convert: 'Math.round(({VAL} * 360) / 65536)', + type: Type.UInt16, + permission: 'rw', + }), + apAltitudeHold: new Offset({ + value: 0x7D0, + name: 'apAltitudeHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP altitude hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apAltitudeValue: new Offset({ + value: 0x7D4, + name: 'apAltitudeValue', + category: OffsetCategory.AUTOPILOT, + description: 'AP altitude value - ft', + convert: '+({VAL} * 3.28084 / 65536).toFixed(2)', + type: Type.Int32, + permission: 'rw', + }), + apAttitudeHold: new Offset({ + value: 0x7D8, + name: 'apAttitudeHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP attitude hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apAsHold: new Offset({ + value: 0x7DC, + name: 'apAsHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP airspeed hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apAsValue: new Offset({ + value: 0x7E2, + name: 'apAsValue', + category: OffsetCategory.AUTOPILOT, + description: 'AP airspeed value - kt', + type: Type.UInt16, + permission: 'rw', + }), + apMachHold: new Offset({ + value: 0x7E4, + name: 'apMachHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP mach hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apMachValue: new Offset({ + value: 0x7E8, + name: 'apMachValue', + category: OffsetCategory.AUTOPILOT, + description: 'AP mach value - mach', + convert: '{VAL} / 65536', + type: Type.UInt32, + permission: 'rw', + }), + apVsHold: new Offset({ + value: 0x7EC, + name: 'apVsHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP vertical speed hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apVsValue: new Offset({ + value: 0x7F2, + name: 'apVsValue', + category: OffsetCategory.AUTOPILOT, + description: 'AP vertical speed value - ft/min', + type: Type.Int16, + permission: 'rw', + }), + apRPMN1Hold: new Offset({ + value: 0x7F4, + name: 'apRPMN1Hold', + category: OffsetCategory.AUTOPILOT, + description: 'AP RPM/N1 hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apRPMN1Value: new Offset({ + value: 0x7FA, + name: 'apRPMN1Value', + category: OffsetCategory.AUTOPILOT, + description: 'AP RPM/N1 value - percent', + convert: 'Math.round({VAL} * 100 / 16384)', + type: Type.UInt32, + permission: 'rw', + }), + apGlideSlopeHold: new Offset({ + value: 0x7FC, + name: 'apGlideSlopeHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP GlideSlope hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apApproachHold: new Offset({ + value: 0x800, + name: 'apApproachHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP Approach hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apBackCourseHold: new Offset({ + value: 0x804, + name: 'apBackCourseHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP back course hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apYawDamperHold: new Offset({ + value: 0x808, + name: 'apYawDamperHold', + category: OffsetCategory.AUTOPILOT, + description: 'AP yaw damper hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apTOGAAutoThrottle: new Offset({ + value: 0x80C, + name: 'apTOGAAutoThrottle', + category: OffsetCategory.AUTOPILOT, + description: 'AP TO/GA throttle hold', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + apAutoThrottleArm: new Offset({ + value: 0x810, + name: 'apAutoThrottleArm', + category: OffsetCategory.AUTOPILOT, + description: 'AP autothrottle arm', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), +}; diff --git a/src/lib/offsets/plane/cockpit.ts b/src/lib/offsets/plane/cockpit.ts new file mode 100644 index 0000000..66f0148 --- /dev/null +++ b/src/lib/offsets/plane/cockpit.ts @@ -0,0 +1,141 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const cockpit: OffsetList = { + navLights: new Offset({ + value: 0x280, + name: 'navLights', + category: OffsetCategory.COCKPIT, + description: 'nav lights', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + strobeLights: new Offset({ + value: 0x281, + name: 'strobeLights', + category: OffsetCategory.COCKPIT, + description: 'strobe lights', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + landingLights: new Offset({ + value: 0x28C, + name: 'landingLights', + category: OffsetCategory.COCKPIT, + description: 'landing lights', + convert: '!!{VAL}', + type: Type.UInt16, + permission: 'rw', + }), + lights: new Offset({ + value: 0x0D0C, + name: 'lights', + category: OffsetCategory.COCKPIT, + description: 'all lights - FS2000+', + type: Type.BitArray, + convert: 'lightsMapping', + mapping: true, + length: 2, + permission: 'rw', + }), + alternateStaticAirSource: new Offset({ + value: 0x29B, + name: 'alternateStaticAirSource', + category: OffsetCategory.COCKPIT, + description: 'Alternate static air source selected', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + pitotHeat: new Offset({ + value: 0x29C, + name: 'pitotHeat', + category: OffsetCategory.COCKPIT, + description: 'pitot heat active', + convert: '!!{VAL}', + type: Type.Int16, + permission: 'rw', + }), + altimeterSettings: new Offset({ + value: 0x330, + name: 'altimeterSettings', + category: OffsetCategory.COCKPIT, + description: 'altimeters settings - mb', + convert: '{VAL} / 16', + type: Type.UInt16, + permission: 'rw', + }), + altimeterSettingsG1000: new Offset({ + value: 0x332, + name: 'altimeterSettingsG1000', + category: OffsetCategory.COCKPIT, + description: 'G1000 altimeters settings - mb', + convert: '{VAL} / 16', + type: Type.UInt16, + permission: 'rw', + }), + turnCoordinatorPosition: new Offset({ + value: 0x36E, + name: 'turnCoordinatorPosition', + category: OffsetCategory.COCKPIT, + description: 'Turn coordinator ball position - + to the right, - to the left, 0 balanced', + type: Type.SByte, + permission: 'r', + }), + turnRate: new Offset({ + value: 0x37C, + name: 'turnRate', + category: OffsetCategory.COCKPIT, + description: 'Turn rate needle - minutes (- to the left, + to the right)', + type: Type.Int16, + convert: 'Math.round({VAL} / 1024)', + permission: 'r', + }), + preciseTurnCoordinatorPosition: new Offset({ + value: 0x380, + name: 'preciseTurnCoordinatorPosition', + category: OffsetCategory.COCKPIT, + description: 'Turn coordinator ball position - + to the right, - to the left, 0 balanced', + type: Type.Single, + permission: 'r', + }), + preciseTurnRate: new Offset({ + value: 0x384, + name: 'preciseTurnRate', + category: OffsetCategory.COCKPIT, + description: 'Turn rate needle - minutes (- to the left, + to the right)', + type: Type.Single, + permission: 'r', + }), + stallWarning: new Offset({ + value: 0x36C, + name: 'stallWarning', + category: OffsetCategory.COCKPIT, + description: 'stall warning', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'r', + }), + overspeedWarning: new Offset({ + value: 0x36D, + name: 'overspeedWarning', + category: OffsetCategory.COCKPIT, + description: 'overspeed warning', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'r', + }), + displayIAS: new Offset({ + value: 0x612, + name: 'displayIAS', + category: OffsetCategory.COCKPIT, + description: 'display IAS - <= FS2000', + type: Type.UInt16, + permission: 'rw', + }), +}; diff --git a/src/lib/offsets/plane/controls.ts b/src/lib/offsets/plane/controls.ts new file mode 100644 index 0000000..d6b28f8 --- /dev/null +++ b/src/lib/offsets/plane/controls.ts @@ -0,0 +1,42 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const controls: OffsetList = { + autoRudder: new Offset({ + value: 0x278, + name: 'autoRudder', + category: OffsetCategory.CONTROLS, + description: 'auto coordination', + convert: '!!{VAL}', + type: Type.Int16, + permission: 'rw', + }), + leftAileronDeflection: new Offset({ + value: 0x3B0, + name: 'leftAileronDeflection', + category: OffsetCategory.CONTROLS, + description: 'left aileron deflection - radians', + type: Type.Double, + permission: 'r', + }), + rightAileronDeflection: new Offset({ + value: 0x3B8, + name: 'rightAileronDeflection', + category: OffsetCategory.CONTROLS, + description: 'right aileron deflection - radians', + type: Type.Double, + permission: 'r', + }), + rotorClutchSwitch: new Offset({ + value: 0x889, + name: 'rotorClutchSwitch', + category: OffsetCategory.CONTROLS, + description: 'rotor clutch switch', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), +}; diff --git a/src/lib/offsets/plane/engines.ts b/src/lib/offsets/plane/engines.ts new file mode 100644 index 0000000..9ce6b16 --- /dev/null +++ b/src/lib/offsets/plane/engines.ts @@ -0,0 +1,45 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const engines: OffsetList = { + engineType: new Offset({ + value: 0x609, + name: 'engineType', + category: OffsetCategory.ENGINE, + description: 'engine type', + convert: 'engineType', + mapping: true, + type: Type.Byte, + permission: 'r', + }), + hasMixtureControl: new Offset({ + value: 0x780, + name: 'hasMixtureControl', + category: OffsetCategory.ENGINE, + description: 'has mixture control', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + hasCarbHeat: new Offset({ + value: 0x784, + name: 'hasCarbHeat', + category: OffsetCategory.ENGINE, + description: 'has carb heat', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + activeEngine: new Offset({ + value: 0x888, + name: 'activeEngine', + category: OffsetCategory.ENGINE, + description: 'active engine pattern', + type: Type.BitArray, + length: 1, + permission: 'rw', + }), +}; diff --git a/src/lib/offsets/plane/helicopter.ts b/src/lib/offsets/plane/helicopter.ts new file mode 100644 index 0000000..f47c1ac --- /dev/null +++ b/src/lib/offsets/plane/helicopter.ts @@ -0,0 +1,79 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const helicopter: OffsetList = { + rotorbreakActive: new Offset({ + value: 0x81E, + name: 'rotorbreakActive', + category: OffsetCategory.HELICOPTER, + description: 'rotor brake active - Robinson only', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + rotorClutchActive: new Offset({ + value: 0x81F, + name: 'rotorClutchActive', + category: OffsetCategory.HELICOPTER, + description: 'rotor clutch active - Robinson only', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + rotorChipWarning: new Offset({ + value: 0x820, + name: 'rotorChipWarning', + category: OffsetCategory.HELICOPTER, + description: 'rotor chip detected - Rbinson only', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + rotorGovWarning: new Offset({ + value: 0x821, + name: 'rotorGovWarning', + category: OffsetCategory.HELICOPTER, + description: 'rotor gov active - Rbinson only', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + rotorBreakApplication: new Offset({ + value: 0x822, + name: 'rotorBreakApplication', + category: OffsetCategory.HELICOPTER, + description: 'rotor brake application - percent - Robinson only', + convert: 'Math.round({VAL} / 16384 * 100)', + type: Type.UInt16, + permission: 'rw', + }), + rotorLateralTrim: new Offset({ + value: 0x824, + name: 'rotorLateralTrim', + category: OffsetCategory.HELICOPTER, + description: 'rotor lateral trim - percent - Robinson only', + convert: 'Math.round({VAL} / 16384 * 100)', + type: Type.UInt16, + permission: 'rw', + }), + governorSwitch: new Offset({ + value: 0x826, + name: 'governorSwitch', + category: OffsetCategory.HELICOPTER, + description: 'governor switch activated - Robinson only', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + rotorTransmissionTemp: new Offset({ + value: 0x828, + name: 'rotorTransmissionTemp', + category: OffsetCategory.HELICOPTER, + description: 'rotor transmission temp - degrees Rankine - read only', + type: Type.Double, + permission: 'r', + }), +}; diff --git a/src/lib/offsets/plane/icing.ts b/src/lib/offsets/plane/icing.ts new file mode 100644 index 0000000..8af3dff --- /dev/null +++ b/src/lib/offsets/plane/icing.ts @@ -0,0 +1,26 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const icing: OffsetList = { + structuralIce: new Offset({ + value: 0x348, + name: 'structuralIce', + category: OffsetCategory.ICING, + description: 'structural ice - decimal percent', + type: Type.UInt16, + convert: '+({VAL} / 16384 * 100).toFixed(2)', + permission: 'r', + }), + pitotIce: new Offset({ + value: 0x34A, + name: 'pitotIce', + category: OffsetCategory.ICING, + description: 'structural ice - decimal percent', + type: Type.UInt16, + convert: '+({VAL} / 16384 * 100).toFixed(2)', + permission: 'r', + }), +}; diff --git a/src/lib/offsets/plane/plane.ts b/src/lib/offsets/plane/plane.ts new file mode 100644 index 0000000..47afd50 --- /dev/null +++ b/src/lib/offsets/plane/plane.ts @@ -0,0 +1,156 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const plane: OffsetList = { + vs0: new Offset({ + value: 0x538, + name: 'vs0', + category: OffsetCategory.PLANE, + description: 'Stall speed full flaps - kt', + convert: 'ftsecToKt', + mapping: true, + type: Type.Double, + permission: 'r', + }), + vs1: new Offset({ + value: 0x540, + name: 'vs1', + category: OffsetCategory.PLANE, + description: 'Stall speed clean - kt', + convert: 'ftsecToKt', + mapping: true, + type: Type.Double, + permission: 'r', + }), + vc: new Offset({ + value: 0x548, + name: 'vc', + category: OffsetCategory.PLANE, + description: 'Cruise speed - kt', + convert: 'ftsecToKt', + mapping: true, + type: Type.Double, + permission: 'r', + }), + vmd: new Offset({ + value: 0x550, + name: 'vmd', + category: OffsetCategory.PLANE, + description: 'Minimum drag speed - kt', + convert: 'ftsecToKt', + mapping: true, + type: Type.Double, + permission: 'r', + }), + smokeSystemControl: new Offset({ + value: 0x5D8, + name: 'smokeSystemControl', + category: OffsetCategory.PLANE, + convert: '!!{VAL}', + description: 'smoke system control on/off', + type: Type.UInt16, + permission: 'rw', + }), + retractableGear: new Offset({ + value: 0x60C, + name: 'retractableGear', + category: OffsetCategory.PLANE, + description: 'retractable gear (read only)', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'r', + }), + retractableLeftFloatExtension: new Offset({ + value: 0x614, + name: 'retractableLeftFloatExtension', + category: OffsetCategory.PLANE, + description: 'retractable left float extension - percent', + convert: 'Math.floor({VAL} / 16384 * 100)', + type: Type.UInt16, + permission: 'r', + }), + retractableRightFloatExtension: new Offset({ + value: 0x616, + name: 'retractableRightFloatExtension', + category: OffsetCategory.PLANE, + description: 'retractable right float extension - percent', + convert: 'Math.floor({VAL} / 16384 * 100)', + type: Type.UInt16, + permission: 'r', + }), + hasFlaps: new Offset({ + value: 0x778, + name: 'hasFlaps', + category: OffsetCategory.PLANE, + description: 'has flaps', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + hasStallHorn: new Offset({ + value: 0x77C, + name: 'hasStallHorn', + category: OffsetCategory.PLANE, + description: 'has stall horn', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + hasMixtureEngine: new Offset({ + value: 0x780, + name: 'hasMixtureEngine', + category: OffsetCategory.PLANE, + description: 'has mixture engine', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + hasCarbHeat: new Offset({ + value: 0x784, + name: 'hasCarbHeat', + category: OffsetCategory.PLANE, + description: 'has carburator heater', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + hasSpoilers: new Offset({ + value: 0x78C, + name: 'hasSpoilers', + category: OffsetCategory.PLANE, + description: 'has spoilers', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + isTailDragger: new Offset({ + value: 0x790, + name: 'isTailDragger', + category: OffsetCategory.PLANE, + description: 'has spoilers', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + hasStrobes: new Offset({ + value: 0x794, + name: 'hasStrobes', + category: OffsetCategory.PLANE, + description: 'has strobes', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + hasToeBrakes: new Offset({ + value: 0x79C, + name: 'hasToeBrakes', + category: OffsetCategory.PLANE, + description: 'has toe brakes', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), +}; diff --git a/src/lib/offsets/plane/pressurisation.ts b/src/lib/offsets/plane/pressurisation.ts new file mode 100644 index 0000000..7c6db75 --- /dev/null +++ b/src/lib/offsets/plane/pressurisation.ts @@ -0,0 +1,49 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const pressurisation: OffsetList = { + pressCabinAlt: new Offset({ + value: 0x318, + name: 'pressCabinAlt', + category: OffsetCategory.PRESSURISATION, + description: 'pressurisation: cabin altitude - ft', + type: Type.Int32, + permission: 'r', + }), + pressCabinAltTarget: new Offset({ + value: 0x31C, + name: 'pressCabinAltTarget', + category: OffsetCategory.PRESSURISATION, + description: 'pressurisation: target cabin altitude - ft', + type: Type.Int32, + permission: 'r', + }), + pressCabinAltChange: new Offset({ + value: 0x320, + name: 'pressCabinAltChange', + category: OffsetCategory.PRESSURISATION, + description: 'pressurisation: cabin altitude change set - ft/s', + type: Type.Single, + permission: 'r', + }), + pressCabinAltPressDiff: new Offset({ + value: 0x324, + name: 'pressCabinAltPressDiff', + category: OffsetCategory.PRESSURISATION, + description: 'pressurisation: cabin altitude change set - lb/sqft', + type: Type.Single, + permission: 'r', + }), + pressDumpSwitch: new Offset({ + value: 0x328, + name: 'pressDumpSwitch', + category: OffsetCategory.PRESSURISATION, + description: 'pressurisation: dump switch', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), +}; diff --git a/src/lib/offsets/plane/radios.ts b/src/lib/offsets/plane/radios.ts new file mode 100644 index 0000000..0963cbb --- /dev/null +++ b/src/lib/offsets/plane/radios.ts @@ -0,0 +1,416 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const radios: OffsetList = { + adf2Freq: new Offset({ + value: 0x2D4, + name: 'adf2Freq', + category: OffsetCategory.RADIOS, + description: 'ADF 2 freq - Main 3 digits in BCD - FS2004', + type: Type.UInt16, + convert: '+({VAL}).toString(16)', + permission: 'rw', + }), + adf2ExtendedFreq: new Offset({ + value: 0x2D6, + name: 'adf2ExtendedFreq', + category: OffsetCategory.RADIOS, + description: 'ADF 2 extended freq - in BCD - FS2004', + type: Type.UInt16, + permission: 'rw', + }), + adf2RelBearing: new Offset({ + value: 0x2D8, + name: 'adf2RelBearing', + category: OffsetCategory.RADIOS, + description: 'ADF2 Rel Bearing - FS2004', + convert: 'Math.round({VAL} * 360 / 65536)', + type: Type.Int16, + permission: 'r', + }), + ndb2Identity: new Offset({ + value: 0x2DC, + name: 'ndb2Identity', + category: OffsetCategory.RADIOS, + description: 'NDB2 identity - FS2004', + type: Type.String, + length: 6, + permission: 'r', + }), + ndb2Name: new Offset({ + value: 0x2E2, + name: 'ndb2Name', + category: OffsetCategory.RADIOS, + description: 'NDB2 name - FS2004', + type: Type.String, + length: 25, + permission: 'r', + }), + ndb2IdentSoundSwitch: new Offset({ + value: 0x2FB, + name: 'ndb2IdentSoundSwitch', + category: OffsetCategory.RADIOS, + description: 'NDB2 ident sound switch - FS2004', + type: Type.Byte, + convert: '!!{VAL}', + permission: 'rw', + }), + vor1DMEDistance: new Offset({ + value: 0x300, + name: 'vor1DMEDistance', + category: OffsetCategory.RADIOS, + description: 'VOR1 DME distance - nm', + convert: '{VAL} / 10', + type: Type.UInt16, + permission: 'r', + }), + vor1DMESpeed: new Offset({ + value: 0x302, + name: 'vor1DMESpeed', + category: OffsetCategory.RADIOS, + description: 'VOR1 DME speed - kt', + convert: '{VAL} / 10', + type: Type.UInt16, + permission: 'r', + }), + vor1DMETimeToStation: new Offset({ + value: 0x304, + name: 'vor1DMETimeToStation', + category: OffsetCategory.RADIOS, + description: 'VOR1 DME time to station - sec', + convert: '{VAL} / 10', + type: Type.UInt16, + permission: 'r', + }), + vor2DMEDistance: new Offset({ + value: 0x306, + name: 'vor2DMEDistance', + category: OffsetCategory.RADIOS, + description: 'VOR2 DME distance - nm', + convert: '{VAL} / 10', + type: Type.UInt16, + permission: 'r', + }), + vor2DMESpeed: new Offset({ + value: 0x308, + name: 'vor2DMESpeed', + category: OffsetCategory.RADIOS, + description: 'VOR2 DME speed - kt', + convert: '{VAL} / 10', + type: Type.UInt16, + permission: 'r', + }), + vor2DMETimeToStation: new Offset({ + value: 0x30A, + name: 'vor2DMETimeToStation', + category: OffsetCategory.RADIOS, + description: 'VOR2 DME time to station - sec', + convert: '{VAL} / 10', + type: Type.UInt16, + permission: 'r', + }), + adfFreq: new Offset({ + value: 0x34C, + name: 'adfFreq', + category: OffsetCategory.RADIOS, + description: 'ADF frequency show as Binary Coded Decimal. The thousands digit and the fractional parts are provided in adfFreqExtended', + type: Type.UInt16, + convert: '+({VAL}).toString(16)', + permission: 'rw', + }), + adfFreqExtended: new Offset({ + value: 0x356, + name: 'adfFreqExtended', + category: OffsetCategory.RADIOS, + description: 'ADF frequency extended', + type: Type.UInt16, + permission: 'rw', + }), + comFreq: new Offset({ + value: 0x34E, + name: 'comFreq', + category: OffsetCategory.RADIOS, + description: 'Com frequency', + type: Type.UInt16, + convert: 'parseInt(`1` + ({VAL}).toString(16))', + permission: 'rw', + }), + nav1Freq: new Offset({ + value: 0x350, + name: 'nav1Freq', + category: OffsetCategory.RADIOS, + description: 'NAV1 frequency', + type: Type.UInt16, + convert: 'parseInt(`1` + ({VAL}).toString(16))', + permission: 'rw', + }), + nav2Freq: new Offset({ + value: 0x352, + name: 'nav2Freq', + category: OffsetCategory.RADIOS, + description: 'NAV2 frequency', + type: Type.UInt16, + convert: 'parseInt(`1` + ({VAL}).toString(16))', + permission: 'rw', + }), + transponderFreq: new Offset({ + value: 0x354, + name: 'transponderFreq', + category: OffsetCategory.RADIOS, + description: 'XPND transponder frequency', + type: Type.UInt16, + convert: 'parseInt(`1` + ({VAL}).toString(16))', + permission: 'rw', + }), + nav12Select: new Offset({ + value: 0x374, + name: 'nav12Select', + category: OffsetCategory.RADIOS, + description: 'NAV1/NAV2 select', + type: Type.UInt16, + permission: 'rw', + }), + dme12Select: new Offset({ + value: 0x378, + name: 'dme12Select', + category: OffsetCategory.RADIOS, + description: 'DME1/DME2 select', + type: Type.UInt16, + permission: 'rw', + }), + navAdfActivate: new Offset({ + value: 0x388, + name: 'navAdfActivate', + category: OffsetCategory.RADIOS, + description: 'NAV and ADF activate < FS2000', + type: Type.UInt16, + permission: 'w', + }), + comAtisActivate: new Offset({ + value: 0x38A, + name: 'comAtisActivate', + category: OffsetCategory.RADIOS, + description: 'COM/ATIS activate < FS2000', + type: Type.UInt16, + permission: 'w', + }), + hasNav1: new Offset({ + value: 0x7A0, + name: 'hasNav1', + category: OffsetCategory.RADIOS, + description: 'has NAV1', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + hasNav2: new Offset({ + value: 0x7A4, + name: 'hasNav2', + category: OffsetCategory.RADIOS, + description: 'has NAV2', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'r', + }), + vor2DmeLatitude: new Offset({ + value: 0x834, + name: 'vor2DmeLatitude', + category: OffsetCategory.RADIOS, + description: 'VOR 2 DME latitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 90 / 10001750', + permission: 'r', + }), + vor2DmeLongitude: new Offset({ + value: 0x838, + name: 'vor2DmeLongitude', + category: OffsetCategory.RADIOS, + description: 'VOR 2 DME longitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 360 / (65536 * 65536)', + permission: 'r', + }), + vor2DmeElevation: new Offset({ + value: 0x83C, + name: 'vor2DmeElevation', + category: OffsetCategory.RADIOS, + description: 'VOR 2 DME elevation - meters - FS2002+', + type: Type.Int32, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + vor2ILSLocHeadingTrue: new Offset({ + value: 0x844, + name: 'vor2ILSLocHeadingTrue', + category: OffsetCategory.RADIOS, + description: 'NAV2 ILS Localiser inverse runway heading if VOR 2 is ILS - TRUE - FS2002+ - 180 different to aircraft direction to follow localiser', + type: Type.UInt16, + convert: '+({VAL} * 360 / 65536).toFixed(2)', + permission: 'r', + }), + vor2ILSGlideSlopeAngle: new Offset({ + value: 0x846, + name: 'vor2ILSGlideSlopeAngle', + category: OffsetCategory.RADIOS, + description: 'VOR 2 ILS GlideSlope Angle', + type: Type.Int16, + convert: '+({VAL} * 360 / 65536).toFixed(2)', + permission: 'r', + }), + vor2LocLatitude: new Offset({ + value: 0x84C, + name: 'vor2LocLatitude', + category: OffsetCategory.RADIOS, + description: 'VOR 2 or NAV2 ILS LOC latitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 90 / 10001750', + permission: 'r', + }), + vor2LocLongitude: new Offset({ + value: 0x850, + name: 'vor2LocLongitude', + category: OffsetCategory.RADIOS, + description: 'VOR 2 or NAV2 ILS LOC longitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 360 / (65536 * 65536)', + permission: 'r', + }), + vor2LocElevation: new Offset({ + value: 0x854, + name: 'vor2LocElevation', + category: OffsetCategory.RADIOS, + description: 'VOR 2 or NAV2 ILS LOC elevation - meters - FS2002+', + type: Type.Int32, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + vor2OrILSGlideSlopeLatitude: new Offset({ + value: 0x858, + name: 'vor2OrILSGlideSlopeLatitude', + category: OffsetCategory.RADIOS, + description: 'VOR 2 latitude or NAV2 ILS glideslope latitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 90 / 10001750', + permission: 'r', + }), + vor1OrILSGlideSlopeLatitude: new Offset({ + value: 0x85C, + name: 'vor1OrILSGlideSlopeLatitude', + category: OffsetCategory.RADIOS, + description: 'VOR 1 latitude OR NAV1 ILS glideslope latitude', + type: Type.Int32, + convert: '{VAL} * 90 / 10001750', + permission: 'r', + }), + vor2OrILSGlideSlopeLongitude: new Offset({ + value: 0x860, + name: 'vor2OrILSGlideSlopeLongitude', + category: OffsetCategory.RADIOS, + description: 'VOR 2 or NAV 2 ILS glideslope longitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 360 / (65536 * 65536)', + permission: 'r', + }), + vor1OrILSGlideSlopeLongitude: new Offset({ + value: 0x864, + name: 'vor1OrILSGlideSlopeLongitude', + category: OffsetCategory.RADIOS, + description: 'VOR 1 or NAV 1 ILS glideslope longitude', + type: Type.Int32, + convert: '{VAL} * 360 / (65536 * 65536)', + permission: 'r', + }), + vor2OrILSGlideSlopeElevation: new Offset({ + value: 0x868, + name: 'vor2OrILSGlideSlopeElevation', + category: OffsetCategory.RADIOS, + description: 'VOR 2 or NAV2 ILS glideslope elevation - meters - FS2002+', + type: Type.Int32, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + vor1OrILSGlideSlopeElevation: new Offset({ + value: 0x86C, + name: 'vor1OrILSGlideSlopeElevation', + category: OffsetCategory.RADIOS, + description: 'VOR 1 or NAV1 ILS glideslope elevation - meters - FS2002+', + type: Type.Int32, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + vor1ILSLocHeadingTrue: new Offset({ + value: 0x870, + name: 'vor1LocHeadingTrue', + category: OffsetCategory.RADIOS, + description: 'VOR 1 ILS LOC heading - TRUE - -180 different to aircraft direction to follow localiser', + type: Type.UInt16, + convert: '+({VAL} * 360 / 65536).toFixed(2)', + permission: 'r', + }), + vor1GlideSlopeAngle: new Offset({ + value: 0x872, + name: 'vor1GlideSlopeAngle', + category: OffsetCategory.RADIOS, + description: 'VOR 1 ILS glideslope Angle', + type: Type.Int16, + convert: '+({VAL} * 360 / 65536).toFixed(2)', + permission: 'r', + }), + vor1LocLatitude: new Offset({ + value: 0x874, + name: 'vor1LocLatitude', + category: OffsetCategory.RADIOS, + description: 'VOR 1 or NAV1 ILS LOC latitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 90 / 10001750', + permission: 'r', + }), + vor1LocLongitude: new Offset({ + value: 0x878, + name: 'vor1LocLongitude', + category: OffsetCategory.RADIOS, + description: 'VOR 1 or NAV1 ILS LOC longitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 360 / (65536 * 65536)', + permission: 'r', + }), + vor1LocElevation: new Offset({ + value: 0x87C, + name: 'vor1LocElevation', + category: OffsetCategory.RADIOS, + description: 'VOR 1 or NAV1 ILS LOC elevation - meters - FS2002+', + type: Type.Int32, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), + vor1DmeLatitude: new Offset({ + value: 0x880, + name: 'vor1DmeLatitude', + category: OffsetCategory.RADIOS, + description: 'VOR 1 DME latitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 90 / 10001750', + permission: 'r', + }), + vor1DmeLongitude: new Offset({ + value: 0x884, + name: 'vor1DmeLongitude', + category: OffsetCategory.RADIOS, + description: 'VOR 1 DME longitude - FS2002+', + type: Type.Int32, + convert: '{VAL} * 360 / (65536 * 65536)', + permission: 'r', + }), + vor1DmeElevation: new Offset({ + value: 0x88A, + name: 'vor1DmeElevation', + category: OffsetCategory.RADIOS, + description: 'VOR 1 DME elevation - ft - FS2002+', + type: Type.Int32, + convert: '+({VAL} * 3.28084).toFixed(2)', + permission: 'r', + }), +}; diff --git a/src/lib/offsets/position-attitude/position-attitude.ts b/src/lib/offsets/position-attitude/position-attitude.ts new file mode 100644 index 0000000..d236f90 --- /dev/null +++ b/src/lib/offsets/position-attitude/position-attitude.ts @@ -0,0 +1,214 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const positionAttitude: OffsetList = { + groundElevation: new Offset({ + value: 0x20, + name: 'groundElevation', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'ground elevation - feet', + convert: 'Math.round({VAL} * 3.28084 / 256)', + type: Type.Int32, + permission: 'r', + }), + magVar: new Offset({ + value: 0x2A0, + name: 'magVar', + category: OffsetCategory.POSITION_ATTITUDE, + description: '-ve is west, +ve east. mag to true by adding this, true to mag by substracting this', + type: Type.Int16, + convert: '+({VAL}*360/65536).toFixed(2)', + permission: 'r', + }), + gs: new Offset({ + value: 0x2B4, + name: 'gs', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'ground speed in kt', + type: Type.Int32, + convert: 'Math.floor({VAL} * 3600 / 65536 / 1852)', + permission: 'r', + }), + tas: new Offset({ + value: 0x2B8, + name: 'tas', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'true air speed - knots', + type: Type.Int32, + convert: 'Math.floor({VAL} / 128)', + permission: 'r', + }), + ias: new Offset({ + value: 0x2BC, + name: 'ias', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'indicated air speed - knots', + type: Type.Int32, + convert: 'Math.floor({VAL} / 128)', + permission: 'r', + }), + bpa: new Offset({ + value: 0x2C4, + name: 'bpa', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'barper pole airspeed - knots', + type: Type.UInt32, + convert: 'Math.floor({VAL} / 128)', + permission: 'r', + }), + vs: new Offset({ + value: 0x2C8, + name: 'vs', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'vertical speed - ft/min', + type: Type.Int32, + convert: 'Math.floor({VAL} * 60 * 3.28084 / 256)', + permission: 'r', + }), + whiskeyCompass: new Offset({ + value: 0x2CC, + name: 'whiskeyCompass', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'whiskey compass - degrees', + type: Type.Double, + permission: 'r', + }), + vsAtTouchdown: new Offset({ + value: 0x30C, + name: 'vsAtTouchdown', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'vertical speed - m/s', + type: Type.Int32, + convert: 'Math.floor({VAL}*60*3.28084/256)', + permission: 'r', + }), + planeOnground: new Offset({ + value: 0x366, + name: 'planeOnground', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'plane on the ground', + type: Type.UInt16, + convert: '!!{VAL}', + permission: 'r', + }), + latitude: new Offset({ + value: 0x560, + name: 'latitude', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'latitude - -ve for south +ve for north', + type: Type.Int64, + convert: '{VAL} * 90 / (10001750 * 65536 * 65536)', + permission: 'rw', + }), + longitude: new Offset({ + value: 0x568, + name: 'longitude', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'longitude - -ve for west +ve for east', + type: Type.Int64, + convert: '{VAL} * 360 / (65536 * 65536 * 65536 * 65536)', + permission: 'rw', + }), + altitude: new Offset({ + value: 0x570, + name: 'altitude', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'altitude - AGL', + type: Type.Int64, + convert: '+({VAL} * 3.28084 / (65536 * 65536)).toFixed(2)', + permission: 'rw', + }), + pitch: new Offset({ + value: 0x578, + name: 'pitch', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'pitch - 0 for level, -ve for pitch up, +ve for pitch down', + type: Type.Int32, + convert: '+({VAL} * 360 / (65536 * 65536)).toFixed(2)', + permission: 'rw', + }), + bank: new Offset({ + value: 0x57C, + name: 'bank', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'bank - -ve right bank, +ve left bank', + type: Type.Int32, + convert: '+({VAL} * 360 / (65536 * 65536)).toFixed(2)', + permission: 'rw', + }), + heading: new Offset({ + value: 0x580, + name: 'heading', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'heading - TRUE', + type: Type.UInt32, + convert: '+({VAL} * 360 / (65536 * 65536)).toFixed(2)', + permission: 'rw', + }), + viewpointLatitude: new Offset({ + value: 0x5B0, + name: 'viewpointLatitude', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'viewpoint latitude - -ve for south +ve for north', + type: Type.Int64, + convert: '{VAL} * 90 / (10001750 * 65536 * 65536)', + permission: 'r', + }), + viewpointLongitude: new Offset({ + value: 0x5B8, + name: 'viewpointLongitude', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'viewpoint longitude - -ve for west +ve for east', + type: Type.Int64, + convert: '{VAL} * 360 / (65536 * 65536 * 65536 * 65536)', + permission: 'r', + }), + viewpointAltitude: new Offset({ + value: 0x5C0, + name: 'viewpointAltitude', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'viewpoint altitude - AGL', + type: Type.Int64, + convert: '+({VAL} * 3.28084 / (65536 * 65536)).toFixed(2)', + permission: 'r', + }), + viewpointPitch: new Offset({ + value: 0x5C8, + name: 'viewpointPitch', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'pitch - 0 for level, - for pitch up, for pitch down', + type: Type.Int32, + convert: '+({VAL} * 360 / (65536 * 65536)).toFixed(2)', + permission: 'r', + }), + viewpointBank: new Offset({ + value: 0x5CC, + name: 'viewpointBank', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'viewpoint bank - - right bank, + left bank', + type: Type.Int32, + convert: '+({VAL} * 360 / (65536 * 65536)).toFixed(2)', + permission: 'r', + }), + viewpointHeading: new Offset({ + value: 0x5D0, + name: 'viewpointHeading', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'viewpoint heading - TRUE', + type: Type.UInt32, + convert: '+({VAL} * 360 / (65536 * 65536)).toFixed(2)', + permission: 'r', + }), + verticalSpeed: new Offset({ + value: 0x842, + name: 'verticalSpeed', + category: OffsetCategory.POSITION_ATTITUDE, + description: 'vertical speed - more precise - ft/min - +ve = up', + type: Type.Int16, + convert: '+({VAL} * -3.28084).toFixed(2)', + permission: 'r', + }), +}; diff --git a/src/lib/offsets/simulation/simulation.ts b/src/lib/offsets/simulation/simulation.ts new file mode 100644 index 0000000..509378c --- /dev/null +++ b/src/lib/offsets/simulation/simulation.ts @@ -0,0 +1,359 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from '@shared/offset-category'; +import { OffsetList } from '@shared/offset-list'; +import { Offset } from '@shared/offset'; + +export const simulation: OffsetList = { + startupFlight: new Offset({ + value: 0x24, + name: 'startupFlight', + category: OffsetCategory.SIMULATION, + description: 'startup path', + type: Type.String, + length: 256, + permission: 'r', + }), + logbookName: new Offset({ + value: 0x12C, + name: 'logbookName', + category: OffsetCategory.SIMULATION, + description: 'logbook name - FS2002+', + type: Type.String, + length: 256, + permission: 'r', + }), + flightPlan: new Offset({ + value: 0x130, + name: 'flightPlan', + category: OffsetCategory.SIMULATION, + description: 'current flight plan - FSX only', + type: Type.String, + length: 256, + permission: 'r', + }), + availableMemory: new Offset({ + value: 0x24C, + name: 'availableMemory', + category: OffsetCategory.SIMULATION, + description: 'available FS memory - kb', + type: Type.Int32, + permission: 'r', + }), + trafficDensityAirline: new Offset({ + value: 0x250, + name: 'trafficDensityAirline', + category: OffsetCategory.SIMULATION, + description: 'Airline traffic density percent', + type: Type.Byte, + permission: 'rw', + }), + trafficDensityGA: new Offset({ + value: 0x251, + name: 'trafficDensityGA', + category: OffsetCategory.SIMULATION, + description: 'General Aviation traffic density percent', + type: Type.Byte, + permission: 'rw', + }), + trafficDensityShips: new Offset({ + value: 0x252, + name: 'trafficDensityShips', + category: OffsetCategory.SIMULATION, + description: 'Ships and Ferries traffic density percent', + type: Type.Byte, + permission: 'rw', + }), + cloudCoverDensity: new Offset({ + value: 0x254, + name: 'cloudCoverDensity', + category: OffsetCategory.SIMULATION, + description: 'cloud cover density - 5-8', + type: Type.Byte, + permission: 'rw', + }), + cloudComplex: new Offset({ + value: 0x255, + name: 'cloudComplex', + category: OffsetCategory.SIMULATION, + description: 'cloud simple/complex - 0 = simple, 1 = complex', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'rw', + }), + thermalVisualisation: new Offset({ + value: 0x256, + name: 'thermalVisualisation', + category: OffsetCategory.SIMULATION, + description: '0 = none, 1 = natural, 2 = schematic', + type: Type.Byte, + permission: 'r', + }), + memoryAssignedToFSUIPC: new Offset({ + value: 0x258, + name: 'memoryAssignedToFSUIPC', + category: OffsetCategory.SIMULATION, + type: Type.Int16, + permission: 'r', + }), + pauseControl: new Offset({ + value: 0x262, + name: 'pauseControl', + category: OffsetCategory.SIMULATION, + description: 'pause control (write only)', + convert: '{VAL} ? 1 : 0', + type: Type.UInt16, + permission: 'w', + }), + pauseFlag: new Offset({ + value: 0x264, + name: 'pauseFlag', + category: OffsetCategory.SIMULATION, + description: 'simulation paused', + convert: '!!{VAL}', + type: Type.Int16, + permission: 'r', + }), + framerate: new Offset({ + value: 0x274, + name: 'framerate', + category: OffsetCategory.SIMULATION, + description: 'framerate', + convert: 'Math.floor(32768/{VAL})', + type: Type.UInt16, + permission: 'r', + }), + zoomfactor: new Offset({ + value: 0x2B2, + name: 'zoomfactor', + category: OffsetCategory.SIMULATION, + description: 'zoom factor - FS2002+', + convert: 'Math.floor({VAL}/64)', + type: Type.UInt16, + permission: 'r', + }), + controlTimer1: new Offset({ + value: 0x310, + name: 'controlTimer1', + category: OffsetCategory.SIMULATION, + description: 'control timer 1 - FS2002+ - Seconds', + type: Type.Double, + permission: 'r', + }), + controlTimer2: new Offset({ + value: 0x368, + name: 'controlTimer2', + category: OffsetCategory.SIMULATION, + description: 'control timer 2 - FS2002+', + type: Type.Int32, + permission: 'r', + }), + fuelBoxFlag: new Offset({ + value: 0x32C, + name: 'fuelBoxFlag', + category: OffsetCategory.SIMULATION, + description: 'plane in fuel box flag', + convert: '!!{VAL}', + type: Type.UInt16, + permission: 'r', + }), + comFreqInc: new Offset({ + value: 0x358, + name: 'comFreqInc', + category: OffsetCategory.SIMULATION, + description: 'COM freq increment - KHz', + convert: '({VAL}) === 0 ? 50 : 25', + type: Type.Int16, + permission: 'rw', + }), + adfFreqInc: new Offset({ + value: 0x358, + name: 'adfFreqInc', + category: OffsetCategory.SIMULATION, + description: 'ADF freq increment - KHz', + convert: '({VAL}) === 0 ? 1.0 : 0.1', + type: Type.Int16, + permission: 'rw', + }), + reliability: new Offset({ + value: 0x372, + name: 'reliability', + category: OffsetCategory.SIMULATION, + description: 'reliability - percent', + type: Type.UInt16, + permission: 'rw', + }), + lastSavedFlightName: new Offset({ + value: 0x400, + name: 'lastSavedFlightName', + category: OffsetCategory.SIMULATION, + description: 'name of last saved flight', + type: Type.String, + length: 128, + permission: 'r', + }), + elapsedTime: new Offset({ + value: 0x4A8, + name: 'elapsedTime', + category: OffsetCategory.SIMULATION, + description: 'simulated flight time - seconds (paused while simulation paused)', + type: Type.Double, + permission: 'r', + }), + elapsedRealTime: new Offset({ + value: 0x588, + name: 'elapsedRealTime', + category: OffsetCategory.SIMULATION, + description: 'elasped real time', + type: Type.Double, + permission: 'r', + }), + smokeSystemAvailable: new Offset({ + value: 0x5D4, + name: 'smokeSystemAvailable', + category: OffsetCategory.SIMULATION, + convert: '!!{VAL}', + description: 'smoke system available - <= FS2000', + type: Type.UInt16, + permission: 'r', + }), + slewMode: new Offset({ + value: 0x5DC, + name: 'slewMode', + category: OffsetCategory.SIMULATION, + convert: '!!{VAL}', + description: 'slew mode activated', + type: Type.UInt16, + permission: 'rw', + }), + slewRollRate: new Offset({ + value: 0x5E4, + name: 'slewRollRate', + category: OffsetCategory.SIMULATION, + description: '192 gives a 360 roll in about 1 minute - -ve right, +ve left', + type: Type.Int16, + permission: 'rw', + }), + slewYawRate: new Offset({ + value: 0x5E6, + name: 'slewYawRate', + category: OffsetCategory.SIMULATION, + description: 'Slew mode turns - +ve values are left, -ve are right - 24 takes about 1 minute to complete a 360', + type: Type.Int16, + permission: 'rw', + }), + slewVerticalRate: new Offset({ + value: 0x5E8, + name: 'slewVerticalRate', + category: OffsetCategory.SIMULATION, + description: '16384=no alt slew rate - 16383 to 0 increasing slew UP rates, 16385 to 32767 increasing slew DOWN rates', + type: Type.Int16, + permission: 'rw', + }), + slewBackwardForwardRate: new Offset({ + value: 0x5EB, + name: 'slewBackwardForwardRate', + category: OffsetCategory.SIMULATION, + description: 'Slew fwd if-ve, bwd if +ve, 1=very slow ... 127=very fast, -128 fastest forward', + type: Type.SByte, + permission: 'rw', + }), + slewLeftRightRate: new Offset({ + value: 0x5ED, + name: 'slewLeftRightRate', + category: OffsetCategory.SIMULATION, + description: 'Slew left if -ve, right if +ve, 1=very slow ... 127=very fast, -128 fastest leftward', + type: Type.SByte, + permission: 'rw', + }), + slewPitchRate: new Offset({ + value: 0x5EE, + name: 'slewPitchRate', + category: OffsetCategory.SIMULATION, + description: '16384=no pitch slew -16384 pitch up, 16384 pitch down, range 0-32767', + type: Type.Int16, + permission: 'rw', + }), + slewModeDisplay: new Offset({ + value: 0x5F4, + name: 'slewModeDisplay', + category: OffsetCategory.SIMULATION, + description: '0=off, 1=coods/hdg/speed, 2=fps, 3=all', + type: Type.UInt16, + }), + flightModeDisplay: new Offset({ + value: 0x5FC, + name: 'flightModeDisplay', + category: OffsetCategory.SIMULATION, + description: '0=off, 1=coods/hdg/speed, 2=fps, 3=all', + type: Type.UInt16, + permission: 'rw', + }), + replayInAction: new Offset({ + value: 0x628, + name: 'replayInAction', + category: OffsetCategory.SIMULATION, + description: 'replay in action', + convert: '!!{VAL}', + type: Type.UInt32, + permission: 'rw', + }), + replayTimerCountdown: new Offset({ + value: 0x62C, + name: 'replayTimerCountdown', + category: OffsetCategory.SIMULATION, + description: 'instant replay time left in seconds - controls the playback', + type: Type.UInt32, + permission: 'rw', + }), + videoRecording: new Offset({ + value: 0x760, + name: 'videoRecording', + category: OffsetCategory.SIMULATION, + description: 'video recording flag - FS2002+', + convert: '!!{VAL}', + type: Type.Byte, + permission: 'r', + }), + flightAnalysisMode: new Offset({ + value: 0x814, + name: 'flightAnalysisMode', + category: OffsetCategory.SIMULATION, + description: '0=off 1=landing 2=course tracking 3=manoeuvres', + type: Type.UInt32, + permission: 'rw', + }), + crashDetection: new Offset({ + value: 0x830, + name: 'crashDetection', + category: OffsetCategory.SIMULATION, + description: '0=Ignore Crash, 1=Detect Crash and restart, 2=Detect Crash and show Graph (last is not applicable to FS2002/4)', + type: Type.UInt16, + permission: 'rw', + }), + crashDetectionFSX: new Offset({ + value: 0x832, + name: 'crashDetectionFSX', + category: OffsetCategory.SIMULATION, + description: '0=Ignore Crash, 1=Detect Crash', + type: Type.Byte, + permission: 'r', + }), + crashDetectionFSXAi: new Offset({ + value: 0x833, + name: 'crashDetectionFSXAi', + category: OffsetCategory.SIMULATION, + description: '0=Ignore Crash, 1=Detect Crash', + type: Type.Byte, + permission: 'r', + }), + crashed: new Offset({ + value: 0x840, + name: 'crashed', + category: OffsetCategory.SIMULATION, + description: 'crashed', + convert: '!!{VAL}', + type: Type.Int16, + permission: 'r', + }), +}; diff --git a/src/shared/converted-offset-values.ts b/src/shared/converted-offset-values.ts new file mode 100644 index 0000000..81c3227 --- /dev/null +++ b/src/shared/converted-offset-values.ts @@ -0,0 +1,5 @@ +export type ConvertedOffsetValue = string | number | boolean | string[] | number[] | boolean[]; + +export interface ConvertedOffsetValues { + [key: string]: ConvertedOffsetValue; +} diff --git a/src/shared/offset-category.ts b/src/shared/offset-category.ts new file mode 100644 index 0000000..2b3651c --- /dev/null +++ b/src/shared/offset-category.ts @@ -0,0 +1,17 @@ +export enum OffsetCategory { + AUTOPILOT = 'autopilot', + COCKPIT = 'cockpit', + CONTROLS = 'controls', + ENGINE = 'engine', + ENVIRONMENT = 'environment', + HELICOPTER = 'helicopter', + ICING = 'icing', + PLANE = 'plane', + POSITION_ATTITUDE = 'position_attitude', + PRESSURISATION = 'pressurisation', + PUSHBACK = 'pushback', + RADIOS = 'radios', + RUNWAY = 'runway', + SIMULATION = 'simulation', + WEATHER = 'weather', +} diff --git a/src/shared/offset-list.ts b/src/shared/offset-list.ts new file mode 100644 index 0000000..ce9a354 --- /dev/null +++ b/src/shared/offset-list.ts @@ -0,0 +1,5 @@ +import { Offset } from './offset'; + +export interface OffsetList { + [key: string]: Offset; +} diff --git a/src/shared/offset-values.ts b/src/shared/offset-values.ts new file mode 100644 index 0000000..8223a7d --- /dev/null +++ b/src/shared/offset-values.ts @@ -0,0 +1,5 @@ +export type RawOffsetValue = string | number | string[] | number[] | boolean[]; + +export interface OffsetValues { + [key: string]: RawOffsetValue; +} diff --git a/src/shared/offset.ts b/src/shared/offset.ts new file mode 100644 index 0000000..bd99d17 --- /dev/null +++ b/src/shared/offset.ts @@ -0,0 +1,53 @@ +import { Type } from 'fsuipc'; + +import { OffsetCategory } from './offset-category'; +import { MAPPINGS } from '@mappings/index'; + +export interface OffsetData { + value: number; + name: string; + category: OffsetCategory; + type: Type; + + mapping?: boolean; + length?: number; + description?: string; + convert?: string; + permission?: 'r' | 'w' | 'rw'; + } + +export class Offset { + public value: number = undefined; + public name: string = undefined; + public category: OffsetCategory = undefined; + public type: Type = undefined; + public mapping: boolean = undefined; + public length: number = undefined; + public description: string = undefined; + public convert: string = undefined; + public permission: string = undefined; + + constructor(offsetData: Partial) { + Object.keys(offsetData).forEach((key: string) => { + if (key in this) { + this[key] = offsetData[key]; + } + }); + } + + public get hasMapping(): boolean { + return !!(this.mapping && this.convert); + } + + public get isMappingInvalid(): boolean { + return !MAPPINGS[this.convert]; + } + + public get isInvalidConvertExpression(): boolean { + return typeof this.convert !== 'string'; + } + + public get mappingFunction(): (_: any) => any { + return MAPPINGS[this.convert]; + } +} diff --git a/src/shared/plane/engine-type.ts b/src/shared/plane/engine-type.ts new file mode 100644 index 0000000..39d06b4 --- /dev/null +++ b/src/shared/plane/engine-type.ts @@ -0,0 +1,8 @@ +export enum EngineType { + PISTON = 'piston', + JET = 'jet', + SAILPLANE = 'sailplane', + HELO = 'helo', + ROCKET = 'rocket', + TURBOPROP = 'turboprop', +} diff --git a/src/shared/runway/runway-surface-condition.ts b/src/shared/runway/runway-surface-condition.ts new file mode 100644 index 0000000..88ed2a0 --- /dev/null +++ b/src/shared/runway/runway-surface-condition.ts @@ -0,0 +1,6 @@ +export enum SurfaceCondition { + NORMAL = 'normal', + WET = 'wet', + ICY = 'icy', + SNOW = 'snow', +} diff --git a/src/shared/weather/precipitation-type.ts b/src/shared/weather/precipitation-type.ts new file mode 100644 index 0000000..289244a --- /dev/null +++ b/src/shared/weather/precipitation-type.ts @@ -0,0 +1,5 @@ +export enum PrecipitationType { + NONE = 'none', + RAIN = 'rain', + SNOW = 'snow', +} diff --git a/src/shared/weather/season.ts b/src/shared/weather/season.ts new file mode 100644 index 0000000..f3b1a13 --- /dev/null +++ b/src/shared/weather/season.ts @@ -0,0 +1,6 @@ +export enum Season { + WINTER = 'winter', + SPRING = 'spring', + SUMMER = 'summer', + AUTUMN = 'autumn', +} diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json new file mode 100644 index 0000000..9878dac --- /dev/null +++ b/src/tsconfig.app.json @@ -0,0 +1,30 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "./api.ts", + "**/*.d.ts" + ], + "compilerOptions": { + "declaration": true, + "outDir": "../dist", + "module": "commonjs", + "baseUrl": "./", + "paths": { + "@shared": ["shared/index"], + "@shared/*": ["shared/*"], + "@offsets": ["lib/offsets/index"], + "@offsets/*": ["lib/offsets/*"], + "@mappings": ["lib/convert/mappings/index"], + "@mappings/*": ["lib/convert/mappings/*"], + "@convert": ["lib/convert/index"], + "@convert/*": ["lib/convert/*"] + } + }, + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "**/*.stub.ts", + "**/*.mock.ts", + "node_modules" + ] +} diff --git a/src/tsconfig.prod.json b/src/tsconfig.prod.json new file mode 100644 index 0000000..1ea518a --- /dev/null +++ b/src/tsconfig.prod.json @@ -0,0 +1,31 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "./api.ts", + "**/*.d.ts" + ], + "compilerOptions": { + "declaration": true, + "outDir": "../dist", + "module": "commonjs", + "sourceMap": false, + "baseUrl": "./", + "paths": { + "@shared": ["shared/index"], + "@shared/*": ["shared/*"], + "@offsets": ["lib/offsets/index"], + "@offsets/*": ["lib/offsets/*"], + "@mappings": ["lib/convert/mappings/index"], + "@mappings/*": ["lib/convert/mappings/*"], + "@convert": ["lib/convert/index"], + "@convert/*": ["lib/convert/*"] + } + }, + "exclude": [ + "**/*.spec.ts", + "**/*.test.ts", + "**/*.stub.ts", + "**/*.mock.ts", + "node_modules" + ] +} diff --git a/tests/api.spec.ts b/tests/api.spec.ts new file mode 100644 index 0000000..f498a5c --- /dev/null +++ b/tests/api.spec.ts @@ -0,0 +1,438 @@ +import { FSUIPC, FSUIPCError } from 'fsuipc'; +import { Subscription } from 'rxjs'; + +import { FsuipcApi } from '../src/api'; +import * as OFFSETS from '../src/lib/offsets/index'; +import { applyConversion } from '../src/lib/convert/apply-conversion'; +import { Offset } from '@shared/offset'; + +jest.useFakeTimers(); + +const enum SimulatorMock { + ANY, + FS98, + FS2K, + CFS2, + CFS1, + FLY, + FS2K2, + FS2K4, + FSX, + ESP, + P3D, + FSX64, + P3D64 +} + +const FSUIPCErrorMock = jest.fn().mockImplementation(() => ({ + message: 'some message', + code: 1234, +})); + +const processMock = jest.fn(); +const addMock = jest.fn(); +const closeMock = jest.fn(); + +jest.mock('fsuipc', () => { + return { + FSUIPC: jest.fn().mockImplementation(() => { + return { + open: jest.fn().mockImplementation((simulator) => { + if (simulator === SimulatorMock.FSX) { + return Promise.resolve({ + process: processMock, + add: addMock, + close: closeMock, + }); + } else { + throw new FSUIPCErrorMock(); + } + }) + }; + }), + FSUIPCError: jest.fn().mockImplementation(() => ({ + message: 'some message', + code: 1234, + })), + Simulator: { + FSX: 8, + P3D64: 12, + }, + Type: { + Byte: 0, + SByte: 1, + Int16: 2, + Int32: 3, + Int64: 4, + UInt16: 5, + UInt32: 6, + UInt64: 7, + Double: 8, + Single: 9, + ByteArray: 10, + String: 11, + BitArray: 12, + } + }; +}); + +const OFFSET_WITH_BYTE_ARRAY_TYPE = new Offset({ + name: 'someOffsetWithByteArrayType', + convert: '!!{VAL}', + value: 0x001, + type: 10, + length: 4, +}); + +const OFFSET_WITH_BIT_ARRAY_TYPE = new Offset({ + name: 'someOffsetWithBitArrayType', + convert: '!!{VAL}', + value: 0x002, + type: 12, + length: 5, +}); + +const OFFSET_WITH_STRING_TYPE = new Offset({ + name: 'someOffsetWithStringType', + convert: '!!{VAL}', + value: 0x003, + type: 11, + length: 6, +}); + +const OFFSET_WITH_OTHER_TYPE = new Offset({ + name: 'someOffsetWithOtherType', + convert: '!!{VAL}', + value: 0x004, + type: 0, +}); + +const RAW_OFFSETS_VALUES = { + someOffsetWithByteArrayType: [123, 456], + someOffsetWithBitArrayType: [789, 101], + someOffsetWithStringType: 'SomeString', + someOffsetWithOtherType: 123, +}; + +jest.mock('../src/lib/offsets/index', () => ({ + OFFSETS: { + someOffsetWithOtherType: { + name: 'someOffsetWithOtherType', + convert: '!!{VAL}', + type: 0, + value: 0x004, + } as any, + someOffsetWithByteArrayType: { + name: 'someOffsetWithByteArrayType', + convert: '!!{VAL}', + type: 10, + value: 0x001, + length: 4, + } as any, + someOffsetWithBitArrayType: { + name: 'someOffsetWithBitArrayType', + convert: '!!{VAL}', + type: 12, + value: 0x002, + length: 5, + } as any, + someOffsetWithStringType: { + name: 'someOffsetWithStringType', + convert: '!!{VAL}', + type: 11, + value: 0x003, + length: 6, + } as any, + } +})); + +jest.mock('../src/lib/convert/apply-conversion', () => ({ + applyConversion: jest.fn().mockImplementation(val => `converted ${val.convert}`) +})); + +describe('FSUIPC Api', () => { + beforeEach(() => { + closeMock.mockClear(); + processMock.mockClear(); + addMock.mockClear(); + }); + + describe('instance', () => { + it('should create instance with specified simulator', () => { + const instance = new FsuipcApi(SimulatorMock.P3D64 as any); + expect(instance['simulator']).toEqual(SimulatorMock.P3D64); + }); + + it('should create instance with FSX by default when no simulator provided', () => { + const instance = new FsuipcApi(); + expect(instance['simulator']).toEqual(SimulatorMock.FSX); + }); + }); + + describe('init', () => { + describe('when connecting to fsuipc protocol succeeds', () => { + it('should store fsuipc instance', async () => { + expect.assertions(4); + + const instance = new FsuipcApi(); + const initResult = await instance.init(); + + expect(initResult).toEqual(true); + expect(instance['fsuipc'].add).toEqual(addMock); + expect(instance['fsuipc'].close).toEqual(closeMock); + expect(instance['fsuipc'].process).toEqual(processMock); + }); + }); + + describe('when an error occurs while connecting to fsuipc', () => { + it('should throw the error', async () => { + expect.assertions(1); + + const instance = new FsuipcApi(SimulatorMock.P3D64 as any); + + try { + await instance.init(); + } catch (e) { + expect(e).toEqual({ + message: 'some message', + code: 1234, + }); + } + }); + }); + }); + + describe('listen', () => { + describe('when called before init', () => { + it('should throw an error', () => { + expect.assertions(1); + + const instance = new FsuipcApi(); + + // tslint:disable-next-line + instance.listen(1000, []).subscribe(() => {}, (err) => { + expect(err).toEqual('NO_FSUIPC_INSTANCE'); + }); + }); + }); + + describe('when called after init', () => { + let sub: Subscription; + + beforeEach(() => { + if (!!sub) { + sub.unsubscribe(); + } + }); + + describe('process', () => { + beforeEach(() => { + processMock.mockResolvedValue({}); + }); + + it('should call process after timer', async () => { + expect.assertions(2); + + const instance = new FsuipcApi(); + await instance.init(); + sub = instance.listen(1000, []).subscribe(); + + expect(processMock).not.toHaveBeenCalled(); + + jest.advanceTimersByTime(1001); + + expect(processMock).toHaveBeenCalledTimes(1); + }); + }); + + describe('offsets watch cache', () => { + describe('when there are no cached watched offsets', () => { + beforeEach(() => { + processMock.mockResolvedValue({}); + }); + + it('should not add watched values', async () => { + expect.assertions(2); + + const instance = new FsuipcApi(); + await instance.init(); + sub = instance.listen(1000, []).subscribe(); + jest.advanceTimersByTime(1001); + + expect(instance['watchedOffsetCache']).toEqual([]); + expect(addMock).not.toHaveBeenCalled(); + }); + + it('should call process after timer', async () => { + expect.assertions(2); + + const instance = new FsuipcApi(); + await instance.init(); + sub = instance.listen(1000, []).subscribe(); + + expect(processMock).not.toHaveBeenCalled(); + + jest.advanceTimersByTime(1001); + + expect(processMock).toHaveBeenCalledTimes(1); + }); + }); + + describe('when there are cached watched offsets', () => { + describe('when offsets list is empty', () => { + beforeEach(() => { + processMock.mockResolvedValue({}); + }); + + it('should add all offsets to watch list', async () => { + expect.assertions(1); + + const instance = new FsuipcApi(); + await instance.init(); + + sub = instance.listen(1000, [OFFSET_WITH_OTHER_TYPE.name]).subscribe(); + jest.advanceTimersByTime(1001); + + expect(instance['watchedOffsetCache']).toEqual([OFFSET_WITH_OTHER_TYPE.name]); + }); + }); + + describe('when cached offsets does not match requested ones', () => { + it('should update offsets watch list', async () => { + expect.assertions(1); + + const instance = new FsuipcApi(); + await instance.init(); + + instance['watchedOffsetCache'] = ['some1', OFFSET_WITH_OTHER_TYPE.name]; + + sub = instance.listen(1000, [OFFSET_WITH_OTHER_TYPE.name]).subscribe(); + jest.advanceTimersByTime(1001); + + expect(instance['watchedOffsetCache']).toEqual([OFFSET_WITH_OTHER_TYPE.name]); + }); + }); + + describe('when cached offsets match requested ones', () => { + it('should use cached offsets', async () => { + expect.assertions(1); + + const instance = new FsuipcApi(); + await instance.init(); + + instance['watchedOffsetCache'] = [ OFFSET_WITH_OTHER_TYPE.name]; + + sub = instance.listen(1000, [OFFSET_WITH_OTHER_TYPE.name]).subscribe(); + jest.advanceTimersByTime(1001); + + expect(instance['watchedOffsetCache']).toEqual([OFFSET_WITH_OTHER_TYPE.name]); + }); + }); + }); + }); + + describe('add', () => { + beforeEach(() => { + processMock.mockResolvedValue({}); + }); + + it('should add offsets on fsuipc watch list with options depending on offset type', async () => { + expect.assertions(1); + + const instance = new FsuipcApi(); + await instance.init(); + + sub = instance.listen(1000, [ + OFFSET_WITH_OTHER_TYPE.name, + OFFSET_WITH_BYTE_ARRAY_TYPE.name, + OFFSET_WITH_BIT_ARRAY_TYPE.name, + OFFSET_WITH_STRING_TYPE.name, + ]).subscribe(); + jest.advanceTimersByTime(1001); + + expect(addMock.mock.calls).toEqual([ + [ + OFFSET_WITH_OTHER_TYPE.name, OFFSET_WITH_OTHER_TYPE.value, OFFSET_WITH_OTHER_TYPE.type, + ], + [ + OFFSET_WITH_BYTE_ARRAY_TYPE.name, OFFSET_WITH_BYTE_ARRAY_TYPE.value, OFFSET_WITH_BYTE_ARRAY_TYPE.type, + OFFSET_WITH_BYTE_ARRAY_TYPE.length, + ], + [ + OFFSET_WITH_BIT_ARRAY_TYPE.name, OFFSET_WITH_BIT_ARRAY_TYPE.value, OFFSET_WITH_BIT_ARRAY_TYPE.type, + OFFSET_WITH_BIT_ARRAY_TYPE.length, + ], + [ + OFFSET_WITH_STRING_TYPE.name, OFFSET_WITH_STRING_TYPE.value, OFFSET_WITH_STRING_TYPE.type, + OFFSET_WITH_STRING_TYPE.length, + ], + ]); + }); + }); + + describe('processing values', () => { + describe('when fsuipc returns valid data', () => { + let instance; + + beforeEach(async () => { + processMock.mockResolvedValue(RAW_OFFSETS_VALUES); + + instance = new FsuipcApi(); + await instance.init(); + }); + + it('should return a converted list', (done) => { + instance.listen(1000, [ + OFFSET_WITH_OTHER_TYPE.name, + OFFSET_WITH_BYTE_ARRAY_TYPE.name, + OFFSET_WITH_BIT_ARRAY_TYPE.name, + OFFSET_WITH_STRING_TYPE.name, + ]).subscribe((res) => { + expect(Object.keys(res).length).toEqual(4); + expect({ + ...res + }).toEqual({ + someOffsetWithByteArrayType: 'converted !!{VAL}', + someOffsetWithBitArrayType: 'converted !!{VAL}', + someOffsetWithStringType: 'converted !!{VAL}', + someOffsetWithOtherType: 'converted !!{VAL}' + }); + done(); + }); + + jest.runOnlyPendingTimers(); + }); + }); + + describe('when fsuipc is errored', () => { + let instance; + + beforeEach(async () => { + processMock.mockRejectedValue(new FSUIPCErrorMock()); + + instance = new FsuipcApi(); + await instance.init(); + }); + + it('should close fsuipc and throw error', (done) => { + sub = instance.listen(1000, [ + OFFSET_WITH_OTHER_TYPE.name, + OFFSET_WITH_BYTE_ARRAY_TYPE.name, + OFFSET_WITH_BIT_ARRAY_TYPE.name, + OFFSET_WITH_STRING_TYPE.name, + // tslint:disable-next-line + ]).subscribe((res) => {}, (err) => { + expect(err.message).toEqual('some message'); + expect(err.code).toEqual(1234); + expect(closeMock).toHaveBeenCalled(); + + done(); + }); + + jest.advanceTimersByTime(1000); + }); + }); + }); + }); + }); +}); diff --git a/tests/convert/apply-conversion.spec.ts b/tests/convert/apply-conversion.spec.ts new file mode 100644 index 0000000..49be1c3 --- /dev/null +++ b/tests/convert/apply-conversion.spec.ts @@ -0,0 +1,133 @@ +import { applyConversion } from '@convert/apply-conversion'; + +import { VM } from 'vm2'; +import * as MAPPINGS from '../../src/lib/convert/mappings'; +import { Offset } from '@shared/offset'; + +jest.mock('../../src/lib/convert/mappings', () => ({ + MAPPINGS: { + someMapping: jest.fn().mockReturnValue('mappingReturn') + } +})); + +const VALUE = 123; +const ARRAY = [123, 456]; +const EXPECTED_RESULT_ARRAY = [124, 457]; +const OFFSET_NO_CONVERT = new Offset({ + name: 'someOffset', +}); +const OFFSET_WITH_NON_EXISTING_MAPPING = new Offset({ + name: 'someOffsetNonExistingMapping', + mapping: true, + convert: 'someNonExistingMapping', +}); +const OFFSET_WITH_EXISTING_MAPPING = new Offset({ + name: 'someOffsetMapping', + mapping: true, + convert: 'someMapping', +}); +const OFFSET_WITH_SIMPLE_CONVERT = new Offset({ + name: 'someOffsetWithConvert', + convert: '!!{VAL}', +}); +const OFFSET_WITH_ARRAY_CONVERT = new Offset({ + name: 'someOffsetWithConvert', + convert: '({VAL}).map(val => val + 1)', +}); +const OFFSET_WITH_NON_STRING_CONVERT = new Offset({ + name: 'someOffsetWithConvert', + convert: (() => { let something; }) as any, +}); +const EXPECTED_EXPRESSION_ARRAY = '([123,456]).map(val => val + 1)'; +const EXPECTED_EXPRESSION_SIMPLE = '!!123'; + +const mockRun = jest.fn().mockImplementation((expression) => { + if (expression === EXPECTED_EXPRESSION_ARRAY) { + return EXPECTED_RESULT_ARRAY; + } + + return true; +}); +jest.mock('vm2', () => { + return { + VM: jest.fn().mockImplementation(() => { + return { + run: mockRun + }; + }) + }; +}); + +describe('apply conversion', () => { + beforeEach(() => { + mockRun.mockClear(); + }); + + describe('when offset has no convert method', () => { + it('should return value unmodified', () => { + expect(applyConversion(OFFSET_NO_CONVERT, VALUE)).toEqual(VALUE); + }); + + it('should not evaluate expression directly', () => { + expect(mockRun).not.toHaveBeenCalled(); + }); + }); + + describe('when offset has a convert method', () => { + describe('when conversion uses a mapping', () => { + describe('when mapping was not found', () => { + it('should return an errored value', () => { + expect(applyConversion(OFFSET_WITH_NON_EXISTING_MAPPING, VALUE)).toEqual('INVALID_MAPPING_FUNCTION'); + }); + }); + + describe('when mapping exists', () => { + it('should call mapping method', () => { + expect(applyConversion(OFFSET_WITH_EXISTING_MAPPING, VALUE)).toEqual('mappingReturn'); + }); + + it('should not evaluate expression directly', () => { + expect(mockRun).not.toHaveBeenCalled(); + }); + }); + }); + + describe('when conversion does not use a mapping', () => { + describe('when value is not a string', () => { + it('should return an errored value set as unsupported conversion expression', () => { + expect(applyConversion(OFFSET_WITH_NON_STRING_CONVERT, VALUE)).toEqual('UNSUPPORTED_CONVERSION_EXPRESSION'); + }); + + it('should not evaluate expression directly', () => { + expect(mockRun).not.toHaveBeenCalled(); + }); + }); + + describe('when value is an array', () => { + let result; + + beforeEach(() => { + result = applyConversion(OFFSET_WITH_ARRAY_CONVERT, ARRAY); + }); + + it('should evaluate expression in safe VM', () => { + expect(mockRun).toHaveBeenCalledWith(EXPECTED_EXPRESSION_ARRAY); + expect(result).toEqual(EXPECTED_RESULT_ARRAY); + }); + }); + + describe('when value is not an array', () => { + let result; + + beforeEach(() => { + result = applyConversion(OFFSET_WITH_SIMPLE_CONVERT, VALUE); + }); + + it('should evaluate expression in safe VM', () => { + expect(mockRun).toHaveBeenCalledWith(EXPECTED_EXPRESSION_SIMPLE); + expect(result).toBe(true); + }); + }); + }); + }); +}); diff --git a/tests/convert/helpers/hexadecimal.spec.ts b/tests/convert/helpers/hexadecimal.spec.ts new file mode 100644 index 0000000..b077e67 --- /dev/null +++ b/tests/convert/helpers/hexadecimal.spec.ts @@ -0,0 +1,16 @@ +import { HexadecimalHelper } from '@convert/helpers/hexadecimal'; + +describe('hexadecimal helper', () => { + describe('binToHex', () => { + it('should number to hexadecimal', () => { + expect(HexadecimalHelper.binToHex(67)).toEqual('43'); + }); + }); + + describe('hex2String', () => { + it('should hexadecimal character code to string', () => { + expect(HexadecimalHelper.hex2string(43)).toEqual('C'); + expect(HexadecimalHelper.hex2string('43')).toEqual('C'); + }); + }); +}); diff --git a/tests/convert/mappings/__snapshots__/mappings.spec.ts.snap b/tests/convert/mappings/__snapshots__/mappings.spec.ts.snap new file mode 100644 index 0000000..7399aca --- /dev/null +++ b/tests/convert/mappings/__snapshots__/mappings.spec.ts.snap @@ -0,0 +1,14 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`mappings list should import all mappings 1`] = ` +Object { + "engineType": [Function], + "ftsecToKt": [Function], + "ktToFtsec": [Function], + "lightsMapping": [Function], + "nearestAirportsIds": [Function], + "precipitationType": [Function], + "runwaySurfaceCondition": [Function], + "seasons": [Function], +} +`; diff --git a/tests/convert/mappings/engine-type.spec.ts b/tests/convert/mappings/engine-type.spec.ts new file mode 100644 index 0000000..14e6962 --- /dev/null +++ b/tests/convert/mappings/engine-type.spec.ts @@ -0,0 +1,19 @@ +import { engineType } from '@mappings/engine-type'; +import { EngineType } from '@shared/plane/engine-type'; + +const TESTS = [ + { value: 0, result: EngineType.PISTON }, + { value: 1, result: EngineType.JET }, + { value: 2, result: EngineType.SAILPLANE }, + { value: 3, result: EngineType.HELO }, + { value: 4, result: EngineType.ROCKET }, + { value: 5, result: EngineType.TURBOPROP }, +]; + +describe('engine-type mapping', () => { + TESTS.forEach(test => { + it(`should map value ${test.value} to engine-type ${test.result}`, () => { + expect(engineType(test.value)).toEqual(test.result); + }); + }); +}); diff --git a/tests/convert/mappings/lights.spec.ts b/tests/convert/mappings/lights.spec.ts new file mode 100644 index 0000000..e118919 --- /dev/null +++ b/tests/convert/mappings/lights.spec.ts @@ -0,0 +1,21 @@ +import { lightsMapping } from '@mappings/lights'; + +const VALUES = [0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0]; +const EXPECTED_RESULT = { + nav: false, + beacon: true, + land: true, + taxi: false, + strobe: false, + panel: false, + recognition: true, + wing: true, + logo: true, + cabin: true +}; + +describe('lights mapping', () => { + it('should map values to lights object', () => { + expect(lightsMapping(VALUES)).toEqual(EXPECTED_RESULT); + }); +}); diff --git a/tests/convert/mappings/mappings.spec.ts b/tests/convert/mappings/mappings.spec.ts new file mode 100644 index 0000000..6e98626 --- /dev/null +++ b/tests/convert/mappings/mappings.spec.ts @@ -0,0 +1,7 @@ +import { MAPPINGS } from '@mappings/index'; + +describe('mappings list', () => { + it('should import all mappings', () => { + expect(MAPPINGS).toMatchSnapshot(); + }); +}); diff --git a/tests/convert/mappings/nearest-airport-id.spec.ts b/tests/convert/mappings/nearest-airport-id.spec.ts new file mode 100644 index 0000000..e8178e6 --- /dev/null +++ b/tests/convert/mappings/nearest-airport-id.spec.ts @@ -0,0 +1,41 @@ +import { nearestAirportsIds } from '@mappings/nearest-airports-ids'; + +/* tslint:disable */ +const BYTE_ARRAY = [ + 67,89,81,66, + 25,42,59,66,99,201,142,194,214,255,115,67,10,5,233,61, + 67,83,71,53, + 185,189,58,66,167,77,142,194,1,128,162,67,149,233,60,65, + 67,83,84,55, + 185,61,58,66,113,93,142,194,2,128,237,67,41,121,130,65, + 67,83,75,53, + 123,148,59,66,89,146,143,194,224,127,17,68,255,229,137,65, + 67,84,82,54, + 107,34,59,66,28,167,143,194,1,0,150,67,90,200,141,65, + 67,84,81,54, + 223,124,58,66,246,232,141,194,0,0,12,68,194,184,165,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,10,51,1,0,100,0,50,0,2,32,0,0,0,0,0,0,0,0,0,0,0,128,0,0,10,51,1,0,100,0,50,0,2,0,0,0,0,0,0,0,0,0,0,0,0,51,0,0,30,77,2,176,29,16,14,153,57,204,12,0,0,0,0,0,0,0,0,0,0,10,0,0,7,0,1 +]; +/* tslint:enable */ + +let EMPTY_BYTE_ARRAY = Array(128).fill(0); + +const EXPECTED_AIRPORTS = [ + 'CYQB', + 'CSG5', + 'CST7', + 'CSK5', + 'CTR6', + 'CTQ6' +]; + +let EMPTY_ARRAY = Array(6).fill(''); + +describe('nearest airport ids', () => { + it('should convert byte array to airport OACI code list', () => { + expect(nearestAirportsIds(BYTE_ARRAY)).toEqual(EXPECTED_AIRPORTS); + }); + + it('should convert empty byte array to an empty OACI code list', () => { + expect(nearestAirportsIds(EMPTY_BYTE_ARRAY)).toEqual(EMPTY_ARRAY); + }); +}); diff --git a/tests/convert/mappings/precipitation-type.spec.ts b/tests/convert/mappings/precipitation-type.spec.ts new file mode 100644 index 0000000..10e02fb --- /dev/null +++ b/tests/convert/mappings/precipitation-type.spec.ts @@ -0,0 +1,16 @@ +import { precipitationType } from '@mappings/precipitation-type'; +import { PrecipitationType } from '@shared/weather/precipitation-type'; + +const TESTS = [ + { value: 0, result: PrecipitationType.NONE }, + { value: 1, result: PrecipitationType.RAIN }, + { value: 2, result: PrecipitationType.SNOW }, +]; + +describe('precipitation type mapping', () => { + TESTS.forEach(test => { + it(`should map value ${test.value} to precipitation type ${test.result}`, () => { + expect(precipitationType(test.value)).toEqual(test.result); + }); + }); +}); diff --git a/tests/convert/mappings/runway-surface-condition.spec.ts b/tests/convert/mappings/runway-surface-condition.spec.ts new file mode 100644 index 0000000..da08afe --- /dev/null +++ b/tests/convert/mappings/runway-surface-condition.spec.ts @@ -0,0 +1,17 @@ +import { runwaySurfaceCondition } from '@mappings/runway-surface-condition'; +import { SurfaceCondition } from '@shared/runway/runway-surface-condition'; + +const TESTS = [ + { value: 0, result: SurfaceCondition.NORMAL }, + { value: 1, result: SurfaceCondition.WET }, + { value: 2, result: SurfaceCondition.ICY }, + { value: 3, result: SurfaceCondition.SNOW }, +]; + +describe('runway surface condition mapping', () => { + TESTS.forEach(test => { + it(`should map value ${test.value} to runway surface condition ${test.result}`, () => { + expect(runwaySurfaceCondition(test.value)).toEqual(test.result); + }); + }); +}); diff --git a/tests/convert/mappings/seasons.spec.ts b/tests/convert/mappings/seasons.spec.ts new file mode 100644 index 0000000..a514c36 --- /dev/null +++ b/tests/convert/mappings/seasons.spec.ts @@ -0,0 +1,17 @@ +import { seasons } from '@mappings/seasons'; +import { Season } from '@shared/weather/season'; + +const TESTS = [ + { value: 0, result: Season.WINTER }, + { value: 1, result: Season.SPRING }, + { value: 2, result: Season.SUMMER }, + { value: 3, result: Season.AUTUMN }, +]; + +describe('seasons mapping', () => { + TESTS.forEach(test => { + it(`should map value ${test.value} to season ${test.result}`, () => { + expect(seasons(test.value)).toEqual(test.result); + }); + }); +}); diff --git a/tests/convert/mappings/units/ftsec-kt.spec.ts b/tests/convert/mappings/units/ftsec-kt.spec.ts new file mode 100644 index 0000000..71a758f --- /dev/null +++ b/tests/convert/mappings/units/ftsec-kt.spec.ts @@ -0,0 +1,13 @@ +import { ftsecToKt, ktToFtsec } from '@mappings/units'; + +describe('ft/s to knots', () => { + it('should convert unit properly', () => { + expect(ftsecToKt(100)).toEqual(59.25); + }); +}); + +describe('knots to ft/s', () => { + it('should convert unit properly', () => { + expect(ktToFtsec(59.253)).toEqual(100.01); + }); +}); diff --git a/tests/offsets/__snapshots__/offset.spec.ts.snap b/tests/offsets/__snapshots__/offset.spec.ts.snap new file mode 100644 index 0000000..30eb3b2 --- /dev/null +++ b/tests/offsets/__snapshots__/offset.spec.ts.snap @@ -0,0 +1,2525 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offsets list should resolve full list 1`] = ` +Object { + "activeEngine": Offset { + "category": "engine", + "convert": undefined, + "description": "active engine pattern", + "length": 1, + "mapping": undefined, + "name": "activeEngine", + "permission": "rw", + "type": 12, + "value": 2184, + }, + "adf2ExtendedFreq": Offset { + "category": "radios", + "convert": undefined, + "description": "ADF 2 extended freq - in BCD - FS2004", + "length": undefined, + "mapping": undefined, + "name": "adf2ExtendedFreq", + "permission": "rw", + "type": 5, + "value": 726, + }, + "adf2Freq": Offset { + "category": "radios", + "convert": "+({VAL}).toString(16)", + "description": "ADF 2 freq - Main 3 digits in BCD - FS2004", + "length": undefined, + "mapping": undefined, + "name": "adf2Freq", + "permission": "rw", + "type": 5, + "value": 724, + }, + "adf2RelBearing": Offset { + "category": "radios", + "convert": "Math.round({VAL} * 360 / 65536)", + "description": "ADF2 Rel Bearing - FS2004", + "length": undefined, + "mapping": undefined, + "name": "adf2RelBearing", + "permission": "r", + "type": 2, + "value": 728, + }, + "adfFreq": Offset { + "category": "radios", + "convert": "+({VAL}).toString(16)", + "description": "ADF frequency show as Binary Coded Decimal. The thousands digit and the fractional parts are provided in adfFreqExtended", + "length": undefined, + "mapping": undefined, + "name": "adfFreq", + "permission": "rw", + "type": 5, + "value": 844, + }, + "adfFreqExtended": Offset { + "category": "radios", + "convert": undefined, + "description": "ADF frequency extended", + "length": undefined, + "mapping": undefined, + "name": "adfFreqExtended", + "permission": "rw", + "type": 5, + "value": 854, + }, + "adfFreqInc": Offset { + "category": "simulation", + "convert": "({VAL}) === 0 ? 1.0 : 0.1", + "description": "ADF freq increment - KHz", + "length": undefined, + "mapping": undefined, + "name": "adfFreqInc", + "permission": "rw", + "type": 2, + "value": 856, + }, + "alternateStaticAirSource": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "Alternate static air source selected", + "length": undefined, + "mapping": undefined, + "name": "alternateStaticAirSource", + "permission": "rw", + "type": 0, + "value": 667, + }, + "altimeterSettings": Offset { + "category": "cockpit", + "convert": "{VAL} / 16", + "description": "altimeters settings - mb", + "length": undefined, + "mapping": undefined, + "name": "altimeterSettings", + "permission": "rw", + "type": 5, + "value": 816, + }, + "altimeterSettingsG1000": Offset { + "category": "cockpit", + "convert": "{VAL} / 16", + "description": "G1000 altimeters settings - mb", + "length": undefined, + "mapping": undefined, + "name": "altimeterSettingsG1000", + "permission": "rw", + "type": 5, + "value": 818, + }, + "altitude": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 3.28084 / (65536 * 65536)).toFixed(2)", + "description": "altitude - AGL", + "length": undefined, + "mapping": undefined, + "name": "altitude", + "permission": "rw", + "type": 4, + "value": 1392, + }, + "apAltitudeHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP altitude hold", + "length": undefined, + "mapping": undefined, + "name": "apAltitudeHold", + "permission": "rw", + "type": 6, + "value": 2000, + }, + "apAltitudeValue": Offset { + "category": "autopilot", + "convert": "+({VAL} * 3.28084 / 65536).toFixed(2)", + "description": "AP altitude value - ft", + "length": undefined, + "mapping": undefined, + "name": "apAltitudeValue", + "permission": "rw", + "type": 3, + "value": 2004, + }, + "apApproachHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP Approach hold", + "length": undefined, + "mapping": undefined, + "name": "apApproachHold", + "permission": "rw", + "type": 6, + "value": 2048, + }, + "apAsHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP airspeed hold", + "length": undefined, + "mapping": undefined, + "name": "apAsHold", + "permission": "rw", + "type": 6, + "value": 2012, + }, + "apAsValue": Offset { + "category": "autopilot", + "convert": undefined, + "description": "AP airspeed value - kt", + "length": undefined, + "mapping": undefined, + "name": "apAsValue", + "permission": "rw", + "type": 5, + "value": 2018, + }, + "apAttitudeHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP attitude hold", + "length": undefined, + "mapping": undefined, + "name": "apAttitudeHold", + "permission": "rw", + "type": 6, + "value": 2008, + }, + "apAutoThrottleArm": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP autothrottle arm", + "length": undefined, + "mapping": undefined, + "name": "apAutoThrottleArm", + "permission": "rw", + "type": 6, + "value": 2064, + }, + "apBackCourseHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP back course hold", + "length": undefined, + "mapping": undefined, + "name": "apBackCourseHold", + "permission": "rw", + "type": 6, + "value": 2052, + }, + "apGlideSlopeHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP GlideSlope hold", + "length": undefined, + "mapping": undefined, + "name": "apGlideSlopeHold", + "permission": "rw", + "type": 6, + "value": 2044, + }, + "apHeadingHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP heading hold", + "length": undefined, + "mapping": undefined, + "name": "apHeadingHold", + "permission": "rw", + "type": 6, + "value": 1992, + }, + "apHeadingValue": Offset { + "category": "autopilot", + "convert": "Math.round(({VAL} * 360) / 65536)", + "description": "AP heading value - degrees", + "length": undefined, + "mapping": undefined, + "name": "apHeadingValue", + "permission": "rw", + "type": 5, + "value": 1996, + }, + "apMachHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP mach hold", + "length": undefined, + "mapping": undefined, + "name": "apMachHold", + "permission": "rw", + "type": 6, + "value": 2020, + }, + "apMachValue": Offset { + "category": "autopilot", + "convert": "{VAL} / 65536", + "description": "AP mach value - mach", + "length": undefined, + "mapping": undefined, + "name": "apMachValue", + "permission": "rw", + "type": 6, + "value": 2024, + }, + "apMasterSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP master switch", + "length": undefined, + "mapping": undefined, + "name": "apMasterSwitch", + "permission": "rw", + "type": 6, + "value": 1980, + }, + "apNav1Hold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP NAV1 hold", + "length": undefined, + "mapping": undefined, + "name": "apNav1Hold", + "permission": "rw", + "type": 6, + "value": 1988, + }, + "apRPMN1Hold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP RPM/N1 hold", + "length": undefined, + "mapping": undefined, + "name": "apRPMN1Hold", + "permission": "rw", + "type": 6, + "value": 2036, + }, + "apRPMN1Value": Offset { + "category": "autopilot", + "convert": "Math.round({VAL} * 100 / 16384)", + "description": "AP RPM/N1 value - percent", + "length": undefined, + "mapping": undefined, + "name": "apRPMN1Value", + "permission": "rw", + "type": 6, + "value": 2042, + }, + "apTOGAAutoThrottle": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP TO/GA throttle hold", + "length": undefined, + "mapping": undefined, + "name": "apTOGAAutoThrottle", + "permission": "rw", + "type": 6, + "value": 2060, + }, + "apVsHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP vertical speed hold", + "length": undefined, + "mapping": undefined, + "name": "apVsHold", + "permission": "rw", + "type": 6, + "value": 2028, + }, + "apVsValue": Offset { + "category": "autopilot", + "convert": undefined, + "description": "AP vertical speed value - ft/min", + "length": undefined, + "mapping": undefined, + "name": "apVsValue", + "permission": "rw", + "type": 2, + "value": 2034, + }, + "apWingLevel": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP wing level", + "length": undefined, + "mapping": undefined, + "name": "apWingLevel", + "permission": "rw", + "type": 6, + "value": 1984, + }, + "apYawDamperHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP yaw damper hold", + "length": undefined, + "mapping": undefined, + "name": "apYawDamperHold", + "permission": "rw", + "type": 6, + "value": 2056, + }, + "autoPilotAvailable": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "autopilot available", + "length": undefined, + "mapping": undefined, + "name": "autoPilotAvailable", + "permission": "r", + "type": 6, + "value": 1892, + }, + "autoRudder": Offset { + "category": "controls", + "convert": "!!{VAL}", + "description": "auto coordination", + "length": undefined, + "mapping": undefined, + "name": "autoRudder", + "permission": "rw", + "type": 2, + "value": 632, + }, + "availableMemory": Offset { + "category": "simulation", + "convert": undefined, + "description": "available FS memory - kb", + "length": undefined, + "mapping": undefined, + "name": "availableMemory", + "permission": "r", + "type": 3, + "value": 588, + }, + "bank": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "bank - -ve right bank, +ve left bank", + "length": undefined, + "mapping": undefined, + "name": "bank", + "permission": "rw", + "type": 3, + "value": 1404, + }, + "bpa": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} / 128)", + "description": "barper pole airspeed - knots", + "length": undefined, + "mapping": undefined, + "name": "bpa", + "permission": "r", + "type": 6, + "value": 708, + }, + "clockHour": Offset { + "category": "environment", + "convert": undefined, + "description": "0-23", + "length": undefined, + "mapping": undefined, + "name": "clockHour", + "permission": "rw", + "type": 0, + "value": 568, + }, + "clockMin": Offset { + "category": "environment", + "convert": undefined, + "description": "0-59", + "length": undefined, + "mapping": undefined, + "name": "clockMin", + "permission": "rw", + "type": 0, + "value": 569, + }, + "clockSec": Offset { + "category": "environment", + "convert": undefined, + "description": "0-59", + "length": undefined, + "mapping": undefined, + "name": "clockSec", + "permission": "rw", + "type": 0, + "value": 570, + }, + "cloudComplex": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "cloud simple/complex - 0 = simple, 1 = complex", + "length": undefined, + "mapping": undefined, + "name": "cloudComplex", + "permission": "rw", + "type": 0, + "value": 597, + }, + "cloudCoverDensity": Offset { + "category": "simulation", + "convert": undefined, + "description": "cloud cover density - 5-8", + "length": undefined, + "mapping": undefined, + "name": "cloudCoverDensity", + "permission": "rw", + "type": 0, + "value": 596, + }, + "cloudHighCoverage": Offset { + "category": "weather", + "convert": undefined, + "description": "cloud high coverage - octa", + "length": undefined, + "mapping": undefined, + "name": "cloudHighCoverage", + "permission": "r", + "type": 0, + "value": 1231, + }, + "cloudLowCoverage": Offset { + "category": "weather", + "convert": undefined, + "description": "cloud low coverage - octa", + "length": undefined, + "mapping": undefined, + "name": "cloudLowCoverage", + "permission": "r", + "type": 0, + "value": 1230, + }, + "cloudThunderCoverage": Offset { + "category": "weather", + "convert": undefined, + "description": "cloud thunder coverage - octa", + "length": undefined, + "mapping": undefined, + "name": "cloudThunderCoverage", + "permission": "r", + "type": 0, + "value": 1229, + }, + "comAtisActivate": Offset { + "category": "radios", + "convert": undefined, + "description": "COM/ATIS activate < FS2000", + "length": undefined, + "mapping": undefined, + "name": "comAtisActivate", + "permission": "w", + "type": 5, + "value": 906, + }, + "comFreq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "Com frequency", + "length": undefined, + "mapping": undefined, + "name": "comFreq", + "permission": "rw", + "type": 5, + "value": 846, + }, + "comFreqInc": Offset { + "category": "simulation", + "convert": "({VAL}) === 0 ? 50 : 25", + "description": "COM freq increment - KHz", + "length": undefined, + "mapping": undefined, + "name": "comFreqInc", + "permission": "rw", + "type": 2, + "value": 856, + }, + "controlTimer1": Offset { + "category": "simulation", + "convert": undefined, + "description": "control timer 1 - FS2002+ - Seconds", + "length": undefined, + "mapping": undefined, + "name": "controlTimer1", + "permission": "r", + "type": 8, + "value": 784, + }, + "controlTimer2": Offset { + "category": "simulation", + "convert": undefined, + "description": "control timer 2 - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "controlTimer2", + "permission": "r", + "type": 3, + "value": 872, + }, + "crashDetection": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=Ignore Crash, 1=Detect Crash and restart, 2=Detect Crash and show Graph (last is not applicable to FS2002/4)", + "length": undefined, + "mapping": undefined, + "name": "crashDetection", + "permission": "rw", + "type": 5, + "value": 2096, + }, + "crashDetectionFSX": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=Ignore Crash, 1=Detect Crash", + "length": undefined, + "mapping": undefined, + "name": "crashDetectionFSX", + "permission": "r", + "type": 0, + "value": 2098, + }, + "crashDetectionFSXAi": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=Ignore Crash, 1=Detect Crash", + "length": undefined, + "mapping": undefined, + "name": "crashDetectionFSXAi", + "permission": "r", + "type": 0, + "value": 2099, + }, + "crashed": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "crashed", + "length": undefined, + "mapping": undefined, + "name": "crashed", + "permission": "r", + "type": 2, + "value": 2112, + }, + "dayOfYear": Offset { + "category": "environment", + "convert": undefined, + "description": "day of year - count from 1", + "length": undefined, + "mapping": undefined, + "name": "dayOfYear", + "permission": "rw", + "type": 5, + "value": 574, + }, + "dewPoint": Offset { + "category": "weather", + "convert": "{VAL} / 256", + "description": "dew point - FS2000+", + "length": undefined, + "mapping": undefined, + "name": "dewPoint", + "permission": "r", + "type": 2, + "value": 1224, + }, + "dewPointControl": Offset { + "category": "weather", + "convert": undefined, + "description": "degrees / 256 - 0x8000 release control", + "length": undefined, + "mapping": undefined, + "name": "dewPointControl", + "permission": "w", + "type": 5, + "value": 1236, + }, + "displayIAS": Offset { + "category": "cockpit", + "convert": undefined, + "description": "display IAS - <= FS2000", + "length": undefined, + "mapping": undefined, + "name": "displayIAS", + "permission": "rw", + "type": 5, + "value": 1554, + }, + "dme12Select": Offset { + "category": "radios", + "convert": undefined, + "description": "DME1/DME2 select", + "length": undefined, + "mapping": undefined, + "name": "dme12Select", + "permission": "rw", + "type": 5, + "value": 888, + }, + "elapsedRealTime": Offset { + "category": "simulation", + "convert": undefined, + "description": "elasped real time", + "length": undefined, + "mapping": undefined, + "name": "elapsedRealTime", + "permission": "r", + "type": 8, + "value": 1416, + }, + "elapsedTime": Offset { + "category": "simulation", + "convert": undefined, + "description": "simulated flight time - seconds (paused while simulation paused)", + "length": undefined, + "mapping": undefined, + "name": "elapsedTime", + "permission": "r", + "type": 8, + "value": 1192, + }, + "engineType": Offset { + "category": "engine", + "convert": "engineType", + "description": "engine type", + "length": undefined, + "mapping": true, + "name": "engineType", + "permission": "r", + "type": 0, + "value": 1545, + }, + "flightAnalysisMode": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=off 1=landing 2=course tracking 3=manoeuvres", + "length": undefined, + "mapping": undefined, + "name": "flightAnalysisMode", + "permission": "rw", + "type": 6, + "value": 2068, + }, + "flightModeDisplay": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=off, 1=coods/hdg/speed, 2=fps, 3=all", + "length": undefined, + "mapping": undefined, + "name": "flightModeDisplay", + "permission": "rw", + "type": 5, + "value": 1532, + }, + "flightPlan": Offset { + "category": "simulation", + "convert": undefined, + "description": "current flight plan - FSX only", + "length": 256, + "mapping": undefined, + "name": "flightPlan", + "permission": "r", + "type": 11, + "value": 304, + }, + "flyByWireELACCompFailFlag": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire ELAC comp fail flag (read only)", + "length": undefined, + "mapping": undefined, + "name": "flyByWireELACCompFailFlag", + "permission": "r", + "type": 0, + "value": 1975, + }, + "flyByWireELACSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire ELAC switch", + "length": undefined, + "mapping": undefined, + "name": "flyByWireELACSwitch", + "permission": "rw", + "type": 0, + "value": 1974, + }, + "flyByWireFACCompFailFlag": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire FAC comp fail flag (read only)", + "length": undefined, + "mapping": undefined, + "name": "flyByWireFACCompFailFlag", + "permission": "r", + "type": 0, + "value": 1977, + }, + "flyByWireFACSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire FAC switch", + "length": undefined, + "mapping": undefined, + "name": "flyByWireFACSwitch", + "permission": "rw", + "type": 0, + "value": 1976, + }, + "flyByWireSECCompFailFlag": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire SEC comp fail flag (read only)", + "length": undefined, + "mapping": undefined, + "name": "flyByWireSECCompFailFlag", + "permission": "r", + "type": 0, + "value": 1979, + }, + "flyByWireSECSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire SEC switch", + "length": undefined, + "mapping": undefined, + "name": "flyByWireSECSwitch", + "permission": "rw", + "type": 0, + "value": 1978, + }, + "framerate": Offset { + "category": "simulation", + "convert": "Math.floor(32768/{VAL})", + "description": "framerate", + "length": undefined, + "mapping": undefined, + "name": "framerate", + "permission": "r", + "type": 5, + "value": 628, + }, + "fuelBoxFlag": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "plane in fuel box flag", + "length": undefined, + "mapping": undefined, + "name": "fuelBoxFlag", + "permission": "r", + "type": 5, + "value": 812, + }, + "groundElevation": Offset { + "category": "position_attitude", + "convert": "Math.round({VAL} * 3.28084 / 256)", + "description": "ground elevation - feet", + "length": undefined, + "mapping": undefined, + "name": "groundElevation", + "permission": "r", + "type": 3, + "value": 32, + }, + "gs": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} * 3600 / 65536 / 1852)", + "description": "ground speed in kt", + "length": undefined, + "mapping": undefined, + "name": "gs", + "permission": "r", + "type": 3, + "value": 692, + }, + "hasCarbHeat": Offset { + "category": "engine", + "convert": "!!{VAL}", + "description": "has carb heat", + "length": undefined, + "mapping": undefined, + "name": "hasCarbHeat", + "permission": "r", + "type": 6, + "value": 1924, + }, + "hasFlaps": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has flaps", + "length": undefined, + "mapping": undefined, + "name": "hasFlaps", + "permission": "r", + "type": 6, + "value": 1912, + }, + "hasMixtureControl": Offset { + "category": "engine", + "convert": "!!{VAL}", + "description": "has mixture control", + "length": undefined, + "mapping": undefined, + "name": "hasMixtureControl", + "permission": "r", + "type": 6, + "value": 1920, + }, + "hasMixtureEngine": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has mixture engine", + "length": undefined, + "mapping": undefined, + "name": "hasMixtureEngine", + "permission": "r", + "type": 6, + "value": 1920, + }, + "hasNav1": Offset { + "category": "radios", + "convert": "!!{VAL}", + "description": "has NAV1", + "length": undefined, + "mapping": undefined, + "name": "hasNav1", + "permission": "rw", + "type": 6, + "value": 1952, + }, + "hasNav2": Offset { + "category": "radios", + "convert": "!!{VAL}", + "description": "has NAV2", + "length": undefined, + "mapping": undefined, + "name": "hasNav2", + "permission": "r", + "type": 6, + "value": 1956, + }, + "hasSpoilers": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has spoilers", + "length": undefined, + "mapping": undefined, + "name": "hasSpoilers", + "permission": "r", + "type": 6, + "value": 1932, + }, + "hasStallHorn": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has stall horn", + "length": undefined, + "mapping": undefined, + "name": "hasStallHorn", + "permission": "r", + "type": 6, + "value": 1916, + }, + "hasStrobes": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has strobes", + "length": undefined, + "mapping": undefined, + "name": "hasStrobes", + "permission": "r", + "type": 6, + "value": 1940, + }, + "hasToeBrakes": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has toe brakes", + "length": undefined, + "mapping": undefined, + "name": "hasToeBrakes", + "permission": "r", + "type": 6, + "value": 1948, + }, + "heading": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "heading - TRUE", + "length": undefined, + "mapping": undefined, + "name": "heading", + "permission": "rw", + "type": 6, + "value": 1408, + }, + "ias": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} / 128)", + "description": "indicated air speed - knots", + "length": undefined, + "mapping": undefined, + "name": "ias", + "permission": "r", + "type": 3, + "value": 700, + }, + "isTailDragger": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has spoilers", + "length": undefined, + "mapping": undefined, + "name": "isTailDragger", + "permission": "r", + "type": 6, + "value": 1936, + }, + "landingLights": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "landing lights", + "length": undefined, + "mapping": undefined, + "name": "landingLights", + "permission": "rw", + "type": 5, + "value": 652, + }, + "lastSavedFlightName": Offset { + "category": "simulation", + "convert": undefined, + "description": "name of last saved flight", + "length": 128, + "mapping": undefined, + "name": "lastSavedFlightName", + "permission": "r", + "type": 11, + "value": 1024, + }, + "latitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 90 / (10001750 * 65536 * 65536)", + "description": "latitude - -ve for south +ve for north", + "length": undefined, + "mapping": undefined, + "name": "latitude", + "permission": "rw", + "type": 4, + "value": 1376, + }, + "leftAileronDeflection": Offset { + "category": "controls", + "convert": undefined, + "description": "left aileron deflection - radians", + "length": undefined, + "mapping": undefined, + "name": "leftAileronDeflection", + "permission": "r", + "type": 8, + "value": 944, + }, + "lights": Offset { + "category": "cockpit", + "convert": "lightsMapping", + "description": "all lights - FS2000+", + "length": 2, + "mapping": true, + "name": "lights", + "permission": "rw", + "type": 12, + "value": 3340, + }, + "localDayOfMonth": Offset { + "category": "environment", + "convert": undefined, + "description": "local day of month - FSX only", + "length": undefined, + "mapping": undefined, + "name": "localDayOfMonth", + "permission": "r", + "type": 0, + "value": 581, + }, + "localMonthOfYear": Offset { + "category": "environment", + "convert": undefined, + "description": "local month of year - FSX only", + "length": undefined, + "mapping": undefined, + "name": "localMonthOfYear", + "permission": "r", + "type": 0, + "value": 580, + }, + "localYear": Offset { + "category": "environment", + "convert": undefined, + "description": "local year", + "length": undefined, + "mapping": undefined, + "name": "localYear", + "permission": "rw", + "type": 5, + "value": 586, + }, + "logbookName": Offset { + "category": "simulation", + "convert": undefined, + "description": "logbook name - FS2002+", + "length": 256, + "mapping": undefined, + "name": "logbookName", + "permission": "r", + "type": 11, + "value": 300, + }, + "longitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 360 / (65536 * 65536 * 65536 * 65536)", + "description": "longitude - -ve for west +ve for east", + "length": undefined, + "mapping": undefined, + "name": "longitude", + "permission": "rw", + "type": 4, + "value": 1384, + }, + "magVar": Offset { + "category": "position_attitude", + "convert": "+({VAL}*360/65536).toFixed(2)", + "description": "-ve is west, +ve east. mag to true by adding this, true to mag by substracting this", + "length": undefined, + "mapping": undefined, + "name": "magVar", + "permission": "r", + "type": 2, + "value": 672, + }, + "memoryAssignedToFSUIPC": Offset { + "category": "simulation", + "convert": undefined, + "description": undefined, + "length": undefined, + "mapping": undefined, + "name": "memoryAssignedToFSUIPC", + "permission": "r", + "type": 2, + "value": 600, + }, + "metarBarometricDrift": Offset { + "category": "weather", + "convert": "{VAL} / 16", + "description": "METAR barometric drift - difference between aircraft/METAR QNH. Adding drift withll give correct value for ATIS report", + "length": undefined, + "mapping": undefined, + "name": "metarBarometricDrift", + "permission": "r", + "type": 5, + "value": 1212, + }, + "metarCloudBaseHigh": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR cloud base high - ft", + "length": undefined, + "mapping": undefined, + "name": "metarCloudBaseHigh", + "permission": "r", + "type": 5, + "value": 1222, + }, + "metarCloudBaseLow": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR cloud base low - ft", + "length": undefined, + "mapping": undefined, + "name": "metarCloudBaseLow", + "permission": "r", + "type": 5, + "value": 1220, + }, + "metarCloudThunderBase": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR visibility - ft", + "length": undefined, + "mapping": undefined, + "name": "metarCloudThunderBase", + "permission": "r", + "type": 5, + "value": 1218, + }, + "metarStationAltitude": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR station altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "metarStationAltitude", + "permission": "r", + "type": 5, + "value": 1204, + }, + "metarVisibility": Offset { + "category": "weather", + "convert": "{VAL} / 100", + "description": "METAR visibility - sm", + "length": undefined, + "mapping": undefined, + "name": "metarVisibility", + "permission": "r", + "type": 5, + "value": 1216, + }, + "nav12Select": Offset { + "category": "radios", + "convert": undefined, + "description": "NAV1/NAV2 select", + "length": undefined, + "mapping": undefined, + "name": "nav12Select", + "permission": "rw", + "type": 5, + "value": 884, + }, + "nav1Freq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "NAV1 frequency", + "length": undefined, + "mapping": undefined, + "name": "nav1Freq", + "permission": "rw", + "type": 5, + "value": 848, + }, + "nav2Freq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "NAV2 frequency", + "length": undefined, + "mapping": undefined, + "name": "nav2Freq", + "permission": "rw", + "type": 5, + "value": 850, + }, + "navAdfActivate": Offset { + "category": "radios", + "convert": undefined, + "description": "NAV and ADF activate < FS2000", + "length": undefined, + "mapping": undefined, + "name": "navAdfActivate", + "permission": "w", + "type": 5, + "value": 904, + }, + "navLights": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "nav lights", + "length": undefined, + "mapping": undefined, + "name": "navLights", + "permission": "rw", + "type": 0, + "value": 640, + }, + "ndb2IdentSoundSwitch": Offset { + "category": "radios", + "convert": "!!{VAL}", + "description": "NDB2 ident sound switch - FS2004", + "length": undefined, + "mapping": undefined, + "name": "ndb2IdentSoundSwitch", + "permission": "rw", + "type": 0, + "value": 763, + }, + "ndb2Identity": Offset { + "category": "radios", + "convert": undefined, + "description": "NDB2 identity - FS2004", + "length": 6, + "mapping": undefined, + "name": "ndb2Identity", + "permission": "r", + "type": 11, + "value": 732, + }, + "ndb2Name": Offset { + "category": "radios", + "convert": undefined, + "description": "NDB2 name - FS2004", + "length": 25, + "mapping": undefined, + "name": "ndb2Name", + "permission": "r", + "type": 11, + "value": 738, + }, + "nearestAirportAltitude": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportAltitude", + "permission": "r", + "type": 9, + "value": 1636, + }, + "nearestAirportDistance": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport distance - NM", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportDistance", + "permission": "r", + "type": 9, + "value": 1640, + }, + "nearestAirportId": Offset { + "category": "environment", + "convert": "nearestAirportsIds", + "description": "nearest airport", + "length": 128, + "mapping": true, + "name": "nearestAirportId", + "permission": "r", + "type": 10, + "value": 1624, + }, + "nearestAirportLatitude": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport latitude", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportLatitude", + "permission": "r", + "type": 9, + "value": 1628, + }, + "nearestAirportLongitude": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport longitude", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportLongitude", + "permission": "r", + "type": 9, + "value": 1632, + }, + "overspeedWarning": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "overspeed warning", + "length": undefined, + "mapping": undefined, + "name": "overspeedWarning", + "permission": "r", + "type": 0, + "value": 877, + }, + "pauseControl": Offset { + "category": "simulation", + "convert": "{VAL} ? 1 : 0", + "description": "pause control (write only)", + "length": undefined, + "mapping": undefined, + "name": "pauseControl", + "permission": "w", + "type": 5, + "value": 610, + }, + "pauseFlag": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "simulation paused", + "length": undefined, + "mapping": undefined, + "name": "pauseFlag", + "permission": "r", + "type": 2, + "value": 612, + }, + "pitch": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "pitch - 0 for level, -ve for pitch up, +ve for pitch down", + "length": undefined, + "mapping": undefined, + "name": "pitch", + "permission": "rw", + "type": 3, + "value": 1400, + }, + "pitotHeat": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "pitot heat active", + "length": undefined, + "mapping": undefined, + "name": "pitotHeat", + "permission": "rw", + "type": 2, + "value": 668, + }, + "pitotIce": Offset { + "category": "icing", + "convert": "+({VAL} / 16384 * 100).toFixed(2)", + "description": "structural ice - decimal percent", + "length": undefined, + "mapping": undefined, + "name": "pitotIce", + "permission": "r", + "type": 5, + "value": 842, + }, + "planeOnground": Offset { + "category": "position_attitude", + "convert": "!!{VAL}", + "description": "plane on the ground", + "length": undefined, + "mapping": undefined, + "name": "planeOnground", + "permission": "r", + "type": 5, + "value": 870, + }, + "precipitationControl": Offset { + "category": "weather", + "convert": undefined, + "description": "hi-byte type 0-2 - low-byte rate 0-5 - writing 0xFFFF release control", + "length": undefined, + "mapping": undefined, + "name": "precipitationControl", + "permission": "w", + "type": 5, + "value": 1234, + }, + "precipitationRate": Offset { + "category": "weather", + "convert": undefined, + "description": "precipitation rate - FS2000+ - 0 to 5", + "length": undefined, + "mapping": undefined, + "name": "precipitationRate", + "permission": "r", + "type": 0, + "value": 1224, + }, + "precipitationType": Offset { + "category": "weather", + "convert": "precipitationType", + "description": "precipitation type - FS2000+ - 0 to 5", + "length": undefined, + "mapping": true, + "name": "precipitationType", + "permission": "r", + "type": 0, + "value": 1228, + }, + "preciseTurnCoordinatorPosition": Offset { + "category": "cockpit", + "convert": undefined, + "description": "Turn coordinator ball position - + to the right, - to the left, 0 balanced", + "length": undefined, + "mapping": undefined, + "name": "preciseTurnCoordinatorPosition", + "permission": "r", + "type": 9, + "value": 896, + }, + "preciseTurnRate": Offset { + "category": "cockpit", + "convert": undefined, + "description": "Turn rate needle - minutes (- to the left, + to the right)", + "length": undefined, + "mapping": undefined, + "name": "preciseTurnRate", + "permission": "r", + "type": 9, + "value": 900, + }, + "pressCabinAlt": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: cabin altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAlt", + "permission": "r", + "type": 3, + "value": 792, + }, + "pressCabinAltChange": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: cabin altitude change set - ft/s", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAltChange", + "permission": "r", + "type": 9, + "value": 800, + }, + "pressCabinAltPressDiff": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: cabin altitude change set - lb/sqft", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAltPressDiff", + "permission": "r", + "type": 9, + "value": 804, + }, + "pressCabinAltTarget": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: target cabin altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAltTarget", + "permission": "r", + "type": 3, + "value": 796, + }, + "pressDumpSwitch": Offset { + "category": "pressurisation", + "convert": "!!{VAL}", + "description": "pressurisation: dump switch", + "length": undefined, + "mapping": undefined, + "name": "pressDumpSwitch", + "permission": "rw", + "type": 6, + "value": 808, + }, + "pushbackAngle": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback angle - radians", + "length": undefined, + "mapping": undefined, + "name": "pushbackAngle", + "permission": "r", + "type": 9, + "value": 820, + }, + "pushbackWaitFlag": Offset { + "category": "pushback", + "convert": "!!{VAL}", + "description": "pushback wait flag", + "length": undefined, + "mapping": undefined, + "name": "pushbackWaitFlag", + "permission": "r", + "type": 5, + "value": 836, + }, + "pushbackXContact": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback X contact - ft", + "length": undefined, + "mapping": undefined, + "name": "pushbackXContact", + "permission": "r", + "type": 9, + "value": 824, + }, + "pushbackYContact": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback Y contact - ft", + "length": undefined, + "mapping": undefined, + "name": "pushbackYContact", + "permission": "r", + "type": 9, + "value": 828, + }, + "pushbackZContact": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback Z contact - ft", + "length": undefined, + "mapping": undefined, + "name": "pushbackZContact", + "permission": "r", + "type": 9, + "value": 832, + }, + "reliability": Offset { + "category": "simulation", + "convert": undefined, + "description": "reliability - percent", + "length": undefined, + "mapping": undefined, + "name": "reliability", + "permission": "rw", + "type": 5, + "value": 882, + }, + "replayInAction": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "replay in action", + "length": undefined, + "mapping": undefined, + "name": "replayInAction", + "permission": "rw", + "type": 6, + "value": 1576, + }, + "replayTimerCountdown": Offset { + "category": "simulation", + "convert": undefined, + "description": "instant replay time left in seconds - controls the playback", + "length": undefined, + "mapping": undefined, + "name": "replayTimerCountdown", + "permission": "rw", + "type": 6, + "value": 1580, + }, + "retractableGear": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "retractable gear (read only)", + "length": undefined, + "mapping": undefined, + "name": "retractableGear", + "permission": "r", + "type": 0, + "value": 1548, + }, + "retractableLeftFloatExtension": Offset { + "category": "plane", + "convert": "Math.floor({VAL} / 16384 * 100)", + "description": "retractable left float extension - percent", + "length": undefined, + "mapping": undefined, + "name": "retractableLeftFloatExtension", + "permission": "r", + "type": 5, + "value": 1556, + }, + "retractableRightFloatExtension": Offset { + "category": "plane", + "convert": "Math.floor({VAL} / 16384 * 100)", + "description": "retractable right float extension - percent", + "length": undefined, + "mapping": undefined, + "name": "retractableRightFloatExtension", + "permission": "r", + "type": 5, + "value": 1558, + }, + "rightAileronDeflection": Offset { + "category": "controls", + "convert": undefined, + "description": "right aileron deflection - radians", + "length": undefined, + "mapping": undefined, + "name": "rightAileronDeflection", + "permission": "r", + "type": 8, + "value": 952, + }, + "rotorClutchSwitch": Offset { + "category": "controls", + "convert": "!!{VAL}", + "description": "rotor clutch switch", + "length": undefined, + "mapping": undefined, + "name": "rotorClutchSwitch", + "permission": "rw", + "type": 0, + "value": 2185, + }, + "runwaySurfaceCondition": Offset { + "category": "runway", + "convert": "runwaySurfaceCondition", + "description": "surface condition", + "length": undefined, + "mapping": true, + "name": "runwaySurfaceCondition", + "permission": "r", + "type": 0, + "value": 838, + }, + "runwaySurfaceConditionValid": Offset { + "category": "runway", + "convert": "!!{VAL}", + "description": "surface condition valid flag", + "length": undefined, + "mapping": undefined, + "name": "runwaySurfaceConditionValid", + "permission": "r", + "type": 0, + "value": 839, + }, + "season": Offset { + "category": "environment", + "convert": "seasons", + "description": "local season", + "length": undefined, + "mapping": true, + "name": "season", + "permission": "rw", + "type": 5, + "value": 584, + }, + "slewBackwardForwardRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "Slew fwd if-ve, bwd if +ve, 1=very slow ... 127=very fast, -128 fastest forward", + "length": undefined, + "mapping": undefined, + "name": "slewBackwardForwardRate", + "permission": "rw", + "type": 1, + "value": 1515, + }, + "slewLeftRightRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "Slew left if -ve, right if +ve, 1=very slow ... 127=very fast, -128 fastest leftward", + "length": undefined, + "mapping": undefined, + "name": "slewLeftRightRate", + "permission": "rw", + "type": 1, + "value": 1517, + }, + "slewMode": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "slew mode activated", + "length": undefined, + "mapping": undefined, + "name": "slewMode", + "permission": "rw", + "type": 5, + "value": 1500, + }, + "slewModeDisplay": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=off, 1=coods/hdg/speed, 2=fps, 3=all", + "length": undefined, + "mapping": undefined, + "name": "slewModeDisplay", + "permission": undefined, + "type": 5, + "value": 1524, + }, + "slewPitchRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "16384=no pitch slew -16384 pitch up, 16384 pitch down, range 0-32767", + "length": undefined, + "mapping": undefined, + "name": "slewPitchRate", + "permission": "rw", + "type": 2, + "value": 1518, + }, + "slewRollRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "192 gives a 360 roll in about 1 minute - -ve right, +ve left", + "length": undefined, + "mapping": undefined, + "name": "slewRollRate", + "permission": "rw", + "type": 2, + "value": 1508, + }, + "slewVerticalRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "16384=no alt slew rate - 16383 to 0 increasing slew UP rates, 16385 to 32767 increasing slew DOWN rates", + "length": undefined, + "mapping": undefined, + "name": "slewVerticalRate", + "permission": "rw", + "type": 2, + "value": 1512, + }, + "slewYawRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "Slew mode turns - +ve values are left, -ve are right - 24 takes about 1 minute to complete a 360", + "length": undefined, + "mapping": undefined, + "name": "slewYawRate", + "permission": "rw", + "type": 2, + "value": 1510, + }, + "smokeSystemAvailable": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "smoke system available - <= FS2000", + "length": undefined, + "mapping": undefined, + "name": "smokeSystemAvailable", + "permission": "r", + "type": 5, + "value": 1492, + }, + "smokeSystemControl": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "smoke system control on/off", + "length": undefined, + "mapping": undefined, + "name": "smokeSystemControl", + "permission": "rw", + "type": 5, + "value": 1496, + }, + "stallWarning": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "stall warning", + "length": undefined, + "mapping": undefined, + "name": "stallWarning", + "permission": "r", + "type": 0, + "value": 876, + }, + "startupFlight": Offset { + "category": "simulation", + "convert": undefined, + "description": "startup path", + "length": 256, + "mapping": undefined, + "name": "startupFlight", + "permission": "r", + "type": 11, + "value": 36, + }, + "strobeLights": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "strobe lights", + "length": undefined, + "mapping": undefined, + "name": "strobeLights", + "permission": "rw", + "type": 0, + "value": 641, + }, + "structuralIce": Offset { + "category": "icing", + "convert": "+({VAL} / 16384 * 100).toFixed(2)", + "description": "structural ice - decimal percent", + "length": undefined, + "mapping": undefined, + "name": "structuralIce", + "permission": "r", + "type": 5, + "value": 840, + }, + "surfaceWindDirection": Offset { + "category": "weather", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "surface wind direction - FS2000+ - deg MAG", + "length": undefined, + "mapping": undefined, + "name": "surfaceWindDirection", + "permission": "r", + "type": 5, + "value": 1242, + }, + "surfaceWindSpeed": Offset { + "category": "weather", + "convert": undefined, + "description": "surface wind speed - FS2000+ - kts", + "length": undefined, + "mapping": undefined, + "name": "surfaceWindSpeed", + "permission": "r", + "type": 5, + "value": 1240, + }, + "tas": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} / 128)", + "description": "true air speed - knots", + "length": undefined, + "mapping": undefined, + "name": "tas", + "permission": "r", + "type": 3, + "value": 696, + }, + "thermalVisualisation": Offset { + "category": "simulation", + "convert": undefined, + "description": "0 = none, 1 = natural, 2 = schematic", + "length": undefined, + "mapping": undefined, + "name": "thermalVisualisation", + "permission": "r", + "type": 0, + "value": 598, + }, + "timezoneOffsetToZulu": Offset { + "category": "environment", + "convert": undefined, + "description": "timezone offset minutes to zulu - determines aircraft position (+ve = behind zulu, -ve = ahead zulu)", + "length": undefined, + "mapping": undefined, + "name": "timezoneOffsetToZulu", + "permission": "rw", + "type": 2, + "value": 582, + }, + "trafficDensityAirline": Offset { + "category": "simulation", + "convert": undefined, + "description": "Airline traffic density percent", + "length": undefined, + "mapping": undefined, + "name": "trafficDensityAirline", + "permission": "rw", + "type": 0, + "value": 592, + }, + "trafficDensityGA": Offset { + "category": "simulation", + "convert": undefined, + "description": "General Aviation traffic density percent", + "length": undefined, + "mapping": undefined, + "name": "trafficDensityGA", + "permission": "rw", + "type": 0, + "value": 593, + }, + "trafficDensityShips": Offset { + "category": "simulation", + "convert": undefined, + "description": "Ships and Ferries traffic density percent", + "length": undefined, + "mapping": undefined, + "name": "trafficDensityShips", + "permission": "rw", + "type": 0, + "value": 594, + }, + "transponderFreq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "XPND transponder frequency", + "length": undefined, + "mapping": undefined, + "name": "transponderFreq", + "permission": "rw", + "type": 5, + "value": 852, + }, + "turnCoordinatorPosition": Offset { + "category": "cockpit", + "convert": undefined, + "description": "Turn coordinator ball position - + to the right, - to the left, 0 balanced", + "length": undefined, + "mapping": undefined, + "name": "turnCoordinatorPosition", + "permission": "r", + "type": 1, + "value": 878, + }, + "turnRate": Offset { + "category": "cockpit", + "convert": "Math.round({VAL} / 1024)", + "description": "Turn rate needle - minutes (- to the left, + to the right)", + "length": undefined, + "mapping": undefined, + "name": "turnRate", + "permission": "r", + "type": 2, + "value": 892, + }, + "vc": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Cruise speed - kt", + "length": undefined, + "mapping": true, + "name": "vc", + "permission": "r", + "type": 8, + "value": 1352, + }, + "verticalSpeed": Offset { + "category": "position_attitude", + "convert": "+({VAL} * -3.28084).toFixed(2)", + "description": "vertical speed - more precise - ft/min - +ve = up", + "length": undefined, + "mapping": undefined, + "name": "verticalSpeed", + "permission": "r", + "type": 2, + "value": 2114, + }, + "videoRecording": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "video recording flag - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "videoRecording", + "permission": "r", + "type": 0, + "value": 1888, + }, + "viewpointAltitude": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 3.28084 / (65536 * 65536)).toFixed(2)", + "description": "viewpoint altitude - AGL", + "length": undefined, + "mapping": undefined, + "name": "viewpointAltitude", + "permission": "r", + "type": 4, + "value": 1472, + }, + "viewpointBank": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "viewpoint bank - - right bank, + left bank", + "length": undefined, + "mapping": undefined, + "name": "viewpointBank", + "permission": "r", + "type": 3, + "value": 1484, + }, + "viewpointHeading": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "viewpoint heading - TRUE", + "length": undefined, + "mapping": undefined, + "name": "viewpointHeading", + "permission": "r", + "type": 6, + "value": 1488, + }, + "viewpointLatitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 90 / (10001750 * 65536 * 65536)", + "description": "viewpoint latitude - -ve for south +ve for north", + "length": undefined, + "mapping": undefined, + "name": "viewpointLatitude", + "permission": "r", + "type": 4, + "value": 1456, + }, + "viewpointLongitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 360 / (65536 * 65536 * 65536 * 65536)", + "description": "viewpoint longitude - -ve for west +ve for east", + "length": undefined, + "mapping": undefined, + "name": "viewpointLongitude", + "permission": "r", + "type": 4, + "value": 1464, + }, + "viewpointPitch": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "pitch - 0 for level, - for pitch up, for pitch down", + "length": undefined, + "mapping": undefined, + "name": "viewpointPitch", + "permission": "r", + "type": 3, + "value": 1480, + }, + "vmd": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Minimum drag speed - kt", + "length": undefined, + "mapping": true, + "name": "vmd", + "permission": "r", + "type": 8, + "value": 1360, + }, + "vor1DMEDistance": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR1 DME distance - nm", + "length": undefined, + "mapping": undefined, + "name": "vor1DMEDistance", + "permission": "r", + "type": 5, + "value": 768, + }, + "vor1DMESpeed": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR1 DME speed - kt", + "length": undefined, + "mapping": undefined, + "name": "vor1DMESpeed", + "permission": "r", + "type": 5, + "value": 770, + }, + "vor1DMETimeToStation": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR1 DME time to station - sec", + "length": undefined, + "mapping": undefined, + "name": "vor1DMETimeToStation", + "permission": "r", + "type": 5, + "value": 772, + }, + "vor1DmeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 1 DME elevation - ft - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1DmeElevation", + "permission": "r", + "type": 3, + "value": 2186, + }, + "vor1DmeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 1 DME latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1DmeLatitude", + "permission": "r", + "type": 3, + "value": 2176, + }, + "vor1DmeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 1 DME longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1DmeLongitude", + "permission": "r", + "type": 3, + "value": 2180, + }, + "vor1GlideSlopeAngle": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "VOR 1 ILS glideslope Angle", + "length": undefined, + "mapping": undefined, + "name": "vor1GlideSlopeAngle", + "permission": "r", + "type": 2, + "value": 2162, + }, + "vor1ILSLocHeadingTrue": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "VOR 1 ILS LOC heading - TRUE - -180 different to aircraft direction to follow localiser", + "length": undefined, + "mapping": undefined, + "name": "vor1LocHeadingTrue", + "permission": "r", + "type": 5, + "value": 2160, + }, + "vor1LocElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 1 or NAV1 ILS LOC elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1LocElevation", + "permission": "r", + "type": 3, + "value": 2172, + }, + "vor1LocLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 1 or NAV1 ILS LOC latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1LocLatitude", + "permission": "r", + "type": 3, + "value": 2164, + }, + "vor1LocLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 1 or NAV1 ILS LOC longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1LocLongitude", + "permission": "r", + "type": 3, + "value": 2168, + }, + "vor1OrILSGlideSlopeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 1 or NAV1 ILS glideslope elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1OrILSGlideSlopeElevation", + "permission": "r", + "type": 3, + "value": 2156, + }, + "vor1OrILSGlideSlopeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 1 latitude OR NAV1 ILS glideslope latitude", + "length": undefined, + "mapping": undefined, + "name": "vor1OrILSGlideSlopeLatitude", + "permission": "r", + "type": 3, + "value": 2140, + }, + "vor1OrILSGlideSlopeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 1 or NAV 1 ILS glideslope longitude", + "length": undefined, + "mapping": undefined, + "name": "vor1OrILSGlideSlopeLongitude", + "permission": "r", + "type": 3, + "value": 2148, + }, + "vor2DMEDistance": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR2 DME distance - nm", + "length": undefined, + "mapping": undefined, + "name": "vor2DMEDistance", + "permission": "r", + "type": 5, + "value": 774, + }, + "vor2DMESpeed": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR2 DME speed - kt", + "length": undefined, + "mapping": undefined, + "name": "vor2DMESpeed", + "permission": "r", + "type": 5, + "value": 776, + }, + "vor2DMETimeToStation": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR2 DME time to station - sec", + "length": undefined, + "mapping": undefined, + "name": "vor2DMETimeToStation", + "permission": "r", + "type": 5, + "value": 778, + }, + "vor2DmeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 2 DME elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2DmeElevation", + "permission": "r", + "type": 3, + "value": 2108, + }, + "vor2DmeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 2 DME latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2DmeLatitude", + "permission": "r", + "type": 3, + "value": 2100, + }, + "vor2DmeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 2 DME longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2DmeLongitude", + "permission": "r", + "type": 3, + "value": 2104, + }, + "vor2ILSGlideSlopeAngle": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "VOR 2 ILS GlideSlope Angle", + "length": undefined, + "mapping": undefined, + "name": "vor2ILSGlideSlopeAngle", + "permission": "r", + "type": 2, + "value": 2118, + }, + "vor2ILSLocHeadingTrue": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "NAV2 ILS Localiser inverse runway heading if VOR 2 is ILS - TRUE - FS2002+ - 180 different to aircraft direction to follow localiser", + "length": undefined, + "mapping": undefined, + "name": "vor2ILSLocHeadingTrue", + "permission": "r", + "type": 5, + "value": 2116, + }, + "vor2LocElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 2 or NAV2 ILS LOC elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2LocElevation", + "permission": "r", + "type": 3, + "value": 2132, + }, + "vor2LocLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 2 or NAV2 ILS LOC latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2LocLatitude", + "permission": "r", + "type": 3, + "value": 2124, + }, + "vor2LocLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 2 or NAV2 ILS LOC longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2LocLongitude", + "permission": "r", + "type": 3, + "value": 2128, + }, + "vor2OrILSGlideSlopeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 2 or NAV2 ILS glideslope elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2OrILSGlideSlopeElevation", + "permission": "r", + "type": 3, + "value": 2152, + }, + "vor2OrILSGlideSlopeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 2 latitude or NAV2 ILS glideslope latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2OrILSGlideSlopeLatitude", + "permission": "r", + "type": 3, + "value": 2136, + }, + "vor2OrILSGlideSlopeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 2 or NAV 2 ILS glideslope longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2OrILSGlideSlopeLongitude", + "permission": "r", + "type": 3, + "value": 2144, + }, + "vs": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} * 60 * 3.28084 / 256)", + "description": "vertical speed - ft/min", + "length": undefined, + "mapping": undefined, + "name": "vs", + "permission": "r", + "type": 3, + "value": 712, + }, + "vs0": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Stall speed full flaps - kt", + "length": undefined, + "mapping": true, + "name": "vs0", + "permission": "r", + "type": 8, + "value": 1336, + }, + "vs1": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Stall speed clean - kt", + "length": undefined, + "mapping": true, + "name": "vs1", + "permission": "r", + "type": 8, + "value": 1344, + }, + "vsAtTouchdown": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL}*60*3.28084/256)", + "description": "vertical speed - m/s", + "length": undefined, + "mapping": undefined, + "name": "vsAtTouchdown", + "permission": "r", + "type": 3, + "value": 780, + }, + "whiskeyCompass": Offset { + "category": "position_attitude", + "convert": undefined, + "description": "whiskey compass - degrees", + "length": undefined, + "mapping": undefined, + "name": "whiskeyCompass", + "permission": "r", + "type": 8, + "value": 716, + }, + "windSurfaceTurbulenceGustSpeed": Offset { + "category": "weather", + "convert": "+({VAL}).toFixed(2)", + "description": "METAR station altitude - kt", + "length": undefined, + "mapping": undefined, + "name": "windSurfaceTurbulenceGustSpeed", + "permission": "r", + "type": 5, + "value": 1210, + }, + "zoomfactor": Offset { + "category": "simulation", + "convert": "Math.floor({VAL}/64)", + "description": "zoom factor - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "zoomfactor", + "permission": "r", + "type": 5, + "value": 690, + }, + "zuluDayOfMonth": Offset { + "category": "environment", + "convert": undefined, + "description": "day of month UTC - FSX only - count from 1", + "length": undefined, + "mapping": undefined, + "name": "zuluDayOfMonth", + "permission": "r", + "type": 0, + "value": 573, + }, + "zuluDayOfWeek": Offset { + "category": "environment", + "convert": undefined, + "description": "day of week UTC - FSX only", + "length": undefined, + "mapping": undefined, + "name": "zuluDayOfWeek", + "permission": "r", + "type": 0, + "value": 579, + }, + "zuluHour": Offset { + "category": "environment", + "convert": undefined, + "description": "0-23 UTC", + "length": undefined, + "mapping": undefined, + "name": "zuluHour", + "permission": "rw", + "type": 0, + "value": 571, + }, + "zuluMin": Offset { + "category": "environment", + "convert": undefined, + "description": "0-59 UTC", + "length": undefined, + "mapping": undefined, + "name": "zuluMin", + "permission": "rw", + "type": 0, + "value": 572, + }, + "zuluMonthOfYear": Offset { + "category": "environment", + "convert": undefined, + "description": "month of year UTC - FSX only", + "length": undefined, + "mapping": undefined, + "name": "zuluMonthOfYear", + "permission": "r", + "type": 0, + "value": 578, + }, + "zuluYear": Offset { + "category": "environment", + "convert": undefined, + "description": "year UTC", + "length": undefined, + "mapping": undefined, + "name": "zuluYear", + "permission": "rw", + "type": 5, + "value": 576, + }, +} +`; diff --git a/tests/offsets/airport/__snapshots__/pushback.spec.ts.snap b/tests/offsets/airport/__snapshots__/pushback.spec.ts.snap new file mode 100644 index 0000000..c116e07 --- /dev/null +++ b/tests/offsets/airport/__snapshots__/pushback.spec.ts.snap @@ -0,0 +1,61 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - airport/pushback offsets list should have required properties 1`] = ` +Object { + "pushbackAngle": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback angle - radians", + "length": undefined, + "mapping": undefined, + "name": "pushbackAngle", + "permission": "r", + "type": 9, + "value": 820, + }, + "pushbackWaitFlag": Offset { + "category": "pushback", + "convert": "!!{VAL}", + "description": "pushback wait flag", + "length": undefined, + "mapping": undefined, + "name": "pushbackWaitFlag", + "permission": "r", + "type": 5, + "value": 836, + }, + "pushbackXContact": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback X contact - ft", + "length": undefined, + "mapping": undefined, + "name": "pushbackXContact", + "permission": "r", + "type": 9, + "value": 824, + }, + "pushbackYContact": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback Y contact - ft", + "length": undefined, + "mapping": undefined, + "name": "pushbackYContact", + "permission": "r", + "type": 9, + "value": 828, + }, + "pushbackZContact": Offset { + "category": "pushback", + "convert": undefined, + "description": "pushback Z contact - ft", + "length": undefined, + "mapping": undefined, + "name": "pushbackZContact", + "permission": "r", + "type": 9, + "value": 832, + }, +} +`; diff --git a/tests/offsets/airport/__snapshots__/runway.spec.ts.snap b/tests/offsets/airport/__snapshots__/runway.spec.ts.snap new file mode 100644 index 0000000..0c876af --- /dev/null +++ b/tests/offsets/airport/__snapshots__/runway.spec.ts.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - airport/runway offsets list should have required properties 1`] = ` +Object { + "runwaySurfaceCondition": Offset { + "category": "runway", + "convert": "runwaySurfaceCondition", + "description": "surface condition", + "length": undefined, + "mapping": true, + "name": "runwaySurfaceCondition", + "permission": "r", + "type": 0, + "value": 838, + }, + "runwaySurfaceConditionValid": Offset { + "category": "runway", + "convert": "!!{VAL}", + "description": "surface condition valid flag", + "length": undefined, + "mapping": undefined, + "name": "runwaySurfaceConditionValid", + "permission": "r", + "type": 0, + "value": 839, + }, +} +`; diff --git a/tests/offsets/airport/pushback.spec.ts b/tests/offsets/airport/pushback.spec.ts new file mode 100644 index 0000000..d577c66 --- /dev/null +++ b/tests/offsets/airport/pushback.spec.ts @@ -0,0 +1,25 @@ +import { pushback as offsets } from '@offsets/airport/pushback'; + +describe('offset - airport/pushback', () => { + const offsetsTestCases = [ + { name: 'pushbackWaitFlag', value: 0, expectedResult: false }, + { name: 'pushbackWaitFlag', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/airport/runway.spec.ts b/tests/offsets/airport/runway.spec.ts new file mode 100644 index 0000000..7f0c105 --- /dev/null +++ b/tests/offsets/airport/runway.spec.ts @@ -0,0 +1,25 @@ +import { runway as offsets } from '@offsets/airport/runway'; + +describe('offset - airport/runway', () => { + const offsetsTestCases = [ + { name: 'runwaySurfaceConditionValid', value: 0, expectedResult: false }, + { name: 'runwaySurfaceConditionValid', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/environment/__snapshots__/environment.spec.ts.snap b/tests/offsets/environment/__snapshots__/environment.spec.ts.snap new file mode 100644 index 0000000..357d008 --- /dev/null +++ b/tests/offsets/environment/__snapshots__/environment.spec.ts.snap @@ -0,0 +1,226 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - environment/environment offsets list should have required properties 1`] = ` +Object { + "clockHour": Offset { + "category": "environment", + "convert": undefined, + "description": "0-23", + "length": undefined, + "mapping": undefined, + "name": "clockHour", + "permission": "rw", + "type": 0, + "value": 568, + }, + "clockMin": Offset { + "category": "environment", + "convert": undefined, + "description": "0-59", + "length": undefined, + "mapping": undefined, + "name": "clockMin", + "permission": "rw", + "type": 0, + "value": 569, + }, + "clockSec": Offset { + "category": "environment", + "convert": undefined, + "description": "0-59", + "length": undefined, + "mapping": undefined, + "name": "clockSec", + "permission": "rw", + "type": 0, + "value": 570, + }, + "dayOfYear": Offset { + "category": "environment", + "convert": undefined, + "description": "day of year - count from 1", + "length": undefined, + "mapping": undefined, + "name": "dayOfYear", + "permission": "rw", + "type": 5, + "value": 574, + }, + "localDayOfMonth": Offset { + "category": "environment", + "convert": undefined, + "description": "local day of month - FSX only", + "length": undefined, + "mapping": undefined, + "name": "localDayOfMonth", + "permission": "r", + "type": 0, + "value": 581, + }, + "localMonthOfYear": Offset { + "category": "environment", + "convert": undefined, + "description": "local month of year - FSX only", + "length": undefined, + "mapping": undefined, + "name": "localMonthOfYear", + "permission": "r", + "type": 0, + "value": 580, + }, + "localYear": Offset { + "category": "environment", + "convert": undefined, + "description": "local year", + "length": undefined, + "mapping": undefined, + "name": "localYear", + "permission": "rw", + "type": 5, + "value": 586, + }, + "nearestAirportAltitude": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportAltitude", + "permission": "r", + "type": 9, + "value": 1636, + }, + "nearestAirportDistance": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport distance - NM", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportDistance", + "permission": "r", + "type": 9, + "value": 1640, + }, + "nearestAirportId": Offset { + "category": "environment", + "convert": "nearestAirportsIds", + "description": "nearest airport", + "length": 128, + "mapping": true, + "name": "nearestAirportId", + "permission": "r", + "type": 10, + "value": 1624, + }, + "nearestAirportLatitude": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport latitude", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportLatitude", + "permission": "r", + "type": 9, + "value": 1628, + }, + "nearestAirportLongitude": Offset { + "category": "environment", + "convert": undefined, + "description": "nearest airport longitude", + "length": undefined, + "mapping": undefined, + "name": "nearestAirportLongitude", + "permission": "r", + "type": 9, + "value": 1632, + }, + "season": Offset { + "category": "environment", + "convert": "seasons", + "description": "local season", + "length": undefined, + "mapping": true, + "name": "season", + "permission": "rw", + "type": 5, + "value": 584, + }, + "timezoneOffsetToZulu": Offset { + "category": "environment", + "convert": undefined, + "description": "timezone offset minutes to zulu - determines aircraft position (+ve = behind zulu, -ve = ahead zulu)", + "length": undefined, + "mapping": undefined, + "name": "timezoneOffsetToZulu", + "permission": "rw", + "type": 2, + "value": 582, + }, + "zuluDayOfMonth": Offset { + "category": "environment", + "convert": undefined, + "description": "day of month UTC - FSX only - count from 1", + "length": undefined, + "mapping": undefined, + "name": "zuluDayOfMonth", + "permission": "r", + "type": 0, + "value": 573, + }, + "zuluDayOfWeek": Offset { + "category": "environment", + "convert": undefined, + "description": "day of week UTC - FSX only", + "length": undefined, + "mapping": undefined, + "name": "zuluDayOfWeek", + "permission": "r", + "type": 0, + "value": 579, + }, + "zuluHour": Offset { + "category": "environment", + "convert": undefined, + "description": "0-23 UTC", + "length": undefined, + "mapping": undefined, + "name": "zuluHour", + "permission": "rw", + "type": 0, + "value": 571, + }, + "zuluMin": Offset { + "category": "environment", + "convert": undefined, + "description": "0-59 UTC", + "length": undefined, + "mapping": undefined, + "name": "zuluMin", + "permission": "rw", + "type": 0, + "value": 572, + }, + "zuluMonthOfYear": Offset { + "category": "environment", + "convert": undefined, + "description": "month of year UTC - FSX only", + "length": undefined, + "mapping": undefined, + "name": "zuluMonthOfYear", + "permission": "r", + "type": 0, + "value": 578, + }, + "zuluYear": Offset { + "category": "environment", + "convert": undefined, + "description": "year UTC", + "length": undefined, + "mapping": undefined, + "name": "zuluYear", + "permission": "rw", + "type": 5, + "value": 576, + }, +} +`; diff --git a/tests/offsets/environment/__snapshots__/weather.spec.ts.snap b/tests/offsets/environment/__snapshots__/weather.spec.ts.snap new file mode 100644 index 0000000..1f696bb --- /dev/null +++ b/tests/offsets/environment/__snapshots__/weather.spec.ts.snap @@ -0,0 +1,193 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - environment/weather offsets list should have required properties 1`] = ` +Object { + "cloudHighCoverage": Offset { + "category": "weather", + "convert": undefined, + "description": "cloud high coverage - octa", + "length": undefined, + "mapping": undefined, + "name": "cloudHighCoverage", + "permission": "r", + "type": 0, + "value": 1231, + }, + "cloudLowCoverage": Offset { + "category": "weather", + "convert": undefined, + "description": "cloud low coverage - octa", + "length": undefined, + "mapping": undefined, + "name": "cloudLowCoverage", + "permission": "r", + "type": 0, + "value": 1230, + }, + "cloudThunderCoverage": Offset { + "category": "weather", + "convert": undefined, + "description": "cloud thunder coverage - octa", + "length": undefined, + "mapping": undefined, + "name": "cloudThunderCoverage", + "permission": "r", + "type": 0, + "value": 1229, + }, + "dewPoint": Offset { + "category": "weather", + "convert": "{VAL} / 256", + "description": "dew point - FS2000+", + "length": undefined, + "mapping": undefined, + "name": "dewPoint", + "permission": "r", + "type": 2, + "value": 1224, + }, + "dewPointControl": Offset { + "category": "weather", + "convert": undefined, + "description": "degrees / 256 - 0x8000 release control", + "length": undefined, + "mapping": undefined, + "name": "dewPointControl", + "permission": "w", + "type": 5, + "value": 1236, + }, + "metarBarometricDrift": Offset { + "category": "weather", + "convert": "{VAL} / 16", + "description": "METAR barometric drift - difference between aircraft/METAR QNH. Adding drift withll give correct value for ATIS report", + "length": undefined, + "mapping": undefined, + "name": "metarBarometricDrift", + "permission": "r", + "type": 5, + "value": 1212, + }, + "metarCloudBaseHigh": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR cloud base high - ft", + "length": undefined, + "mapping": undefined, + "name": "metarCloudBaseHigh", + "permission": "r", + "type": 5, + "value": 1222, + }, + "metarCloudBaseLow": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR cloud base low - ft", + "length": undefined, + "mapping": undefined, + "name": "metarCloudBaseLow", + "permission": "r", + "type": 5, + "value": 1220, + }, + "metarCloudThunderBase": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR visibility - ft", + "length": undefined, + "mapping": undefined, + "name": "metarCloudThunderBase", + "permission": "r", + "type": 5, + "value": 1218, + }, + "metarStationAltitude": Offset { + "category": "weather", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "METAR station altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "metarStationAltitude", + "permission": "r", + "type": 5, + "value": 1204, + }, + "metarVisibility": Offset { + "category": "weather", + "convert": "{VAL} / 100", + "description": "METAR visibility - sm", + "length": undefined, + "mapping": undefined, + "name": "metarVisibility", + "permission": "r", + "type": 5, + "value": 1216, + }, + "precipitationControl": Offset { + "category": "weather", + "convert": undefined, + "description": "hi-byte type 0-2 - low-byte rate 0-5 - writing 0xFFFF release control", + "length": undefined, + "mapping": undefined, + "name": "precipitationControl", + "permission": "w", + "type": 5, + "value": 1234, + }, + "precipitationRate": Offset { + "category": "weather", + "convert": undefined, + "description": "precipitation rate - FS2000+ - 0 to 5", + "length": undefined, + "mapping": undefined, + "name": "precipitationRate", + "permission": "r", + "type": 0, + "value": 1224, + }, + "precipitationType": Offset { + "category": "weather", + "convert": "precipitationType", + "description": "precipitation type - FS2000+ - 0 to 5", + "length": undefined, + "mapping": true, + "name": "precipitationType", + "permission": "r", + "type": 0, + "value": 1228, + }, + "surfaceWindDirection": Offset { + "category": "weather", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "surface wind direction - FS2000+ - deg MAG", + "length": undefined, + "mapping": undefined, + "name": "surfaceWindDirection", + "permission": "r", + "type": 5, + "value": 1242, + }, + "surfaceWindSpeed": Offset { + "category": "weather", + "convert": undefined, + "description": "surface wind speed - FS2000+ - kts", + "length": undefined, + "mapping": undefined, + "name": "surfaceWindSpeed", + "permission": "r", + "type": 5, + "value": 1240, + }, + "windSurfaceTurbulenceGustSpeed": Offset { + "category": "weather", + "convert": "+({VAL}).toFixed(2)", + "description": "METAR station altitude - kt", + "length": undefined, + "mapping": undefined, + "name": "windSurfaceTurbulenceGustSpeed", + "permission": "r", + "type": 5, + "value": 1210, + }, +} +`; diff --git a/tests/offsets/environment/environment.spec.ts b/tests/offsets/environment/environment.spec.ts new file mode 100644 index 0000000..d919d95 --- /dev/null +++ b/tests/offsets/environment/environment.spec.ts @@ -0,0 +1,9 @@ +import { environment as offsets } from '@offsets/environment/environment'; + +describe('offset - environment/environment', () => { + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); +}); diff --git a/tests/offsets/environment/weather.spec.ts b/tests/offsets/environment/weather.spec.ts new file mode 100644 index 0000000..b0df5a2 --- /dev/null +++ b/tests/offsets/environment/weather.spec.ts @@ -0,0 +1,31 @@ +import { weather as offsets } from '@offsets/environment/weather'; + +describe('offset - environment/weather', () => { + const offsetsTestCases = [ + { name: 'metarStationAltitude', value: 123, expectedResult: 403.54 }, + { name: 'metarBarometricDrift', value: 32, expectedResult: 2 }, + { name: 'metarVisibility', value: 3200, expectedResult: 32 }, + { name: 'metarCloudThunderBase', value: 914, expectedResult: 2998.69 }, + { name: 'metarCloudBaseLow', value: 914, expectedResult: 2998.69 }, + { name: 'metarCloudBaseHigh', value: 914, expectedResult: 2998.69 }, + { name: 'dewPoint', value: 512, expectedResult: 2 }, + { name: 'surfaceWindDirection', value: 32768, expectedResult: 180 }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/offset.spec.ts b/tests/offsets/offset.spec.ts new file mode 100644 index 0000000..ac2d58a --- /dev/null +++ b/tests/offsets/offset.spec.ts @@ -0,0 +1,7 @@ +import { OFFSETS } from '@offsets/index'; + +describe('offsets list', () => { + it('should resolve full list', () => { + expect(OFFSETS).toMatchSnapshot(); + }); +}); diff --git a/tests/offsets/plane/__snapshots__/autopilot.spec.ts.snap b/tests/offsets/plane/__snapshots__/autopilot.spec.ts.snap new file mode 100644 index 0000000..2980ea5 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/autopilot.spec.ts.snap @@ -0,0 +1,325 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/autopilot offsets list should have required properties 1`] = ` +Object { + "apAltitudeHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP altitude hold", + "length": undefined, + "mapping": undefined, + "name": "apAltitudeHold", + "permission": "rw", + "type": 6, + "value": 2000, + }, + "apAltitudeValue": Offset { + "category": "autopilot", + "convert": "+({VAL} * 3.28084 / 65536).toFixed(2)", + "description": "AP altitude value - ft", + "length": undefined, + "mapping": undefined, + "name": "apAltitudeValue", + "permission": "rw", + "type": 3, + "value": 2004, + }, + "apApproachHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP Approach hold", + "length": undefined, + "mapping": undefined, + "name": "apApproachHold", + "permission": "rw", + "type": 6, + "value": 2048, + }, + "apAsHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP airspeed hold", + "length": undefined, + "mapping": undefined, + "name": "apAsHold", + "permission": "rw", + "type": 6, + "value": 2012, + }, + "apAsValue": Offset { + "category": "autopilot", + "convert": undefined, + "description": "AP airspeed value - kt", + "length": undefined, + "mapping": undefined, + "name": "apAsValue", + "permission": "rw", + "type": 5, + "value": 2018, + }, + "apAttitudeHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP attitude hold", + "length": undefined, + "mapping": undefined, + "name": "apAttitudeHold", + "permission": "rw", + "type": 6, + "value": 2008, + }, + "apAutoThrottleArm": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP autothrottle arm", + "length": undefined, + "mapping": undefined, + "name": "apAutoThrottleArm", + "permission": "rw", + "type": 6, + "value": 2064, + }, + "apBackCourseHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP back course hold", + "length": undefined, + "mapping": undefined, + "name": "apBackCourseHold", + "permission": "rw", + "type": 6, + "value": 2052, + }, + "apGlideSlopeHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP GlideSlope hold", + "length": undefined, + "mapping": undefined, + "name": "apGlideSlopeHold", + "permission": "rw", + "type": 6, + "value": 2044, + }, + "apHeadingHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP heading hold", + "length": undefined, + "mapping": undefined, + "name": "apHeadingHold", + "permission": "rw", + "type": 6, + "value": 1992, + }, + "apHeadingValue": Offset { + "category": "autopilot", + "convert": "Math.round(({VAL} * 360) / 65536)", + "description": "AP heading value - degrees", + "length": undefined, + "mapping": undefined, + "name": "apHeadingValue", + "permission": "rw", + "type": 5, + "value": 1996, + }, + "apMachHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP mach hold", + "length": undefined, + "mapping": undefined, + "name": "apMachHold", + "permission": "rw", + "type": 6, + "value": 2020, + }, + "apMachValue": Offset { + "category": "autopilot", + "convert": "{VAL} / 65536", + "description": "AP mach value - mach", + "length": undefined, + "mapping": undefined, + "name": "apMachValue", + "permission": "rw", + "type": 6, + "value": 2024, + }, + "apMasterSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP master switch", + "length": undefined, + "mapping": undefined, + "name": "apMasterSwitch", + "permission": "rw", + "type": 6, + "value": 1980, + }, + "apNav1Hold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP NAV1 hold", + "length": undefined, + "mapping": undefined, + "name": "apNav1Hold", + "permission": "rw", + "type": 6, + "value": 1988, + }, + "apRPMN1Hold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP RPM/N1 hold", + "length": undefined, + "mapping": undefined, + "name": "apRPMN1Hold", + "permission": "rw", + "type": 6, + "value": 2036, + }, + "apRPMN1Value": Offset { + "category": "autopilot", + "convert": "Math.round({VAL} * 100 / 16384)", + "description": "AP RPM/N1 value - percent", + "length": undefined, + "mapping": undefined, + "name": "apRPMN1Value", + "permission": "rw", + "type": 6, + "value": 2042, + }, + "apTOGAAutoThrottle": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP TO/GA throttle hold", + "length": undefined, + "mapping": undefined, + "name": "apTOGAAutoThrottle", + "permission": "rw", + "type": 6, + "value": 2060, + }, + "apVsHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP vertical speed hold", + "length": undefined, + "mapping": undefined, + "name": "apVsHold", + "permission": "rw", + "type": 6, + "value": 2028, + }, + "apVsValue": Offset { + "category": "autopilot", + "convert": undefined, + "description": "AP vertical speed value - ft/min", + "length": undefined, + "mapping": undefined, + "name": "apVsValue", + "permission": "rw", + "type": 2, + "value": 2034, + }, + "apWingLevel": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP wing level", + "length": undefined, + "mapping": undefined, + "name": "apWingLevel", + "permission": "rw", + "type": 6, + "value": 1984, + }, + "apYawDamperHold": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "AP yaw damper hold", + "length": undefined, + "mapping": undefined, + "name": "apYawDamperHold", + "permission": "rw", + "type": 6, + "value": 2056, + }, + "autoPilotAvailable": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "autopilot available", + "length": undefined, + "mapping": undefined, + "name": "autoPilotAvailable", + "permission": "r", + "type": 6, + "value": 1892, + }, + "flyByWireELACCompFailFlag": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire ELAC comp fail flag (read only)", + "length": undefined, + "mapping": undefined, + "name": "flyByWireELACCompFailFlag", + "permission": "r", + "type": 0, + "value": 1975, + }, + "flyByWireELACSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire ELAC switch", + "length": undefined, + "mapping": undefined, + "name": "flyByWireELACSwitch", + "permission": "rw", + "type": 0, + "value": 1974, + }, + "flyByWireFACCompFailFlag": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire FAC comp fail flag (read only)", + "length": undefined, + "mapping": undefined, + "name": "flyByWireFACCompFailFlag", + "permission": "r", + "type": 0, + "value": 1977, + }, + "flyByWireFACSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire FAC switch", + "length": undefined, + "mapping": undefined, + "name": "flyByWireFACSwitch", + "permission": "rw", + "type": 0, + "value": 1976, + }, + "flyByWireSECCompFailFlag": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire SEC comp fail flag (read only)", + "length": undefined, + "mapping": undefined, + "name": "flyByWireSECCompFailFlag", + "permission": "r", + "type": 0, + "value": 1979, + }, + "flyByWireSECSwitch": Offset { + "category": "autopilot", + "convert": "!!{VAL}", + "description": "fly by wire SEC switch", + "length": undefined, + "mapping": undefined, + "name": "flyByWireSECSwitch", + "permission": "rw", + "type": 0, + "value": 1978, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/cockpit.spec.ts.snap b/tests/offsets/plane/__snapshots__/cockpit.spec.ts.snap new file mode 100644 index 0000000..74c5a72 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/cockpit.spec.ts.snap @@ -0,0 +1,171 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/cockpit offsets list should have required properties 1`] = ` +Object { + "alternateStaticAirSource": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "Alternate static air source selected", + "length": undefined, + "mapping": undefined, + "name": "alternateStaticAirSource", + "permission": "rw", + "type": 0, + "value": 667, + }, + "altimeterSettings": Offset { + "category": "cockpit", + "convert": "{VAL} / 16", + "description": "altimeters settings - mb", + "length": undefined, + "mapping": undefined, + "name": "altimeterSettings", + "permission": "rw", + "type": 5, + "value": 816, + }, + "altimeterSettingsG1000": Offset { + "category": "cockpit", + "convert": "{VAL} / 16", + "description": "G1000 altimeters settings - mb", + "length": undefined, + "mapping": undefined, + "name": "altimeterSettingsG1000", + "permission": "rw", + "type": 5, + "value": 818, + }, + "displayIAS": Offset { + "category": "cockpit", + "convert": undefined, + "description": "display IAS - <= FS2000", + "length": undefined, + "mapping": undefined, + "name": "displayIAS", + "permission": "rw", + "type": 5, + "value": 1554, + }, + "landingLights": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "landing lights", + "length": undefined, + "mapping": undefined, + "name": "landingLights", + "permission": "rw", + "type": 5, + "value": 652, + }, + "lights": Offset { + "category": "cockpit", + "convert": "lightsMapping", + "description": "all lights - FS2000+", + "length": 2, + "mapping": true, + "name": "lights", + "permission": "rw", + "type": 12, + "value": 3340, + }, + "navLights": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "nav lights", + "length": undefined, + "mapping": undefined, + "name": "navLights", + "permission": "rw", + "type": 0, + "value": 640, + }, + "overspeedWarning": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "overspeed warning", + "length": undefined, + "mapping": undefined, + "name": "overspeedWarning", + "permission": "r", + "type": 0, + "value": 877, + }, + "pitotHeat": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "pitot heat active", + "length": undefined, + "mapping": undefined, + "name": "pitotHeat", + "permission": "rw", + "type": 2, + "value": 668, + }, + "preciseTurnCoordinatorPosition": Offset { + "category": "cockpit", + "convert": undefined, + "description": "Turn coordinator ball position - + to the right, - to the left, 0 balanced", + "length": undefined, + "mapping": undefined, + "name": "preciseTurnCoordinatorPosition", + "permission": "r", + "type": 9, + "value": 896, + }, + "preciseTurnRate": Offset { + "category": "cockpit", + "convert": undefined, + "description": "Turn rate needle - minutes (- to the left, + to the right)", + "length": undefined, + "mapping": undefined, + "name": "preciseTurnRate", + "permission": "r", + "type": 9, + "value": 900, + }, + "stallWarning": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "stall warning", + "length": undefined, + "mapping": undefined, + "name": "stallWarning", + "permission": "r", + "type": 0, + "value": 876, + }, + "strobeLights": Offset { + "category": "cockpit", + "convert": "!!{VAL}", + "description": "strobe lights", + "length": undefined, + "mapping": undefined, + "name": "strobeLights", + "permission": "rw", + "type": 0, + "value": 641, + }, + "turnCoordinatorPosition": Offset { + "category": "cockpit", + "convert": undefined, + "description": "Turn coordinator ball position - + to the right, - to the left, 0 balanced", + "length": undefined, + "mapping": undefined, + "name": "turnCoordinatorPosition", + "permission": "r", + "type": 1, + "value": 878, + }, + "turnRate": Offset { + "category": "cockpit", + "convert": "Math.round({VAL} / 1024)", + "description": "Turn rate needle - minutes (- to the left, + to the right)", + "length": undefined, + "mapping": undefined, + "name": "turnRate", + "permission": "r", + "type": 2, + "value": 892, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/controls.spec.ts.snap b/tests/offsets/plane/__snapshots__/controls.spec.ts.snap new file mode 100644 index 0000000..12c4645 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/controls.spec.ts.snap @@ -0,0 +1,50 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/controls offsets list should have required properties 1`] = ` +Object { + "autoRudder": Offset { + "category": "controls", + "convert": "!!{VAL}", + "description": "auto coordination", + "length": undefined, + "mapping": undefined, + "name": "autoRudder", + "permission": "rw", + "type": 2, + "value": 632, + }, + "leftAileronDeflection": Offset { + "category": "controls", + "convert": undefined, + "description": "left aileron deflection - radians", + "length": undefined, + "mapping": undefined, + "name": "leftAileronDeflection", + "permission": "r", + "type": 8, + "value": 944, + }, + "rightAileronDeflection": Offset { + "category": "controls", + "convert": undefined, + "description": "right aileron deflection - radians", + "length": undefined, + "mapping": undefined, + "name": "rightAileronDeflection", + "permission": "r", + "type": 8, + "value": 952, + }, + "rotorClutchSwitch": Offset { + "category": "controls", + "convert": "!!{VAL}", + "description": "rotor clutch switch", + "length": undefined, + "mapping": undefined, + "name": "rotorClutchSwitch", + "permission": "rw", + "type": 0, + "value": 2185, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/engines.spec.ts.snap b/tests/offsets/plane/__snapshots__/engines.spec.ts.snap new file mode 100644 index 0000000..cf21dd3 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/engines.spec.ts.snap @@ -0,0 +1,50 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/engines offsets list should have required properties 1`] = ` +Object { + "activeEngine": Offset { + "category": "engine", + "convert": undefined, + "description": "active engine pattern", + "length": 1, + "mapping": undefined, + "name": "activeEngine", + "permission": "rw", + "type": 12, + "value": 2184, + }, + "engineType": Offset { + "category": "engine", + "convert": "engineType", + "description": "engine type", + "length": undefined, + "mapping": true, + "name": "engineType", + "permission": "r", + "type": 0, + "value": 1545, + }, + "hasCarbHeat": Offset { + "category": "engine", + "convert": "!!{VAL}", + "description": "has carb heat", + "length": undefined, + "mapping": undefined, + "name": "hasCarbHeat", + "permission": "r", + "type": 6, + "value": 1924, + }, + "hasMixtureControl": Offset { + "category": "engine", + "convert": "!!{VAL}", + "description": "has mixture control", + "length": undefined, + "mapping": undefined, + "name": "hasMixtureControl", + "permission": "r", + "type": 6, + "value": 1920, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/helicopter.spec.ts.snap b/tests/offsets/plane/__snapshots__/helicopter.spec.ts.snap new file mode 100644 index 0000000..d369493 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/helicopter.spec.ts.snap @@ -0,0 +1,94 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/helicopter offsets list should have required properties 1`] = ` +Object { + "governorSwitch": Offset { + "category": "helicopter", + "convert": "!!{VAL}", + "description": "governor switch activated - Robinson only", + "length": undefined, + "mapping": undefined, + "name": "governorSwitch", + "permission": "rw", + "type": 0, + "value": 2086, + }, + "rotorBreakApplication": Offset { + "category": "helicopter", + "convert": "Math.round({VAL} / 16384 * 100)", + "description": "rotor brake application - percent - Robinson only", + "length": undefined, + "mapping": undefined, + "name": "rotorBreakApplication", + "permission": "rw", + "type": 5, + "value": 2082, + }, + "rotorChipWarning": Offset { + "category": "helicopter", + "convert": "!!{VAL}", + "description": "rotor chip detected - Rbinson only", + "length": undefined, + "mapping": undefined, + "name": "rotorChipWarning", + "permission": "rw", + "type": 0, + "value": 2080, + }, + "rotorClutchActive": Offset { + "category": "helicopter", + "convert": "!!{VAL}", + "description": "rotor clutch active - Robinson only", + "length": undefined, + "mapping": undefined, + "name": "rotorClutchActive", + "permission": "rw", + "type": 0, + "value": 2079, + }, + "rotorGovWarning": Offset { + "category": "helicopter", + "convert": "!!{VAL}", + "description": "rotor gov active - Rbinson only", + "length": undefined, + "mapping": undefined, + "name": "rotorGovWarning", + "permission": "rw", + "type": 0, + "value": 2081, + }, + "rotorLateralTrim": Offset { + "category": "helicopter", + "convert": "Math.round({VAL} / 16384 * 100)", + "description": "rotor lateral trim - percent - Robinson only", + "length": undefined, + "mapping": undefined, + "name": "rotorLateralTrim", + "permission": "rw", + "type": 5, + "value": 2084, + }, + "rotorTransmissionTemp": Offset { + "category": "helicopter", + "convert": undefined, + "description": "rotor transmission temp - degrees Rankine - read only", + "length": undefined, + "mapping": undefined, + "name": "rotorTransmissionTemp", + "permission": "r", + "type": 8, + "value": 2088, + }, + "rotorbreakActive": Offset { + "category": "helicopter", + "convert": "!!{VAL}", + "description": "rotor brake active - Robinson only", + "length": undefined, + "mapping": undefined, + "name": "rotorbreakActive", + "permission": "rw", + "type": 0, + "value": 2078, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/icing.spec.ts.snap b/tests/offsets/plane/__snapshots__/icing.spec.ts.snap new file mode 100644 index 0000000..1102670 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/icing.spec.ts.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/icing offsets list should have required properties 1`] = ` +Object { + "pitotIce": Offset { + "category": "icing", + "convert": "+({VAL} / 16384 * 100).toFixed(2)", + "description": "structural ice - decimal percent", + "length": undefined, + "mapping": undefined, + "name": "pitotIce", + "permission": "r", + "type": 5, + "value": 842, + }, + "structuralIce": Offset { + "category": "icing", + "convert": "+({VAL} / 16384 * 100).toFixed(2)", + "description": "structural ice - decimal percent", + "length": undefined, + "mapping": undefined, + "name": "structuralIce", + "permission": "r", + "type": 5, + "value": 840, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/plane.spec.ts.snap b/tests/offsets/plane/__snapshots__/plane.spec.ts.snap new file mode 100644 index 0000000..d268a3e --- /dev/null +++ b/tests/offsets/plane/__snapshots__/plane.spec.ts.snap @@ -0,0 +1,182 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/plane offsets list should have required properties 1`] = ` +Object { + "hasCarbHeat": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has carburator heater", + "length": undefined, + "mapping": undefined, + "name": "hasCarbHeat", + "permission": "r", + "type": 6, + "value": 1924, + }, + "hasFlaps": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has flaps", + "length": undefined, + "mapping": undefined, + "name": "hasFlaps", + "permission": "r", + "type": 6, + "value": 1912, + }, + "hasMixtureEngine": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has mixture engine", + "length": undefined, + "mapping": undefined, + "name": "hasMixtureEngine", + "permission": "r", + "type": 6, + "value": 1920, + }, + "hasSpoilers": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has spoilers", + "length": undefined, + "mapping": undefined, + "name": "hasSpoilers", + "permission": "r", + "type": 6, + "value": 1932, + }, + "hasStallHorn": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has stall horn", + "length": undefined, + "mapping": undefined, + "name": "hasStallHorn", + "permission": "r", + "type": 6, + "value": 1916, + }, + "hasStrobes": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has strobes", + "length": undefined, + "mapping": undefined, + "name": "hasStrobes", + "permission": "r", + "type": 6, + "value": 1940, + }, + "hasToeBrakes": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has toe brakes", + "length": undefined, + "mapping": undefined, + "name": "hasToeBrakes", + "permission": "r", + "type": 6, + "value": 1948, + }, + "isTailDragger": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "has spoilers", + "length": undefined, + "mapping": undefined, + "name": "isTailDragger", + "permission": "r", + "type": 6, + "value": 1936, + }, + "retractableGear": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "retractable gear (read only)", + "length": undefined, + "mapping": undefined, + "name": "retractableGear", + "permission": "r", + "type": 0, + "value": 1548, + }, + "retractableLeftFloatExtension": Offset { + "category": "plane", + "convert": "Math.floor({VAL} / 16384 * 100)", + "description": "retractable left float extension - percent", + "length": undefined, + "mapping": undefined, + "name": "retractableLeftFloatExtension", + "permission": "r", + "type": 5, + "value": 1556, + }, + "retractableRightFloatExtension": Offset { + "category": "plane", + "convert": "Math.floor({VAL} / 16384 * 100)", + "description": "retractable right float extension - percent", + "length": undefined, + "mapping": undefined, + "name": "retractableRightFloatExtension", + "permission": "r", + "type": 5, + "value": 1558, + }, + "smokeSystemControl": Offset { + "category": "plane", + "convert": "!!{VAL}", + "description": "smoke system control on/off", + "length": undefined, + "mapping": undefined, + "name": "smokeSystemControl", + "permission": "rw", + "type": 5, + "value": 1496, + }, + "vc": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Cruise speed - kt", + "length": undefined, + "mapping": true, + "name": "vc", + "permission": "r", + "type": 8, + "value": 1352, + }, + "vmd": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Minimum drag speed - kt", + "length": undefined, + "mapping": true, + "name": "vmd", + "permission": "r", + "type": 8, + "value": 1360, + }, + "vs0": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Stall speed full flaps - kt", + "length": undefined, + "mapping": true, + "name": "vs0", + "permission": "r", + "type": 8, + "value": 1336, + }, + "vs1": Offset { + "category": "plane", + "convert": "ftsecToKt", + "description": "Stall speed clean - kt", + "length": undefined, + "mapping": true, + "name": "vs1", + "permission": "r", + "type": 8, + "value": 1344, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/pressurisation.spec.ts.snap b/tests/offsets/plane/__snapshots__/pressurisation.spec.ts.snap new file mode 100644 index 0000000..1cd86a9 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/pressurisation.spec.ts.snap @@ -0,0 +1,61 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/pressurisation offsets list should have required properties 1`] = ` +Object { + "pressCabinAlt": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: cabin altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAlt", + "permission": "r", + "type": 3, + "value": 792, + }, + "pressCabinAltChange": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: cabin altitude change set - ft/s", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAltChange", + "permission": "r", + "type": 9, + "value": 800, + }, + "pressCabinAltPressDiff": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: cabin altitude change set - lb/sqft", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAltPressDiff", + "permission": "r", + "type": 9, + "value": 804, + }, + "pressCabinAltTarget": Offset { + "category": "pressurisation", + "convert": undefined, + "description": "pressurisation: target cabin altitude - ft", + "length": undefined, + "mapping": undefined, + "name": "pressCabinAltTarget", + "permission": "r", + "type": 3, + "value": 796, + }, + "pressDumpSwitch": Offset { + "category": "pressurisation", + "convert": "!!{VAL}", + "description": "pressurisation: dump switch", + "length": undefined, + "mapping": undefined, + "name": "pressDumpSwitch", + "permission": "rw", + "type": 6, + "value": 808, + }, +} +`; diff --git a/tests/offsets/plane/__snapshots__/radios.spec.ts.snap b/tests/offsets/plane/__snapshots__/radios.spec.ts.snap new file mode 100644 index 0000000..67b4eb4 --- /dev/null +++ b/tests/offsets/plane/__snapshots__/radios.spec.ts.snap @@ -0,0 +1,512 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/radios offsets list should have required properties 1`] = ` +Object { + "adf2ExtendedFreq": Offset { + "category": "radios", + "convert": undefined, + "description": "ADF 2 extended freq - in BCD - FS2004", + "length": undefined, + "mapping": undefined, + "name": "adf2ExtendedFreq", + "permission": "rw", + "type": 5, + "value": 726, + }, + "adf2Freq": Offset { + "category": "radios", + "convert": "+({VAL}).toString(16)", + "description": "ADF 2 freq - Main 3 digits in BCD - FS2004", + "length": undefined, + "mapping": undefined, + "name": "adf2Freq", + "permission": "rw", + "type": 5, + "value": 724, + }, + "adf2RelBearing": Offset { + "category": "radios", + "convert": "Math.round({VAL} * 360 / 65536)", + "description": "ADF2 Rel Bearing - FS2004", + "length": undefined, + "mapping": undefined, + "name": "adf2RelBearing", + "permission": "r", + "type": 2, + "value": 728, + }, + "adfFreq": Offset { + "category": "radios", + "convert": "+({VAL}).toString(16)", + "description": "ADF frequency show as Binary Coded Decimal. The thousands digit and the fractional parts are provided in adfFreqExtended", + "length": undefined, + "mapping": undefined, + "name": "adfFreq", + "permission": "rw", + "type": 5, + "value": 844, + }, + "adfFreqExtended": Offset { + "category": "radios", + "convert": undefined, + "description": "ADF frequency extended", + "length": undefined, + "mapping": undefined, + "name": "adfFreqExtended", + "permission": "rw", + "type": 5, + "value": 854, + }, + "comAtisActivate": Offset { + "category": "radios", + "convert": undefined, + "description": "COM/ATIS activate < FS2000", + "length": undefined, + "mapping": undefined, + "name": "comAtisActivate", + "permission": "w", + "type": 5, + "value": 906, + }, + "comFreq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "Com frequency", + "length": undefined, + "mapping": undefined, + "name": "comFreq", + "permission": "rw", + "type": 5, + "value": 846, + }, + "dme12Select": Offset { + "category": "radios", + "convert": undefined, + "description": "DME1/DME2 select", + "length": undefined, + "mapping": undefined, + "name": "dme12Select", + "permission": "rw", + "type": 5, + "value": 888, + }, + "hasNav1": Offset { + "category": "radios", + "convert": "!!{VAL}", + "description": "has NAV1", + "length": undefined, + "mapping": undefined, + "name": "hasNav1", + "permission": "rw", + "type": 6, + "value": 1952, + }, + "hasNav2": Offset { + "category": "radios", + "convert": "!!{VAL}", + "description": "has NAV2", + "length": undefined, + "mapping": undefined, + "name": "hasNav2", + "permission": "r", + "type": 6, + "value": 1956, + }, + "nav12Select": Offset { + "category": "radios", + "convert": undefined, + "description": "NAV1/NAV2 select", + "length": undefined, + "mapping": undefined, + "name": "nav12Select", + "permission": "rw", + "type": 5, + "value": 884, + }, + "nav1Freq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "NAV1 frequency", + "length": undefined, + "mapping": undefined, + "name": "nav1Freq", + "permission": "rw", + "type": 5, + "value": 848, + }, + "nav2Freq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "NAV2 frequency", + "length": undefined, + "mapping": undefined, + "name": "nav2Freq", + "permission": "rw", + "type": 5, + "value": 850, + }, + "navAdfActivate": Offset { + "category": "radios", + "convert": undefined, + "description": "NAV and ADF activate < FS2000", + "length": undefined, + "mapping": undefined, + "name": "navAdfActivate", + "permission": "w", + "type": 5, + "value": 904, + }, + "ndb2IdentSoundSwitch": Offset { + "category": "radios", + "convert": "!!{VAL}", + "description": "NDB2 ident sound switch - FS2004", + "length": undefined, + "mapping": undefined, + "name": "ndb2IdentSoundSwitch", + "permission": "rw", + "type": 0, + "value": 763, + }, + "ndb2Identity": Offset { + "category": "radios", + "convert": undefined, + "description": "NDB2 identity - FS2004", + "length": 6, + "mapping": undefined, + "name": "ndb2Identity", + "permission": "r", + "type": 11, + "value": 732, + }, + "ndb2Name": Offset { + "category": "radios", + "convert": undefined, + "description": "NDB2 name - FS2004", + "length": 25, + "mapping": undefined, + "name": "ndb2Name", + "permission": "r", + "type": 11, + "value": 738, + }, + "transponderFreq": Offset { + "category": "radios", + "convert": "parseInt(\`1\` + ({VAL}).toString(16))", + "description": "XPND transponder frequency", + "length": undefined, + "mapping": undefined, + "name": "transponderFreq", + "permission": "rw", + "type": 5, + "value": 852, + }, + "vor1DMEDistance": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR1 DME distance - nm", + "length": undefined, + "mapping": undefined, + "name": "vor1DMEDistance", + "permission": "r", + "type": 5, + "value": 768, + }, + "vor1DMESpeed": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR1 DME speed - kt", + "length": undefined, + "mapping": undefined, + "name": "vor1DMESpeed", + "permission": "r", + "type": 5, + "value": 770, + }, + "vor1DMETimeToStation": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR1 DME time to station - sec", + "length": undefined, + "mapping": undefined, + "name": "vor1DMETimeToStation", + "permission": "r", + "type": 5, + "value": 772, + }, + "vor1DmeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 1 DME elevation - ft - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1DmeElevation", + "permission": "r", + "type": 3, + "value": 2186, + }, + "vor1DmeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 1 DME latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1DmeLatitude", + "permission": "r", + "type": 3, + "value": 2176, + }, + "vor1DmeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 1 DME longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1DmeLongitude", + "permission": "r", + "type": 3, + "value": 2180, + }, + "vor1GlideSlopeAngle": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "VOR 1 ILS glideslope Angle", + "length": undefined, + "mapping": undefined, + "name": "vor1GlideSlopeAngle", + "permission": "r", + "type": 2, + "value": 2162, + }, + "vor1ILSLocHeadingTrue": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "VOR 1 ILS LOC heading - TRUE - -180 different to aircraft direction to follow localiser", + "length": undefined, + "mapping": undefined, + "name": "vor1LocHeadingTrue", + "permission": "r", + "type": 5, + "value": 2160, + }, + "vor1LocElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 1 or NAV1 ILS LOC elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1LocElevation", + "permission": "r", + "type": 3, + "value": 2172, + }, + "vor1LocLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 1 or NAV1 ILS LOC latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1LocLatitude", + "permission": "r", + "type": 3, + "value": 2164, + }, + "vor1LocLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 1 or NAV1 ILS LOC longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1LocLongitude", + "permission": "r", + "type": 3, + "value": 2168, + }, + "vor1OrILSGlideSlopeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 1 or NAV1 ILS glideslope elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor1OrILSGlideSlopeElevation", + "permission": "r", + "type": 3, + "value": 2156, + }, + "vor1OrILSGlideSlopeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 1 latitude OR NAV1 ILS glideslope latitude", + "length": undefined, + "mapping": undefined, + "name": "vor1OrILSGlideSlopeLatitude", + "permission": "r", + "type": 3, + "value": 2140, + }, + "vor1OrILSGlideSlopeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 1 or NAV 1 ILS glideslope longitude", + "length": undefined, + "mapping": undefined, + "name": "vor1OrILSGlideSlopeLongitude", + "permission": "r", + "type": 3, + "value": 2148, + }, + "vor2DMEDistance": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR2 DME distance - nm", + "length": undefined, + "mapping": undefined, + "name": "vor2DMEDistance", + "permission": "r", + "type": 5, + "value": 774, + }, + "vor2DMESpeed": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR2 DME speed - kt", + "length": undefined, + "mapping": undefined, + "name": "vor2DMESpeed", + "permission": "r", + "type": 5, + "value": 776, + }, + "vor2DMETimeToStation": Offset { + "category": "radios", + "convert": "{VAL} / 10", + "description": "VOR2 DME time to station - sec", + "length": undefined, + "mapping": undefined, + "name": "vor2DMETimeToStation", + "permission": "r", + "type": 5, + "value": 778, + }, + "vor2DmeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 2 DME elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2DmeElevation", + "permission": "r", + "type": 3, + "value": 2108, + }, + "vor2DmeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 2 DME latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2DmeLatitude", + "permission": "r", + "type": 3, + "value": 2100, + }, + "vor2DmeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 2 DME longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2DmeLongitude", + "permission": "r", + "type": 3, + "value": 2104, + }, + "vor2ILSGlideSlopeAngle": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "VOR 2 ILS GlideSlope Angle", + "length": undefined, + "mapping": undefined, + "name": "vor2ILSGlideSlopeAngle", + "permission": "r", + "type": 2, + "value": 2118, + }, + "vor2ILSLocHeadingTrue": Offset { + "category": "radios", + "convert": "+({VAL} * 360 / 65536).toFixed(2)", + "description": "NAV2 ILS Localiser inverse runway heading if VOR 2 is ILS - TRUE - FS2002+ - 180 different to aircraft direction to follow localiser", + "length": undefined, + "mapping": undefined, + "name": "vor2ILSLocHeadingTrue", + "permission": "r", + "type": 5, + "value": 2116, + }, + "vor2LocElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 2 or NAV2 ILS LOC elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2LocElevation", + "permission": "r", + "type": 3, + "value": 2132, + }, + "vor2LocLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 2 or NAV2 ILS LOC latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2LocLatitude", + "permission": "r", + "type": 3, + "value": 2124, + }, + "vor2LocLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 2 or NAV2 ILS LOC longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2LocLongitude", + "permission": "r", + "type": 3, + "value": 2128, + }, + "vor2OrILSGlideSlopeElevation": Offset { + "category": "radios", + "convert": "+({VAL} * 3.28084).toFixed(2)", + "description": "VOR 2 or NAV2 ILS glideslope elevation - meters - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2OrILSGlideSlopeElevation", + "permission": "r", + "type": 3, + "value": 2152, + }, + "vor2OrILSGlideSlopeLatitude": Offset { + "category": "radios", + "convert": "{VAL} * 90 / 10001750", + "description": "VOR 2 latitude or NAV2 ILS glideslope latitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2OrILSGlideSlopeLatitude", + "permission": "r", + "type": 3, + "value": 2136, + }, + "vor2OrILSGlideSlopeLongitude": Offset { + "category": "radios", + "convert": "{VAL} * 360 / (65536 * 65536)", + "description": "VOR 2 or NAV 2 ILS glideslope longitude - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "vor2OrILSGlideSlopeLongitude", + "permission": "r", + "type": 3, + "value": 2144, + }, +} +`; diff --git a/tests/offsets/plane/autopilot.spec.ts b/tests/offsets/plane/autopilot.spec.ts new file mode 100644 index 0000000..7daf419 --- /dev/null +++ b/tests/offsets/plane/autopilot.spec.ts @@ -0,0 +1,71 @@ +import { autopilot as offsets } from '@offsets/plane/autopilot'; + +describe('offset - plane/autopilot', () => { + const offsetsTestCases = [ + { name: 'autoPilotAvailable', value: 0, expectedResult: false }, + { name: 'autoPilotAvailable', value: 1, expectedResult: true }, + { name: 'flyByWireELACSwitch', value: 0, expectedResult: false }, + { name: 'flyByWireELACSwitch', value: 1, expectedResult: true }, + { name: 'flyByWireELACCompFailFlag', value: 0, expectedResult: false }, + { name: 'flyByWireELACCompFailFlag', value: 1, expectedResult: true }, + { name: 'flyByWireFACSwitch', value: 0, expectedResult: false }, + { name: 'flyByWireFACSwitch', value: 1, expectedResult: true }, + { name: 'flyByWireFACCompFailFlag', value: 0, expectedResult: false }, + { name: 'flyByWireFACCompFailFlag', value: 1, expectedResult: true }, + { name: 'flyByWireSECSwitch', value: 0, expectedResult: false }, + { name: 'flyByWireSECSwitch', value: 1, expectedResult: true }, + { name: 'flyByWireSECCompFailFlag', value: 0, expectedResult: false }, + { name: 'flyByWireSECCompFailFlag', value: 1, expectedResult: true }, + { name: 'apMasterSwitch', value: 0, expectedResult: false }, + { name: 'apMasterSwitch', value: 1, expectedResult: true }, + { name: 'apWingLevel', value: 0, expectedResult: false }, + { name: 'apWingLevel', value: 1, expectedResult: true }, + { name: 'apNav1Hold', value: 0, expectedResult: false }, + { name: 'apNav1Hold', value: 1, expectedResult: true }, + { name: 'apHeadingHold', value: 0, expectedResult: false }, + { name: 'apHeadingHold', value: 1, expectedResult: true }, + { name: 'apHeadingValue', value: 32768, expectedResult: 180 }, + { name: 'apAltitudeHold', value: 0, expectedResult: false }, + { name: 'apAltitudeHold', value: 1, expectedResult: true }, + { name: 'apAltitudeValue', value: 19975000, expectedResult: 999.98 }, + { name: 'apAsHold', value: 0, expectedResult: false }, + { name: 'apAsHold', value: 1, expectedResult: true }, + { name: 'apMachHold', value: 0, expectedResult: false }, + { name: 'apMachHold', value: 1, expectedResult: true }, + { name: 'apMachValue', value: 229376, expectedResult: 3.5 }, + { name: 'apVsHold', value: 0, expectedResult: false }, + { name: 'apVsHold', value: 1, expectedResult: true }, + { name: 'apRPMN1Hold', value: 0, expectedResult: false }, + { name: 'apRPMN1Hold', value: 1, expectedResult: true }, + { name: 'apRPMN1Value', value: 9175, expectedResult: 56 }, + { name: 'apGlideSlopeHold', value: 0, expectedResult: false }, + { name: 'apGlideSlopeHold', value: 1, expectedResult: true }, + { name: 'apApproachHold', value: 0, expectedResult: false }, + { name: 'apApproachHold', value: 1, expectedResult: true }, + { name: 'apBackCourseHold', value: 0, expectedResult: false }, + { name: 'apBackCourseHold', value: 1, expectedResult: true }, + { name: 'apYawDamperHold', value: 0, expectedResult: false }, + { name: 'apYawDamperHold', value: 1, expectedResult: true }, + { name: 'apTOGAAutoThrottle', value: 0, expectedResult: false }, + { name: 'apTOGAAutoThrottle', value: 1, expectedResult: true }, + { name: 'apAutoThrottleArm', value: 0, expectedResult: false }, + { name: 'apAutoThrottleArm', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/cockpit.spec.ts b/tests/offsets/plane/cockpit.spec.ts new file mode 100644 index 0000000..b8a191e --- /dev/null +++ b/tests/offsets/plane/cockpit.spec.ts @@ -0,0 +1,41 @@ +import { cockpit as offsets } from '@offsets/plane/cockpit'; + +describe('offset - plane/cockpit', () => { + const offsetsTestCases = [ + { name: 'navLights', value: 0, expectedResult: false }, + { name: 'navLights', value: 1, expectedResult: true }, + { name: 'strobeLights', value: 0, expectedResult: false }, + { name: 'strobeLights', value: 1, expectedResult: true }, + { name: 'landingLights', value: 0, expectedResult: false }, + { name: 'landingLights', value: 1, expectedResult: true }, + { name: 'alternateStaticAirSource', value: 0, expectedResult: false }, + { name: 'alternateStaticAirSource', value: 1, expectedResult: true }, + { name: 'pitotHeat', value: 0, expectedResult: false }, + { name: 'pitotHeat', value: 1, expectedResult: true }, + { name: 'altimeterSettings', value: 32, expectedResult: 2 }, + { name: 'altimeterSettingsG1000', value: 32, expectedResult: 2 }, + { name: 'turnRate', value: 2765, expectedResult: 3 }, + { name: 'turnRate', value: 2055, expectedResult: 2 }, + { name: 'stallWarning', value: 0, expectedResult: false }, + { name: 'stallWarning', value: 1, expectedResult: true }, + { name: 'overspeedWarning', value: 0, expectedResult: false }, + { name: 'overspeedWarning', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/controls.spec.ts b/tests/offsets/plane/controls.spec.ts new file mode 100644 index 0000000..41d6b3e --- /dev/null +++ b/tests/offsets/plane/controls.spec.ts @@ -0,0 +1,27 @@ +import { controls as offsets } from '@offsets/plane/controls'; + +describe('offset - plane/controls', () => { + const offsetsTestCases = [ + { name: 'autoRudder', value: 0, expectedResult: false }, + { name: 'autoRudder', value: 1, expectedResult: true }, + { name: 'rotorClutchSwitch', value: 0, expectedResult: false }, + { name: 'rotorClutchSwitch', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/engines.spec.ts b/tests/offsets/plane/engines.spec.ts new file mode 100644 index 0000000..8744d63 --- /dev/null +++ b/tests/offsets/plane/engines.spec.ts @@ -0,0 +1,27 @@ +import { engines as offsets } from '@offsets/plane/engines'; + +describe('offset - plane/engines', () => { + const offsetsTestCases = [ + { name: 'hasMixtureControl', value: 0, expectedResult: false }, + { name: 'hasMixtureControl', value: 1, expectedResult: true }, + { name: 'hasCarbHeat', value: 0, expectedResult: false }, + { name: 'hasCarbHeat', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/helicopter.spec.ts b/tests/offsets/plane/helicopter.spec.ts new file mode 100644 index 0000000..3d639cb --- /dev/null +++ b/tests/offsets/plane/helicopter.spec.ts @@ -0,0 +1,27 @@ +import { helicopter as offsets } from '@offsets/plane/helicopter'; + +describe('offset - plane/helicopter', () => { + const offsetsTestCases = [ + { name: 'rotorBreakApplication', value: 13107, expectedResult: 80 }, + { name: 'rotorLateralTrim', value: 13107, expectedResult: 80 }, + { name: 'governorSwitch', value: 0, expectedResult: false }, + { name: 'governorSwitch', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/icing.spec.ts b/tests/offsets/plane/icing.spec.ts new file mode 100644 index 0000000..37dab60 --- /dev/null +++ b/tests/offsets/plane/icing.spec.ts @@ -0,0 +1,25 @@ +import { icing as offsets } from '@offsets/plane/icing'; + +describe('offset - plane/icing', () => { + const offsetsTestCases = [ + { name: 'structuralIce', value: 5730, expectedResult: 34.97 }, + { name: 'pitotIce', value: 5730, expectedResult: 34.97 }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/plane.spec.ts b/tests/offsets/plane/plane.spec.ts new file mode 100644 index 0000000..ffd5914 --- /dev/null +++ b/tests/offsets/plane/plane.spec.ts @@ -0,0 +1,41 @@ +import { plane as offsets } from '@offsets/plane/plane'; + +describe('offset - plane/plane', () => { + const offsetsTestCases = [ + { name: 'smokeSystemControl', value: 0, expectedResult: false }, + { name: 'smokeSystemControl', value: 1, expectedResult: true }, + { name: 'retractableGear', value: 0, expectedResult: false }, + { name: 'retractableGear', value: 1, expectedResult: true }, + { name: 'retractableLeftFloatExtension', value: 13200, expectedResult: 80 }, + { name: 'retractableRightFloatExtension', value: 13200, expectedResult: 80 }, + { name: 'hasFlaps', value: 0, expectedResult: false }, + { name: 'hasFlaps', value: 1, expectedResult: true }, + { name: 'hasStallHorn', value: 0, expectedResult: false }, + { name: 'hasStallHorn', value: 1, expectedResult: true }, + { name: 'hasSpoilers', value: 0, expectedResult: false }, + { name: 'hasSpoilers', value: 1, expectedResult: true }, + { name: 'isTailDragger', value: 0, expectedResult: false }, + { name: 'isTailDragger', value: 1, expectedResult: true }, + { name: 'hasStrobes', value: 0, expectedResult: false }, + { name: 'hasStrobes', value: 1, expectedResult: true }, + { name: 'hasToeBrakes', value: 0, expectedResult: false }, + { name: 'hasToeBrakes', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/pressurisation.spec.ts b/tests/offsets/plane/pressurisation.spec.ts new file mode 100644 index 0000000..0c232e8 --- /dev/null +++ b/tests/offsets/plane/pressurisation.spec.ts @@ -0,0 +1,25 @@ +import { pressurisation as offsets } from '@offsets/plane/pressurisation'; + +describe('offset - plane/pressurisation', () => { + const offsetsTestCases = [ + { name: 'pressDumpSwitch', value: 0, expectedResult: false }, + { name: 'pressDumpSwitch', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/plane/radios.spec.ts b/tests/offsets/plane/radios.spec.ts new file mode 100644 index 0000000..8e590a6 --- /dev/null +++ b/tests/offsets/plane/radios.spec.ts @@ -0,0 +1,63 @@ +import { radios as offsets } from '@offsets/plane/radios'; + +describe('offset - plane/radios', () => { + const offsetsTestCases = [ + { name: 'adf2Freq', value: 74528, expectedResult: 12320 }, + { name: 'adf2RelBearing', value: 38229, expectedResult: 210 }, + { name: 'ndb2IdentSoundSwitch', value: 0, expectedResult: false }, + { name: 'ndb2IdentSoundSwitch', value: 1, expectedResult: true }, + { name: 'vor1DMEDistance', value: 250, expectedResult: 25 }, + { name: 'vor1DMESpeed', value: 350, expectedResult: 35 }, + { name: 'vor1DMETimeToStation', value: 450, expectedResult: 45 }, + { name: 'vor2DMEDistance', value: 550, expectedResult: 55 }, + { name: 'vor2DMESpeed', value: 650, expectedResult: 65 }, + { name: 'vor2DMETimeToStation', value: 750, expectedResult: 75 }, + { name: 'adfFreq', value: 74528, expectedResult: 12320 }, + { name: 'comFreq', value: 13584, expectedResult: 13510 }, + { name: 'nav1Freq', value: 13584, expectedResult: 13510 }, + { name: 'nav2Freq', value: 13584, expectedResult: 13510 }, + { name: 'hasNav1', value: 0, expectedResult: false }, + { name: 'hasNav1', value: 1, expectedResult: true }, + { name: 'hasNav2', value: 0, expectedResult: false }, + { name: 'hasNav2', value: 1, expectedResult: true }, + { name: 'vor2DmeLatitude', value: 5198687, expectedResult: 46.77999650061239 }, + { name: 'vor2DmeLongitude', value: -851715875, expectedResult: -71.38999993912876 }, + { name: 'vor2DmeElevation', value: 92, expectedResult: 301.84 }, + { name: 'vor2ILSLocHeadingTrue', value: 27346, expectedResult: 150.22 }, + { name: 'vor2ILSGlideSlopeAngle', value: 27346, expectedResult: 150.22 }, + { name: 'vor2LocLatitude', value: 5198687, expectedResult: 46.77999650061239 }, + { name: 'vor2LocLongitude', value: -851715875, expectedResult: -71.38999993912876 }, + { name: 'vor2LocElevation', value: 92, expectedResult: 301.84 }, + { name: 'vor2OrILSGlideSlopeLatitude', value: 5198687, expectedResult: 46.77999650061239 }, + { name: 'vor1OrILSGlideSlopeLatitude', value: 5198687, expectedResult: 46.77999650061239 }, + { name: 'vor2OrILSGlideSlopeLongitude', value: -851715875, expectedResult: -71.38999993912876 }, + { name: 'vor1OrILSGlideSlopeLongitude', value: -851715875, expectedResult: -71.38999993912876 }, + { name: 'vor2OrILSGlideSlopeElevation', value: 92, expectedResult: 301.84 }, + { name: 'vor1OrILSGlideSlopeElevation', value: 92, expectedResult: 301.84 }, + { name: 'vor1ILSLocHeadingTrue', value: 27346, expectedResult: 150.22 }, + { name: 'vor1GlideSlopeAngle', value: 27346, expectedResult: 150.22 }, + { name: 'vor1LocLatitude', value: 5198687, expectedResult: 46.77999650061239 }, + { name: 'vor1LocLongitude', value: -851715875, expectedResult: -71.38999993912876 }, + { name: 'vor1LocElevation', value: 92, expectedResult: 301.84 }, + { name: 'vor1DmeLatitude', value: 5198687, expectedResult: 46.77999650061239 }, + { name: 'vor1DmeLongitude', value: -851715875, expectedResult: -71.38999993912876 }, + { name: 'vor1DmeElevation', value: 92, expectedResult: 301.84 }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/position-attitude/__snapshots__/position-attitude.spec.ts.snap b/tests/offsets/position-attitude/__snapshots__/position-attitude.spec.ts.snap new file mode 100644 index 0000000..86568d1 --- /dev/null +++ b/tests/offsets/position-attitude/__snapshots__/position-attitude.spec.ts.snap @@ -0,0 +1,259 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - position-attitude/position-attitude offsets list should have required properties 1`] = ` +Object { + "altitude": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 3.28084 / (65536 * 65536)).toFixed(2)", + "description": "altitude - AGL", + "length": undefined, + "mapping": undefined, + "name": "altitude", + "permission": "rw", + "type": 4, + "value": 1392, + }, + "bank": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "bank - -ve right bank, +ve left bank", + "length": undefined, + "mapping": undefined, + "name": "bank", + "permission": "rw", + "type": 3, + "value": 1404, + }, + "bpa": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} / 128)", + "description": "barper pole airspeed - knots", + "length": undefined, + "mapping": undefined, + "name": "bpa", + "permission": "r", + "type": 6, + "value": 708, + }, + "groundElevation": Offset { + "category": "position_attitude", + "convert": "Math.round({VAL} * 3.28084 / 256)", + "description": "ground elevation - feet", + "length": undefined, + "mapping": undefined, + "name": "groundElevation", + "permission": "r", + "type": 3, + "value": 32, + }, + "gs": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} * 3600 / 65536 / 1852)", + "description": "ground speed in kt", + "length": undefined, + "mapping": undefined, + "name": "gs", + "permission": "r", + "type": 3, + "value": 692, + }, + "heading": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "heading - TRUE", + "length": undefined, + "mapping": undefined, + "name": "heading", + "permission": "rw", + "type": 6, + "value": 1408, + }, + "ias": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} / 128)", + "description": "indicated air speed - knots", + "length": undefined, + "mapping": undefined, + "name": "ias", + "permission": "r", + "type": 3, + "value": 700, + }, + "latitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 90 / (10001750 * 65536 * 65536)", + "description": "latitude - -ve for south +ve for north", + "length": undefined, + "mapping": undefined, + "name": "latitude", + "permission": "rw", + "type": 4, + "value": 1376, + }, + "longitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 360 / (65536 * 65536 * 65536 * 65536)", + "description": "longitude - -ve for west +ve for east", + "length": undefined, + "mapping": undefined, + "name": "longitude", + "permission": "rw", + "type": 4, + "value": 1384, + }, + "magVar": Offset { + "category": "position_attitude", + "convert": "+({VAL}*360/65536).toFixed(2)", + "description": "-ve is west, +ve east. mag to true by adding this, true to mag by substracting this", + "length": undefined, + "mapping": undefined, + "name": "magVar", + "permission": "r", + "type": 2, + "value": 672, + }, + "pitch": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "pitch - 0 for level, -ve for pitch up, +ve for pitch down", + "length": undefined, + "mapping": undefined, + "name": "pitch", + "permission": "rw", + "type": 3, + "value": 1400, + }, + "planeOnground": Offset { + "category": "position_attitude", + "convert": "!!{VAL}", + "description": "plane on the ground", + "length": undefined, + "mapping": undefined, + "name": "planeOnground", + "permission": "r", + "type": 5, + "value": 870, + }, + "tas": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} / 128)", + "description": "true air speed - knots", + "length": undefined, + "mapping": undefined, + "name": "tas", + "permission": "r", + "type": 3, + "value": 696, + }, + "verticalSpeed": Offset { + "category": "position_attitude", + "convert": "+({VAL} * -3.28084).toFixed(2)", + "description": "vertical speed - more precise - ft/min - +ve = up", + "length": undefined, + "mapping": undefined, + "name": "verticalSpeed", + "permission": "r", + "type": 2, + "value": 2114, + }, + "viewpointAltitude": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 3.28084 / (65536 * 65536)).toFixed(2)", + "description": "viewpoint altitude - AGL", + "length": undefined, + "mapping": undefined, + "name": "viewpointAltitude", + "permission": "r", + "type": 4, + "value": 1472, + }, + "viewpointBank": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "viewpoint bank - - right bank, + left bank", + "length": undefined, + "mapping": undefined, + "name": "viewpointBank", + "permission": "r", + "type": 3, + "value": 1484, + }, + "viewpointHeading": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "viewpoint heading - TRUE", + "length": undefined, + "mapping": undefined, + "name": "viewpointHeading", + "permission": "r", + "type": 6, + "value": 1488, + }, + "viewpointLatitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 90 / (10001750 * 65536 * 65536)", + "description": "viewpoint latitude - -ve for south +ve for north", + "length": undefined, + "mapping": undefined, + "name": "viewpointLatitude", + "permission": "r", + "type": 4, + "value": 1456, + }, + "viewpointLongitude": Offset { + "category": "position_attitude", + "convert": "{VAL} * 360 / (65536 * 65536 * 65536 * 65536)", + "description": "viewpoint longitude - -ve for west +ve for east", + "length": undefined, + "mapping": undefined, + "name": "viewpointLongitude", + "permission": "r", + "type": 4, + "value": 1464, + }, + "viewpointPitch": Offset { + "category": "position_attitude", + "convert": "+({VAL} * 360 / (65536 * 65536)).toFixed(2)", + "description": "pitch - 0 for level, - for pitch up, for pitch down", + "length": undefined, + "mapping": undefined, + "name": "viewpointPitch", + "permission": "r", + "type": 3, + "value": 1480, + }, + "vs": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL} * 60 * 3.28084 / 256)", + "description": "vertical speed - ft/min", + "length": undefined, + "mapping": undefined, + "name": "vs", + "permission": "r", + "type": 3, + "value": 712, + }, + "vsAtTouchdown": Offset { + "category": "position_attitude", + "convert": "Math.floor({VAL}*60*3.28084/256)", + "description": "vertical speed - m/s", + "length": undefined, + "mapping": undefined, + "name": "vsAtTouchdown", + "permission": "r", + "type": 3, + "value": 780, + }, + "whiskeyCompass": Offset { + "category": "position_attitude", + "convert": undefined, + "description": "whiskey compass - degrees", + "length": undefined, + "mapping": undefined, + "name": "whiskeyCompass", + "permission": "r", + "type": 8, + "value": 716, + }, +} +`; diff --git a/tests/offsets/position-attitude/position-attitude.spec.ts b/tests/offsets/position-attitude/position-attitude.spec.ts new file mode 100644 index 0000000..d2632ab --- /dev/null +++ b/tests/offsets/position-attitude/position-attitude.spec.ts @@ -0,0 +1,46 @@ +import { positionAttitude as offsets } from '@offsets/position-attitude/position-attitude'; + +describe('offset - position-attitude/position-attitude', () => { + const offsetsTestCases = [ + { name: 'groundElevation', value: 18726, expectedResult: 240 }, + { name: 'magVar', value: 38229, expectedResult: 210.00 }, + { name: 'gs', value: 674292, expectedResult: 19 }, + { name: 'tas', value: 257, expectedResult: 2 }, + { name: 'ias', value: 520, expectedResult: 4 }, + { name: 'bpa', value: 390, expectedResult: 3 }, + { name: 'vs', value: 14, expectedResult: 10 }, + { name: 'vsAtTouchdown', value: 13, expectedResult: 9 }, + { name: 'planeOnground', value: 0, expectedResult: false }, + { name: 'planeOnground', value: 1, expectedResult: true }, + { name: 'latitude', value: 2.2329449e+16, expectedResult: 46.78263288720104 }, + { name: 'longitude', value: -3.6582626e+18, expectedResult: -71.39333265196446 }, + { name: 'altitude', value: 392731796979, expectedResult: 300 }, + { name: 'pitch', value: -238609294, expectedResult: -20 }, + { name: 'bank', value: -238609294, expectedResult: -20 }, + { name: 'heading', value: -238609294, expectedResult: -20 }, + { name: 'viewpointLatitude', value: 2.2329449e+16, expectedResult: 46.78263288720104 }, + { name: 'viewpointLongitude', value: -3.6582626e+18, expectedResult: -71.39333265196446 }, + { name: 'viewpointAltitude', value: 392731796979, expectedResult: 300 }, + { name: 'viewpointPitch', value: -238609294, expectedResult: -20 }, + { name: 'viewpointBank', value: -238609294, expectedResult: -20 }, + { name: 'viewpointHeading', value: 2147483648, expectedResult: 180 }, + { name: 'verticalSpeed', value: -46, expectedResult: 150.92 }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/offsets/simulation/__snapshots__/simulation.spec.ts.snap b/tests/offsets/simulation/__snapshots__/simulation.spec.ts.snap new file mode 100644 index 0000000..acd2cfb --- /dev/null +++ b/tests/offsets/simulation/__snapshots__/simulation.spec.ts.snap @@ -0,0 +1,468 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`offset - plane/simulation offsets list should have required properties 1`] = ` +Object { + "adfFreqInc": Offset { + "category": "simulation", + "convert": "({VAL}) === 0 ? 1.0 : 0.1", + "description": "ADF freq increment - KHz", + "length": undefined, + "mapping": undefined, + "name": "adfFreqInc", + "permission": "rw", + "type": 2, + "value": 856, + }, + "availableMemory": Offset { + "category": "simulation", + "convert": undefined, + "description": "available FS memory - kb", + "length": undefined, + "mapping": undefined, + "name": "availableMemory", + "permission": "r", + "type": 3, + "value": 588, + }, + "cloudComplex": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "cloud simple/complex - 0 = simple, 1 = complex", + "length": undefined, + "mapping": undefined, + "name": "cloudComplex", + "permission": "rw", + "type": 0, + "value": 597, + }, + "cloudCoverDensity": Offset { + "category": "simulation", + "convert": undefined, + "description": "cloud cover density - 5-8", + "length": undefined, + "mapping": undefined, + "name": "cloudCoverDensity", + "permission": "rw", + "type": 0, + "value": 596, + }, + "comFreqInc": Offset { + "category": "simulation", + "convert": "({VAL}) === 0 ? 50 : 25", + "description": "COM freq increment - KHz", + "length": undefined, + "mapping": undefined, + "name": "comFreqInc", + "permission": "rw", + "type": 2, + "value": 856, + }, + "controlTimer1": Offset { + "category": "simulation", + "convert": undefined, + "description": "control timer 1 - FS2002+ - Seconds", + "length": undefined, + "mapping": undefined, + "name": "controlTimer1", + "permission": "r", + "type": 8, + "value": 784, + }, + "controlTimer2": Offset { + "category": "simulation", + "convert": undefined, + "description": "control timer 2 - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "controlTimer2", + "permission": "r", + "type": 3, + "value": 872, + }, + "crashDetection": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=Ignore Crash, 1=Detect Crash and restart, 2=Detect Crash and show Graph (last is not applicable to FS2002/4)", + "length": undefined, + "mapping": undefined, + "name": "crashDetection", + "permission": "rw", + "type": 5, + "value": 2096, + }, + "crashDetectionFSX": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=Ignore Crash, 1=Detect Crash", + "length": undefined, + "mapping": undefined, + "name": "crashDetectionFSX", + "permission": "r", + "type": 0, + "value": 2098, + }, + "crashDetectionFSXAi": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=Ignore Crash, 1=Detect Crash", + "length": undefined, + "mapping": undefined, + "name": "crashDetectionFSXAi", + "permission": "r", + "type": 0, + "value": 2099, + }, + "crashed": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "crashed", + "length": undefined, + "mapping": undefined, + "name": "crashed", + "permission": "r", + "type": 2, + "value": 2112, + }, + "elapsedRealTime": Offset { + "category": "simulation", + "convert": undefined, + "description": "elasped real time", + "length": undefined, + "mapping": undefined, + "name": "elapsedRealTime", + "permission": "r", + "type": 8, + "value": 1416, + }, + "elapsedTime": Offset { + "category": "simulation", + "convert": undefined, + "description": "simulated flight time - seconds (paused while simulation paused)", + "length": undefined, + "mapping": undefined, + "name": "elapsedTime", + "permission": "r", + "type": 8, + "value": 1192, + }, + "flightAnalysisMode": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=off 1=landing 2=course tracking 3=manoeuvres", + "length": undefined, + "mapping": undefined, + "name": "flightAnalysisMode", + "permission": "rw", + "type": 6, + "value": 2068, + }, + "flightModeDisplay": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=off, 1=coods/hdg/speed, 2=fps, 3=all", + "length": undefined, + "mapping": undefined, + "name": "flightModeDisplay", + "permission": "rw", + "type": 5, + "value": 1532, + }, + "flightPlan": Offset { + "category": "simulation", + "convert": undefined, + "description": "current flight plan - FSX only", + "length": 256, + "mapping": undefined, + "name": "flightPlan", + "permission": "r", + "type": 11, + "value": 304, + }, + "framerate": Offset { + "category": "simulation", + "convert": "Math.floor(32768/{VAL})", + "description": "framerate", + "length": undefined, + "mapping": undefined, + "name": "framerate", + "permission": "r", + "type": 5, + "value": 628, + }, + "fuelBoxFlag": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "plane in fuel box flag", + "length": undefined, + "mapping": undefined, + "name": "fuelBoxFlag", + "permission": "r", + "type": 5, + "value": 812, + }, + "lastSavedFlightName": Offset { + "category": "simulation", + "convert": undefined, + "description": "name of last saved flight", + "length": 128, + "mapping": undefined, + "name": "lastSavedFlightName", + "permission": "r", + "type": 11, + "value": 1024, + }, + "logbookName": Offset { + "category": "simulation", + "convert": undefined, + "description": "logbook name - FS2002+", + "length": 256, + "mapping": undefined, + "name": "logbookName", + "permission": "r", + "type": 11, + "value": 300, + }, + "memoryAssignedToFSUIPC": Offset { + "category": "simulation", + "convert": undefined, + "description": undefined, + "length": undefined, + "mapping": undefined, + "name": "memoryAssignedToFSUIPC", + "permission": "r", + "type": 2, + "value": 600, + }, + "pauseControl": Offset { + "category": "simulation", + "convert": "{VAL} ? 1 : 0", + "description": "pause control (write only)", + "length": undefined, + "mapping": undefined, + "name": "pauseControl", + "permission": "w", + "type": 5, + "value": 610, + }, + "pauseFlag": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "simulation paused", + "length": undefined, + "mapping": undefined, + "name": "pauseFlag", + "permission": "r", + "type": 2, + "value": 612, + }, + "reliability": Offset { + "category": "simulation", + "convert": undefined, + "description": "reliability - percent", + "length": undefined, + "mapping": undefined, + "name": "reliability", + "permission": "rw", + "type": 5, + "value": 882, + }, + "replayInAction": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "replay in action", + "length": undefined, + "mapping": undefined, + "name": "replayInAction", + "permission": "rw", + "type": 6, + "value": 1576, + }, + "replayTimerCountdown": Offset { + "category": "simulation", + "convert": undefined, + "description": "instant replay time left in seconds - controls the playback", + "length": undefined, + "mapping": undefined, + "name": "replayTimerCountdown", + "permission": "rw", + "type": 6, + "value": 1580, + }, + "slewBackwardForwardRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "Slew fwd if-ve, bwd if +ve, 1=very slow ... 127=very fast, -128 fastest forward", + "length": undefined, + "mapping": undefined, + "name": "slewBackwardForwardRate", + "permission": "rw", + "type": 1, + "value": 1515, + }, + "slewLeftRightRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "Slew left if -ve, right if +ve, 1=very slow ... 127=very fast, -128 fastest leftward", + "length": undefined, + "mapping": undefined, + "name": "slewLeftRightRate", + "permission": "rw", + "type": 1, + "value": 1517, + }, + "slewMode": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "slew mode activated", + "length": undefined, + "mapping": undefined, + "name": "slewMode", + "permission": "rw", + "type": 5, + "value": 1500, + }, + "slewModeDisplay": Offset { + "category": "simulation", + "convert": undefined, + "description": "0=off, 1=coods/hdg/speed, 2=fps, 3=all", + "length": undefined, + "mapping": undefined, + "name": "slewModeDisplay", + "permission": undefined, + "type": 5, + "value": 1524, + }, + "slewPitchRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "16384=no pitch slew -16384 pitch up, 16384 pitch down, range 0-32767", + "length": undefined, + "mapping": undefined, + "name": "slewPitchRate", + "permission": "rw", + "type": 2, + "value": 1518, + }, + "slewRollRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "192 gives a 360 roll in about 1 minute - -ve right, +ve left", + "length": undefined, + "mapping": undefined, + "name": "slewRollRate", + "permission": "rw", + "type": 2, + "value": 1508, + }, + "slewVerticalRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "16384=no alt slew rate - 16383 to 0 increasing slew UP rates, 16385 to 32767 increasing slew DOWN rates", + "length": undefined, + "mapping": undefined, + "name": "slewVerticalRate", + "permission": "rw", + "type": 2, + "value": 1512, + }, + "slewYawRate": Offset { + "category": "simulation", + "convert": undefined, + "description": "Slew mode turns - +ve values are left, -ve are right - 24 takes about 1 minute to complete a 360", + "length": undefined, + "mapping": undefined, + "name": "slewYawRate", + "permission": "rw", + "type": 2, + "value": 1510, + }, + "smokeSystemAvailable": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "smoke system available - <= FS2000", + "length": undefined, + "mapping": undefined, + "name": "smokeSystemAvailable", + "permission": "r", + "type": 5, + "value": 1492, + }, + "startupFlight": Offset { + "category": "simulation", + "convert": undefined, + "description": "startup path", + "length": 256, + "mapping": undefined, + "name": "startupFlight", + "permission": "r", + "type": 11, + "value": 36, + }, + "thermalVisualisation": Offset { + "category": "simulation", + "convert": undefined, + "description": "0 = none, 1 = natural, 2 = schematic", + "length": undefined, + "mapping": undefined, + "name": "thermalVisualisation", + "permission": "r", + "type": 0, + "value": 598, + }, + "trafficDensityAirline": Offset { + "category": "simulation", + "convert": undefined, + "description": "Airline traffic density percent", + "length": undefined, + "mapping": undefined, + "name": "trafficDensityAirline", + "permission": "rw", + "type": 0, + "value": 592, + }, + "trafficDensityGA": Offset { + "category": "simulation", + "convert": undefined, + "description": "General Aviation traffic density percent", + "length": undefined, + "mapping": undefined, + "name": "trafficDensityGA", + "permission": "rw", + "type": 0, + "value": 593, + }, + "trafficDensityShips": Offset { + "category": "simulation", + "convert": undefined, + "description": "Ships and Ferries traffic density percent", + "length": undefined, + "mapping": undefined, + "name": "trafficDensityShips", + "permission": "rw", + "type": 0, + "value": 594, + }, + "videoRecording": Offset { + "category": "simulation", + "convert": "!!{VAL}", + "description": "video recording flag - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "videoRecording", + "permission": "r", + "type": 0, + "value": 1888, + }, + "zoomfactor": Offset { + "category": "simulation", + "convert": "Math.floor({VAL}/64)", + "description": "zoom factor - FS2002+", + "length": undefined, + "mapping": undefined, + "name": "zoomfactor", + "permission": "r", + "type": 5, + "value": 690, + }, +} +`; diff --git a/tests/offsets/simulation/simulation.spec.ts b/tests/offsets/simulation/simulation.spec.ts new file mode 100644 index 0000000..6827779 --- /dev/null +++ b/tests/offsets/simulation/simulation.spec.ts @@ -0,0 +1,45 @@ +import { simulation as offsets } from '@offsets/simulation/simulation'; + +describe('offset - plane/simulation', () => { + const offsetsTestCases = [ + { name: 'cloudComplex', value: 0, expectedResult: false }, + { name: 'cloudComplex', value: 1, expectedResult: true }, + { name: 'pauseFlag', value: 0, expectedResult: false }, + { name: 'pauseFlag', value: 1, expectedResult: true }, + { name: 'framerate', value: 354, expectedResult: 92 }, + { name: 'zoomfactor', value: 128, expectedResult: 2 }, + { name: 'fuelBoxFlag', value: 0, expectedResult: false }, + { name: 'fuelBoxFlag', value: 1, expectedResult: true }, + { name: 'comFreqInc', value: 0, expectedResult: 50 }, + { name: 'comFreqInc', value: 1, expectedResult: 25 }, + { name: 'adfFreqInc', value: 0, expectedResult: 1.0 }, + { name: 'adfFreqInc', value: 1, expectedResult: 0.1 }, + { name: 'smokeSystemAvailable', value: 0, expectedResult: false }, + { name: 'smokeSystemAvailable', value: 1, expectedResult: true }, + { name: 'slewMode', value: 0, expectedResult: false }, + { name: 'slewMode', value: 1, expectedResult: true }, + { name: 'replayInAction', value: 0, expectedResult: false }, + { name: 'replayInAction', value: 1, expectedResult: true }, + { name: 'videoRecording', value: 0, expectedResult: false }, + { name: 'videoRecording', value: 1, expectedResult: true }, + { name: 'crashed', value: 0, expectedResult: false }, + { name: 'crashed', value: 1, expectedResult: true }, + ]; + + describe('offsets list', () => { + it('should have required properties', () => { + expect(offsets).toMatchSnapshot(); + }); + }); + + offsetsTestCases.forEach(testedOffset => { + describe(testedOffset.name, () => { + it('should convert data properly', () => { + const convertExpression = offsets[testedOffset.name].convert.replace('{VAL}', testedOffset.value.toString()); + + // tslint:disable-next-line:no-eval + expect(eval(convertExpression)).toEqual(testedOffset.expectedResult); + }); + }); + }); +}); diff --git a/tests/shared/offset.spec.ts b/tests/shared/offset.spec.ts new file mode 100644 index 0000000..f26ba5e --- /dev/null +++ b/tests/shared/offset.spec.ts @@ -0,0 +1,189 @@ +import { Type } from 'fsuipc'; + +import { Offset } from '@shared/offset'; +import { OffsetCategory } from '@shared/offset-category'; + +import * as MAPPINGS from '../../src/lib/convert/mappings'; +jest.mock('../../src/lib/convert/mappings', () => ({ + MAPPINGS: { + someMapping: jest.fn().mockReturnValue('mappingReturn') + } +})); + +const OFFSET_DATA_WITH_VALID_MAPPING = { + name: 'someOffsetWithMapping', + mapping: true, + convert: 'someMapping', + description: 'some magical description', + value: 0x123, + category: OffsetCategory.COCKPIT, + type: Type.ByteArray, + length: 4, + unexistingKey: '[H+]' +}; + +const OFFSET_DATA_WITH_NON_EXISTING_MAPPING = { + name: 'someOffsetWithMapping', + mapping: true, + convert: 'someNoneExistingMapping', + description: 'some magical description', + value: 0x123, + category: OffsetCategory.COCKPIT, + type: Type.ByteArray, + length: 4, +}; + +const OFFSET_DATA_WITH_ONLY_MAPPING = { + name: 'someOffsetWithMapping', + mapping: true, + description: 'some magical description', + value: 0x123, + category: OffsetCategory.COCKPIT, + type: Type.ByteArray, + length: 4, +}; + +const OFFSET_DATA_WITH_ONLY_CONVERT = { + name: 'someOffsetWithMapping', + convert: '{VAL}', + description: 'some magical description', + value: 0x123, + category: OffsetCategory.COCKPIT, + type: Type.ByteArray, + length: 4, +}; + +const OFFSET_DATA_WITH_NON_VALID_CONVERT = { + name: 'someOffsetWithMapping', + convert: (() => { const doSomething = true; }) as any, + description: 'some magical description', + value: 0x123, + category: OffsetCategory.COCKPIT, + type: Type.ByteArray, + length: 4, +}; + +let offset; + +describe('Offset class', () => { + beforeEach(() => { + offset = undefined; + }); + + describe('initialization', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_VALID_MAPPING); + }); + + it('should map data to object attributes', () => { + expect(offset.name).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.name); + expect(offset.mapping).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.mapping); + expect(offset.convert).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.convert); + expect(offset.description).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.description); + expect(offset.value).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.value); + expect(offset.category).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.category); + expect(offset.type).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.type); + expect(offset.length).toEqual(OFFSET_DATA_WITH_VALID_MAPPING.length); + expect(offset.unexistingKey).toBeUndefined(); + }); + }); + + describe('hasMapping', () => { + describe('when offset has mapping and convert', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_VALID_MAPPING); + }); + + it('should return true', () => { + expect(offset.hasMapping).toBe(true); + }); + }); + + describe('when offset has only mapping', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_ONLY_MAPPING); + }); + + it('should return false', () => { + expect(offset.hasMapping).toBe(false); + }); + }); + + describe('when offset has only convert', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_ONLY_CONVERT); + }); + + it('should return false', () => { + expect(offset.hasMapping).toBe(false); + }); + }); + }); + + describe('isMappingInvalid', () => { + describe('when offset has existing mapping', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_VALID_MAPPING); + }); + + it('should return false', () => { + expect(offset.isMappingInvalid).toBe(false); + }); + }); + + describe('when offset has non existing mapping', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_NON_EXISTING_MAPPING); + }); + + it('should return true', () => { + expect(offset.isMappingInvalid).toBe(true); + }); + }); + }); + + describe('isInvalidConvertExpression', () => { + describe('when convert is a string', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_VALID_MAPPING); + }); + + it('should return false', () => { + expect(offset.isInvalidConvertExpression).toBe(false); + }); + }); + + describe('when convert expression is not a string', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_NON_VALID_CONVERT); + }); + + it('should return true', () => { + expect(offset.isInvalidConvertExpression).toBe(true); + }); + }); + }); + + describe('mappingFunction', () => { + describe('when mapping exists', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_VALID_MAPPING); + }); + + it('should return the matching mapping Function', () => { + expect(typeof offset.mappingFunction).toEqual('function'); + expect(offset.mappingFunction()).toEqual('mappingReturn'); + }); + }); + + describe('when mapping does not exist', () => { + beforeEach(() => { + offset = new Offset(OFFSET_DATA_WITH_NON_EXISTING_MAPPING); + }); + + it('should return undefined', () => { + expect(offset.mappingFunction).toBeUndefined(); + }); + }); + }); +}); diff --git a/tests/tsconfig.spec.json b/tests/tsconfig.spec.json new file mode 100644 index 0000000..299ace7 --- /dev/null +++ b/tests/tsconfig.spec.json @@ -0,0 +1,30 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ], + "exclude": [ + "node_modules" + ], + "compilerOptions": { + "outDir": "../dist/spec", + "module": "commonjs", + "baseUrl": "./", + "allowJs": true, + "types": [ + "jest", + "node" + ], + "paths": { + "@shared": ["../src/shared/index"], + "@shared/*": ["../src/shared/*"], + "@offsets": ["../src/lib/offsets/index"], + "@offsets/*": ["../src/lib/offsets/*"], + "@mappings": ["../src/lib/convert/mappings/index"], + "@mappings/*": ["../src/lib/convert/mappings/*"], + "@convert": ["../src/lib/convert/index"], + "@convert/*": ["../src/lib/convert/*"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c62b876 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "module": "commonjs", + "outDir": "./dist", + "baseUrl": "./", + "allowJs": true, + "sourceMap": true, + "strict": true, + "strictNullChecks": false, + "moduleResolution": "node", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "noImplicitAny": false, + "target": "es2017", + "typeRoots": [ + "node_modules/@types" + ], + "types": [ + "jest", + "node" + ], + "lib": [ + "es2019" + ], + "paths": { + "@shared": ["src/shared/index"], + "@shared/*": ["src/shared/*"], + "@offsets": ["src/lib/offsets/index"], + "@offsets/*": ["src/lib/offsets/*"], + "@mappings": ["src/lib/convert/mappings/index"], + "@mappings/*": ["src/lib/convert/mappings/*"], + "@convert": ["src/lib/convert/index"], + "@convert/*": ["src/lib/convert/*"] + } + } +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..a30c9db --- /dev/null +++ b/tslint.json @@ -0,0 +1,40 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "arrow-parens": false, + "curly": [ + true, + "ignore-same-line" + ], + "interface-name": false, + "linebreak-style": false, + "max-line-length": false, + "no-consecutive-blank-lines": false, + "no-require-imports": false, + "no-string-literal": false, + "object-literal-sort-keys": false, + "one-variable-per-declaration": false, + "only-arrow-functions": false, + "ordered-imports": false, + "prefer-const": false, + "quotemark": [ + true, + "single" + ], + "semicolon": true, + "space-before-function-paren": false, + "trailing-comma": false, + "variable-name": [ + true, + "check-format", + "allow-leading-underscore", + "allow-trailing-underscore", + "allow-pascal-case" + ] + }, + "rulesDirectory": [] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..f064539 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4880 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.0.tgz#8c98d4ac29d6f80f28127b1bc50970a72086c5ac" + integrity sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA== + dependencies: + "@babel/highlight" "^7.8.0" + +"@babel/core@^7.1.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.0.tgz#fd273d4faf69cc20ee3ccfd32d42df916bb4a15c" + integrity sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/generator" "^7.8.0" + "@babel/helpers" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.0.tgz#40a1244677be58ffdc5cd01e22634cd1d5b29edf" + integrity sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg== + dependencies: + "@babel/types" "^7.8.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz#dde5cf0d6b15c21817a67dd66fe7350348e023bf" + integrity sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.0" + "@babel/template" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/helper-get-function-arity@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz#90977f61d76d2225d1ae0208def7df22ea92792e" + integrity sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w== + dependencies: + "@babel/types" "^7.8.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz#59ec882d43c21c544ccb51decaecb306b34a8231" + integrity sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA== + +"@babel/helper-split-export-declaration@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz#ed10cb03b07454c0d40735fad4e9c9711e739588" + integrity sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA== + dependencies: + "@babel/types" "^7.8.0" + +"@babel/helpers@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.0.tgz#3d3e6e08febf5edbbf63b1cf64395525aa3ece37" + integrity sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA== + dependencies: + "@babel/template" "^7.8.0" + "@babel/traverse" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/highlight@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.0.tgz#4cc003dc10359919e2e3a1d9459150942913dd1a" + integrity sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.0.tgz#54682775f1fb25dd29a93a02315aab29a6a292bb" + integrity sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA== + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz#9b37d580d459682364d8602494c69145b394fd4c" + integrity sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/template@^7.4.0", "@babel/template@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.0.tgz#a32f57ad3be89c0fa69ae87b53b4826844dc6330" + integrity sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/types" "^7.8.0" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.0.tgz#d85266fdcff553c10e57b672604b36383a127c1f" + integrity sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw== + dependencies: + "@babel/code-frame" "^7.8.0" + "@babel/generator" "^7.8.0" + "@babel/helper-function-name" "^7.8.0" + "@babel/helper-split-export-declaration" "^7.8.0" + "@babel/parser" "^7.8.0" + "@babel/types" "^7.8.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.8.0": + version "7.8.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.0.tgz#1a2039a028057a2c888b668d94c98e61ea906e7f" + integrity sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@exalif/tscpaths@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@exalif/tscpaths/-/tscpaths-0.1.3.tgz#146994580ca7bae13a6308260604ece001672c51" + integrity sha512-tI7vkYB7jsIXk0a5uV99W4VD2bY+0pKzMwIBsi9H5rm+35cgeypOzhv+Jpk4ueVqECjwhCfxU6XbA8nzf4Z63A== + dependencies: + commander "^2.20.0" + globby "^9.2.0" + +"@jest/console@^24.7.1", "@jest/console@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" + integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ== + dependencies: + "@jest/source-map" "^24.9.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4" + integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.9.0" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-resolve-dependencies "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + jest-watcher "^24.9.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + realpath-native "^1.1.0" + rimraf "^2.5.4" + slash "^2.0.0" + strip-ansi "^5.0.0" + +"@jest/environment@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18" + integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ== + dependencies: + "@jest/fake-timers" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + +"@jest/fake-timers@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93" + integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A== + dependencies: + "@jest/types" "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + +"@jest/reporters@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43" + integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.2.6" + jest-haste-map "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + node-notifier "^5.4.2" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714" + integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca" + integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA== + dependencies: + "@jest/console" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31" + integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A== + dependencies: + "@jest/test-result" "^24.9.0" + jest-haste-map "^24.9.0" + jest-runner "^24.9.0" + jest-runtime "^24.9.0" + +"@jest/transform@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56" + integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.9.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.9.0" + jest-regex-util "^24.9.0" + jest-util "^24.9.0" + micromatch "^3.1.10" + pirates "^4.0.1" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + +"@types/babel__core@^7.1.0": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30" + integrity sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" + integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.8" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" + integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/jest@24.0.25": + version "24.0.25" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.25.tgz#2aba377824ce040114aa906ad2cac2c85351360f" + integrity sha512-hnP1WpjN4KbGEK4dLayul6lgtys6FPz0UfxMeMQCv0M+sTnzN3ConfiO72jHgLxl119guHgI8gLqDOrRLsyp2g== + dependencies: + jest-diff "^24.3.0" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@*", "@types/node@13.1.6": + version "13.1.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.6.tgz#076028d0b0400be8105b89a0a55550c86684ffec" + integrity sha512-Jg1F+bmxcpENHP23sVKkNuU3uaxPnsBMW0cLjleiikFKomJQbsn0Cqk2yDvQArqzZN6ABfBkZ0To7pQ8sLdWDg== + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs-parser@*": + version "13.1.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" + integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== + +"@types/yargs@^13.0.0": + version "13.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.5.tgz#18121bfd39dc12f280cee58f92c5b21d32041908" + integrity sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q== + dependencies: + "@types/yargs-parser" "*" + +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abab@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" + integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-globals@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7" + integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" + integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" + integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= + +ajv@^6.5.5: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.2.tgz#e70c90579e02c63d80e3ad4e31d8bfdb8bd50064" + integrity sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c" + integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A== + +babel-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54" + integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw== + dependencies: + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.9.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-plugin-istanbul@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854" + integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756" + integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-preset-jest@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc" + integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.9.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bindings@^1.3.0, bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@1.x, buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^3.2.2: + version "3.3.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" + integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.3.0" + optionalDependencies: + fsevents "~2.1.2" + +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.12.1, commander@^2.20.0, commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +compare-func@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" + integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + dependencies: + array-ify "^1.0.0" + dot-prop "^3.0.0" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +configstore@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" + integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +conventional-changelog-angular@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" + integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== + dependencies: + compare-func "^1.3.1" + q "^1.5.1" + +conventional-changelog-atom@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.3.tgz#3bd14280aa09fe3ec49a0e8fe97b5002db02aad4" + integrity sha512-szZe2ut97qNO6vCCMkm1I/tWu6ol4Rr8a9Lx0y/VlpDnpY0PNp+oGpFgU55lplhx+I3Lro9Iv4/gRj0knfgjzg== + dependencies: + q "^1.5.1" + +conventional-changelog-cli@2.0.31: + version "2.0.31" + resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-2.0.31.tgz#3345581170fbb540416946e460fef519a64aef43" + integrity sha512-nMINylKAamBLM3OmD7/44d9TPZ3V58IDTXoGC/QtXxve+1Sj37BQTzIEW3TNaviZ2ZV/b5Dqg0eSk4DNP5fBdA== + dependencies: + add-stream "^1.0.0" + conventional-changelog "^3.1.18" + lodash "^4.17.15" + meow "^5.0.0" + tempfile "^3.0.0" + +conventional-changelog-codemirror@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.3.tgz#ebc088154684f8f5171446b8d546ba6b460d46f2" + integrity sha512-t2afackdgFV2yBdHhWPqrKbpaQeVnz2hSJKdWqjasPo5EpIB6TBL0er3cOP1mnGQmuzk9JSvimNSuqjWGDtU5Q== + dependencies: + q "^1.5.1" + +conventional-changelog-conventionalcommits@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.2.3.tgz#22855b32d57d0328951c1c2dc01b172a5f24ea37" + integrity sha512-atGa+R4vvEhb8N/8v3IoW59gCBJeeFiX6uIbPu876ENAmkMwsenyn0R21kdDHJFLQdy6zW4J6b4xN8KI3b9oww== + dependencies: + compare-func "^1.3.1" + lodash "^4.17.15" + q "^1.5.1" + +conventional-changelog-core@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.1.4.tgz#39be27fca6ef20a0f998d7a3a1e97cfa8a055cb6" + integrity sha512-LO58ZbEpp1Ul+y/vOI8rJRsWkovsYkCFbOCVgi6UnVfU8WC0F8K8VQQwaBZWWUpb6JvEiN4GBR5baRP2txZ+Vg== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^4.0.11" + conventional-commits-parser "^3.0.8" + dateformat "^3.0.0" + get-pkg-repo "^1.0.0" + git-raw-commits "2.0.0" + git-remote-origin-url "^2.0.0" + git-semver-tags "^3.0.1" + lodash "^4.17.15" + normalize-package-data "^2.3.5" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + through2 "^3.0.0" + +conventional-changelog-ember@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.4.tgz#c29b78e4af7825cbecb6c3fd6086ca5c09471ac1" + integrity sha512-q1u73sO9uCnxN4TSw8xu6MRU8Y1h9kpwtcdJuNRwu/LSKI1IE/iuNSH5eQ6aLlQ3HTyrIpTfUuVybW4W0F17rA== + dependencies: + q "^1.5.1" + +conventional-changelog-eslint@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.4.tgz#8f4736a23e0cd97e890e76fccc287db2f205f2ff" + integrity sha512-CPwTUENzhLGl3auunrJxiIEWncAGaby7gOFCdj2gslIuOFJ0KPJVOUhRz4Da/I53sdo/7UncUJkiLg94jEsjxg== + dependencies: + q "^1.5.1" + +conventional-changelog-express@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz#fea2231d99a5381b4e6badb0c1c40a41fcacb755" + integrity sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw== + dependencies: + q "^1.5.1" + +conventional-changelog-jquery@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.6.tgz#460236ad8fb1d29ff932a14fe4e3a45379b63c5e" + integrity sha512-gHAABCXUNA/HjnZEm+vxAfFPJkgtrZvCDIlCKfdPVXtCIo/Q0lN5VKpx8aR5p8KdVRQFF3OuTlvv5kv6iPuRqA== + dependencies: + q "^1.5.1" + +conventional-changelog-jshint@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.3.tgz#ef6e2caf2ee6ffdfda78fcdf7ce87cf6c512d728" + integrity sha512-Pc2PnMPcez634ckzr4EOWviwRSpZcURaK7bjyD9oK6N5fsC/a+3G7LW5m/JpcHPhA9ZxsfIbm7uqZ3ZDGsQ/sw== + dependencies: + compare-func "^1.3.1" + q "^1.5.1" + +conventional-changelog-preset-loader@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz#580fa8ab02cef22c24294d25e52d7ccd247a9a6a" + integrity sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ== + +conventional-changelog-writer@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" + integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== + dependencies: + compare-func "^1.3.1" + conventional-commits-filter "^2.0.2" + dateformat "^3.0.0" + handlebars "^4.4.0" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^5.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^3.0.0" + +conventional-changelog@^3.1.18: + version "3.1.18" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.18.tgz#7da0a5ab34a604b920b8bf71c6cf5d952f0e805e" + integrity sha512-aN6a3rjgV8qwAJj3sC/Lme2kvswWO7fFSGQc32gREcwIOsaiqBaO6f2p0NomFaPDnTqZ+mMZFLL3hlzvEnZ0mQ== + dependencies: + conventional-changelog-angular "^5.0.6" + conventional-changelog-atom "^2.0.3" + conventional-changelog-codemirror "^2.0.3" + conventional-changelog-conventionalcommits "^4.2.3" + conventional-changelog-core "^4.1.4" + conventional-changelog-ember "^2.0.4" + conventional-changelog-eslint "^3.0.4" + conventional-changelog-express "^2.0.1" + conventional-changelog-jquery "^3.0.6" + conventional-changelog-jshint "^2.0.3" + conventional-changelog-preset-loader "^2.3.0" + +conventional-commits-filter@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1" + integrity sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" + integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^5.0.0" + split2 "^2.0.0" + through2 "^3.0.0" + trim-off-newlines "^1.0.0" + +convert-source-map@^1.4.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + +cross-env@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-6.0.3.tgz#4256b71e49b3a40637a0ce70768a6ef5c72ae941" + integrity sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag== + dependencies: + cross-spawn "^7.0.0" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" + integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1" + integrity sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA== + dependencies: + cssom "0.3.x" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dargs@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" + integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= + dependencies: + number-is-nan "^1.0.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" + integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== + +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== + dependencies: + is-obj "^1.0.0" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.17.0-next.1: + version "1.17.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1" + integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.1.5" + is-regex "^1.0.5" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimleft "^2.1.1" + string.prototype.trimright "^2.1.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.9.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.1.tgz#08770602a74ac34c7a90ca9229e7d51e379abc76" + integrity sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expect@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca" + integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q== + dependencies: + "@jest/types" "^24.9.0" + ansi-styles "^3.2.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-regex-util "^24.9.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.11" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" + integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" + integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + +fsuipc@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fsuipc/-/fsuipc-0.3.0.tgz#1a68303ee905916901121ff9d1f5c76353cfb621" + integrity sha512-6cX1UhBOOuWJLGaPqk8Nx/AI4hNL4XKVJFrE/cF3ktOfavJYUTsredUzkSt7CeY4TTg6BHulIZBqu8gW+Fq/AQ== + dependencies: + bindings "^1.3.0" + nan "^2.8.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-pkg-repo@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" + integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= + dependencies: + hosted-git-info "^2.1.4" + meow "^3.3.0" + normalize-package-data "^2.3.0" + parse-github-repo-url "^1.3.0" + through2 "^2.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-raw-commits@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.0.tgz#d92addf74440c14bcc5c83ecce3fb7f8a79118b5" + integrity sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg== + dependencies: + dargs "^4.0.1" + lodash.template "^4.0.2" + meow "^4.0.0" + split2 "^2.0.0" + through2 "^2.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-3.0.1.tgz#9cb9e4974437de1f71f32da3bfe74f4d35afb1b9" + integrity sha512-Hzd1MOHXouITfCasrpVJbRDg9uvW7LfABk3GQmXYZByerBDrfrEMP9HXpNT7RxAbieiocP6u+xq20DkvjwxnCA== + dependencies: + meow "^5.0.0" + semver "^6.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + dependencies: + ini "^1.3.2" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.4.0: + version "4.7.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.2.tgz#01127b3840156a0927058779482031afe0e730d7" + integrity sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.8.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" + integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +html-escaper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" + integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" + integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== + +is-ci@^1.0.10: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== + dependencies: + ci-info "^1.5.0" + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + +is-regex@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + +is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931" + integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg== + dependencies: + html-escaper "^2.0.0" + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af" + integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg== + dependencies: + "@jest/core" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^13.3.0" + +jest-config@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5" + integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.9.0" + "@jest/types" "^24.9.0" + babel-jest "^24.9.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.9.0" + jest-environment-node "^24.9.0" + jest-get-type "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + micromatch "^3.1.10" + pretty-format "^24.9.0" + realpath-native "^1.1.0" + +jest-diff@^24.3.0, jest-diff@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" + integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-docblock@^24.3.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2" + integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05" + integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog== + dependencies: + "@jest/types" "^24.9.0" + chalk "^2.0.1" + jest-get-type "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + +jest-environment-jsdom@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b" + integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + jsdom "^11.5.1" + +jest-environment-node@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3" + integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA== + dependencies: + "@jest/environment" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/types" "^24.9.0" + jest-mock "^24.9.0" + jest-util "^24.9.0" + +jest-get-type@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" + integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== + +jest-haste-map@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d" + integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ== + dependencies: + "@jest/types" "^24.9.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.9.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0" + integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.9.0" + is-generator-fn "^2.0.0" + jest-each "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-runtime "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + pretty-format "^24.9.0" + throat "^4.0.0" + +jest-leak-detector@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a" + integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA== + dependencies: + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-matcher-utils@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" + integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== + dependencies: + chalk "^2.0.1" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + pretty-format "^24.9.0" + +jest-message-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3" + integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6" + integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w== + dependencies: + "@jest/types" "^24.9.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636" + integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA== + +jest-resolve-dependencies@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab" + integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g== + dependencies: + "@jest/types" "^24.9.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.9.0" + +jest-resolve@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321" + integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ== + dependencies: + "@jest/types" "^24.9.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42" + integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.9.0" + jest-jasmine2 "^24.9.0" + jest-leak-detector "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + jest-runtime "^24.9.0" + jest-util "^24.9.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac" + integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.9.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.9.0" + jest-haste-map "^24.9.0" + jest-message-util "^24.9.0" + jest-mock "^24.9.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.9.0" + jest-snapshot "^24.9.0" + jest-util "^24.9.0" + jest-validate "^24.9.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^13.3.0" + +jest-serializer@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73" + integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ== + +jest-snapshot@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba" + integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.9.0" + chalk "^2.0.1" + expect "^24.9.0" + jest-diff "^24.9.0" + jest-get-type "^24.9.0" + jest-matcher-utils "^24.9.0" + jest-message-util "^24.9.0" + jest-resolve "^24.9.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.9.0" + semver "^6.2.0" + +jest-util@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162" + integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg== + dependencies: + "@jest/console" "^24.9.0" + "@jest/fake-timers" "^24.9.0" + "@jest/source-map" "^24.9.0" + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab" + integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ== + dependencies: + "@jest/types" "^24.9.0" + camelcase "^5.3.1" + chalk "^2.0.1" + jest-get-type "^24.9.0" + leven "^3.1.0" + pretty-format "^24.9.0" + +jest-watcher@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b" + integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw== + dependencies: + "@jest/test-result" "^24.9.0" + "@jest/types" "^24.9.0" + "@types/yargs" "^13.0.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.9.0" + string-length "^2.0.0" + +jest-worker@^24.6.0, jest-worker@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" + integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== + dependencies: + merge-stream "^2.0.0" + supports-color "^6.1.0" + +jest@24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171" + integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw== + dependencies: + import-local "^2.0.0" + jest-cli "^24.9.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@2.x, json5@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" + integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== + dependencies: + minimist "^1.2.0" + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.template@^4.0.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash@^4.17.13, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +loose-envify@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== + dependencies: + pify "^3.0.0" + +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975" + integrity sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist "^1.1.3" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" + integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.43.0: + version "1.43.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" + integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.26" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" + integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + dependencies: + mime-db "1.43.0" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.x, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.12.1, nan@^2.8.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.4.2: + version "5.4.3" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" + integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +nodemon@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.2.tgz#9c7efeaaf9b8259295a97e5d4585ba8f0cbe50b0" + integrity sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw== + dependencies: + chokidar "^3.2.2" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.7: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" + integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" + integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +parse-github-repo-url@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" + integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.7: + version "2.2.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" + integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +pretty-format@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" + integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== + dependencies: + "@jest/types" "^24.9.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prompts@^2.0.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4" + integrity sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.3" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.7.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" + integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + +pstree.remy@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" + integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + +rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-is@^16.8.4: + version "16.12.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" + integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@2 || 3": + version "3.5.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" + integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readdirp@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" + integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== + dependencies: + picomatch "^2.0.7" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request-promise-core@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" + integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== + dependencies: + lodash "^4.17.15" + +request-promise-native@^1.0.5: + version "1.0.8" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" + integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + dependencies: + request-promise-core "1.1.3" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@1.x, resolve@^1.10.0, resolve@^1.3.2: + version "1.14.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2" + integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ== + dependencies: + path-parse "^1.0.6" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +rxjs@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" + integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sisteransi@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" + integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6: + version "0.5.16" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" + integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimleft@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" + integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" + integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +symbol-tree@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempfile@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-3.0.0.tgz#5376a3492de7c54150d0cc0612c3f00e2cdaf76c" + integrity sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw== + dependencies: + temp-dir "^2.0.0" + uuid "^3.3.2" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0, through2@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + +through@2, "through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + +ts-jest@24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.3.0.tgz#b97814e3eab359ea840a1ac112deae68aa440869" + integrity sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ== + dependencies: + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + mkdirp "0.x" + resolve "1.x" + semver "^5.5" + yargs-parser "10.x" + +ts-node@8.6.1: + version "8.6.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.6.1.tgz#a31838d93cb67bbe2c56026848ab6c9224564c4e" + integrity sha512-KqPbO7/UuOPE4ANAOV9geZjk6tet6rK2K+DFeEJq6kIXUi0nLkrOMksozGkIlFopOorkStlwar3DdWYrdl7zCw== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.6" + yn "^4.0.0" + +tsconfig-paths@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" + integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + +tslint@5.20.1: + version "5.20.1" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.20.1.tgz#e401e8aeda0152bc44dd07e614034f3f80c67b7d" + integrity sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg== + dependencies: + "@babel/code-frame" "^7.0.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^4.0.1" + glob "^7.1.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + mkdirp "^0.5.1" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +typescript@3.7.4: + version "3.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.4.tgz#1743a5ec5fef6a1fa9f3e4708e33c81c73876c19" + integrity sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw== + +uglify-js@^3.1.4: + version "3.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.5.tgz#278c7c24927ac5a32d3336fc68fd4ae1177a486a" + integrity sha512-GFZ3EXRptKGvb/C1Sq6nO1iI7AGcjyqmIyOw0DrD0675e+NNbGO72xmMM2iEBdFbxaTLo70NbjM/Wy54uZIlsg== + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + +undefsafe@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + integrity sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY= + dependencies: + debug "^2.2.0" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + +update-notifier@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +uuid@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" + integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm2@3.8.4: + version "3.8.4" + resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.8.4.tgz#882be9135467942d84d1af80b6e6549b57c69041" + integrity sha512-5HThl+RBO/pwE9SF0kM4nLrpq5vXHBNk4BMX27xztvl0j1RsZ4/PMVJAu9rM9yfOtTo5KroL7XNX3031ExleSw== + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yargs-parser@10.x, yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-4.0.0.tgz#611480051ea43b510da1dfdbe177ed159f00a979" + integrity sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==