Replace can stream with capnp stream (#7)

* Not working yet, initial download flow. Figuring out prev message garbage

* Basic functionality, but its slooowwwwwwww

* Make localforage optional since it doesnt work in CI for some reason

* Performance improvements

* remove dead code

* Update version of log reader

* Fall back on the old can fetcher when you see ios logs
main
Chris Vickery 2018-05-03 11:23:45 -07:00 committed by GitHub
parent 2f1a8d36c7
commit 63ca8ba824
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 738 additions and 86 deletions

View File

@ -4,12 +4,14 @@
"private": true,
"homepage": "https://community.comma.ai/cabana",
"dependencies": {
"@commaai/pandajs": "^0.1.10",
"@commaai/log_reader": "^0.3.0",
"@commaai/pandajs": "^0.3.0",
"aphrodite": "^1.2.1",
"babel-preset-stage-0": "^6.24.1",
"base64-inline-loader": "^1.1.0",
"classnames": "^2.2.5",
"clipboard": "^1.7.1",
"config-request": "^0.5.1",
"core-js": "^2.4.1",
"create-react-class": "^15.5.3",
"cuint": "^0.2.2",
@ -27,6 +29,7 @@
"js-cookie": "^2.1.4",
"left-pad": "^1.1.3",
"lint-staged": "^6.0.0",
"localforage": "^1.7.1",
"moment": "^2.18.1",
"node-sass": "^4.7.2",
"prettier": "^1.9.2",
@ -45,6 +48,7 @@
"react-visibility-sensor": "^3.10.1",
"simple-statistics": "^4.1.0",
"socket.io-client": "^2.0.3",
"stream-selector": "^0.1.1",
"streamsaver": "^1.0.1",
"vega": "3.0.10",
"vega-tooltip": "^0.4.0"

View File

@ -8,7 +8,7 @@ import Panda from "@commaai/pandajs";
import { USE_UNLOGGER, PART_SEGMENT_LENGTH, STREAMING_WINDOW } from "./config";
import * as GithubAuth from "./api/github-auth";
import auth from "./api/comma-auth";
import * as auth from "./api/comma-auth";
import DBC from "./models/can/dbc";
import Meta from "./components/Meta";
import Explorer from "./components/Explorer";
@ -29,7 +29,7 @@ import UnloggerClient from "./api/unlogger";
import * as ObjectUtils from "./utils/object";
import { hash } from "./utils/string";
const CanFetcher = require("./workers/can-fetcher.worker.js");
const RLogDownloader = require("./workers/rlog-downloader.worker.js");
const LogCSVDownloader = require("./workers/dbc-csv-downloader.worker.js");
const MessageParser = require("./workers/message-parser.worker.js");
const CanOffsetFinder = require("./workers/can-offset-finder.worker.js");
@ -302,7 +302,7 @@ export default class CanExplorer extends Component {
// Adds new message entries to messages state
// and "rehydrates" ES6 classes (message frame)
// lost from JSON serialization in webworker data cloning.
if (options === undefined) options = {};
options = options || {};
const messages = { ...this.state.messages };
for (var key in newMessages) {
@ -325,22 +325,18 @@ export default class CanExplorer extends Component {
}
spawnWorker(parts, options) {
// options is object of {part, prevMsgEntries, spawnWorkerHash, prepend}
console.log("Spawning worker for", parts);
if (!this.state.isLoading) {
this.setState({ isLoading: true });
}
// options is object of {part, prevMsgEntries, spawnWorkerHash, prepend}
const [minPart, maxPart] = parts;
let part = minPart,
prevMsgEntries = {},
prepend = false,
spawnWorkerHash;
if (options) {
if (options.part) part = options.part;
if (options.prevMsgEntries) prevMsgEntries = options.prevMsgEntries;
if (options.spawnWorkerHash) {
spawnWorkerHash = options.spawnWorkerHash;
}
}
options = options || {};
let part = options.part || minPart;
let prevMsgEntries = options.prevMsgEntries || {};
let prepend = false;
let spawnWorkerHash = options.spawnWorkerHash; // || undefined
if (!spawnWorkerHash) {
spawnWorkerHash = hash(Math.random().toString(16));
this.setState({ spawnWorkerHash });
@ -358,7 +354,8 @@ export default class CanExplorer extends Component {
canFrameOffset,
maxByteStateChangeCount
} = this.state;
var worker = new CanFetcher();
// var worker = new CanFetcher();
var worker = new RLogDownloader();
worker.onmessage = e => {
if (spawnWorkerHash !== this.state.spawnWorkerHash) {
@ -372,7 +369,7 @@ export default class CanExplorer extends Component {
return;
}
let { newMessages, maxByteStateChangeCount } = e.data;
let { newMessages, maxByteStateChangeCount, isFinished } = e.data;
if (maxByteStateChangeCount > this.state.maxByteStateChangeCount) {
this.setState({ maxByteStateChangeCount });
} else {
@ -390,30 +387,39 @@ export default class CanExplorer extends Component {
prevMsgEntries[key] = msg.entries[msg.entries.length - 1];
}
this.setState(
{
messages,
partsLoaded: this.state.partsLoaded + 1
},
() => {
if (part < maxPart) {
this.spawnWorker(parts, {
part: part + 1,
prevMsgEntries,
spawnWorkerHash,
prepend
});
} else {
this.setState({ isLoading: false });
if (!isFinished) {
this.setState({ messages });
} else {
this.setState(
{
messages,
partsLoaded: this.state.partsLoaded + 1
},
() => {
if (part < maxPart) {
this.spawnWorker(parts, {
part: part + 1,
prevMsgEntries,
spawnWorkerHash,
prepend
});
} else {
this.setState({ isLoading: false });
}
}
}
);
);
}
};
worker.postMessage({
dbcText: dbc.text(),
// old stuff for reverse compatibility for easier testing
base: route.url,
num: part,
// data that is used
dbcText: dbc.text(),
route: route.fullname,
part: part,
canStartTime: firstCanTime - canFrameOffset,
prevMsgEntries,
maxByteStateChangeCount

View File

@ -0,0 +1,57 @@
// API gateway for `api.commadotai.com/v1` urls
import { getCommaAccessToken } from "./comma-auth";
const URL_ROOT = "//api.commadotai.com/v1/";
const ConfigRequest = require("config-request/instance");
const request = ConfigRequest();
var initPromise = init();
async function init() {
var token = await getCommaAccessToken();
request.configure({
baseUrl: URL_ROOT,
token: "JWT " + token,
jwt: false
});
}
export async function get(endpoint, data) {
await initPromise;
return new Promise((resolve, reject) => {
request.get(
endpoint,
{
query: data,
json: true
},
errorHandler(resolve, reject)
);
});
}
export async function post(endpoint, data) {
await initPromise;
return new Promise((resolve, reject) => {
request.post(
endpoint,
{
body: data,
json: true
},
errorHandler(resolve, reject)
);
});
}
function errorHandler(resolve, reject) {
return handle;
function handle(err, data) {
if (err) {
return reject(err);
}
resolve(data);
}
}

View File

@ -1,22 +1,52 @@
import Cookies from "js-cookie";
import storage from "localforage";
import {
COMMA_ACCESS_TOKEN_COOKIE,
COMMA_OAUTH_REDIRECT_COOKIE
} from "../config";
function getCommaAccessToken() {
let isAuthed = false;
let useForage = true;
export async function getCommaAccessToken() {
let token = getTokenInternal();
if (!token) {
try {
token = await storage.getItem("authorization");
} catch (e) {
useForage = false;
}
}
if (token) {
isAuthed = true;
if (useForage) {
await storage.setItem("authorization", token);
}
}
return token;
}
// seed cache
getCommaAccessToken();
function getTokenInternal() {
if (typeof localStorage !== "undefined") {
if (localStorage.authorization) {
return localStorage.authorization;
}
}
return Cookies.get(COMMA_ACCESS_TOKEN_COOKIE);
}
function isAuthenticated() {
return getCommaAccessToken() !== undefined;
export function isAuthenticated() {
return isAuthed;
}
function authUrl() {
export function authUrl() {
Cookies.set(COMMA_OAUTH_REDIRECT_COOKIE, window.location.href);
return "https://community.comma.ai/ucp.php?mode=login&login=external&oauth_service=google";
}
export default { getCommaAccessToken, isAuthenticated, authUrl };

32
src/api/rlog.js 100644
View File

@ -0,0 +1,32 @@
import * as CommaAPI from "./comma-api";
import request from "simple-get";
const urlStore = {};
export async function getLogURLList(routeName) {
if (urlStore[routeName]) {
return urlStore[routeName];
}
var data = await CommaAPI.get("route/" + routeName + "/log_urls");
urlStore[routeName] = data;
setTimeout(function() {
delete urlStore[routeName];
}, 1000 * 60 * 45); // expires in 1h, lets reset in 45m
return urlStore[routeName];
}
export async function getLogPart(routeName, part) {
return new Promise(async function(resolve, reject) {
var logUrls = await getLogURLList(routeName);
request(logUrls[part], function(err, res) {
if (err) {
return reject(err);
}
resolve(res);
});
});
}

View File

@ -1,5 +1,5 @@
import Moment from "moment";
import CommaAuth from "./comma-auth";
import * as CommaAuth from "./comma-auth";
const ROUTES_ENDPOINT = "https://api.commadotai.com/v1/{dongleId}/routes/";
@ -18,7 +18,7 @@ export async function fetchRoutes(dongleId) {
dongleId = "me";
}
const accessToken = CommaAuth.getCommaAccessToken();
const accessToken = await CommaAuth.getCommaAccessToken();
if (accessToken) {
const endpoint = ROUTES_ENDPOINT.replace("{dongleId}", dongleId);
const headers = new Headers();

View File

@ -36,7 +36,16 @@ export default class MessageBytes extends Component {
}
componentWillReceiveProps(nextProps) {
this.updateCanvas(nextProps);
if (
this.props.seekIndex !== nextProps.seekIndex ||
frameForTime(this.props.seekTime) !== frameForTime(nextProps.seekTime)
) {
this.updateCanvas(nextProps);
}
function frameForTime(t) {
return ~~(t * 60);
}
}
findMostRecentMessage(seekTime) {
@ -44,7 +53,7 @@ export default class MessageBytes extends Component {
const { lastMessageIndex, lastSeekTime } = this.state;
let mostRecentMessageIndex = null;
if (seekTime >= lastSeekTime) {
for (let i = lastMessageIndex; i < message.entries.length; i++) {
for (let i = lastMessageIndex; i < message.entries.length; ++i) {
const msg = message.entries[i];
if (msg && msg.relTime >= seekTime) {
mostRecentMessageIndex = i;
@ -84,9 +93,10 @@ export default class MessageBytes extends Component {
}
const ctx = this.canvas.getContext("2d");
ctx.clearRect(0, 0, 180, 15);
for (let i = 0; i < message.byteStateChangeCounts.length; i++) {
const hexData = mostRecentMsg.hexData.substr(i * 2, 2);
// ctx.clearRect(0, 0, 180, 15);
for (let i = 0; i < message.byteStateChangeCounts.length; ++i) {
const hexData = mostRecentMsg.hexData.substr(i * 2, 2) || "00";
ctx.fillStyle = message.byteColors[i];
ctx.fillRect(i * 20, 0, 20, 15);

View File

@ -4,7 +4,7 @@ import Moment from "moment";
import _ from "lodash";
import cx from "classnames";
import auth from "../../api/comma-auth";
import * as auth from "../../api/comma-auth";
import Modal from "../Modals/baseModal";

View File

@ -5,11 +5,9 @@ import DBC from "../models/can/dbc";
import DbcUtils from "../utils/dbc";
import * as CanApi from "../api/can";
var window = self;
const Int64LE = require("int64-buffer").Int64LE;
async function loadCanPart(
export async function loadCanPart(
dbc,
base,
num,
@ -74,30 +72,35 @@ async function loadCanPart(
);
});
self.postMessage({
return {
newMessages: messages,
maxByteStateChangeCount
});
self.close();
};
// self.postMessage({
// newMessages: messages,
// maxByteStateChangeCount
// });
// self.close();
}
self.onmessage = function(e) {
const {
dbcText,
base,
num,
canStartTime,
prevMsgEntries,
maxByteStateChangeCount
} = e.data;
// self.onmessage = function(e) {
// const {
// dbcText,
// base,
// num,
// canStartTime,
// prevMsgEntries,
// maxByteStateChangeCount
// } = e.data;
const dbc = new DBC(dbcText);
loadCanPart(
dbc,
base,
num,
canStartTime,
prevMsgEntries,
maxByteStateChangeCount
);
};
// const dbc = new DBC(dbcText);
// loadCanPart(
// dbc,
// base,
// num,
// canStartTime,
// prevMsgEntries,
// maxByteStateChangeCount
// );
// };

View File

@ -0,0 +1,165 @@
import LogStream from "@commaai/log_reader";
import { timeout } from "thyming";
import { partial } from "ap";
import { getLogPart, getLogURLList } from "../api/rlog";
import DbcUtils from "../utils/dbc";
import DBC from "../models/can/dbc";
import { loadCanPart } from "./can-fetcher";
const DEBOUNCE_DELAY = 100;
self.onmessage = handleMessage;
function handleMessage(msg) {
const options = msg.data;
options.dbc = new DBC(options.dbcText);
var entry = new CacheEntry(options);
}
function CacheEntry(options) {
options = options || {};
this.options = options;
let { route, part, dbc } = options;
this.messages = {};
this.route = route;
this.part = part;
this.dbc = dbc;
this.sendBatch = partial(sendBatch, this);
// load in the data!
loadData(this);
}
function sendBatch(entry) {
delete entry.batching;
let messages = entry.messages;
entry.messages = {};
let maxByteStateChangeCount = entry.options.maxByteStateChangeCount;
const newMaxByteStateChangeCount = DbcUtils.findMaxByteStateChangeCount(
messages
);
if (newMaxByteStateChangeCount > maxByteStateChangeCount) {
maxByteStateChangeCount = newMaxByteStateChangeCount;
}
Object.keys(messages).forEach(key => {
messages[key] = DbcUtils.setMessageByteColors(
messages[key],
maxByteStateChangeCount
);
});
if (entry.ended) {
console.log("Sending finished");
}
self.postMessage({
newMessages: messages,
maxByteStateChangeCount,
isFinished: entry.ended
});
}
async function loadData(entry) {
var url = (await getLogURLList(entry.route))[entry.part];
if (url.indexOf(".7z") !== -1) {
// this is a shit log we can't read...
var data = await loadCanPart(
entry.dbc,
entry.options.base,
entry.options.num,
entry.options.canStartTime,
entry.options.prevMsgEntries,
entry.options.maxByteStateChangeCount
);
data.isFinished = true;
return self.postMessage(data);
}
var res = await getLogPart(entry.route, entry.part);
var logReader = new LogStream(res);
entry.ended = false;
res.on("end", function() {
console.log("Stream ended");
entry.ended = true;
queueBatch(entry);
});
var msgArr = [];
var startTime = Date.now();
var i = 0;
logReader(function(msg) {
if (entry.ended) {
console.log("You can get msgs after end", msg);
}
if ("Can" in msg) {
let monoTime = msg.LogMonoTime / 1000000000;
msg.Can.forEach(partial(insertCanMessage, entry, monoTime));
queueBatch(entry);
}
});
}
function queueBatch(entry) {
if (!entry.batching) {
entry.batching = timeout(entry.sendBatch, DEBOUNCE_DELAY);
}
}
function insertCanMessage(entry, logTime, msg) {
var src = msg.Src;
var address = Number(msg.Address);
var busTime = msg.BusTime;
var addressHexStr = address.toString(16);
var id = src + ":" + addressHexStr;
if (!entry.messages[id]) {
entry.messages[id] = DbcUtils.createMessageSpec(
entry.dbc,
address,
id,
src
);
}
let prevMsgEntry = getPrevMsgEntry(
entry.messages,
entry.options.prevMsgEntries,
id
);
let { msgEntry, byteStateChangeCounts } = DbcUtils.parseMessage(
entry.dbc,
logTime,
address,
msg.Dat,
entry.options.canStartTime,
prevMsgEntry
);
entry.messages[id].byteStateChangeCounts = byteStateChangeCounts.map(function(
count,
idx
) {
return entry.messages[id].byteStateChangeCounts[idx] + count;
});
entry.messages[id].entries.push(msgEntry);
// console.log(id);
}
function getPrevMsgEntry(messages, prevMsgEntries, id) {
if (messages[id].entries.length) {
return messages[id].entries[messages[id].entries.length - 1];
}
return prevMsgEntries[id] || null;
}

367
yarn.lock
View File

@ -17,12 +17,29 @@
lodash "^4.2.0"
to-fast-properties "^2.0.0"
"@commaai/pandajs@^0.1.10":
version "0.1.10"
resolved "https://registry.yarnpkg.com/@commaai/pandajs/-/pandajs-0.1.10.tgz#89ac13c78bc2194144e8d868dadd351967659788"
"@commaai/log_reader@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@commaai/log_reader/-/log_reader-0.3.0.tgz#6a19265dedab555407f999a4e5fe3f567ed8d551"
dependencies:
"@commaai/unbzip2-stream" "^2.0.0"
JSONStream "^1.3.2"
ap "^0.2.0"
capnp-json "^0.1.2"
capnp-split "^0.1.1"
capnp-ts "^0.2.4"
commander "^2.15.1"
file-type "^7.6.0"
geval "^2.2.0"
stream-selector "^0.3.0"
"@commaai/pandajs@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@commaai/pandajs/-/pandajs-0.3.0.tgz#ad072defde75ddaf00175d1a0134b3d891a64283"
dependencies:
ap "^0.2.0"
babel-runtime "^6.26.0"
can-message "^0.1.0"
commander "^2.15.1"
is-browser "^2.0.1"
is-node "^1.0.2"
is-promise "^2.1.0"
@ -32,10 +49,21 @@
usb "^1.3.1"
weakmap-event "^2.0.7"
"@commaai/unbzip2-stream@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@commaai/unbzip2-stream/-/unbzip2-stream-2.0.0.tgz#93821dc5e72f04ec5eedef5ed4e6ff57412019e0"
"@types/node@*":
version "8.5.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5"
JSONStream@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
dependencies:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
abab@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
@ -308,6 +336,10 @@ assert-function@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-function/-/assert-function-1.0.0.tgz#aeb2ad0fe00888b41254a8e3934a562968d77905"
assert-ok@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-ok/-/assert-ok-1.0.0.tgz#5b5cf795f9275c59c714d66c3a06d7de70e43ec8"
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"
@ -1424,6 +1456,10 @@ buffer-indexof@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
buffer-to-arraybuffer@^0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a"
buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@ -1444,6 +1480,10 @@ builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
builtin-status-codes@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad"
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@ -1529,6 +1569,23 @@ canvas@^1.6:
dependencies:
nan "^2.4.0"
capnp-json@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/capnp-json/-/capnp-json-0.1.2.tgz#4a6ecdb6d5b827541f9f47f329f7e65e5e943b40"
capnp-split@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/capnp-split/-/capnp-split-0.1.1.tgz#22823becdfc6fc9a40921c119e85a1035e3e22e4"
capnp-ts@^0.2.4:
version "0.2.4"
resolved "https://registry.yarnpkg.com/capnp-ts/-/capnp-ts-0.2.4.tgz#da729493311f384d65d480d9afe979ceab9f41bb"
dependencies:
debug "^2.6.3"
format "^0.2.2"
tslib "^1.7.1"
utf8-encoding "^0.1.2"
capture-stack-trace@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
@ -1754,6 +1811,10 @@ commander@2, commander@2.12.x, commander@^2.11.0, commander@^2.9.0, commander@~2
version "2.12.2"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
commander@^2.15.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@ -1800,6 +1861,21 @@ concat-stream@^1.6.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
config-request@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/config-request/-/config-request-0.5.1.tgz#cffc1288a681c46de1dafaeb2333d5500f6e12d8"
dependencies:
geval "^2.1.1"
http-status-error "^1.1.1"
is-error-code "^1.0.0"
is-function "^1.0.1"
is-obj "^1.0.1"
query-string-flatten "^1.0.0"
safe-json-parse "^4.0.0"
url-join "^1.1.0"
xhr-request "^1.0.1"
xtend "^4.0.1"
configstore@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1"
@ -2252,7 +2328,7 @@ date-now@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.9:
debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.3, debug@^2.6.6, debug@^2.6.8, debug@~2.6.4, debug@~2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
@ -2268,6 +2344,16 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
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"
decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
dependencies:
mimic-response "^1.0.0"
dedent@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
@ -2443,6 +2529,10 @@ dom-urls@^1.1.0:
dependencies:
urijs "^1.16.1"
dom-walk@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
domain-browser@^1.1.1:
version "1.1.7"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
@ -3166,6 +3256,10 @@ file-saver@^1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.3.tgz#cdd4c44d3aa264eac2f68ec165bc791c34af1232"
file-type@^7.6.0:
version "7.6.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-7.6.0.tgz#b3dbfc8029148e86f30761b21253562943d21f06"
filename-regex@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
@ -3267,11 +3361,17 @@ font-awesome@^4.7.0:
version "4.7.0"
resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
for-each@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4"
dependencies:
is-function "~1.0.0"
for-in@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
for-own@^0.1.4:
for-own@^0.1.3, for-own@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
dependencies:
@ -3301,6 +3401,10 @@ form-data@~2.3.1:
combined-stream "^1.0.5"
mime-types "^2.1.12"
format@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@ -3433,7 +3537,7 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
geval@~2.2.0:
geval@^2.1.1, geval@^2.2.0, geval@~2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/geval/-/geval-2.2.0.tgz#5622b10a28028284198afe351f6b417042c33dda"
@ -3498,6 +3602,13 @@ global-prefix@^1.0.1:
is-windows "^1.0.1"
which "^1.2.14"
global@~4.3.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
dependencies:
min-document "^2.19.0"
process "~0.5.1"
globals@^9.17.0, globals@^9.18.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
@ -3858,6 +3969,14 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
http-status-error@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/http-status-error/-/http-status-error-1.1.1.tgz#16ab35efbb3aca9c17b0a262a6eceec7e0d394cc"
dependencies:
assert-ok "~1.0.0"
builtin-status-codes "~1.0.0"
is-error-code "~1.0.0"
https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
@ -3896,6 +4015,10 @@ ignore@^3.3.3:
version "3.3.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
import-local@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/import-local/-/import-local-0.1.1.tgz#b1179572aacdc11c6a91009fb430dbcab5f668a8"
@ -3929,6 +4052,10 @@ indexof@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
individual@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -4062,6 +4189,10 @@ is-equal-shallow@^0.1.3:
dependencies:
is-primitive "^2.0.0"
is-error-code@^1.0.0, is-error-code@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-error-code/-/is-error-code-1.0.0.tgz#d27e3923434bbbd5149ce8d1ae316674851a8c25"
is-extendable@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
@ -4090,6 +4221,10 @@ 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"
is-function@^1.0.1, is-function@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
is-glob@^2.0.0, is-glob@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@ -4163,7 +4298,7 @@ is-path-inside@^1.0.0:
dependencies:
path-is-inside "^1.0.1"
is-plain-obj@^1.0.0:
is-plain-obj@^1.0.0, 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"
@ -4265,6 +4400,12 @@ isobject@^2.0.0:
dependencies:
isarray "1.0.0"
isobject@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.0.0.tgz#208de872bd7378c2a92af9428a3f56eb91a122c4"
dependencies:
isarray "0.0.1"
isomorphic-fetch@^2.1.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
@ -4675,6 +4816,10 @@ jsonify@~0.0.0:
version "0.0.0"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
jsonpointer@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
@ -4762,6 +4907,12 @@ levn@^0.3.0, levn@~0.3.0:
prelude-ls "~1.1.2"
type-check "~0.3.2"
lie@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
dependencies:
immediate "~3.0.5"
lint-staged@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.0.0.tgz#7ab7d345f2fe302ff196f1de6a005594ace03210"
@ -4882,6 +5033,12 @@ loader-utils@^1.0.2, loader-utils@^1.1.0:
emojis-list "^2.0.0"
json5 "^0.5.0"
localforage@^1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.7.1.tgz#e4927e042302b864db30f3211f13b5c6f0de965d"
dependencies:
lie "3.1.1"
locate-path@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
@ -5025,7 +5182,7 @@ makeerror@1.0.x:
dependencies:
tmpl "1.0.x"
map-obj@^1.0.0, map-obj@^1.0.1:
map-obj@^1.0.0, map-obj@^1.0.1, map-obj@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
@ -5145,6 +5302,16 @@ mimic-fn@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
mimic-response@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e"
min-document@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
dependencies:
dom-walk "^0.1.0"
minimalistic-assert@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
@ -5465,6 +5632,17 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
obj-query@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/obj-query/-/obj-query-1.0.0.tgz#9447527491a243c9f72a7fec322402404a1f2e7c"
dependencies:
is-plain-obj "~1.1.0"
map-obj "~1.0.1"
object-pair "~1.0.0"
object.reduce "~0.1.7"
print-value "~1.0.0"
xtend "~4.0.1"
object-assign@4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.0.1.tgz#99504456c3598b5cad4fc59c26e8a9bb107fe0bd"
@ -5489,6 +5667,10 @@ object-keys@^1.0.10, object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
object-pair@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/object-pair/-/object-pair-1.0.0.tgz#253fb8070cb28bc9a349b8e606011cbd99f8bc25"
object.assign@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc"
@ -5513,6 +5695,12 @@ object.omit@^2.0.0:
for-own "^0.1.4"
is-extendable "^0.1.1"
object.reduce@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-0.1.7.tgz#d180e84f72d218348af45352b55165246b95046d"
dependencies:
for-own "^0.1.3"
object.values@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
@ -5522,6 +5710,10 @@ object.values@^1.0.4:
function-bind "^1.1.0"
has "^1.0.1"
obtain-unicode@~0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/obtain-unicode/-/obtain-unicode-0.0.5.tgz#655f337a8f135280495d77a60efc601f9af5d5dc"
obuf@^1.0.0, obuf@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e"
@ -5536,7 +5728,7 @@ on-headers@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
once@^1.3.0, once@^1.3.3, once@^1.4.0:
once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
dependencies:
@ -5687,6 +5879,13 @@ parse-glob@^3.0.4:
is-extglob "^1.0.0"
is-glob "^2.0.0"
parse-headers@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536"
dependencies:
for-each "^0.3.2"
trim "0.0.1"
parse-json@^2.1.0, parse-json@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@ -6168,6 +6367,13 @@ pretty-format@^21.2.1:
ansi-regex "^3.0.0"
ansi-styles "^3.2.0"
print-value@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/print-value/-/print-value-1.0.0.tgz#55b3a3a2ec4d0a6125257070700ca582c4b8eb7e"
dependencies:
isobject "~2.0.0"
json-stringify-safe "~5.0.1"
private@^0.1.6, private@^0.1.7:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@ -6184,6 +6390,10 @@ process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
process@~0.5.1:
version "0.5.2"
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
progress@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
@ -6257,6 +6467,14 @@ qs@~6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
query-string-flatten@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/query-string-flatten/-/query-string-flatten-1.0.0.tgz#33bb7b3b09d6a08cf2a887535761035900e69a8d"
dependencies:
obj-query "~1.0.0"
query-string "~3.0.0"
value-pipe "~1.0.0"
query-string@^4.1.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
@ -6264,6 +6482,20 @@ query-string@^4.1.0:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
query-string@^5.0.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
dependencies:
decode-uri-component "^0.2.0"
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
query-string@~3.0.0:
version "3.0.3"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-3.0.3.tgz#ae2e14b4d05071d4e9b9eb4873c35b0dcd42e638"
dependencies:
strict-uri-encode "^1.0.0"
querystring-es3@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@ -6567,6 +6799,18 @@ readable-stream@^2.0.6, readable-stream@^2.1.4:
string_decoder "~1.0.3"
util-deprecate "~1.0.1"
readable-stream@^2.1.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
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@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
@ -6902,6 +7146,12 @@ run-async@^2.2.0:
dependencies:
is-promise "^2.1.0"
rust-result@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
dependencies:
individual "^2.0.0"
rw@1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
@ -6926,6 +7176,12 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
safe-json-parse@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
dependencies:
rust-result "^1.0.0"
sane@~1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775"
@ -7093,6 +7349,18 @@ 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"
simple-concat@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
simple-get@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.7.0.tgz#ad37f926d08129237ff08c4f2edfd6f10e0380b5"
dependencies:
decompress-response "^3.3.0"
once "^1.3.1"
simple-concat "^1.0.0"
simple-statistics@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/simple-statistics/-/simple-statistics-4.1.1.tgz#533c48d48336ba3d350d8135f20fa7138acb0c7d"
@ -7296,6 +7564,19 @@ stream-http@^2.7.2:
to-arraybuffer "^1.0.0"
xtend "^4.0.0"
stream-selector@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/stream-selector/-/stream-selector-0.1.1.tgz#bef2ea3af72b7d17b0cd5fe6970a71698c38afe3"
dependencies:
inherits "^2.0.3"
stream-selector@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/stream-selector/-/stream-selector-0.3.0.tgz#ba2223c0fd449e3a9ea16444f52142ea79506ec4"
dependencies:
inherits "^2.0.3"
through2 "^2.0.3"
stream-to-observable@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10"
@ -7345,6 +7626,12 @@ string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
dependencies:
safe-buffer "~5.1.0"
stringify-object@^3.2.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.1.tgz#2720c2eff940854c819f6ee252aaeb581f30624d"
@ -7536,7 +7823,14 @@ throat@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836"
through@^2.3.6:
through2@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
dependencies:
readable-stream "^2.1.5"
xtend "~4.0.1"
"through@>=2.2.7 <3", through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@ -7558,6 +7852,10 @@ timed-out@^3.0.0:
version "3.1.3"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217"
timed-out@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
timers-browserify@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
@ -7634,12 +7932,20 @@ trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
trim@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
"true-case-path@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62"
dependencies:
glob "^6.0.4"
tslib@^1.7.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
tslib@^1.8.0:
version "1.8.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac"
@ -7770,6 +8076,10 @@ urijs@^1.16.1:
version "1.19.0"
resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.0.tgz#d8aa284d0e7469703a6988ad045c4cbfdf08ada0"
url-join@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
url-loader@0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
@ -7798,6 +8108,10 @@ url-parse@^1.1.8:
querystringify "~1.0.0"
requires-port "~1.0.0"
url-set-query@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339"
url-toolkit@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.1.tgz#96c2da3cd672df1aa2ac7fc89240b2dcf5c99a80"
@ -7816,6 +8130,12 @@ usb@^1.3.1:
nan "^2.8.0"
node-pre-gyp "^0.6.30"
utf8-encoding@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/utf8-encoding/-/utf8-encoding-0.1.2.tgz#8717015cb8b923bc0303bf4af520af96f06ae9a2"
dependencies:
obtain-unicode "~0.0.5"
utf8@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96"
@ -7861,6 +8181,10 @@ validate-npm-package-license@^3.0.1:
spdx-correct "~1.0.0"
spdx-expression-parse "~1.0.0"
value-pipe@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/value-pipe/-/value-pipe-1.0.1.tgz#c7f09dbb105a72a9f5bdbd7085b537f10e995492"
vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@ -8468,6 +8792,27 @@ xdg-basedir@^2.0.0:
dependencies:
os-homedir "^1.0.0"
xhr-request@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed"
dependencies:
buffer-to-arraybuffer "^0.0.5"
object-assign "^4.1.1"
query-string "^5.0.1"
simple-get "^2.7.0"
timed-out "^4.0.1"
url-set-query "^1.0.0"
xhr "^2.0.4"
xhr@^2.0.4:
version "2.4.1"
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.1.tgz#ba982cced205ae5eec387169ac9dc77ca4853d38"
dependencies:
global "~4.3.0"
is-function "^1.0.1"
parse-headers "^2.0.0"
xtend "^4.0.0"
xml-char-classes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
@ -8484,7 +8829,7 @@ xmlhttprequest@1:
version "1.8.0"
resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0:
xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"