commit cdadc608c5882a6affd8da4ea04e357d30237e0a Author: Kohei Watanabe Date: Fri Feb 7 12:34:43 2020 +0900 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89b5c53 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/node_modules/ +/cjs/ +/esm/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2faac91 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Kohei Watanabe + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4e95a0c --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# Megabit + +Connect real things with Node.js + +## Usage + +### GPIO Example + +```js +const { gpio } = require("megabit"); +const sleep = require("util").promisify(setTimeout); + +async function blink() { + for (;;) { + await gpio(26).write(1); + await sleep(1000); + await gpio(26).write(0); + await sleep(1000); + } +} + +blink(); +``` + +### I2C Example + +```js +const { adt7410 } = require("megabit"); + +async function measure() { + const temperature = await adt7410().read(); + console.log(`Temperature: ${temperature} ℃`); +} + +measure(); +``` + +## Documents + +[Megabit API Documentation](https://kou029w.github.io/megabit/) diff --git a/package.json b/package.json new file mode 100644 index 0000000..9d24067 --- /dev/null +++ b/package.json @@ -0,0 +1,65 @@ +{ + "name": "megabit", + "version": "1.0.0-alpha.0", + "description": "Connect real things with Node.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "cjs/index.d.js", + "files": [ + "cjs", + "esm" + ], + "repository": { + "type": "git", + "url": "https://github.com/kou029w/megabit.git" + }, + "author": "Kohei Watanabe ", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@chirimen/ads1015": "~1", + "@chirimen/adt7410": "~1", + "@chirimen/gp2y0e03": "~1", + "@chirimen/grove-accelerometer": "~1", + "@chirimen/grove-gesture": "~1", + "@chirimen/grove-light": "~1", + "@chirimen/grove-oled-display": "~1", + "@chirimen/grove-touch": "~1", + "@chirimen/pca9685": "~1", + "@chirimen/s11059": "~1", + "@chirimen/veml6070": "~1", + "@chirimen/vl53l0x": "~1", + "node-web-gpio": "~1", + "node-web-i2c": "~1" + }, + "devDependencies": { + "@types/node": "~12", + "npm-run-all": "~4", + "typedoc": "~0.16", + "typescript": "~3.7" + }, + "scripts": { + "doc": "typedoc --tsconfig tsconfig.base.json src", + "build": "run-p build:*", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:esm": "tsc -p tsconfig.esm.json" + }, + "keywords": [ + "gpio", + "hardware", + "i2c", + "iot", + "linux", + "pi", + "raspberry pi", + "raspberry", + "raspi", + "robot", + "robotics", + "robots", + "rpi", + "smbus" + ] +} diff --git a/src/Device.ts b/src/Device.ts new file mode 100644 index 0000000..a201611 --- /dev/null +++ b/src/Device.ts @@ -0,0 +1,9 @@ +export interface ReadableDevice< + T extends boolean | number | string | boolean[] | number[] +> { + read(): Promise; +} + +export interface WritableDevice { + write(value: T): Promise; +} diff --git a/src/ads1015.ts b/src/ads1015.ts new file mode 100644 index 0000000..69c113b --- /dev/null +++ b/src/ads1015.ts @@ -0,0 +1,20 @@ +import Device from "@chirimen/ads1015"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +export function ads1015( + bus: I2CPort = i2c(), + address: number = 0x48, + channel: 0 | 1 | 2 | 3 = 0 +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + return device.read(channel); + } + }; +} + +export default ads1015; diff --git a/src/adt7410.ts b/src/adt7410.ts new file mode 100644 index 0000000..f1294f4 --- /dev/null +++ b/src/adt7410.ts @@ -0,0 +1,22 @@ +import Device from "@chirimen/adt7410"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type Temperature (°C) */ +type Temperature = number; + +export function adt7410( + bus: I2CPort = i2c(), + address: number = 0x48 +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + return device.read(); + } + }; +} + +export default adt7410; diff --git a/src/adxl345.ts b/src/adxl345.ts new file mode 100644 index 0000000..2dcf17a --- /dev/null +++ b/src/adxl345.ts @@ -0,0 +1,23 @@ +import Device from "@chirimen/grove-accelerometer"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type Acceleration (g) */ +type Acceleration = [number, number, number]; + +export function adxl345( + bus: I2CPort = i2c(), + address: number = 0x53 +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + const acc = await device.read(); + return [acc.x, acc.y, acc.z]; + } + }; +} + +export default adxl345; diff --git a/src/gp2y0e03.ts b/src/gp2y0e03.ts new file mode 100644 index 0000000..0f09b51 --- /dev/null +++ b/src/gp2y0e03.ts @@ -0,0 +1,22 @@ +import Device from "@chirimen/gp2y0e03"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type Distance (cm) */ +type Distance = number; + +export function gp2y0e03( + bus: I2CPort = i2c(), + address: number = 0x40 +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + return device.read(); + } + }; +} + +export default gp2y0e03; diff --git a/src/gpio.ts b/src/gpio.ts new file mode 100644 index 0000000..e0465cf --- /dev/null +++ b/src/gpio.ts @@ -0,0 +1,43 @@ +import { + GPIOPort, + OperationError, + InvalidAccessError, + requestGPIOAccess +} from "node-web-gpio"; + +export { OperationError, InvalidAccessError, requestGPIOAccess }; +export type GPIOValue = 0 | 1; + +export class GPIO extends GPIOPort { + async read(): Promise { + try { + if (!(this.exported && this.direction === "in")) { + throw new OperationError(`direction must be "in"`); + } + } catch (error) { + if (error instanceof OperationError) await this.export("in"); + else throw error; + } + + return super.read(); + } + + async write(value: GPIOValue): Promise { + try { + if (!(this.exported && this.direction === "out")) { + throw new OperationError(`direction must be "out"`); + } + } catch (error) { + if (error instanceof OperationError) await this.export("out"); + else throw error; + } + + return super.write(value); + } +} + +export function gpio(pin: number) { + return new GPIOPort(pin); +} + +export default gpio; diff --git a/src/i2c.ts b/src/i2c.ts new file mode 100644 index 0000000..7e42ef4 --- /dev/null +++ b/src/i2c.ts @@ -0,0 +1,9 @@ +import { I2CPort, I2CSlaveDevice, requestI2CAccess } from "node-web-i2c"; + +export { I2CPort, I2CSlaveDevice, requestI2CAccess }; + +export function i2c(bus: number = 1) { + return new I2CPort(bus); +} + +export default i2c; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..02ede61 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,23 @@ +export { + GPIO, + GPIOValue, + OperationError, + InvalidAccessError, + requestGPIOAccess, + default as gpio +} from "./gpio"; + +export { I2CSlaveDevice, requestI2CAccess, default as i2c } from "./i2c"; + +export { default as ads1015 } from "./ads1015"; +export { default as adt7410 } from "./adt7410"; +export { default as adxl345 } from "./adxl345"; +export { default as gp2y0e03 } from "./gp2y0e03"; +export { default as mpr121 } from "./mpr121"; +export { default as paj7620 } from "./paj7620"; +export { default as pca9685 } from "./pca9685"; +export { default as s11059 } from "./s11059"; +export { default as ssd1308 } from "./ssd1308"; +export { default as tsl2561 } from "./tsl2561"; +export { default as veml6070 } from "./veml6070"; +export { default as vl53l0x } from "./vl53l0x"; diff --git a/src/mpr121.ts b/src/mpr121.ts new file mode 100644 index 0000000..dce11cd --- /dev/null +++ b/src/mpr121.ts @@ -0,0 +1,35 @@ +import Device from "@chirimen/grove-touch"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type true if touched by the finger, false otherwise */ +type Touched = [ + boolean, + boolean, + boolean, + boolean, + boolean, + boolean, + boolean, + boolean, + boolean, + boolean, + boolean, + boolean +]; + +export function mpr121( + bus: I2CPort = i2c(), + address: number = 0x5a +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + return device.read(); + } + }; +} + +export default mpr121; diff --git a/src/paj7620.ts b/src/paj7620.ts new file mode 100644 index 0000000..e821817 --- /dev/null +++ b/src/paj7620.ts @@ -0,0 +1,44 @@ +import Device from "@chirimen/grove-gesture"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +type Direction = + | "" + | "right" + | "left" + | "up" + | "down" + | "forward" + | "back" + | "clockwise" + | "counterclockwise"; + +export function paj7620( + bus: I2CPort = i2c(), + address: number = 0x73 +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + const direction = await device.read(); + switch (direction) { + case "right": + case "left": + case "up": + case "down": + case "forward": + case "back": + case "clockwise": + return direction; + case "count clockwise": + return "counterclockwise"; + default: + return ""; + } + } + }; +} + +export default paj7620; diff --git a/src/pca9685.ts b/src/pca9685.ts new file mode 100644 index 0000000..7ec53df --- /dev/null +++ b/src/pca9685.ts @@ -0,0 +1,50 @@ +import Device from "@chirimen/pca9685"; +import { WritableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +type Channel = + | 0 + | 1 + | 2 + | 3 + | 4 + | 5 + | 6 + | 7 + | 8 + | 9 + | 10 + | 11 + | 12 + | 13 + | 14 + | 15; + +/** + * @param minPulse sec + * @param maxPulse sec + * @param angleRange deg + */ +export function pca9685( + bus: I2CPort = i2c(), + address: number = 0x40, + channel: Channel = 0, + minPulse?: number, + maxPulse?: number, + angleRange?: number +): WritableDevice { + const device = new Device(bus, address); + + return { + /** @param angle deg */ + async write(angle: number): Promise { + if (device.i2cSlave == null) { + await device.init(minPulse, maxPulse, angleRange, false); + } + + await device.setServo(channel, angle); + } + }; +} + +export default pca9685; diff --git a/src/s11059.ts b/src/s11059.ts new file mode 100644 index 0000000..fdf67ba --- /dev/null +++ b/src/s11059.ts @@ -0,0 +1,22 @@ +import Device from "@chirimen/s11059"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type 8-bit RGB */ +type RGB = [number, number, number]; + +export function s11059( + bus: I2CPort = i2c(), + address: number = 0x2a +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + return device.readR8G8B8(); + } + }; +} + +export default s11059; diff --git a/src/ssd1308.ts b/src/ssd1308.ts new file mode 100644 index 0000000..ce8c845 --- /dev/null +++ b/src/ssd1308.ts @@ -0,0 +1,30 @@ +import Device from "@chirimen/grove-oled-display"; +import { WritableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +export function ssd1308( + bus: I2CPort = i2c(), + address: number = 0x3c +): WritableDevice { + const device = new Device(bus, address); + + return { + /** @param value Object to be output */ + async write(value: boolean | number | string): Promise { + if (device.i2cSlave == null) { + await device.init(false); + } + await device.clearDisplay(); + const messages = + typeof value === "string" + ? value.split("\n") + : JSON.stringify(value, null, " ").split("\n"); + messages.forEach((message, index) => { + device.drawStringQ(index, 0, message); + }); + await device.playSequence(); + } + }; +} + +export default ssd1308; diff --git a/src/tsl2561.ts b/src/tsl2561.ts new file mode 100644 index 0000000..51a525e --- /dev/null +++ b/src/tsl2561.ts @@ -0,0 +1,22 @@ +import Device from "@chirimen/grove-light"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type Illuminance (lx) */ +type Illuminance = number; + +export function tsl2561( + bus: I2CPort = i2c(), + address: number = 0x29 +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(); + return device.read(); + } + }; +} + +export default tsl2561; diff --git a/src/veml6070.ts b/src/veml6070.ts new file mode 100644 index 0000000..c7aee73 --- /dev/null +++ b/src/veml6070.ts @@ -0,0 +1,21 @@ +import Device from "@chirimen/veml6070"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type UVA (μW/cm^2) */ +type UVA = number; + +/** slave addresses are 0x38 and 0x39 */ +export function veml6070(bus: I2CPort = i2c()): ReadableDevice { + const device = new Device(bus); + + return { + async read(): Promise { + if (device.i2cSlaveLSB == null || device.i2cSlaveMSB == null) + await device.init(); + return device.read(); + } + }; +} + +export default veml6070; diff --git a/src/vl53l0x.ts b/src/vl53l0x.ts new file mode 100644 index 0000000..09e12cd --- /dev/null +++ b/src/vl53l0x.ts @@ -0,0 +1,27 @@ +import Device from "@chirimen/vl53l0x"; +import { ReadableDevice } from "./Device"; +import { I2CPort, i2c } from "./i2c"; + +/** @type Enable long range mode (max 2200mm) */ +type EnableLongRangeMode = Boolean; + +/** @type Distance (mm) */ +type Distance = number; + +/** max 1200 mm / 2200 mm (long range mode) */ +export function vl53l0x( + bus: I2CPort = i2c(), + address: number = 0x29, + enableLongRangeMode?: EnableLongRangeMode +): ReadableDevice { + const device = new Device(bus, address); + + return { + async read(): Promise { + if (device.i2cSlave == null) await device.init(enableLongRangeMode); + return device.getRange(); + } + }; +} + +export default vl53l0x; diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..d0e7afc --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,22 @@ +{ + "exclude": ["cjs", "esm"], + "compilerOptions": { + "target": "esnext", + "moduleResolution": "node", + "allowJs": true, + "declaration": true, + "noImplicitThis": true, + "alwaysStrict": true, + "strictBindCallApply": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictPropertyInitialization": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "typedocOptions": { + "mode": "file", + "out": "docs" + } +} diff --git a/tsconfig.cjs.json b/tsconfig.cjs.json new file mode 100644 index 0000000..6072d70 --- /dev/null +++ b/tsconfig.cjs.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "cjs" + } +} diff --git a/tsconfig.esm.json b/tsconfig.esm.json new file mode 100644 index 0000000..321584b --- /dev/null +++ b/tsconfig.esm.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "module": "esnext", + "outDir": "esm" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..c8b1ebb --- /dev/null +++ b/yarn.lock @@ -0,0 +1,720 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@chirimen/ads1015@~1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chirimen/ads1015/-/ads1015-1.0.1.tgz#c92fe6fcc538c20ab44573326b8e8ac232313997" + integrity sha512-DEecY3aeumJxlR64a5ic7J5tnx54zmFpAP1xZXrQrRvp3xgbzFdh7/kz2kU1aC/EO5CD61V00hf5dsjTri38aA== + +"@chirimen/adt7410@~1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chirimen/adt7410/-/adt7410-1.0.1.tgz#f31c9bb1de20619ceda4e932204b5b6697e7819c" + integrity sha512-SeEZ/BhTiTgHzoXVV9WwyqlxTq1yibnXhHZ/4emj6dm4lMbMbRQQWcD75OPRTPhUWMueBW5gSH3Xu/NHnxfCkw== + +"@chirimen/gp2y0e03@~1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chirimen/gp2y0e03/-/gp2y0e03-1.0.1.tgz#a44430181cf9755ba9adbf02af035cda1f88254d" + integrity sha512-xdxN8lT0geAwzDDLm3fEOPqMgDgNMSFKCDE0AuijPvB4qtXwK5eAbQk/a/8MtA7kabi+znfiLDbgK3NWyO/KCg== + +"@chirimen/grove-accelerometer@~1": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@chirimen/grove-accelerometer/-/grove-accelerometer-1.0.0.tgz#740dd22d0bcc39c3eedfec237dbde9e9cdfa044b" + integrity sha512-zt0sJdGZBad3vLPqBIRRbhCce9rzB3Bi8GHqVihEbFzbXphC5wCWS3AR6v5FqrNV0U4gbsbwZ3yAVEQ3I0XyWQ== + +"@chirimen/grove-gesture@~1": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@chirimen/grove-gesture/-/grove-gesture-1.0.0.tgz#71de0db2a4d48bcf5cac97b5d961213978929388" + integrity sha512-g8TmoA7H7+oJm77Kg2Ot0kucSlEhge5fC0Obv3CPoTah3hyjjCz07ujS/aJPe9aeDAmFK3rtkpkXzCqTcr8dag== + +"@chirimen/grove-light@~1": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@chirimen/grove-light/-/grove-light-1.0.0.tgz#da0ec85802f99cd5d6d946ca74792dd6cb55c6b1" + integrity sha512-3lHXKxO4mYVCgCm48+LtkbHgOQXFTg38TawU3Duto9jJK1sK2FwLDjPvLKAjLQm4ijpRaeOwDxyOMtu6WBljlA== + +"@chirimen/grove-oled-display@~1": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@chirimen/grove-oled-display/-/grove-oled-display-1.0.0.tgz#9e175c2d47fa4721b6ba0f027e8897219493ad98" + integrity sha512-cx3JgekfNwy7rZHRiCwsdpfExrOQ7/lqNTJD1ZDUCCRrWacKBjOTB06OTOtjZhTjJhQx4Og67JdW1SIV8Egs6Q== + +"@chirimen/grove-touch@~1": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@chirimen/grove-touch/-/grove-touch-1.0.0.tgz#684b5b72c6904779c515426be4d1ebc15fe3e00a" + integrity sha512-d4E3pv8OuqR1xRh5wGZHYYbskd+qkjDw2+/UPm1Id54bBzg54dQ6FCAm56tPVvs34NOAm+S7e7GHw49+yF66dQ== + +"@chirimen/pca9685@~1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@chirimen/pca9685/-/pca9685-1.0.1.tgz#7d6de987f6612c6bd6d7540b3e3ece09b2d26220" + integrity sha512-iEignBzmxn+f+WKDFTd3I78HQurEYlM1l54b5e8kDTWsbkyKb2MJA792NdJcOSkX/Obf05IbW8H7GwgcNolwxQ== + +"@chirimen/s11059@~1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@chirimen/s11059/-/s11059-1.0.2.tgz#d27e1d205975296e28348fc5d8c17a573d23364d" + integrity sha512-qj9Vp9pxEsL5XF1bM374xAWIpDJFnM3kx03UZnkZzHI76RG03+ghoh6iNu8eicy2fM55LIForUV+ZQDNcqOy1A== + +"@chirimen/veml6070@~1": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@chirimen/veml6070/-/veml6070-1.0.0.tgz#407fdef1f1a6017196879b90fad8858eb20ad33a" + integrity sha512-tF42hu9y3oTEuOEKp4FlnvhuklSZszeWnlcVSMbyZX/xuvgZBTvNNPdWlqfLSor7Rduu1olfKSk8wsy9ha/R2w== + +"@chirimen/vl53l0x@~1": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@chirimen/vl53l0x/-/vl53l0x-1.0.3.tgz#847b14f5c400047f5c129ae2e85559df066531c3" + integrity sha512-Cna26V7q/2u2bcbJERypiedz2iEwT3fFNlRzL6cCQ6cR97ukOPdgGHH7EVfoNrqZb4TuRP77GSySqkZpgxoNwA== + +"@types/minimatch@3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/node@~12": + version "12.12.26" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.26.tgz#213e153babac0ed169d44a6d919501e68f59dea9" + integrity sha512-UmUm94/QZvU5xLcUlNR8hA7Ac+fGpO1EG/a8bcWVz0P0LqtxFmun9Y2bbtuckwGboWJIT70DoWq1r3hb56n3DA== + +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" + +backbone@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12" + integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ== + dependencies: + underscore ">=1.8.3" + +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= + +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" + +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" + +chalk@^2.4.1: + 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" + +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= + +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== + +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= + +cross-spawn@^6.0.5: + 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" + +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" + +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.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" + integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== + 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= + +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== + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +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= + +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== + +glob@^7.0.0: + 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" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + +handlebars@^4.7.2: + version "4.7.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.3.tgz#8ece2797826886cf8082d1726ff21d2a022550ee" + integrity sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +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@^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" + +highlight.js@^9.17.1: + version "9.18.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz#ed21aa001fe6252bb10a3d76d47573c6539fe13c" + integrity sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== + +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== + +i2c-bus@~5: + version "5.1.0" + resolved "https://registry.yarnpkg.com/i2c-bus/-/i2c-bus-5.1.0.tgz#7d667d225c09017cf044f75fc593d5ea3e0f4ea6" + integrity sha512-u/q1fuZ5xrG77y3uo1rAANycboXsRNjneN+6jXRNMT2yRNpanVkbAP+IArwgsPRCHaY/zKxw7x5G8Y2fSPNseA== + dependencies: + bindings "^1.5.0" + nan "^2.14.0" + +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: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +interpret@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +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-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-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-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-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" + +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= + +jquery@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" + integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== + +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== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +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" + +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== + +lunr@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072" + integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg== + +marked@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.0.tgz#ec5c0c9b93878dc52dd54be8d0e524097bd81a99" + integrity sha512-MyUe+T/Pw4TZufHkzAfDj6HarCBWia2y27/bhuYkTaiUnfDYFnCP3KUN+9oM7Wi6JA2rymtVYbQu3spE0GCmxQ== + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +minimatch@^3.0.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@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +nan@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +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-web-gpio@~1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-web-gpio/-/node-web-gpio-1.0.0.tgz#ea75726a792c64cba09a9d65bc191294c531eded" + integrity sha512-bNYPeLK+tBBOE92Hc7B+5n4dEMEbH+Ai3toQk3Fc2YqaR1GFhTN6zSqHT6bIjmjvJSHsWE2xKOrcAL2ge+2qpQ== + +node-web-i2c@~1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/node-web-i2c/-/node-web-i2c-1.1.2.tgz#9f24b5d1580832689b2c2719d33e50b14b43150d" + integrity sha512-q7mk4pcqXbq7rxLtagtMZ1jNE1S0acA4GMmHju8PSaI5xvbcwg/iKPs4lFqzpyyalbiNo8g4QIbSjVPQyZjghw== + dependencies: + i2c-bus "~5" + +normalize-package-data@^2.3.2: + 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" + +npm-run-all@~4: + version "4.1.5" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +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.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" + +once@^1.3.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" + +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" + +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-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-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@^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" + +pidtree@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.0.tgz#f6fada10fccc9f99bf50e90d0b23d72c9ebc2e6b" + integrity sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg== + +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= + +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +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" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +resolve@^1.1.6, resolve@^1.10.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" + integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + dependencies: + path-parse "^1.0.6" + +"semver@2 || 3 || 4 || 5", semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +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-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= + +shell-quote@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" + integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== + +shelljs@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +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== + +string.prototype.padend@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3" + integrity sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +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" + +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= + +supports-color@^5.3.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" + +typedoc-default-themes@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/typedoc-default-themes/-/typedoc-default-themes-0.7.2.tgz#1e9896f920b58e6da0bba9d7e643738d02405a5a" + integrity sha512-fiFKlFO6VTqjcno8w6WpTsbCgXmfPHVjnLfYkmByZE7moaz+E2DSpAT+oHtDHv7E0BM5kAhPrHJELP2J2Y2T9A== + dependencies: + backbone "^1.4.0" + jquery "^3.4.1" + lunr "^2.3.8" + underscore "^1.9.1" + +typedoc@~0.16: + version "0.16.9" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.16.9.tgz#d6f46f4dea7d3362029927a92981efdf896f435b" + integrity sha512-UvOGoy76yqwCXwxPgatwgXWfsQ3FczyZ6ZNLjhCPK+TsDir6LiU3YB6N9XZmPv36E+7LA860mnc8a0v6YADKFw== + dependencies: + "@types/minimatch" "3.0.3" + fs-extra "^8.1.0" + handlebars "^4.7.2" + highlight.js "^9.17.1" + lodash "^4.17.15" + marked "^0.8.0" + minimatch "^3.0.0" + progress "^2.0.3" + shelljs "^0.8.3" + typedoc-default-themes "^0.7.2" + typescript "3.7.x" + +typescript@3.7.x, typescript@~3.7: + version "3.7.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" + integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== + +uglify-js@^3.1.4: + version "3.7.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.7.tgz#21e52c7dccda80a53bf7cde69628a7e511aec9c9" + integrity sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA== + dependencies: + commander "~2.20.3" + source-map "~0.6.1" + +underscore@>=1.8.3, underscore@^1.9.1: + version "1.9.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f" + integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +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" + +which@^1.2.9: + 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" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=