├── .gitignore
├── .npmignore
├── .nycrc
├── .travis.yml
├── README.md
├── examples
├── rtp-filters.ts
├── rtp-info.ts
└── sample.ts
├── files
└── .gitkeep
├── index.js
├── mocha.opts
├── package-lock.json
├── package.json
├── samples
├── README.md
├── SIP_CALL_RTP_G711.pcap
├── aaa.pcap
├── sip-rtp-g711.pcap
├── sip-rtp-g729a.pcap
└── sip-rtp-gsm.pcap
├── src
├── api
│ ├── index.ts
│ ├── pcap-to-wav.spec.ts
│ └── pcap-to-wav.ts
├── helpers
│ ├── exists-async.ts
│ ├── index.spec.ts
│ ├── index.ts
│ └── payload-types.ts
├── index.spec.ts
├── index.ts
├── sox
│ └── index.ts
├── tshark
│ ├── index.spec.ts
│ ├── index.ts
│ └── rtp-info.ts
└── typings.d.ts
├── tsconfig.json
└── tslint.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode
2 | node_modules
3 | files/*
4 | coverage.lcov
5 | .nyc_output
6 | coverage
7 | out
8 |
9 | !.gitkeep
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .vscode
2 | node_modules
3 | files/*
4 | coverage.lcov
5 | .nyc_output
6 | coverage
7 | src
8 |
9 | !.gitkeep
--------------------------------------------------------------------------------
/.nycrc:
--------------------------------------------------------------------------------
1 | {
2 | "include": [
3 | "src/**/*.ts"
4 | ],
5 | "extension": [
6 | ".ts"
7 | ],
8 | "require": [
9 | "ts-node/register"
10 | ],
11 | "reporter": [
12 | "text-summary",
13 | "html"
14 | ],
15 | "sourceMap": true,
16 | "instrument": true
17 | }
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "8.0.0"
4 | - "8.2.1"
5 | - "9.2.1"
6 |
7 | branches:
8 | only:
9 | - master
10 | - dev
11 |
12 | before_install:
13 | - sudo apt-get install -y tshark sox
14 |
15 | before_script:
16 | - npm run lint
17 |
18 | after_success:
19 | - npm run coverage
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://www.npmjs.com/package/pcap2wav) [](https://travis-ci.org/Bobrovskih/pcap2wav)
2 | [](https://codecov.io/gh/Bobrovskih/pcap2wav)
3 |
4 | # pcap2wav
5 | Извлекает из pcap файла (rtp) аудио в wav формате
6 |
7 | Поддерживаемые кодеки:
8 | - PCMA
9 | - PCMU
10 |
11 | ## Требования
12 | - nodejs >= 8.0.0
13 | - tshark 2.4.5
14 | - sox 14.4.2
15 |
16 | ## Установка
17 | `npm i pcap2wav`
18 |
19 | ## Использование
20 | ```javascript
21 | const { pcap2wav } = require('pcap2wav');
22 |
23 | const options = { pcap: '/absolute/path/to/pcap/file.pcap' };
24 | const { success, wav } = await pcap2wav(options);
25 | console.log(success, wav); // => true, '/absolute/path/to/wav/file.wav'
26 | ```
27 |
28 | | Параметр | Тип | Описание |
29 | | --------- | ---- | -------- |
30 | | options | object
| параметры |
31 | | options.pcap | string
| абсолютный путь до .pcap файла |
32 | | options.clean| boolean
| очищать мусор из рабочей папки |
33 |
--------------------------------------------------------------------------------
/examples/rtp-filters.ts:
--------------------------------------------------------------------------------
1 | // tslint:disable:no-console
2 |
3 | import { pcap2wav, rtpInfo } from '../src';
4 | import * as path from 'path';
5 |
6 | const main = async () => {
7 | const pcap = path.resolve(__dirname, '../samples/SIP_CALL_RTP_G711.pcap');
8 | const { info } = await rtpInfo({ pcap });
9 | const filters = info.slice(0, 2);
10 | const result = await pcap2wav({ filters, pcap });
11 | console.log(result);
12 | };
13 |
14 | main();
15 |
--------------------------------------------------------------------------------
/examples/rtp-info.ts:
--------------------------------------------------------------------------------
1 | // tslint:disable:no-console
2 | import { rtpInfo } from '../src';
3 | import * as path from 'path';
4 |
5 | const main = async () => {
6 | const pcap = path.resolve(__dirname, '../samples/aaa.pcap');
7 | const result = await rtpInfo({ pcap });
8 | console.log(result);
9 | };
10 |
11 | main();
12 |
--------------------------------------------------------------------------------
/examples/sample.ts:
--------------------------------------------------------------------------------
1 | // tslint:disable:no-console
2 |
3 | import { pcap2wav } from '../src';
4 | import * as path from 'path';
5 |
6 | const main = async () => {
7 | const pcap = path.resolve(__dirname, '../samples/aaa.pcap');
8 | const result = await pcap2wav({ pcap });
9 | console.log(result);
10 | };
11 |
12 | main();
13 |
--------------------------------------------------------------------------------
/files/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bobrovskih/pcap2wav/71b10f09e3276f3f73302432bdde255fcc754fed/files/.gitkeep
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | module.exports = require('./out');
2 |
--------------------------------------------------------------------------------
/mocha.opts:
--------------------------------------------------------------------------------
1 | --require ts-node/register
2 | --full-trace
3 | --bail
4 | --timeout 20000
5 |
6 | src/**/*.spec.ts
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pcap2wav",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.0.0-beta.51",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz",
10 | "integrity": "sha1-vXHZsZKvl435FYKdOdQJRFZDmgw=",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "7.0.0-beta.51"
14 | }
15 | },
16 | "@babel/generator": {
17 | "version": "7.0.0-beta.51",
18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.51.tgz",
19 | "integrity": "sha1-bHV1/952HQdIXgS67cA5LG2eMPY=",
20 | "dev": true,
21 | "requires": {
22 | "@babel/types": "7.0.0-beta.51",
23 | "jsesc": "2.5.1",
24 | "lodash": "4.17.10",
25 | "source-map": "0.5.7",
26 | "trim-right": "1.0.1"
27 | },
28 | "dependencies": {
29 | "source-map": {
30 | "version": "0.5.7",
31 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
32 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
33 | "dev": true
34 | }
35 | }
36 | },
37 | "@babel/helper-function-name": {
38 | "version": "7.0.0-beta.51",
39 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz",
40 | "integrity": "sha1-IbSHSiJ8+Z7K/MMKkDAtpaJkBWE=",
41 | "dev": true,
42 | "requires": {
43 | "@babel/helper-get-function-arity": "7.0.0-beta.51",
44 | "@babel/template": "7.0.0-beta.51",
45 | "@babel/types": "7.0.0-beta.51"
46 | }
47 | },
48 | "@babel/helper-get-function-arity": {
49 | "version": "7.0.0-beta.51",
50 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz",
51 | "integrity": "sha1-MoGy0EWvlcFyzpGyCCXYXqRnZBE=",
52 | "dev": true,
53 | "requires": {
54 | "@babel/types": "7.0.0-beta.51"
55 | }
56 | },
57 | "@babel/helper-split-export-declaration": {
58 | "version": "7.0.0-beta.51",
59 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz",
60 | "integrity": "sha1-imw/ZsTSZTUvwHdIT59ugKUauXg=",
61 | "dev": true,
62 | "requires": {
63 | "@babel/types": "7.0.0-beta.51"
64 | }
65 | },
66 | "@babel/highlight": {
67 | "version": "7.0.0-beta.51",
68 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.51.tgz",
69 | "integrity": "sha1-6IRK4loVlcz9QriWI7Q3bKBtIl0=",
70 | "dev": true,
71 | "requires": {
72 | "chalk": "2.4.1",
73 | "esutils": "2.0.2",
74 | "js-tokens": "3.0.2"
75 | }
76 | },
77 | "@babel/parser": {
78 | "version": "7.0.0-beta.51",
79 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.51.tgz",
80 | "integrity": "sha1-J87C30Cd9gr1gnDtj2qlVAnqhvY=",
81 | "dev": true
82 | },
83 | "@babel/template": {
84 | "version": "7.0.0-beta.51",
85 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.51.tgz",
86 | "integrity": "sha1-lgKkCuvPNXrpZ34lMu9fyBD1+/8=",
87 | "dev": true,
88 | "requires": {
89 | "@babel/code-frame": "7.0.0-beta.51",
90 | "@babel/parser": "7.0.0-beta.51",
91 | "@babel/types": "7.0.0-beta.51",
92 | "lodash": "4.17.10"
93 | }
94 | },
95 | "@babel/traverse": {
96 | "version": "7.0.0-beta.51",
97 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.51.tgz",
98 | "integrity": "sha1-mB2vLOw0emIx06odnhgDsDqqpKg=",
99 | "dev": true,
100 | "requires": {
101 | "@babel/code-frame": "7.0.0-beta.51",
102 | "@babel/generator": "7.0.0-beta.51",
103 | "@babel/helper-function-name": "7.0.0-beta.51",
104 | "@babel/helper-split-export-declaration": "7.0.0-beta.51",
105 | "@babel/parser": "7.0.0-beta.51",
106 | "@babel/types": "7.0.0-beta.51",
107 | "debug": "3.1.0",
108 | "globals": "11.7.0",
109 | "invariant": "2.2.4",
110 | "lodash": "4.17.10"
111 | }
112 | },
113 | "@babel/types": {
114 | "version": "7.0.0-beta.51",
115 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.51.tgz",
116 | "integrity": "sha1-2AK3tUO1g2x3iqaReXq/APPZfqk=",
117 | "dev": true,
118 | "requires": {
119 | "esutils": "2.0.2",
120 | "lodash": "4.17.10",
121 | "to-fast-properties": "2.0.0"
122 | }
123 | },
124 | "@types/chai": {
125 | "version": "4.1.4",
126 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.4.tgz",
127 | "integrity": "sha512-h6+VEw2Vr3ORiFCyyJmcho2zALnUq9cvdB/IO8Xs9itrJVCenC7o26A6+m7D0ihTTr65eS259H5/Ghl/VjYs6g==",
128 | "dev": true
129 | },
130 | "@types/mocha": {
131 | "version": "5.2.4",
132 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.4.tgz",
133 | "integrity": "sha512-XMHApnKWI0jvXU5gLcSTsRjJBpSzP0BG+2oGv98JFyS4a5R0tRy0oshHBRndb3BuHb9AwDKaUL8Ja7GfUvsG4g==",
134 | "dev": true
135 | },
136 | "@types/node": {
137 | "version": "10.5.2",
138 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.2.tgz",
139 | "integrity": "sha512-m9zXmifkZsMHZBOyxZWilMwmTlpC8x5Ty360JKTiXvlXZfBWYpsg9ZZvP/Ye+iZUh+Q+MxDLjItVTWIsfwz+8Q==",
140 | "dev": true
141 | },
142 | "ajv": {
143 | "version": "5.5.2",
144 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
145 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
146 | "dev": true,
147 | "requires": {
148 | "co": "4.6.0",
149 | "fast-deep-equal": "1.1.0",
150 | "fast-json-stable-stringify": "2.0.0",
151 | "json-schema-traverse": "0.3.1"
152 | }
153 | },
154 | "ansi-regex": {
155 | "version": "2.1.1",
156 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
157 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
158 | "dev": true
159 | },
160 | "ansi-styles": {
161 | "version": "2.2.1",
162 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
163 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
164 | "dev": true
165 | },
166 | "argparse": {
167 | "version": "1.0.10",
168 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
169 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
170 | "dev": true,
171 | "requires": {
172 | "sprintf-js": "1.0.3"
173 | }
174 | },
175 | "argv": {
176 | "version": "0.0.2",
177 | "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz",
178 | "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=",
179 | "dev": true
180 | },
181 | "arrify": {
182 | "version": "1.0.1",
183 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
184 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
185 | },
186 | "asn1": {
187 | "version": "0.2.3",
188 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
189 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
190 | "dev": true
191 | },
192 | "assert-plus": {
193 | "version": "1.0.0",
194 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
195 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
196 | "dev": true
197 | },
198 | "assertion-error": {
199 | "version": "1.1.0",
200 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
201 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
202 | "dev": true
203 | },
204 | "asynckit": {
205 | "version": "0.4.0",
206 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
207 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
208 | "dev": true
209 | },
210 | "aws-sign2": {
211 | "version": "0.7.0",
212 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
213 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
214 | "dev": true
215 | },
216 | "aws4": {
217 | "version": "1.7.0",
218 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
219 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
220 | "dev": true
221 | },
222 | "babel-code-frame": {
223 | "version": "6.26.0",
224 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
225 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
226 | "dev": true,
227 | "requires": {
228 | "chalk": "1.1.3",
229 | "esutils": "2.0.2",
230 | "js-tokens": "3.0.2"
231 | },
232 | "dependencies": {
233 | "chalk": {
234 | "version": "1.1.3",
235 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
236 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
237 | "dev": true,
238 | "requires": {
239 | "ansi-styles": "2.2.1",
240 | "escape-string-regexp": "1.0.5",
241 | "has-ansi": "2.0.0",
242 | "strip-ansi": "3.0.1",
243 | "supports-color": "2.0.0"
244 | }
245 | }
246 | }
247 | },
248 | "balanced-match": {
249 | "version": "1.0.0",
250 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
251 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
252 | "dev": true
253 | },
254 | "bcrypt-pbkdf": {
255 | "version": "1.0.2",
256 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
257 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
258 | "dev": true,
259 | "optional": true,
260 | "requires": {
261 | "tweetnacl": "0.14.5"
262 | }
263 | },
264 | "brace-expansion": {
265 | "version": "1.1.11",
266 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
267 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
268 | "dev": true,
269 | "requires": {
270 | "balanced-match": "1.0.0",
271 | "concat-map": "0.0.1"
272 | }
273 | },
274 | "browser-stdout": {
275 | "version": "1.3.1",
276 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
277 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
278 | "dev": true
279 | },
280 | "buffer-from": {
281 | "version": "1.1.0",
282 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
283 | "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ=="
284 | },
285 | "builtin-modules": {
286 | "version": "1.1.1",
287 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
288 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
289 | "dev": true
290 | },
291 | "caseless": {
292 | "version": "0.12.0",
293 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
294 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
295 | "dev": true
296 | },
297 | "chai": {
298 | "version": "4.1.2",
299 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
300 | "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
301 | "dev": true,
302 | "requires": {
303 | "assertion-error": "1.1.0",
304 | "check-error": "1.0.2",
305 | "deep-eql": "3.0.1",
306 | "get-func-name": "2.0.0",
307 | "pathval": "1.1.0",
308 | "type-detect": "4.0.8"
309 | }
310 | },
311 | "chalk": {
312 | "version": "2.4.1",
313 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
314 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
315 | "dev": true,
316 | "requires": {
317 | "ansi-styles": "3.2.1",
318 | "escape-string-regexp": "1.0.5",
319 | "supports-color": "5.4.0"
320 | },
321 | "dependencies": {
322 | "ansi-styles": {
323 | "version": "3.2.1",
324 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
325 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
326 | "dev": true,
327 | "requires": {
328 | "color-convert": "1.9.2"
329 | }
330 | },
331 | "supports-color": {
332 | "version": "5.4.0",
333 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
334 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
335 | "dev": true,
336 | "requires": {
337 | "has-flag": "3.0.0"
338 | }
339 | }
340 | }
341 | },
342 | "check-error": {
343 | "version": "1.0.2",
344 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
345 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
346 | "dev": true
347 | },
348 | "co": {
349 | "version": "4.6.0",
350 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
351 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
352 | "dev": true
353 | },
354 | "codecov": {
355 | "version": "3.0.4",
356 | "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.4.tgz",
357 | "integrity": "sha512-KJyzHdg9B8U9LxXa7hS6jnEW5b1cNckLYc2YpnJ1nEFiOW+/iSzDHp+5MYEIQd9fN3/tC6WmGZmYiwxzkuGp/A==",
358 | "dev": true,
359 | "requires": {
360 | "argv": "0.0.2",
361 | "ignore-walk": "3.0.1",
362 | "request": "2.87.0",
363 | "urlgrey": "0.4.4"
364 | }
365 | },
366 | "color-convert": {
367 | "version": "1.9.2",
368 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
369 | "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
370 | "dev": true,
371 | "requires": {
372 | "color-name": "1.1.1"
373 | }
374 | },
375 | "color-name": {
376 | "version": "1.1.1",
377 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
378 | "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
379 | "dev": true
380 | },
381 | "combined-stream": {
382 | "version": "1.0.6",
383 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
384 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
385 | "dev": true,
386 | "requires": {
387 | "delayed-stream": "1.0.0"
388 | }
389 | },
390 | "commander": {
391 | "version": "2.16.0",
392 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz",
393 | "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==",
394 | "dev": true
395 | },
396 | "concat-map": {
397 | "version": "0.0.1",
398 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
399 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
400 | "dev": true
401 | },
402 | "core-util-is": {
403 | "version": "1.0.2",
404 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
405 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
406 | "dev": true
407 | },
408 | "dashdash": {
409 | "version": "1.14.1",
410 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
411 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
412 | "dev": true,
413 | "requires": {
414 | "assert-plus": "1.0.0"
415 | }
416 | },
417 | "debug": {
418 | "version": "3.1.0",
419 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
420 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
421 | "requires": {
422 | "ms": "2.0.0"
423 | }
424 | },
425 | "deep-eql": {
426 | "version": "3.0.1",
427 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
428 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
429 | "dev": true,
430 | "requires": {
431 | "type-detect": "4.0.8"
432 | }
433 | },
434 | "delayed-stream": {
435 | "version": "1.0.0",
436 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
437 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
438 | "dev": true
439 | },
440 | "diff": {
441 | "version": "3.5.0",
442 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
443 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
444 | },
445 | "ecc-jsbn": {
446 | "version": "0.1.1",
447 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
448 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
449 | "dev": true,
450 | "optional": true,
451 | "requires": {
452 | "jsbn": "0.1.1"
453 | }
454 | },
455 | "escape-string-regexp": {
456 | "version": "1.0.5",
457 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
458 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
459 | "dev": true
460 | },
461 | "esprima": {
462 | "version": "4.0.0",
463 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
464 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
465 | "dev": true
466 | },
467 | "esutils": {
468 | "version": "2.0.2",
469 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
470 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
471 | "dev": true
472 | },
473 | "extend": {
474 | "version": "3.0.1",
475 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
476 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
477 | "dev": true
478 | },
479 | "extsprintf": {
480 | "version": "1.3.0",
481 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
482 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
483 | "dev": true
484 | },
485 | "fast-deep-equal": {
486 | "version": "1.1.0",
487 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
488 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
489 | "dev": true
490 | },
491 | "fast-json-stable-stringify": {
492 | "version": "2.0.0",
493 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
494 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
495 | "dev": true
496 | },
497 | "forever-agent": {
498 | "version": "0.6.1",
499 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
500 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
501 | "dev": true
502 | },
503 | "form-data": {
504 | "version": "2.3.2",
505 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
506 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
507 | "dev": true,
508 | "requires": {
509 | "asynckit": "0.4.0",
510 | "combined-stream": "1.0.6",
511 | "mime-types": "2.1.18"
512 | }
513 | },
514 | "fs.realpath": {
515 | "version": "1.0.0",
516 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
517 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
518 | "dev": true
519 | },
520 | "get-func-name": {
521 | "version": "2.0.0",
522 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
523 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
524 | "dev": true
525 | },
526 | "getpass": {
527 | "version": "0.1.7",
528 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
529 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
530 | "dev": true,
531 | "requires": {
532 | "assert-plus": "1.0.0"
533 | }
534 | },
535 | "glob": {
536 | "version": "7.1.2",
537 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
538 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
539 | "dev": true,
540 | "requires": {
541 | "fs.realpath": "1.0.0",
542 | "inflight": "1.0.6",
543 | "inherits": "2.0.3",
544 | "minimatch": "3.0.4",
545 | "once": "1.4.0",
546 | "path-is-absolute": "1.0.1"
547 | }
548 | },
549 | "globals": {
550 | "version": "11.7.0",
551 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
552 | "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
553 | "dev": true
554 | },
555 | "growl": {
556 | "version": "1.10.5",
557 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
558 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
559 | "dev": true
560 | },
561 | "har-schema": {
562 | "version": "2.0.0",
563 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
564 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
565 | "dev": true
566 | },
567 | "har-validator": {
568 | "version": "5.0.3",
569 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
570 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
571 | "dev": true,
572 | "requires": {
573 | "ajv": "5.5.2",
574 | "har-schema": "2.0.0"
575 | }
576 | },
577 | "has-ansi": {
578 | "version": "2.0.0",
579 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
580 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
581 | "dev": true,
582 | "requires": {
583 | "ansi-regex": "2.1.1"
584 | }
585 | },
586 | "has-flag": {
587 | "version": "3.0.0",
588 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
589 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
590 | "dev": true
591 | },
592 | "he": {
593 | "version": "1.1.1",
594 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
595 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
596 | "dev": true
597 | },
598 | "http-signature": {
599 | "version": "1.2.0",
600 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
601 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
602 | "dev": true,
603 | "requires": {
604 | "assert-plus": "1.0.0",
605 | "jsprim": "1.4.1",
606 | "sshpk": "1.14.2"
607 | }
608 | },
609 | "ignore-walk": {
610 | "version": "3.0.1",
611 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
612 | "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
613 | "dev": true,
614 | "requires": {
615 | "minimatch": "3.0.4"
616 | }
617 | },
618 | "inflight": {
619 | "version": "1.0.6",
620 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
621 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
622 | "dev": true,
623 | "requires": {
624 | "once": "1.4.0",
625 | "wrappy": "1.0.2"
626 | }
627 | },
628 | "inherits": {
629 | "version": "2.0.3",
630 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
631 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
632 | "dev": true
633 | },
634 | "invariant": {
635 | "version": "2.2.4",
636 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
637 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
638 | "dev": true,
639 | "requires": {
640 | "loose-envify": "1.3.1"
641 | }
642 | },
643 | "is-typedarray": {
644 | "version": "1.0.0",
645 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
646 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
647 | "dev": true
648 | },
649 | "isstream": {
650 | "version": "0.1.2",
651 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
652 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
653 | "dev": true
654 | },
655 | "istanbul-lib-coverage": {
656 | "version": "2.0.1",
657 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz",
658 | "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==",
659 | "dev": true
660 | },
661 | "istanbul-lib-instrument": {
662 | "version": "2.3.1",
663 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-2.3.1.tgz",
664 | "integrity": "sha512-h9Vg3nfbxrF0PK0kZiNiMAyL8zXaLiBP/BXniaKSwVvAi1TaumYV2b0wPdmy1CRX3irYbYD1p4Wjbv4uyECiiQ==",
665 | "dev": true,
666 | "requires": {
667 | "@babel/generator": "7.0.0-beta.51",
668 | "@babel/parser": "7.0.0-beta.51",
669 | "@babel/template": "7.0.0-beta.51",
670 | "@babel/traverse": "7.0.0-beta.51",
671 | "@babel/types": "7.0.0-beta.51",
672 | "istanbul-lib-coverage": "2.0.1",
673 | "semver": "5.5.0"
674 | }
675 | },
676 | "js-tokens": {
677 | "version": "3.0.2",
678 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
679 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
680 | "dev": true
681 | },
682 | "js-yaml": {
683 | "version": "3.12.0",
684 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
685 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
686 | "dev": true,
687 | "requires": {
688 | "argparse": "1.0.10",
689 | "esprima": "4.0.0"
690 | }
691 | },
692 | "jsbn": {
693 | "version": "0.1.1",
694 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
695 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
696 | "dev": true,
697 | "optional": true
698 | },
699 | "jsesc": {
700 | "version": "2.5.1",
701 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
702 | "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
703 | "dev": true
704 | },
705 | "json-schema": {
706 | "version": "0.2.3",
707 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
708 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
709 | "dev": true
710 | },
711 | "json-schema-traverse": {
712 | "version": "0.3.1",
713 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
714 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
715 | "dev": true
716 | },
717 | "json-stringify-safe": {
718 | "version": "5.0.1",
719 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
720 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
721 | "dev": true
722 | },
723 | "jsprim": {
724 | "version": "1.4.1",
725 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
726 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
727 | "dev": true,
728 | "requires": {
729 | "assert-plus": "1.0.0",
730 | "extsprintf": "1.3.0",
731 | "json-schema": "0.2.3",
732 | "verror": "1.10.0"
733 | }
734 | },
735 | "lodash": {
736 | "version": "4.17.10",
737 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
738 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
739 | "dev": true
740 | },
741 | "loose-envify": {
742 | "version": "1.3.1",
743 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
744 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
745 | "dev": true,
746 | "requires": {
747 | "js-tokens": "3.0.2"
748 | }
749 | },
750 | "make-error": {
751 | "version": "1.3.4",
752 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz",
753 | "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g=="
754 | },
755 | "mime-db": {
756 | "version": "1.33.0",
757 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
758 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
759 | "dev": true
760 | },
761 | "mime-types": {
762 | "version": "2.1.18",
763 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
764 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
765 | "dev": true,
766 | "requires": {
767 | "mime-db": "1.33.0"
768 | }
769 | },
770 | "minimatch": {
771 | "version": "3.0.4",
772 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
773 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
774 | "dev": true,
775 | "requires": {
776 | "brace-expansion": "1.1.11"
777 | }
778 | },
779 | "minimist": {
780 | "version": "1.2.0",
781 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
782 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
783 | },
784 | "mkdirp": {
785 | "version": "0.5.1",
786 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
787 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
788 | "requires": {
789 | "minimist": "0.0.8"
790 | },
791 | "dependencies": {
792 | "minimist": {
793 | "version": "0.0.8",
794 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
795 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
796 | }
797 | }
798 | },
799 | "mocha": {
800 | "version": "5.2.0",
801 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
802 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
803 | "dev": true,
804 | "requires": {
805 | "browser-stdout": "1.3.1",
806 | "commander": "2.15.1",
807 | "debug": "3.1.0",
808 | "diff": "3.5.0",
809 | "escape-string-regexp": "1.0.5",
810 | "glob": "7.1.2",
811 | "growl": "1.10.5",
812 | "he": "1.1.1",
813 | "minimatch": "3.0.4",
814 | "mkdirp": "0.5.1",
815 | "supports-color": "5.4.0"
816 | },
817 | "dependencies": {
818 | "commander": {
819 | "version": "2.15.1",
820 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
821 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
822 | "dev": true
823 | },
824 | "supports-color": {
825 | "version": "5.4.0",
826 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
827 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
828 | "dev": true,
829 | "requires": {
830 | "has-flag": "3.0.0"
831 | }
832 | }
833 | }
834 | },
835 | "ms": {
836 | "version": "2.0.0",
837 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
838 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
839 | },
840 | "nyc": {
841 | "version": "12.0.2",
842 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-12.0.2.tgz",
843 | "integrity": "sha1-ikpO1pCWbBHsWH/4fuoMEsl0upk=",
844 | "dev": true,
845 | "requires": {
846 | "archy": "1.0.0",
847 | "arrify": "1.0.1",
848 | "caching-transform": "1.0.1",
849 | "convert-source-map": "1.5.1",
850 | "debug-log": "1.0.1",
851 | "default-require-extensions": "1.0.0",
852 | "find-cache-dir": "0.1.1",
853 | "find-up": "2.1.0",
854 | "foreground-child": "1.5.6",
855 | "glob": "7.1.2",
856 | "istanbul-lib-coverage": "1.2.0",
857 | "istanbul-lib-hook": "1.1.0",
858 | "istanbul-lib-instrument": "2.3.1",
859 | "istanbul-lib-report": "1.1.3",
860 | "istanbul-lib-source-maps": "1.2.5",
861 | "istanbul-reports": "1.4.1",
862 | "md5-hex": "1.3.0",
863 | "merge-source-map": "1.1.0",
864 | "micromatch": "3.1.10",
865 | "mkdirp": "0.5.1",
866 | "resolve-from": "2.0.0",
867 | "rimraf": "2.6.2",
868 | "signal-exit": "3.0.2",
869 | "spawn-wrap": "1.4.2",
870 | "test-exclude": "4.2.1",
871 | "yargs": "11.1.0",
872 | "yargs-parser": "8.1.0"
873 | },
874 | "dependencies": {
875 | "align-text": {
876 | "version": "0.1.4",
877 | "bundled": true,
878 | "dev": true,
879 | "requires": {
880 | "kind-of": "3.2.2",
881 | "longest": "1.0.1",
882 | "repeat-string": "1.6.1"
883 | }
884 | },
885 | "amdefine": {
886 | "version": "1.0.1",
887 | "bundled": true,
888 | "dev": true
889 | },
890 | "ansi-regex": {
891 | "version": "3.0.0",
892 | "bundled": true,
893 | "dev": true
894 | },
895 | "append-transform": {
896 | "version": "0.4.0",
897 | "bundled": true,
898 | "dev": true,
899 | "requires": {
900 | "default-require-extensions": "1.0.0"
901 | }
902 | },
903 | "archy": {
904 | "version": "1.0.0",
905 | "bundled": true,
906 | "dev": true
907 | },
908 | "arr-diff": {
909 | "version": "4.0.0",
910 | "bundled": true,
911 | "dev": true
912 | },
913 | "arr-flatten": {
914 | "version": "1.1.0",
915 | "bundled": true,
916 | "dev": true
917 | },
918 | "arr-union": {
919 | "version": "3.1.0",
920 | "bundled": true,
921 | "dev": true
922 | },
923 | "array-unique": {
924 | "version": "0.3.2",
925 | "bundled": true,
926 | "dev": true
927 | },
928 | "arrify": {
929 | "version": "1.0.1",
930 | "bundled": true,
931 | "dev": true
932 | },
933 | "assign-symbols": {
934 | "version": "1.0.0",
935 | "bundled": true,
936 | "dev": true
937 | },
938 | "async": {
939 | "version": "1.5.2",
940 | "bundled": true,
941 | "dev": true
942 | },
943 | "atob": {
944 | "version": "2.1.1",
945 | "bundled": true,
946 | "dev": true
947 | },
948 | "balanced-match": {
949 | "version": "1.0.0",
950 | "bundled": true,
951 | "dev": true
952 | },
953 | "base": {
954 | "version": "0.11.2",
955 | "bundled": true,
956 | "dev": true,
957 | "requires": {
958 | "cache-base": "1.0.1",
959 | "class-utils": "0.3.6",
960 | "component-emitter": "1.2.1",
961 | "define-property": "1.0.0",
962 | "isobject": "3.0.1",
963 | "mixin-deep": "1.3.1",
964 | "pascalcase": "0.1.1"
965 | },
966 | "dependencies": {
967 | "define-property": {
968 | "version": "1.0.0",
969 | "bundled": true,
970 | "dev": true,
971 | "requires": {
972 | "is-descriptor": "1.0.2"
973 | }
974 | },
975 | "is-accessor-descriptor": {
976 | "version": "1.0.0",
977 | "bundled": true,
978 | "dev": true,
979 | "requires": {
980 | "kind-of": "6.0.2"
981 | }
982 | },
983 | "is-data-descriptor": {
984 | "version": "1.0.0",
985 | "bundled": true,
986 | "dev": true,
987 | "requires": {
988 | "kind-of": "6.0.2"
989 | }
990 | },
991 | "is-descriptor": {
992 | "version": "1.0.2",
993 | "bundled": true,
994 | "dev": true,
995 | "requires": {
996 | "is-accessor-descriptor": "1.0.0",
997 | "is-data-descriptor": "1.0.0",
998 | "kind-of": "6.0.2"
999 | }
1000 | },
1001 | "kind-of": {
1002 | "version": "6.0.2",
1003 | "bundled": true,
1004 | "dev": true
1005 | }
1006 | }
1007 | },
1008 | "brace-expansion": {
1009 | "version": "1.1.11",
1010 | "bundled": true,
1011 | "dev": true,
1012 | "requires": {
1013 | "balanced-match": "1.0.0",
1014 | "concat-map": "0.0.1"
1015 | }
1016 | },
1017 | "braces": {
1018 | "version": "2.3.2",
1019 | "bundled": true,
1020 | "dev": true,
1021 | "requires": {
1022 | "arr-flatten": "1.1.0",
1023 | "array-unique": "0.3.2",
1024 | "extend-shallow": "2.0.1",
1025 | "fill-range": "4.0.0",
1026 | "isobject": "3.0.1",
1027 | "repeat-element": "1.1.2",
1028 | "snapdragon": "0.8.2",
1029 | "snapdragon-node": "2.1.1",
1030 | "split-string": "3.1.0",
1031 | "to-regex": "3.0.2"
1032 | },
1033 | "dependencies": {
1034 | "extend-shallow": {
1035 | "version": "2.0.1",
1036 | "bundled": true,
1037 | "dev": true,
1038 | "requires": {
1039 | "is-extendable": "0.1.1"
1040 | }
1041 | }
1042 | }
1043 | },
1044 | "builtin-modules": {
1045 | "version": "1.1.1",
1046 | "bundled": true,
1047 | "dev": true
1048 | },
1049 | "cache-base": {
1050 | "version": "1.0.1",
1051 | "bundled": true,
1052 | "dev": true,
1053 | "requires": {
1054 | "collection-visit": "1.0.0",
1055 | "component-emitter": "1.2.1",
1056 | "get-value": "2.0.6",
1057 | "has-value": "1.0.0",
1058 | "isobject": "3.0.1",
1059 | "set-value": "2.0.0",
1060 | "to-object-path": "0.3.0",
1061 | "union-value": "1.0.0",
1062 | "unset-value": "1.0.0"
1063 | }
1064 | },
1065 | "caching-transform": {
1066 | "version": "1.0.1",
1067 | "bundled": true,
1068 | "dev": true,
1069 | "requires": {
1070 | "md5-hex": "1.3.0",
1071 | "mkdirp": "0.5.1",
1072 | "write-file-atomic": "1.3.4"
1073 | }
1074 | },
1075 | "camelcase": {
1076 | "version": "1.2.1",
1077 | "bundled": true,
1078 | "dev": true,
1079 | "optional": true
1080 | },
1081 | "center-align": {
1082 | "version": "0.1.3",
1083 | "bundled": true,
1084 | "dev": true,
1085 | "optional": true,
1086 | "requires": {
1087 | "align-text": "0.1.4",
1088 | "lazy-cache": "1.0.4"
1089 | }
1090 | },
1091 | "class-utils": {
1092 | "version": "0.3.6",
1093 | "bundled": true,
1094 | "dev": true,
1095 | "requires": {
1096 | "arr-union": "3.1.0",
1097 | "define-property": "0.2.5",
1098 | "isobject": "3.0.1",
1099 | "static-extend": "0.1.2"
1100 | },
1101 | "dependencies": {
1102 | "define-property": {
1103 | "version": "0.2.5",
1104 | "bundled": true,
1105 | "dev": true,
1106 | "requires": {
1107 | "is-descriptor": "0.1.6"
1108 | }
1109 | }
1110 | }
1111 | },
1112 | "cliui": {
1113 | "version": "2.1.0",
1114 | "bundled": true,
1115 | "dev": true,
1116 | "optional": true,
1117 | "requires": {
1118 | "center-align": "0.1.3",
1119 | "right-align": "0.1.3",
1120 | "wordwrap": "0.0.2"
1121 | },
1122 | "dependencies": {
1123 | "wordwrap": {
1124 | "version": "0.0.2",
1125 | "bundled": true,
1126 | "dev": true,
1127 | "optional": true
1128 | }
1129 | }
1130 | },
1131 | "code-point-at": {
1132 | "version": "1.1.0",
1133 | "bundled": true,
1134 | "dev": true
1135 | },
1136 | "collection-visit": {
1137 | "version": "1.0.0",
1138 | "bundled": true,
1139 | "dev": true,
1140 | "requires": {
1141 | "map-visit": "1.0.0",
1142 | "object-visit": "1.0.1"
1143 | }
1144 | },
1145 | "commondir": {
1146 | "version": "1.0.1",
1147 | "bundled": true,
1148 | "dev": true
1149 | },
1150 | "component-emitter": {
1151 | "version": "1.2.1",
1152 | "bundled": true,
1153 | "dev": true
1154 | },
1155 | "concat-map": {
1156 | "version": "0.0.1",
1157 | "bundled": true,
1158 | "dev": true
1159 | },
1160 | "convert-source-map": {
1161 | "version": "1.5.1",
1162 | "bundled": true,
1163 | "dev": true
1164 | },
1165 | "copy-descriptor": {
1166 | "version": "0.1.1",
1167 | "bundled": true,
1168 | "dev": true
1169 | },
1170 | "cross-spawn": {
1171 | "version": "4.0.2",
1172 | "bundled": true,
1173 | "dev": true,
1174 | "requires": {
1175 | "lru-cache": "4.1.3",
1176 | "which": "1.3.1"
1177 | }
1178 | },
1179 | "debug": {
1180 | "version": "3.1.0",
1181 | "bundled": true,
1182 | "dev": true,
1183 | "requires": {
1184 | "ms": "2.0.0"
1185 | }
1186 | },
1187 | "debug-log": {
1188 | "version": "1.0.1",
1189 | "bundled": true,
1190 | "dev": true
1191 | },
1192 | "decamelize": {
1193 | "version": "1.2.0",
1194 | "bundled": true,
1195 | "dev": true
1196 | },
1197 | "decode-uri-component": {
1198 | "version": "0.2.0",
1199 | "bundled": true,
1200 | "dev": true
1201 | },
1202 | "default-require-extensions": {
1203 | "version": "1.0.0",
1204 | "bundled": true,
1205 | "dev": true,
1206 | "requires": {
1207 | "strip-bom": "2.0.0"
1208 | }
1209 | },
1210 | "define-property": {
1211 | "version": "2.0.2",
1212 | "bundled": true,
1213 | "dev": true,
1214 | "requires": {
1215 | "is-descriptor": "1.0.2",
1216 | "isobject": "3.0.1"
1217 | },
1218 | "dependencies": {
1219 | "is-accessor-descriptor": {
1220 | "version": "1.0.0",
1221 | "bundled": true,
1222 | "dev": true,
1223 | "requires": {
1224 | "kind-of": "6.0.2"
1225 | }
1226 | },
1227 | "is-data-descriptor": {
1228 | "version": "1.0.0",
1229 | "bundled": true,
1230 | "dev": true,
1231 | "requires": {
1232 | "kind-of": "6.0.2"
1233 | }
1234 | },
1235 | "is-descriptor": {
1236 | "version": "1.0.2",
1237 | "bundled": true,
1238 | "dev": true,
1239 | "requires": {
1240 | "is-accessor-descriptor": "1.0.0",
1241 | "is-data-descriptor": "1.0.0",
1242 | "kind-of": "6.0.2"
1243 | }
1244 | },
1245 | "kind-of": {
1246 | "version": "6.0.2",
1247 | "bundled": true,
1248 | "dev": true
1249 | }
1250 | }
1251 | },
1252 | "error-ex": {
1253 | "version": "1.3.1",
1254 | "bundled": true,
1255 | "dev": true,
1256 | "requires": {
1257 | "is-arrayish": "0.2.1"
1258 | }
1259 | },
1260 | "execa": {
1261 | "version": "0.7.0",
1262 | "bundled": true,
1263 | "dev": true,
1264 | "requires": {
1265 | "cross-spawn": "5.1.0",
1266 | "get-stream": "3.0.0",
1267 | "is-stream": "1.1.0",
1268 | "npm-run-path": "2.0.2",
1269 | "p-finally": "1.0.0",
1270 | "signal-exit": "3.0.2",
1271 | "strip-eof": "1.0.0"
1272 | },
1273 | "dependencies": {
1274 | "cross-spawn": {
1275 | "version": "5.1.0",
1276 | "bundled": true,
1277 | "dev": true,
1278 | "requires": {
1279 | "lru-cache": "4.1.3",
1280 | "shebang-command": "1.2.0",
1281 | "which": "1.3.1"
1282 | }
1283 | }
1284 | }
1285 | },
1286 | "expand-brackets": {
1287 | "version": "2.1.4",
1288 | "bundled": true,
1289 | "dev": true,
1290 | "requires": {
1291 | "debug": "2.6.9",
1292 | "define-property": "0.2.5",
1293 | "extend-shallow": "2.0.1",
1294 | "posix-character-classes": "0.1.1",
1295 | "regex-not": "1.0.2",
1296 | "snapdragon": "0.8.2",
1297 | "to-regex": "3.0.2"
1298 | },
1299 | "dependencies": {
1300 | "debug": {
1301 | "version": "2.6.9",
1302 | "bundled": true,
1303 | "dev": true,
1304 | "requires": {
1305 | "ms": "2.0.0"
1306 | }
1307 | },
1308 | "define-property": {
1309 | "version": "0.2.5",
1310 | "bundled": true,
1311 | "dev": true,
1312 | "requires": {
1313 | "is-descriptor": "0.1.6"
1314 | }
1315 | },
1316 | "extend-shallow": {
1317 | "version": "2.0.1",
1318 | "bundled": true,
1319 | "dev": true,
1320 | "requires": {
1321 | "is-extendable": "0.1.1"
1322 | }
1323 | }
1324 | }
1325 | },
1326 | "extend-shallow": {
1327 | "version": "3.0.2",
1328 | "bundled": true,
1329 | "dev": true,
1330 | "requires": {
1331 | "assign-symbols": "1.0.0",
1332 | "is-extendable": "1.0.1"
1333 | },
1334 | "dependencies": {
1335 | "is-extendable": {
1336 | "version": "1.0.1",
1337 | "bundled": true,
1338 | "dev": true,
1339 | "requires": {
1340 | "is-plain-object": "2.0.4"
1341 | }
1342 | }
1343 | }
1344 | },
1345 | "extglob": {
1346 | "version": "2.0.4",
1347 | "bundled": true,
1348 | "dev": true,
1349 | "requires": {
1350 | "array-unique": "0.3.2",
1351 | "define-property": "1.0.0",
1352 | "expand-brackets": "2.1.4",
1353 | "extend-shallow": "2.0.1",
1354 | "fragment-cache": "0.2.1",
1355 | "regex-not": "1.0.2",
1356 | "snapdragon": "0.8.2",
1357 | "to-regex": "3.0.2"
1358 | },
1359 | "dependencies": {
1360 | "define-property": {
1361 | "version": "1.0.0",
1362 | "bundled": true,
1363 | "dev": true,
1364 | "requires": {
1365 | "is-descriptor": "1.0.2"
1366 | }
1367 | },
1368 | "extend-shallow": {
1369 | "version": "2.0.1",
1370 | "bundled": true,
1371 | "dev": true,
1372 | "requires": {
1373 | "is-extendable": "0.1.1"
1374 | }
1375 | },
1376 | "is-accessor-descriptor": {
1377 | "version": "1.0.0",
1378 | "bundled": true,
1379 | "dev": true,
1380 | "requires": {
1381 | "kind-of": "6.0.2"
1382 | }
1383 | },
1384 | "is-data-descriptor": {
1385 | "version": "1.0.0",
1386 | "bundled": true,
1387 | "dev": true,
1388 | "requires": {
1389 | "kind-of": "6.0.2"
1390 | }
1391 | },
1392 | "is-descriptor": {
1393 | "version": "1.0.2",
1394 | "bundled": true,
1395 | "dev": true,
1396 | "requires": {
1397 | "is-accessor-descriptor": "1.0.0",
1398 | "is-data-descriptor": "1.0.0",
1399 | "kind-of": "6.0.2"
1400 | }
1401 | },
1402 | "kind-of": {
1403 | "version": "6.0.2",
1404 | "bundled": true,
1405 | "dev": true
1406 | }
1407 | }
1408 | },
1409 | "fill-range": {
1410 | "version": "4.0.0",
1411 | "bundled": true,
1412 | "dev": true,
1413 | "requires": {
1414 | "extend-shallow": "2.0.1",
1415 | "is-number": "3.0.0",
1416 | "repeat-string": "1.6.1",
1417 | "to-regex-range": "2.1.1"
1418 | },
1419 | "dependencies": {
1420 | "extend-shallow": {
1421 | "version": "2.0.1",
1422 | "bundled": true,
1423 | "dev": true,
1424 | "requires": {
1425 | "is-extendable": "0.1.1"
1426 | }
1427 | }
1428 | }
1429 | },
1430 | "find-cache-dir": {
1431 | "version": "0.1.1",
1432 | "bundled": true,
1433 | "dev": true,
1434 | "requires": {
1435 | "commondir": "1.0.1",
1436 | "mkdirp": "0.5.1",
1437 | "pkg-dir": "1.0.0"
1438 | }
1439 | },
1440 | "find-up": {
1441 | "version": "2.1.0",
1442 | "bundled": true,
1443 | "dev": true,
1444 | "requires": {
1445 | "locate-path": "2.0.0"
1446 | }
1447 | },
1448 | "for-in": {
1449 | "version": "1.0.2",
1450 | "bundled": true,
1451 | "dev": true
1452 | },
1453 | "foreground-child": {
1454 | "version": "1.5.6",
1455 | "bundled": true,
1456 | "dev": true,
1457 | "requires": {
1458 | "cross-spawn": "4.0.2",
1459 | "signal-exit": "3.0.2"
1460 | }
1461 | },
1462 | "fragment-cache": {
1463 | "version": "0.2.1",
1464 | "bundled": true,
1465 | "dev": true,
1466 | "requires": {
1467 | "map-cache": "0.2.2"
1468 | }
1469 | },
1470 | "fs.realpath": {
1471 | "version": "1.0.0",
1472 | "bundled": true,
1473 | "dev": true
1474 | },
1475 | "get-caller-file": {
1476 | "version": "1.0.2",
1477 | "bundled": true,
1478 | "dev": true
1479 | },
1480 | "get-stream": {
1481 | "version": "3.0.0",
1482 | "bundled": true,
1483 | "dev": true
1484 | },
1485 | "get-value": {
1486 | "version": "2.0.6",
1487 | "bundled": true,
1488 | "dev": true
1489 | },
1490 | "glob": {
1491 | "version": "7.1.2",
1492 | "bundled": true,
1493 | "dev": true,
1494 | "requires": {
1495 | "fs.realpath": "1.0.0",
1496 | "inflight": "1.0.6",
1497 | "inherits": "2.0.3",
1498 | "minimatch": "3.0.4",
1499 | "once": "1.4.0",
1500 | "path-is-absolute": "1.0.1"
1501 | }
1502 | },
1503 | "graceful-fs": {
1504 | "version": "4.1.11",
1505 | "bundled": true,
1506 | "dev": true
1507 | },
1508 | "handlebars": {
1509 | "version": "4.0.11",
1510 | "bundled": true,
1511 | "dev": true,
1512 | "requires": {
1513 | "async": "1.5.2",
1514 | "optimist": "0.6.1",
1515 | "source-map": "0.4.4",
1516 | "uglify-js": "2.8.29"
1517 | },
1518 | "dependencies": {
1519 | "source-map": {
1520 | "version": "0.4.4",
1521 | "bundled": true,
1522 | "dev": true,
1523 | "requires": {
1524 | "amdefine": "1.0.1"
1525 | }
1526 | }
1527 | }
1528 | },
1529 | "has-value": {
1530 | "version": "1.0.0",
1531 | "bundled": true,
1532 | "dev": true,
1533 | "requires": {
1534 | "get-value": "2.0.6",
1535 | "has-values": "1.0.0",
1536 | "isobject": "3.0.1"
1537 | }
1538 | },
1539 | "has-values": {
1540 | "version": "1.0.0",
1541 | "bundled": true,
1542 | "dev": true,
1543 | "requires": {
1544 | "is-number": "3.0.0",
1545 | "kind-of": "4.0.0"
1546 | },
1547 | "dependencies": {
1548 | "kind-of": {
1549 | "version": "4.0.0",
1550 | "bundled": true,
1551 | "dev": true,
1552 | "requires": {
1553 | "is-buffer": "1.1.6"
1554 | }
1555 | }
1556 | }
1557 | },
1558 | "hosted-git-info": {
1559 | "version": "2.6.0",
1560 | "bundled": true,
1561 | "dev": true
1562 | },
1563 | "imurmurhash": {
1564 | "version": "0.1.4",
1565 | "bundled": true,
1566 | "dev": true
1567 | },
1568 | "inflight": {
1569 | "version": "1.0.6",
1570 | "bundled": true,
1571 | "dev": true,
1572 | "requires": {
1573 | "once": "1.4.0",
1574 | "wrappy": "1.0.2"
1575 | }
1576 | },
1577 | "inherits": {
1578 | "version": "2.0.3",
1579 | "bundled": true,
1580 | "dev": true
1581 | },
1582 | "invert-kv": {
1583 | "version": "1.0.0",
1584 | "bundled": true,
1585 | "dev": true
1586 | },
1587 | "is-accessor-descriptor": {
1588 | "version": "0.1.6",
1589 | "bundled": true,
1590 | "dev": true,
1591 | "requires": {
1592 | "kind-of": "3.2.2"
1593 | }
1594 | },
1595 | "is-arrayish": {
1596 | "version": "0.2.1",
1597 | "bundled": true,
1598 | "dev": true
1599 | },
1600 | "is-buffer": {
1601 | "version": "1.1.6",
1602 | "bundled": true,
1603 | "dev": true
1604 | },
1605 | "is-builtin-module": {
1606 | "version": "1.0.0",
1607 | "bundled": true,
1608 | "dev": true,
1609 | "requires": {
1610 | "builtin-modules": "1.1.1"
1611 | }
1612 | },
1613 | "is-data-descriptor": {
1614 | "version": "0.1.4",
1615 | "bundled": true,
1616 | "dev": true,
1617 | "requires": {
1618 | "kind-of": "3.2.2"
1619 | }
1620 | },
1621 | "is-descriptor": {
1622 | "version": "0.1.6",
1623 | "bundled": true,
1624 | "dev": true,
1625 | "requires": {
1626 | "is-accessor-descriptor": "0.1.6",
1627 | "is-data-descriptor": "0.1.4",
1628 | "kind-of": "5.1.0"
1629 | },
1630 | "dependencies": {
1631 | "kind-of": {
1632 | "version": "5.1.0",
1633 | "bundled": true,
1634 | "dev": true
1635 | }
1636 | }
1637 | },
1638 | "is-extendable": {
1639 | "version": "0.1.1",
1640 | "bundled": true,
1641 | "dev": true
1642 | },
1643 | "is-fullwidth-code-point": {
1644 | "version": "2.0.0",
1645 | "bundled": true,
1646 | "dev": true
1647 | },
1648 | "is-number": {
1649 | "version": "3.0.0",
1650 | "bundled": true,
1651 | "dev": true,
1652 | "requires": {
1653 | "kind-of": "3.2.2"
1654 | }
1655 | },
1656 | "is-odd": {
1657 | "version": "2.0.0",
1658 | "bundled": true,
1659 | "dev": true,
1660 | "requires": {
1661 | "is-number": "4.0.0"
1662 | },
1663 | "dependencies": {
1664 | "is-number": {
1665 | "version": "4.0.0",
1666 | "bundled": true,
1667 | "dev": true
1668 | }
1669 | }
1670 | },
1671 | "is-plain-object": {
1672 | "version": "2.0.4",
1673 | "bundled": true,
1674 | "dev": true,
1675 | "requires": {
1676 | "isobject": "3.0.1"
1677 | }
1678 | },
1679 | "is-stream": {
1680 | "version": "1.1.0",
1681 | "bundled": true,
1682 | "dev": true
1683 | },
1684 | "is-utf8": {
1685 | "version": "0.2.1",
1686 | "bundled": true,
1687 | "dev": true
1688 | },
1689 | "is-windows": {
1690 | "version": "1.0.2",
1691 | "bundled": true,
1692 | "dev": true
1693 | },
1694 | "isarray": {
1695 | "version": "1.0.0",
1696 | "bundled": true,
1697 | "dev": true
1698 | },
1699 | "isexe": {
1700 | "version": "2.0.0",
1701 | "bundled": true,
1702 | "dev": true
1703 | },
1704 | "isobject": {
1705 | "version": "3.0.1",
1706 | "bundled": true,
1707 | "dev": true
1708 | },
1709 | "istanbul-lib-coverage": {
1710 | "version": "1.2.0",
1711 | "bundled": true,
1712 | "dev": true
1713 | },
1714 | "istanbul-lib-hook": {
1715 | "version": "1.1.0",
1716 | "bundled": true,
1717 | "dev": true,
1718 | "requires": {
1719 | "append-transform": "0.4.0"
1720 | }
1721 | },
1722 | "istanbul-lib-report": {
1723 | "version": "1.1.3",
1724 | "bundled": true,
1725 | "dev": true,
1726 | "requires": {
1727 | "istanbul-lib-coverage": "1.2.0",
1728 | "mkdirp": "0.5.1",
1729 | "path-parse": "1.0.5",
1730 | "supports-color": "3.2.3"
1731 | },
1732 | "dependencies": {
1733 | "has-flag": {
1734 | "version": "1.0.0",
1735 | "bundled": true,
1736 | "dev": true
1737 | },
1738 | "supports-color": {
1739 | "version": "3.2.3",
1740 | "bundled": true,
1741 | "dev": true,
1742 | "requires": {
1743 | "has-flag": "1.0.0"
1744 | }
1745 | }
1746 | }
1747 | },
1748 | "istanbul-lib-source-maps": {
1749 | "version": "1.2.5",
1750 | "bundled": true,
1751 | "dev": true,
1752 | "requires": {
1753 | "debug": "3.1.0",
1754 | "istanbul-lib-coverage": "1.2.0",
1755 | "mkdirp": "0.5.1",
1756 | "rimraf": "2.6.2",
1757 | "source-map": "0.5.7"
1758 | }
1759 | },
1760 | "istanbul-reports": {
1761 | "version": "1.4.1",
1762 | "bundled": true,
1763 | "dev": true,
1764 | "requires": {
1765 | "handlebars": "4.0.11"
1766 | }
1767 | },
1768 | "kind-of": {
1769 | "version": "3.2.2",
1770 | "bundled": true,
1771 | "dev": true,
1772 | "requires": {
1773 | "is-buffer": "1.1.6"
1774 | }
1775 | },
1776 | "lazy-cache": {
1777 | "version": "1.0.4",
1778 | "bundled": true,
1779 | "dev": true,
1780 | "optional": true
1781 | },
1782 | "lcid": {
1783 | "version": "1.0.0",
1784 | "bundled": true,
1785 | "dev": true,
1786 | "requires": {
1787 | "invert-kv": "1.0.0"
1788 | }
1789 | },
1790 | "load-json-file": {
1791 | "version": "1.1.0",
1792 | "bundled": true,
1793 | "dev": true,
1794 | "requires": {
1795 | "graceful-fs": "4.1.11",
1796 | "parse-json": "2.2.0",
1797 | "pify": "2.3.0",
1798 | "pinkie-promise": "2.0.1",
1799 | "strip-bom": "2.0.0"
1800 | }
1801 | },
1802 | "locate-path": {
1803 | "version": "2.0.0",
1804 | "bundled": true,
1805 | "dev": true,
1806 | "requires": {
1807 | "p-locate": "2.0.0",
1808 | "path-exists": "3.0.0"
1809 | },
1810 | "dependencies": {
1811 | "path-exists": {
1812 | "version": "3.0.0",
1813 | "bundled": true,
1814 | "dev": true
1815 | }
1816 | }
1817 | },
1818 | "longest": {
1819 | "version": "1.0.1",
1820 | "bundled": true,
1821 | "dev": true
1822 | },
1823 | "lru-cache": {
1824 | "version": "4.1.3",
1825 | "bundled": true,
1826 | "dev": true,
1827 | "requires": {
1828 | "pseudomap": "1.0.2",
1829 | "yallist": "2.1.2"
1830 | }
1831 | },
1832 | "map-cache": {
1833 | "version": "0.2.2",
1834 | "bundled": true,
1835 | "dev": true
1836 | },
1837 | "map-visit": {
1838 | "version": "1.0.0",
1839 | "bundled": true,
1840 | "dev": true,
1841 | "requires": {
1842 | "object-visit": "1.0.1"
1843 | }
1844 | },
1845 | "md5-hex": {
1846 | "version": "1.3.0",
1847 | "bundled": true,
1848 | "dev": true,
1849 | "requires": {
1850 | "md5-o-matic": "0.1.1"
1851 | }
1852 | },
1853 | "md5-o-matic": {
1854 | "version": "0.1.1",
1855 | "bundled": true,
1856 | "dev": true
1857 | },
1858 | "mem": {
1859 | "version": "1.1.0",
1860 | "bundled": true,
1861 | "dev": true,
1862 | "requires": {
1863 | "mimic-fn": "1.2.0"
1864 | }
1865 | },
1866 | "merge-source-map": {
1867 | "version": "1.1.0",
1868 | "bundled": true,
1869 | "dev": true,
1870 | "requires": {
1871 | "source-map": "0.6.1"
1872 | },
1873 | "dependencies": {
1874 | "source-map": {
1875 | "version": "0.6.1",
1876 | "bundled": true,
1877 | "dev": true
1878 | }
1879 | }
1880 | },
1881 | "micromatch": {
1882 | "version": "3.1.10",
1883 | "bundled": true,
1884 | "dev": true,
1885 | "requires": {
1886 | "arr-diff": "4.0.0",
1887 | "array-unique": "0.3.2",
1888 | "braces": "2.3.2",
1889 | "define-property": "2.0.2",
1890 | "extend-shallow": "3.0.2",
1891 | "extglob": "2.0.4",
1892 | "fragment-cache": "0.2.1",
1893 | "kind-of": "6.0.2",
1894 | "nanomatch": "1.2.9",
1895 | "object.pick": "1.3.0",
1896 | "regex-not": "1.0.2",
1897 | "snapdragon": "0.8.2",
1898 | "to-regex": "3.0.2"
1899 | },
1900 | "dependencies": {
1901 | "kind-of": {
1902 | "version": "6.0.2",
1903 | "bundled": true,
1904 | "dev": true
1905 | }
1906 | }
1907 | },
1908 | "mimic-fn": {
1909 | "version": "1.2.0",
1910 | "bundled": true,
1911 | "dev": true
1912 | },
1913 | "minimatch": {
1914 | "version": "3.0.4",
1915 | "bundled": true,
1916 | "dev": true,
1917 | "requires": {
1918 | "brace-expansion": "1.1.11"
1919 | }
1920 | },
1921 | "minimist": {
1922 | "version": "0.0.8",
1923 | "bundled": true,
1924 | "dev": true
1925 | },
1926 | "mixin-deep": {
1927 | "version": "1.3.1",
1928 | "bundled": true,
1929 | "dev": true,
1930 | "requires": {
1931 | "for-in": "1.0.2",
1932 | "is-extendable": "1.0.1"
1933 | },
1934 | "dependencies": {
1935 | "is-extendable": {
1936 | "version": "1.0.1",
1937 | "bundled": true,
1938 | "dev": true,
1939 | "requires": {
1940 | "is-plain-object": "2.0.4"
1941 | }
1942 | }
1943 | }
1944 | },
1945 | "mkdirp": {
1946 | "version": "0.5.1",
1947 | "bundled": true,
1948 | "dev": true,
1949 | "requires": {
1950 | "minimist": "0.0.8"
1951 | }
1952 | },
1953 | "ms": {
1954 | "version": "2.0.0",
1955 | "bundled": true,
1956 | "dev": true
1957 | },
1958 | "nanomatch": {
1959 | "version": "1.2.9",
1960 | "bundled": true,
1961 | "dev": true,
1962 | "requires": {
1963 | "arr-diff": "4.0.0",
1964 | "array-unique": "0.3.2",
1965 | "define-property": "2.0.2",
1966 | "extend-shallow": "3.0.2",
1967 | "fragment-cache": "0.2.1",
1968 | "is-odd": "2.0.0",
1969 | "is-windows": "1.0.2",
1970 | "kind-of": "6.0.2",
1971 | "object.pick": "1.3.0",
1972 | "regex-not": "1.0.2",
1973 | "snapdragon": "0.8.2",
1974 | "to-regex": "3.0.2"
1975 | },
1976 | "dependencies": {
1977 | "kind-of": {
1978 | "version": "6.0.2",
1979 | "bundled": true,
1980 | "dev": true
1981 | }
1982 | }
1983 | },
1984 | "normalize-package-data": {
1985 | "version": "2.4.0",
1986 | "bundled": true,
1987 | "dev": true,
1988 | "requires": {
1989 | "hosted-git-info": "2.6.0",
1990 | "is-builtin-module": "1.0.0",
1991 | "semver": "5.5.0",
1992 | "validate-npm-package-license": "3.0.3"
1993 | }
1994 | },
1995 | "npm-run-path": {
1996 | "version": "2.0.2",
1997 | "bundled": true,
1998 | "dev": true,
1999 | "requires": {
2000 | "path-key": "2.0.1"
2001 | }
2002 | },
2003 | "number-is-nan": {
2004 | "version": "1.0.1",
2005 | "bundled": true,
2006 | "dev": true
2007 | },
2008 | "object-assign": {
2009 | "version": "4.1.1",
2010 | "bundled": true,
2011 | "dev": true
2012 | },
2013 | "object-copy": {
2014 | "version": "0.1.0",
2015 | "bundled": true,
2016 | "dev": true,
2017 | "requires": {
2018 | "copy-descriptor": "0.1.1",
2019 | "define-property": "0.2.5",
2020 | "kind-of": "3.2.2"
2021 | },
2022 | "dependencies": {
2023 | "define-property": {
2024 | "version": "0.2.5",
2025 | "bundled": true,
2026 | "dev": true,
2027 | "requires": {
2028 | "is-descriptor": "0.1.6"
2029 | }
2030 | }
2031 | }
2032 | },
2033 | "object-visit": {
2034 | "version": "1.0.1",
2035 | "bundled": true,
2036 | "dev": true,
2037 | "requires": {
2038 | "isobject": "3.0.1"
2039 | }
2040 | },
2041 | "object.pick": {
2042 | "version": "1.3.0",
2043 | "bundled": true,
2044 | "dev": true,
2045 | "requires": {
2046 | "isobject": "3.0.1"
2047 | }
2048 | },
2049 | "once": {
2050 | "version": "1.4.0",
2051 | "bundled": true,
2052 | "dev": true,
2053 | "requires": {
2054 | "wrappy": "1.0.2"
2055 | }
2056 | },
2057 | "optimist": {
2058 | "version": "0.6.1",
2059 | "bundled": true,
2060 | "dev": true,
2061 | "requires": {
2062 | "minimist": "0.0.8",
2063 | "wordwrap": "0.0.3"
2064 | }
2065 | },
2066 | "os-homedir": {
2067 | "version": "1.0.2",
2068 | "bundled": true,
2069 | "dev": true
2070 | },
2071 | "os-locale": {
2072 | "version": "2.1.0",
2073 | "bundled": true,
2074 | "dev": true,
2075 | "requires": {
2076 | "execa": "0.7.0",
2077 | "lcid": "1.0.0",
2078 | "mem": "1.1.0"
2079 | }
2080 | },
2081 | "p-finally": {
2082 | "version": "1.0.0",
2083 | "bundled": true,
2084 | "dev": true
2085 | },
2086 | "p-limit": {
2087 | "version": "1.2.0",
2088 | "bundled": true,
2089 | "dev": true,
2090 | "requires": {
2091 | "p-try": "1.0.0"
2092 | }
2093 | },
2094 | "p-locate": {
2095 | "version": "2.0.0",
2096 | "bundled": true,
2097 | "dev": true,
2098 | "requires": {
2099 | "p-limit": "1.2.0"
2100 | }
2101 | },
2102 | "p-try": {
2103 | "version": "1.0.0",
2104 | "bundled": true,
2105 | "dev": true
2106 | },
2107 | "parse-json": {
2108 | "version": "2.2.0",
2109 | "bundled": true,
2110 | "dev": true,
2111 | "requires": {
2112 | "error-ex": "1.3.1"
2113 | }
2114 | },
2115 | "pascalcase": {
2116 | "version": "0.1.1",
2117 | "bundled": true,
2118 | "dev": true
2119 | },
2120 | "path-exists": {
2121 | "version": "2.1.0",
2122 | "bundled": true,
2123 | "dev": true,
2124 | "requires": {
2125 | "pinkie-promise": "2.0.1"
2126 | }
2127 | },
2128 | "path-is-absolute": {
2129 | "version": "1.0.1",
2130 | "bundled": true,
2131 | "dev": true
2132 | },
2133 | "path-key": {
2134 | "version": "2.0.1",
2135 | "bundled": true,
2136 | "dev": true
2137 | },
2138 | "path-parse": {
2139 | "version": "1.0.5",
2140 | "bundled": true,
2141 | "dev": true
2142 | },
2143 | "path-type": {
2144 | "version": "1.1.0",
2145 | "bundled": true,
2146 | "dev": true,
2147 | "requires": {
2148 | "graceful-fs": "4.1.11",
2149 | "pify": "2.3.0",
2150 | "pinkie-promise": "2.0.1"
2151 | }
2152 | },
2153 | "pify": {
2154 | "version": "2.3.0",
2155 | "bundled": true,
2156 | "dev": true
2157 | },
2158 | "pinkie": {
2159 | "version": "2.0.4",
2160 | "bundled": true,
2161 | "dev": true
2162 | },
2163 | "pinkie-promise": {
2164 | "version": "2.0.1",
2165 | "bundled": true,
2166 | "dev": true,
2167 | "requires": {
2168 | "pinkie": "2.0.4"
2169 | }
2170 | },
2171 | "pkg-dir": {
2172 | "version": "1.0.0",
2173 | "bundled": true,
2174 | "dev": true,
2175 | "requires": {
2176 | "find-up": "1.1.2"
2177 | },
2178 | "dependencies": {
2179 | "find-up": {
2180 | "version": "1.1.2",
2181 | "bundled": true,
2182 | "dev": true,
2183 | "requires": {
2184 | "path-exists": "2.1.0",
2185 | "pinkie-promise": "2.0.1"
2186 | }
2187 | }
2188 | }
2189 | },
2190 | "posix-character-classes": {
2191 | "version": "0.1.1",
2192 | "bundled": true,
2193 | "dev": true
2194 | },
2195 | "pseudomap": {
2196 | "version": "1.0.2",
2197 | "bundled": true,
2198 | "dev": true
2199 | },
2200 | "read-pkg": {
2201 | "version": "1.1.0",
2202 | "bundled": true,
2203 | "dev": true,
2204 | "requires": {
2205 | "load-json-file": "1.1.0",
2206 | "normalize-package-data": "2.4.0",
2207 | "path-type": "1.1.0"
2208 | }
2209 | },
2210 | "read-pkg-up": {
2211 | "version": "1.0.1",
2212 | "bundled": true,
2213 | "dev": true,
2214 | "requires": {
2215 | "find-up": "1.1.2",
2216 | "read-pkg": "1.1.0"
2217 | },
2218 | "dependencies": {
2219 | "find-up": {
2220 | "version": "1.1.2",
2221 | "bundled": true,
2222 | "dev": true,
2223 | "requires": {
2224 | "path-exists": "2.1.0",
2225 | "pinkie-promise": "2.0.1"
2226 | }
2227 | }
2228 | }
2229 | },
2230 | "regex-not": {
2231 | "version": "1.0.2",
2232 | "bundled": true,
2233 | "dev": true,
2234 | "requires": {
2235 | "extend-shallow": "3.0.2",
2236 | "safe-regex": "1.1.0"
2237 | }
2238 | },
2239 | "repeat-element": {
2240 | "version": "1.1.2",
2241 | "bundled": true,
2242 | "dev": true
2243 | },
2244 | "repeat-string": {
2245 | "version": "1.6.1",
2246 | "bundled": true,
2247 | "dev": true
2248 | },
2249 | "require-directory": {
2250 | "version": "2.1.1",
2251 | "bundled": true,
2252 | "dev": true
2253 | },
2254 | "require-main-filename": {
2255 | "version": "1.0.1",
2256 | "bundled": true,
2257 | "dev": true
2258 | },
2259 | "resolve-from": {
2260 | "version": "2.0.0",
2261 | "bundled": true,
2262 | "dev": true
2263 | },
2264 | "resolve-url": {
2265 | "version": "0.2.1",
2266 | "bundled": true,
2267 | "dev": true
2268 | },
2269 | "ret": {
2270 | "version": "0.1.15",
2271 | "bundled": true,
2272 | "dev": true
2273 | },
2274 | "right-align": {
2275 | "version": "0.1.3",
2276 | "bundled": true,
2277 | "dev": true,
2278 | "optional": true,
2279 | "requires": {
2280 | "align-text": "0.1.4"
2281 | }
2282 | },
2283 | "rimraf": {
2284 | "version": "2.6.2",
2285 | "bundled": true,
2286 | "dev": true,
2287 | "requires": {
2288 | "glob": "7.1.2"
2289 | }
2290 | },
2291 | "safe-regex": {
2292 | "version": "1.1.0",
2293 | "bundled": true,
2294 | "dev": true,
2295 | "requires": {
2296 | "ret": "0.1.15"
2297 | }
2298 | },
2299 | "semver": {
2300 | "version": "5.5.0",
2301 | "bundled": true,
2302 | "dev": true
2303 | },
2304 | "set-blocking": {
2305 | "version": "2.0.0",
2306 | "bundled": true,
2307 | "dev": true
2308 | },
2309 | "set-value": {
2310 | "version": "2.0.0",
2311 | "bundled": true,
2312 | "dev": true,
2313 | "requires": {
2314 | "extend-shallow": "2.0.1",
2315 | "is-extendable": "0.1.1",
2316 | "is-plain-object": "2.0.4",
2317 | "split-string": "3.1.0"
2318 | },
2319 | "dependencies": {
2320 | "extend-shallow": {
2321 | "version": "2.0.1",
2322 | "bundled": true,
2323 | "dev": true,
2324 | "requires": {
2325 | "is-extendable": "0.1.1"
2326 | }
2327 | }
2328 | }
2329 | },
2330 | "shebang-command": {
2331 | "version": "1.2.0",
2332 | "bundled": true,
2333 | "dev": true,
2334 | "requires": {
2335 | "shebang-regex": "1.0.0"
2336 | }
2337 | },
2338 | "shebang-regex": {
2339 | "version": "1.0.0",
2340 | "bundled": true,
2341 | "dev": true
2342 | },
2343 | "signal-exit": {
2344 | "version": "3.0.2",
2345 | "bundled": true,
2346 | "dev": true
2347 | },
2348 | "slide": {
2349 | "version": "1.1.6",
2350 | "bundled": true,
2351 | "dev": true
2352 | },
2353 | "snapdragon": {
2354 | "version": "0.8.2",
2355 | "bundled": true,
2356 | "dev": true,
2357 | "requires": {
2358 | "base": "0.11.2",
2359 | "debug": "2.6.9",
2360 | "define-property": "0.2.5",
2361 | "extend-shallow": "2.0.1",
2362 | "map-cache": "0.2.2",
2363 | "source-map": "0.5.7",
2364 | "source-map-resolve": "0.5.2",
2365 | "use": "3.1.0"
2366 | },
2367 | "dependencies": {
2368 | "debug": {
2369 | "version": "2.6.9",
2370 | "bundled": true,
2371 | "dev": true,
2372 | "requires": {
2373 | "ms": "2.0.0"
2374 | }
2375 | },
2376 | "define-property": {
2377 | "version": "0.2.5",
2378 | "bundled": true,
2379 | "dev": true,
2380 | "requires": {
2381 | "is-descriptor": "0.1.6"
2382 | }
2383 | },
2384 | "extend-shallow": {
2385 | "version": "2.0.1",
2386 | "bundled": true,
2387 | "dev": true,
2388 | "requires": {
2389 | "is-extendable": "0.1.1"
2390 | }
2391 | }
2392 | }
2393 | },
2394 | "snapdragon-node": {
2395 | "version": "2.1.1",
2396 | "bundled": true,
2397 | "dev": true,
2398 | "requires": {
2399 | "define-property": "1.0.0",
2400 | "isobject": "3.0.1",
2401 | "snapdragon-util": "3.0.1"
2402 | },
2403 | "dependencies": {
2404 | "define-property": {
2405 | "version": "1.0.0",
2406 | "bundled": true,
2407 | "dev": true,
2408 | "requires": {
2409 | "is-descriptor": "1.0.2"
2410 | }
2411 | },
2412 | "is-accessor-descriptor": {
2413 | "version": "1.0.0",
2414 | "bundled": true,
2415 | "dev": true,
2416 | "requires": {
2417 | "kind-of": "6.0.2"
2418 | }
2419 | },
2420 | "is-data-descriptor": {
2421 | "version": "1.0.0",
2422 | "bundled": true,
2423 | "dev": true,
2424 | "requires": {
2425 | "kind-of": "6.0.2"
2426 | }
2427 | },
2428 | "is-descriptor": {
2429 | "version": "1.0.2",
2430 | "bundled": true,
2431 | "dev": true,
2432 | "requires": {
2433 | "is-accessor-descriptor": "1.0.0",
2434 | "is-data-descriptor": "1.0.0",
2435 | "kind-of": "6.0.2"
2436 | }
2437 | },
2438 | "kind-of": {
2439 | "version": "6.0.2",
2440 | "bundled": true,
2441 | "dev": true
2442 | }
2443 | }
2444 | },
2445 | "snapdragon-util": {
2446 | "version": "3.0.1",
2447 | "bundled": true,
2448 | "dev": true,
2449 | "requires": {
2450 | "kind-of": "3.2.2"
2451 | }
2452 | },
2453 | "source-map": {
2454 | "version": "0.5.7",
2455 | "bundled": true,
2456 | "dev": true
2457 | },
2458 | "source-map-resolve": {
2459 | "version": "0.5.2",
2460 | "bundled": true,
2461 | "dev": true,
2462 | "requires": {
2463 | "atob": "2.1.1",
2464 | "decode-uri-component": "0.2.0",
2465 | "resolve-url": "0.2.1",
2466 | "source-map-url": "0.4.0",
2467 | "urix": "0.1.0"
2468 | }
2469 | },
2470 | "source-map-url": {
2471 | "version": "0.4.0",
2472 | "bundled": true,
2473 | "dev": true
2474 | },
2475 | "spawn-wrap": {
2476 | "version": "1.4.2",
2477 | "bundled": true,
2478 | "dev": true,
2479 | "requires": {
2480 | "foreground-child": "1.5.6",
2481 | "mkdirp": "0.5.1",
2482 | "os-homedir": "1.0.2",
2483 | "rimraf": "2.6.2",
2484 | "signal-exit": "3.0.2",
2485 | "which": "1.3.1"
2486 | }
2487 | },
2488 | "spdx-correct": {
2489 | "version": "3.0.0",
2490 | "bundled": true,
2491 | "dev": true,
2492 | "requires": {
2493 | "spdx-expression-parse": "3.0.0",
2494 | "spdx-license-ids": "3.0.0"
2495 | }
2496 | },
2497 | "spdx-exceptions": {
2498 | "version": "2.1.0",
2499 | "bundled": true,
2500 | "dev": true
2501 | },
2502 | "spdx-expression-parse": {
2503 | "version": "3.0.0",
2504 | "bundled": true,
2505 | "dev": true,
2506 | "requires": {
2507 | "spdx-exceptions": "2.1.0",
2508 | "spdx-license-ids": "3.0.0"
2509 | }
2510 | },
2511 | "spdx-license-ids": {
2512 | "version": "3.0.0",
2513 | "bundled": true,
2514 | "dev": true
2515 | },
2516 | "split-string": {
2517 | "version": "3.1.0",
2518 | "bundled": true,
2519 | "dev": true,
2520 | "requires": {
2521 | "extend-shallow": "3.0.2"
2522 | }
2523 | },
2524 | "static-extend": {
2525 | "version": "0.1.2",
2526 | "bundled": true,
2527 | "dev": true,
2528 | "requires": {
2529 | "define-property": "0.2.5",
2530 | "object-copy": "0.1.0"
2531 | },
2532 | "dependencies": {
2533 | "define-property": {
2534 | "version": "0.2.5",
2535 | "bundled": true,
2536 | "dev": true,
2537 | "requires": {
2538 | "is-descriptor": "0.1.6"
2539 | }
2540 | }
2541 | }
2542 | },
2543 | "string-width": {
2544 | "version": "2.1.1",
2545 | "bundled": true,
2546 | "dev": true,
2547 | "requires": {
2548 | "is-fullwidth-code-point": "2.0.0",
2549 | "strip-ansi": "4.0.0"
2550 | }
2551 | },
2552 | "strip-ansi": {
2553 | "version": "4.0.0",
2554 | "bundled": true,
2555 | "dev": true,
2556 | "requires": {
2557 | "ansi-regex": "3.0.0"
2558 | }
2559 | },
2560 | "strip-bom": {
2561 | "version": "2.0.0",
2562 | "bundled": true,
2563 | "dev": true,
2564 | "requires": {
2565 | "is-utf8": "0.2.1"
2566 | }
2567 | },
2568 | "strip-eof": {
2569 | "version": "1.0.0",
2570 | "bundled": true,
2571 | "dev": true
2572 | },
2573 | "test-exclude": {
2574 | "version": "4.2.1",
2575 | "bundled": true,
2576 | "dev": true,
2577 | "requires": {
2578 | "arrify": "1.0.1",
2579 | "micromatch": "3.1.10",
2580 | "object-assign": "4.1.1",
2581 | "read-pkg-up": "1.0.1",
2582 | "require-main-filename": "1.0.1"
2583 | }
2584 | },
2585 | "to-object-path": {
2586 | "version": "0.3.0",
2587 | "bundled": true,
2588 | "dev": true,
2589 | "requires": {
2590 | "kind-of": "3.2.2"
2591 | }
2592 | },
2593 | "to-regex": {
2594 | "version": "3.0.2",
2595 | "bundled": true,
2596 | "dev": true,
2597 | "requires": {
2598 | "define-property": "2.0.2",
2599 | "extend-shallow": "3.0.2",
2600 | "regex-not": "1.0.2",
2601 | "safe-regex": "1.1.0"
2602 | }
2603 | },
2604 | "to-regex-range": {
2605 | "version": "2.1.1",
2606 | "bundled": true,
2607 | "dev": true,
2608 | "requires": {
2609 | "is-number": "3.0.0",
2610 | "repeat-string": "1.6.1"
2611 | }
2612 | },
2613 | "uglify-js": {
2614 | "version": "2.8.29",
2615 | "bundled": true,
2616 | "dev": true,
2617 | "optional": true,
2618 | "requires": {
2619 | "source-map": "0.5.7",
2620 | "uglify-to-browserify": "1.0.2",
2621 | "yargs": "3.10.0"
2622 | },
2623 | "dependencies": {
2624 | "yargs": {
2625 | "version": "3.10.0",
2626 | "bundled": true,
2627 | "dev": true,
2628 | "optional": true,
2629 | "requires": {
2630 | "camelcase": "1.2.1",
2631 | "cliui": "2.1.0",
2632 | "decamelize": "1.2.0",
2633 | "window-size": "0.1.0"
2634 | }
2635 | }
2636 | }
2637 | },
2638 | "uglify-to-browserify": {
2639 | "version": "1.0.2",
2640 | "bundled": true,
2641 | "dev": true,
2642 | "optional": true
2643 | },
2644 | "union-value": {
2645 | "version": "1.0.0",
2646 | "bundled": true,
2647 | "dev": true,
2648 | "requires": {
2649 | "arr-union": "3.1.0",
2650 | "get-value": "2.0.6",
2651 | "is-extendable": "0.1.1",
2652 | "set-value": "0.4.3"
2653 | },
2654 | "dependencies": {
2655 | "extend-shallow": {
2656 | "version": "2.0.1",
2657 | "bundled": true,
2658 | "dev": true,
2659 | "requires": {
2660 | "is-extendable": "0.1.1"
2661 | }
2662 | },
2663 | "set-value": {
2664 | "version": "0.4.3",
2665 | "bundled": true,
2666 | "dev": true,
2667 | "requires": {
2668 | "extend-shallow": "2.0.1",
2669 | "is-extendable": "0.1.1",
2670 | "is-plain-object": "2.0.4",
2671 | "to-object-path": "0.3.0"
2672 | }
2673 | }
2674 | }
2675 | },
2676 | "unset-value": {
2677 | "version": "1.0.0",
2678 | "bundled": true,
2679 | "dev": true,
2680 | "requires": {
2681 | "has-value": "0.3.1",
2682 | "isobject": "3.0.1"
2683 | },
2684 | "dependencies": {
2685 | "has-value": {
2686 | "version": "0.3.1",
2687 | "bundled": true,
2688 | "dev": true,
2689 | "requires": {
2690 | "get-value": "2.0.6",
2691 | "has-values": "0.1.4",
2692 | "isobject": "2.1.0"
2693 | },
2694 | "dependencies": {
2695 | "isobject": {
2696 | "version": "2.1.0",
2697 | "bundled": true,
2698 | "dev": true,
2699 | "requires": {
2700 | "isarray": "1.0.0"
2701 | }
2702 | }
2703 | }
2704 | },
2705 | "has-values": {
2706 | "version": "0.1.4",
2707 | "bundled": true,
2708 | "dev": true
2709 | }
2710 | }
2711 | },
2712 | "urix": {
2713 | "version": "0.1.0",
2714 | "bundled": true,
2715 | "dev": true
2716 | },
2717 | "use": {
2718 | "version": "3.1.0",
2719 | "bundled": true,
2720 | "dev": true,
2721 | "requires": {
2722 | "kind-of": "6.0.2"
2723 | },
2724 | "dependencies": {
2725 | "kind-of": {
2726 | "version": "6.0.2",
2727 | "bundled": true,
2728 | "dev": true
2729 | }
2730 | }
2731 | },
2732 | "validate-npm-package-license": {
2733 | "version": "3.0.3",
2734 | "bundled": true,
2735 | "dev": true,
2736 | "requires": {
2737 | "spdx-correct": "3.0.0",
2738 | "spdx-expression-parse": "3.0.0"
2739 | }
2740 | },
2741 | "which": {
2742 | "version": "1.3.1",
2743 | "bundled": true,
2744 | "dev": true,
2745 | "requires": {
2746 | "isexe": "2.0.0"
2747 | }
2748 | },
2749 | "which-module": {
2750 | "version": "2.0.0",
2751 | "bundled": true,
2752 | "dev": true
2753 | },
2754 | "window-size": {
2755 | "version": "0.1.0",
2756 | "bundled": true,
2757 | "dev": true,
2758 | "optional": true
2759 | },
2760 | "wordwrap": {
2761 | "version": "0.0.3",
2762 | "bundled": true,
2763 | "dev": true
2764 | },
2765 | "wrap-ansi": {
2766 | "version": "2.1.0",
2767 | "bundled": true,
2768 | "dev": true,
2769 | "requires": {
2770 | "string-width": "1.0.2",
2771 | "strip-ansi": "3.0.1"
2772 | },
2773 | "dependencies": {
2774 | "ansi-regex": {
2775 | "version": "2.1.1",
2776 | "bundled": true,
2777 | "dev": true
2778 | },
2779 | "is-fullwidth-code-point": {
2780 | "version": "1.0.0",
2781 | "bundled": true,
2782 | "dev": true,
2783 | "requires": {
2784 | "number-is-nan": "1.0.1"
2785 | }
2786 | },
2787 | "string-width": {
2788 | "version": "1.0.2",
2789 | "bundled": true,
2790 | "dev": true,
2791 | "requires": {
2792 | "code-point-at": "1.1.0",
2793 | "is-fullwidth-code-point": "1.0.0",
2794 | "strip-ansi": "3.0.1"
2795 | }
2796 | },
2797 | "strip-ansi": {
2798 | "version": "3.0.1",
2799 | "bundled": true,
2800 | "dev": true,
2801 | "requires": {
2802 | "ansi-regex": "2.1.1"
2803 | }
2804 | }
2805 | }
2806 | },
2807 | "wrappy": {
2808 | "version": "1.0.2",
2809 | "bundled": true,
2810 | "dev": true
2811 | },
2812 | "write-file-atomic": {
2813 | "version": "1.3.4",
2814 | "bundled": true,
2815 | "dev": true,
2816 | "requires": {
2817 | "graceful-fs": "4.1.11",
2818 | "imurmurhash": "0.1.4",
2819 | "slide": "1.1.6"
2820 | }
2821 | },
2822 | "y18n": {
2823 | "version": "3.2.1",
2824 | "bundled": true,
2825 | "dev": true
2826 | },
2827 | "yallist": {
2828 | "version": "2.1.2",
2829 | "bundled": true,
2830 | "dev": true
2831 | },
2832 | "yargs": {
2833 | "version": "11.1.0",
2834 | "bundled": true,
2835 | "dev": true,
2836 | "requires": {
2837 | "cliui": "4.1.0",
2838 | "decamelize": "1.2.0",
2839 | "find-up": "2.1.0",
2840 | "get-caller-file": "1.0.2",
2841 | "os-locale": "2.1.0",
2842 | "require-directory": "2.1.1",
2843 | "require-main-filename": "1.0.1",
2844 | "set-blocking": "2.0.0",
2845 | "string-width": "2.1.1",
2846 | "which-module": "2.0.0",
2847 | "y18n": "3.2.1",
2848 | "yargs-parser": "9.0.2"
2849 | },
2850 | "dependencies": {
2851 | "camelcase": {
2852 | "version": "4.1.0",
2853 | "bundled": true,
2854 | "dev": true
2855 | },
2856 | "cliui": {
2857 | "version": "4.1.0",
2858 | "bundled": true,
2859 | "dev": true,
2860 | "requires": {
2861 | "string-width": "2.1.1",
2862 | "strip-ansi": "4.0.0",
2863 | "wrap-ansi": "2.1.0"
2864 | }
2865 | },
2866 | "yargs-parser": {
2867 | "version": "9.0.2",
2868 | "bundled": true,
2869 | "dev": true,
2870 | "requires": {
2871 | "camelcase": "4.1.0"
2872 | }
2873 | }
2874 | }
2875 | },
2876 | "yargs-parser": {
2877 | "version": "8.1.0",
2878 | "bundled": true,
2879 | "dev": true,
2880 | "requires": {
2881 | "camelcase": "4.1.0"
2882 | },
2883 | "dependencies": {
2884 | "camelcase": {
2885 | "version": "4.1.0",
2886 | "bundled": true,
2887 | "dev": true
2888 | }
2889 | }
2890 | }
2891 | }
2892 | },
2893 | "oauth-sign": {
2894 | "version": "0.8.2",
2895 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
2896 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
2897 | "dev": true
2898 | },
2899 | "once": {
2900 | "version": "1.4.0",
2901 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2902 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2903 | "dev": true,
2904 | "requires": {
2905 | "wrappy": "1.0.2"
2906 | }
2907 | },
2908 | "path-is-absolute": {
2909 | "version": "1.0.1",
2910 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2911 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2912 | "dev": true
2913 | },
2914 | "path-parse": {
2915 | "version": "1.0.5",
2916 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
2917 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
2918 | "dev": true
2919 | },
2920 | "pathval": {
2921 | "version": "1.1.0",
2922 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
2923 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
2924 | "dev": true
2925 | },
2926 | "performance-now": {
2927 | "version": "2.1.0",
2928 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
2929 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
2930 | "dev": true
2931 | },
2932 | "punycode": {
2933 | "version": "1.4.1",
2934 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
2935 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
2936 | "dev": true
2937 | },
2938 | "qs": {
2939 | "version": "6.5.2",
2940 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
2941 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
2942 | "dev": true
2943 | },
2944 | "request": {
2945 | "version": "2.87.0",
2946 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
2947 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
2948 | "dev": true,
2949 | "requires": {
2950 | "aws-sign2": "0.7.0",
2951 | "aws4": "1.7.0",
2952 | "caseless": "0.12.0",
2953 | "combined-stream": "1.0.6",
2954 | "extend": "3.0.1",
2955 | "forever-agent": "0.6.1",
2956 | "form-data": "2.3.2",
2957 | "har-validator": "5.0.3",
2958 | "http-signature": "1.2.0",
2959 | "is-typedarray": "1.0.0",
2960 | "isstream": "0.1.2",
2961 | "json-stringify-safe": "5.0.1",
2962 | "mime-types": "2.1.18",
2963 | "oauth-sign": "0.8.2",
2964 | "performance-now": "2.1.0",
2965 | "qs": "6.5.2",
2966 | "safe-buffer": "5.1.2",
2967 | "tough-cookie": "2.3.4",
2968 | "tunnel-agent": "0.6.0",
2969 | "uuid": "3.3.2"
2970 | }
2971 | },
2972 | "resolve": {
2973 | "version": "1.8.1",
2974 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
2975 | "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
2976 | "dev": true,
2977 | "requires": {
2978 | "path-parse": "1.0.5"
2979 | }
2980 | },
2981 | "safe-buffer": {
2982 | "version": "5.1.2",
2983 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2984 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2985 | "dev": true
2986 | },
2987 | "safer-buffer": {
2988 | "version": "2.1.2",
2989 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2990 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2991 | "dev": true
2992 | },
2993 | "semver": {
2994 | "version": "5.5.0",
2995 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
2996 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
2997 | "dev": true
2998 | },
2999 | "source-map": {
3000 | "version": "0.6.1",
3001 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
3002 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
3003 | },
3004 | "source-map-support": {
3005 | "version": "0.5.6",
3006 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz",
3007 | "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==",
3008 | "requires": {
3009 | "buffer-from": "1.1.0",
3010 | "source-map": "0.6.1"
3011 | }
3012 | },
3013 | "sprintf-js": {
3014 | "version": "1.0.3",
3015 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
3016 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
3017 | "dev": true
3018 | },
3019 | "sshpk": {
3020 | "version": "1.14.2",
3021 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
3022 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
3023 | "dev": true,
3024 | "requires": {
3025 | "asn1": "0.2.3",
3026 | "assert-plus": "1.0.0",
3027 | "bcrypt-pbkdf": "1.0.2",
3028 | "dashdash": "1.14.1",
3029 | "ecc-jsbn": "0.1.1",
3030 | "getpass": "0.1.7",
3031 | "jsbn": "0.1.1",
3032 | "safer-buffer": "2.1.2",
3033 | "tweetnacl": "0.14.5"
3034 | }
3035 | },
3036 | "strip-ansi": {
3037 | "version": "3.0.1",
3038 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3039 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3040 | "dev": true,
3041 | "requires": {
3042 | "ansi-regex": "2.1.1"
3043 | }
3044 | },
3045 | "supports-color": {
3046 | "version": "2.0.0",
3047 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
3048 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
3049 | "dev": true
3050 | },
3051 | "to-fast-properties": {
3052 | "version": "2.0.0",
3053 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
3054 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
3055 | "dev": true
3056 | },
3057 | "tough-cookie": {
3058 | "version": "2.3.4",
3059 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
3060 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
3061 | "dev": true,
3062 | "requires": {
3063 | "punycode": "1.4.1"
3064 | }
3065 | },
3066 | "trim-right": {
3067 | "version": "1.0.1",
3068 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
3069 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
3070 | "dev": true
3071 | },
3072 | "ts-node": {
3073 | "version": "7.0.0",
3074 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.0.tgz",
3075 | "integrity": "sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==",
3076 | "requires": {
3077 | "arrify": "1.0.1",
3078 | "buffer-from": "1.1.0",
3079 | "diff": "3.5.0",
3080 | "make-error": "1.3.4",
3081 | "minimist": "1.2.0",
3082 | "mkdirp": "0.5.1",
3083 | "source-map-support": "0.5.6",
3084 | "yn": "2.0.0"
3085 | }
3086 | },
3087 | "tslib": {
3088 | "version": "1.9.3",
3089 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
3090 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
3091 | "dev": true
3092 | },
3093 | "tslint": {
3094 | "version": "5.10.0",
3095 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz",
3096 | "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=",
3097 | "dev": true,
3098 | "requires": {
3099 | "babel-code-frame": "6.26.0",
3100 | "builtin-modules": "1.1.1",
3101 | "chalk": "2.4.1",
3102 | "commander": "2.16.0",
3103 | "diff": "3.5.0",
3104 | "glob": "7.1.2",
3105 | "js-yaml": "3.12.0",
3106 | "minimatch": "3.0.4",
3107 | "resolve": "1.8.1",
3108 | "semver": "5.5.0",
3109 | "tslib": "1.9.3",
3110 | "tsutils": "2.27.2"
3111 | }
3112 | },
3113 | "tsutils": {
3114 | "version": "2.27.2",
3115 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.2.tgz",
3116 | "integrity": "sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==",
3117 | "dev": true,
3118 | "requires": {
3119 | "tslib": "1.9.3"
3120 | }
3121 | },
3122 | "tunnel-agent": {
3123 | "version": "0.6.0",
3124 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
3125 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
3126 | "dev": true,
3127 | "requires": {
3128 | "safe-buffer": "5.1.2"
3129 | }
3130 | },
3131 | "tweetnacl": {
3132 | "version": "0.14.5",
3133 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
3134 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
3135 | "dev": true,
3136 | "optional": true
3137 | },
3138 | "type-detect": {
3139 | "version": "4.0.8",
3140 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
3141 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
3142 | "dev": true
3143 | },
3144 | "typescript": {
3145 | "version": "2.9.2",
3146 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
3147 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w=="
3148 | },
3149 | "urlgrey": {
3150 | "version": "0.4.4",
3151 | "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz",
3152 | "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=",
3153 | "dev": true
3154 | },
3155 | "uuid": {
3156 | "version": "3.3.2",
3157 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
3158 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
3159 | "dev": true
3160 | },
3161 | "verror": {
3162 | "version": "1.10.0",
3163 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
3164 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
3165 | "dev": true,
3166 | "requires": {
3167 | "assert-plus": "1.0.0",
3168 | "core-util-is": "1.0.2",
3169 | "extsprintf": "1.3.0"
3170 | }
3171 | },
3172 | "wrappy": {
3173 | "version": "1.0.2",
3174 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3175 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3176 | "dev": true
3177 | },
3178 | "yn": {
3179 | "version": "2.0.0",
3180 | "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
3181 | "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo="
3182 | }
3183 | }
3184 | }
3185 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "pcap2wav",
3 | "version": "0.4.0",
4 | "description": "Extract wav from pcap (rtp)",
5 | "main": "index.js",
6 | "types": "out/typings.d.ts",
7 | "engines": {
8 | "node": ">=8.0.0"
9 | },
10 | "scripts": {
11 | "test": "mocha --opts ./mocha.opts",
12 | "lint": "tslint -p . -c tslint.json",
13 | "lint:fix": "tslint -p . -c tslint.json --fix",
14 | "cov": "nyc npm test",
15 | "coverage": "nyc npm test && nyc report --reporter=text-lcov > coverage.lcov && codecov",
16 | "prepublishOnly": "npm test && npm run build",
17 | "build": "tsc"
18 | },
19 | "repository": {
20 | "type": "git",
21 | "url": "git+https://github.com/Bobrovskih/pcap2wav.git"
22 | },
23 | "keywords": [
24 | "wav",
25 | "pcap",
26 | "rtp",
27 | "convert",
28 | "extract"
29 | ],
30 | "author": "Bobrovskih A.",
31 | "license": "MIT",
32 | "bugs": {
33 | "url": "https://github.com/Bobrovskih/pcap2wav/issues"
34 | },
35 | "homepage": "https://github.com/Bobrovskih/pcap2wav#readme",
36 | "dependencies": {
37 | "debug": "^3.1.0"
38 | },
39 | "devDependencies": {
40 | "@types/chai": "^4.1.4",
41 | "@types/mocha": "^5.2.4",
42 | "@types/node": "^10.5.2",
43 | "chai": "^4.1.2",
44 | "codecov": "^3.0.4",
45 | "mocha": "^5.2.0",
46 | "nyc": "^12.0.2",
47 | "source-map-support": "^0.5.6",
48 | "ts-node": "^7.0.0",
49 | "tslint": "^5.10.0",
50 | "typescript": "^2.9.2"
51 | }
52 | }
--------------------------------------------------------------------------------
/samples/README.md:
--------------------------------------------------------------------------------
1 | Sample captures download from https://wiki.wireshark.org/SampleCaptures
2 |
--------------------------------------------------------------------------------
/samples/SIP_CALL_RTP_G711.pcap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bobrovskih/pcap2wav/71b10f09e3276f3f73302432bdde255fcc754fed/samples/SIP_CALL_RTP_G711.pcap
--------------------------------------------------------------------------------
/samples/aaa.pcap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bobrovskih/pcap2wav/71b10f09e3276f3f73302432bdde255fcc754fed/samples/aaa.pcap
--------------------------------------------------------------------------------
/samples/sip-rtp-g711.pcap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bobrovskih/pcap2wav/71b10f09e3276f3f73302432bdde255fcc754fed/samples/sip-rtp-g711.pcap
--------------------------------------------------------------------------------
/samples/sip-rtp-g729a.pcap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bobrovskih/pcap2wav/71b10f09e3276f3f73302432bdde255fcc754fed/samples/sip-rtp-g729a.pcap
--------------------------------------------------------------------------------
/samples/sip-rtp-gsm.pcap:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Bobrovskih/pcap2wav/71b10f09e3276f3f73302432bdde255fcc754fed/samples/sip-rtp-gsm.pcap
--------------------------------------------------------------------------------
/src/api/index.ts:
--------------------------------------------------------------------------------
1 | import { tshark } from '../tshark';
2 | import { PcapToWav } from './pcap-to-wav';
3 |
4 | import { Pcap2WavOptions, RtpInfoOptions } from '../typings';
5 |
6 | const pcap2wav = async (options: Pcap2WavOptions) => {
7 | const p2w = new PcapToWav(options);
8 | return await p2w.convert();
9 | };
10 |
11 | const rtpInfo = async (options: RtpInfoOptions) => {
12 | return await tshark.rtpInfo(options);
13 | };
14 |
15 | export {
16 | pcap2wav,
17 | rtpInfo,
18 | };
19 |
--------------------------------------------------------------------------------
/src/api/pcap-to-wav.spec.ts:
--------------------------------------------------------------------------------
1 | import * as path from 'path';
2 | import { expect } from 'chai';
3 | import { PcapToWav } from './pcap-to-wav';
4 | import { helpers } from '../helpers';
5 |
6 | describe('PcapToWav', () => {
7 | it('without filter', async () => {
8 | const pcap = path.resolve(__dirname, '../../samples/aaa.pcap');
9 | const p2w = new PcapToWav({ pcap });
10 | const result = await p2w.convert();
11 | expect(1).equal(result.rtpCount);
12 | });
13 |
14 | it('pcma + pcmu', async () => {
15 | const pcap = path.resolve(__dirname, '../../samples/sip-rtp-g711.pcap');
16 | const p2w = new PcapToWav({ pcap });
17 | const result = await p2w.convert();
18 | const { size } = await helpers.fs.statAsync(result.wav);
19 | expect(135210).equal(size);
20 | });
21 |
22 | it('only pcmu', async () => {
23 | const pcap = path.resolve(__dirname, '../../samples/sip-rtp-g711.pcap');
24 | const filters = [{ ssrc: '0x343da99b', dstIp: '10.0.2.20', dstPort: '6000' }];
25 | const p2w = new PcapToWav({ pcap, filters });
26 | const result = await p2w.convert();
27 | const { size } = await helpers.fs.statAsync(result.wav);
28 | expect(67634).equal(size);
29 | });
30 |
31 | it('gsm', async () => {
32 | const pcap = path.resolve(__dirname, '../../samples/sip-rtp-gsm.pcap');
33 | const p2w = new PcapToWav({ pcap });
34 | const result = await p2w.convert();
35 | const { size } = await helpers.fs.statAsync(result.wav);
36 | expect(60).equal(size);
37 | });
38 |
39 | it('filter', async () => {
40 | const filters = [
41 | {
42 | dstPort: '8000',
43 | ssrc: '0x58F33DEA',
44 | dstIp: '200.57.7.204',
45 | }, {
46 | dstPort: '40362',
47 | ssrc: '0x00002E3D',
48 | dstIp: '200.57.7.196',
49 | },
50 | ];
51 | const pcap = path.resolve(__dirname, '../../samples/SIP_CALL_RTP_G711.pcap');
52 | const p2w = new PcapToWav({ filters, pcap });
53 | const result = await p2w.convert();
54 | expect(2).equal(result.rtpCount);
55 | });
56 | it('clean', async () => {
57 | const pcap = path.resolve(__dirname, '../../samples/aaa.pcap');
58 | const p2w = new PcapToWav({ pcap });
59 | const result = await p2w.convert();
60 | const basename = path.parse(result.wav).name;
61 | const isExistsPCMA = await helpers.fs.existsAsync(path.resolve(__dirname, `../../files/${basename}_0.PCMA`));
62 | const isExistsWAV = await helpers.fs.existsAsync(path.resolve(__dirname, `../../files/${basename}_0.wav`));
63 | expect(false).equal(isExistsPCMA);
64 | expect(false).equal(isExistsWAV);
65 | });
66 | it('not clean', async () => {
67 | const pcap = path.resolve(__dirname, '../../samples/aaa.pcap');
68 | const p2w = new PcapToWav({ pcap, clean: false });
69 | const result = await p2w.convert();
70 | const basename = path.parse(result.wav).name;
71 | const pcmaTrash = path.resolve(__dirname, `../../files/${basename}_0.PCMA`);
72 | const wavTrash = path.resolve(__dirname, `../../files/${basename}_0.wav`);
73 | const isExistsPCMA = await helpers.fs.existsAsync(pcmaTrash);
74 | const isExistsWAV = await helpers.fs.existsAsync(wavTrash);
75 | expect(true).equal(isExistsPCMA);
76 | expect(true).equal(isExistsWAV);
77 | });
78 |
79 | it('wav option', async () => {
80 | const pcap = path.resolve(__dirname, '../../samples/aaa.pcap');
81 | const wav = path.resolve(__dirname, '../../files/track.wav');
82 | const p2w = new PcapToWav({ pcap, wav });
83 | const result = await p2w.convert();
84 | const wavExists = await helpers.fs.existsAsync(wav);
85 | expect(wav).to.equal(result.wav);
86 | expect(true).to.equal(wavExists);
87 | });
88 | });
89 |
--------------------------------------------------------------------------------
/src/api/pcap-to-wav.ts:
--------------------------------------------------------------------------------
1 | import * as path from 'path';
2 | const debug = require('debug')('pcap2wav:core:pcap-to-wav');
3 |
4 | import { sox } from '../sox';
5 | import { tshark } from '../tshark';
6 | import { helpers } from '../helpers';
7 |
8 | import { Pcap2WavOptions, RtpData, RtpInfoData } from '../typings';
9 |
10 | class PcapToWav {
11 | /** параметры */
12 | private options: Pcap2WavOptions;
13 | /** ртп потоки */
14 | private rtps: RtpData[];
15 | /** id операции */
16 | private opId: string;
17 | /** папка с файлами */
18 | private filesDir: string;
19 | private info: RtpInfoData[];
20 | private wav: string;
21 | constructor(options: Pcap2WavOptions) {
22 | this.options = options || {};
23 | this.opId = helpers.random();
24 | this.filesDir = path.resolve(__dirname, '../../files');
25 | debug('this.filesDir', this.filesDir);
26 | this.options.pcap = path.resolve(this.options.pcap);
27 | this.options.clean = this.options.clean === false ? false : true;
28 | debug('this.options.pcap', this.options.pcap);
29 | this.wav = this.options.wav || path.resolve(this.filesDir, `${this.opId}.wav`);
30 | debug('this.wav', this.wav);
31 | this.info = [];
32 | this.rtps = [];
33 | }
34 |
35 | public async convert() {
36 | try {
37 | debug('convert start');
38 | await this.loadInfo();
39 | this.filterInfo();
40 | await this.loadRtps();
41 | await this.createWavs();
42 | await this.mergeWavs();
43 | debug('convert finish');
44 | const { wav } = this;
45 | const success = true;
46 | const rtpCount = this.rtps.length;
47 | await this.cleanTrash();
48 | return {
49 | success,
50 | wav,
51 | rtpCount,
52 | };
53 | } catch (error) {
54 | debug('convert error', error);
55 | await this.cleanTrash();
56 | const success = false;
57 | const wav = '';
58 | const rtpCount = null;
59 | return {
60 | success,
61 | error,
62 | wav,
63 | rtpCount,
64 | };
65 | }
66 | }
67 |
68 | private async loadInfo() {
69 | const { info } = await tshark.rtpInfo(this.options);
70 | this.info = info;
71 | debug('this.info.length', this.info.length);
72 | }
73 |
74 | private filterInfo() {
75 | const { filters = [] } = this.options;
76 | if (!Array.isArray(filters)) {
77 | return;
78 | }
79 | if (filters.length < 1) {
80 | return;
81 | }
82 | this.info = this.info.filter((stream) => {
83 | return filters.some((filter) => {
84 | const ssrcEqual = filter.ssrc.toLowerCase() === stream.ssrc.toLowerCase();
85 | const dstPortEqual = filter.dstPort === stream.dstPort;
86 | const dstIpEqual = filter.dstIp === stream.dstIp;
87 | const hit = ssrcEqual && dstIpEqual && dstPortEqual;
88 | return hit;
89 | });
90 | });
91 | debug('filterInfo this.info.length', this.info.length);
92 | }
93 |
94 | private async loadRtps() {
95 | this.rtps = await Promise.all(this.info.map(async (rtp, i) => {
96 | debug('loadRtp i', i, 'rtp.ssrc', rtp.ssrc);
97 | const payloadType = helpers.payloadTypes[rtp.codec];
98 | const codecFile = path.resolve(this.filesDir, `${this.opId}_${i}.${rtp.codec}`);
99 | const wavFile = path.resolve(this.filesDir, `${this.opId}_${i}.wav`);
100 | const opts = {
101 | pcap: this.options.pcap,
102 | ssrc: rtp.ssrc,
103 | dstIp: rtp.dstIp,
104 | dstPort: rtp.dstPort,
105 | };
106 | const payloads = await tshark.extractPayload(opts);
107 | const hexPayloads = payloads
108 | .split(':')
109 | .map((payload) => String.fromCharCode(parseInt(payload, 16)))
110 | .join('');
111 |
112 | return {
113 | payloadType,
114 | payloads,
115 | hexPayloads,
116 | codecFile,
117 | wavFile,
118 | i,
119 | ...rtp,
120 | };
121 | }));
122 | }
123 |
124 | private async createWavs() {
125 | await Promise.all(this.rtps.map(async (rtp) => {
126 | debug('create wav rtp.ssrc', rtp.ssrc);
127 | await helpers.fs.writeFileAsync(rtp.codecFile, rtp.hexPayloads, { encoding: 'ascii' });
128 | await sox.convertToWav(rtp.codec, rtp.codecFile, rtp.wavFile);
129 | }));
130 | }
131 |
132 | private async mergeWavs() {
133 | if (this.rtps.length > 1) {
134 | debug(`merging ${this.rtps.length} wavs into one`);
135 | const wavPaths = this.rtps.map((rtp) => rtp.wavFile).join(' ');
136 | await sox.mergeWavs(wavPaths, this.wav);
137 | return;
138 | }
139 | if (this.rtps.length === 1) {
140 | debug('this.rtps.length === 1. copying one rtp in wav');
141 | const data = await helpers.fs.readFileAsync(this.rtps[0].wavFile);
142 | await helpers.fs.writeFileAsync(this.wav, data);
143 | return;
144 | }
145 | throw Error(`cannot merge wav, this.rtps.length: ${this.rtps.length}`);
146 | }
147 |
148 | private async cleanTrash() {
149 | if (!this.options.clean) {
150 | return;
151 | }
152 | await Promise.all(this.rtps.map(async (rtp) => {
153 | const trashs = [rtp.wavFile, rtp.codecFile];
154 | await Promise.all(trashs.map(async (trash) => {
155 | const exists = await helpers.fs.existsAsync(trash);
156 | if (exists) {
157 | await helpers.fs.unlinkAsync(trash);
158 | }
159 | }));
160 | }));
161 | }
162 |
163 | }
164 |
165 | export {
166 | PcapToWav,
167 | };
168 |
--------------------------------------------------------------------------------
/src/helpers/exists-async.ts:
--------------------------------------------------------------------------------
1 |
2 | import * as fs from 'fs';
3 | import { promisify } from 'util';
4 |
5 | const statAsync = promisify(fs.stat);
6 | /**
7 | * Проверить существование файла/директории
8 | */
9 | const existsAsync = async (path: fs.PathLike) => {
10 | try {
11 | await statAsync(path);
12 | return true;
13 | } catch (error) {
14 | return false;
15 | }
16 | };
17 |
18 | export {
19 | existsAsync,
20 | };
21 |
--------------------------------------------------------------------------------
/src/helpers/index.spec.ts:
--------------------------------------------------------------------------------
1 | import { expect } from 'chai';
2 | import { helpers } from './';
3 |
4 | describe('helpers', () => {
5 | it('random', () => {
6 | const r1 = helpers.random();
7 | const r2 = helpers.random();
8 | expect(r1).not.equal(r2);
9 | });
10 | });
11 |
--------------------------------------------------------------------------------
/src/helpers/index.ts:
--------------------------------------------------------------------------------
1 | import * as cp from 'child_process';
2 | import * as fs from 'fs';
3 | import { promisify } from 'util';
4 | import { payloadTypes } from './payload-types';
5 | import { existsAsync } from './exists-async';
6 |
7 | class Helpers {
8 | public get fs() {
9 | return {
10 | writeFileAsync: promisify(fs.writeFile),
11 | readFileAsync: promisify(fs.readFile),
12 | unlinkAsync: promisify(fs.unlink),
13 | statAsync: promisify(fs.stat),
14 | existsAsync,
15 | };
16 | }
17 | public get cp() {
18 | return {
19 | execAsync: promisify(cp.exec),
20 | };
21 | }
22 | public get payloadTypes(): any {
23 | return payloadTypes;
24 | }
25 |
26 | public random(min = 100000, max = 999999) {
27 | const rand = Math.round(min - 0.5 + Math.random() * (max - min + 1));
28 | const now = Date.now();
29 | return now + '' + rand;
30 | }
31 |
32 | public typeOf(variable: any) {
33 | const type: string = Object.prototype.toString.call(variable);
34 | return type
35 | .slice(8, -1)
36 | .toLowerCase();
37 | }
38 | }
39 |
40 | const helpers = new Helpers();
41 |
42 | export {
43 | helpers,
44 | Helpers,
45 | };
46 |
--------------------------------------------------------------------------------
/src/helpers/payload-types.ts:
--------------------------------------------------------------------------------
1 | const payloadTypes = {
2 | PCMU: '0',
3 | GSM: '3',
4 | PCMA: '8',
5 | G722: '9',
6 | G729: '18',
7 | };
8 |
9 | export {
10 | payloadTypes,
11 | };
12 |
--------------------------------------------------------------------------------
/src/index.spec.ts:
--------------------------------------------------------------------------------
1 | import * as path from 'path';
2 | import * as fs from 'fs';
3 |
4 | import { expect } from 'chai';
5 | import { pcap2wav, rtpInfo } from './';
6 |
7 | describe('pcap2wav', () => {
8 | it('aaa.pcap, basic convert', async () => {
9 | const pcap = path.resolve(__dirname, '../samples/aaa.pcap');
10 | const result = await pcap2wav({ pcap });
11 | const { size } = fs.statSync(result.wav);
12 | expect(1490).equal(size);
13 | expect(true).equal(/\.wav$/.test(result.wav));
14 | });
15 | it('SIP_CALL_RTP_G711.pcap, basic convert', async () => {
16 | const pcap = path.resolve(__dirname, '../samples/SIP_CALL_RTP_G711.pcap');
17 | const result = await pcap2wav({ pcap });
18 | const { size } = fs.statSync(result.wav);
19 | expect(417436).equal(size);
20 | expect(true).equal(/\.wav$/.test(result.wav));
21 | });
22 | it('SIP_CALL_RTP_G711.pcap, only 1 rtp', async () => {
23 | const pcap = path.resolve(__dirname, '../samples/SIP_CALL_RTP_G711.pcap');
24 | const { info } = await rtpInfo({ pcap });
25 | const filters = info.slice(0, 1);
26 | const result = await pcap2wav({ pcap, filters });
27 | const { size } = fs.statSync(result.wav);
28 | expect(87192).equal(size);
29 | expect(true).equal(/\.wav$/.test(result.wav));
30 | });
31 | });
32 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | export * from './api';
2 |
--------------------------------------------------------------------------------
/src/sox/index.ts:
--------------------------------------------------------------------------------
1 | const debug = require('debug')('pcap2wav:sox:index');
2 | import { helpers } from '../helpers';
3 |
4 | class Sox {
5 | public async convertToWav(codec: string, codecFile: string, wavFile: string) {
6 | const command = this.createConvertToWavCommand(codec, codecFile, wavFile);
7 | const { stderr, stdout } = await helpers.cp.execAsync(command);
8 | debug(stderr, stdout);
9 | }
10 |
11 | public async mergeWavs(inputWavPaths: string, wav: string) {
12 | const command = `sox --combine merge ${inputWavPaths} ${wav}`;
13 | const { stderr, stdout } = await helpers.cp.execAsync(command);
14 | debug(stderr, stdout);
15 | }
16 |
17 | private createConvertToWavCommand(codec: string, codecFile: string, wavFile: string) {
18 | debug('createConvertToWavCommand codec:', codec);
19 | if (codec === 'PCMA') {
20 | return this.escapingBackslash(`sox -t al -r 8000 -c 1 ${codecFile} ${wavFile}`);
21 | }
22 | if (codec === 'PCMU') {
23 | return this.escapingBackslash(`sox -t ul -r 8000 -c 1 ${codecFile} ${wavFile}`);
24 | }
25 | if (codec === 'GSM') {
26 | return this.escapingBackslash(`sox -t gsm -r 8000 -c 1 ${codecFile} ${wavFile}`);
27 | }
28 | throw Error(`cannot define convert command for codec: ${codec}`);
29 | }
30 |
31 | private escapingBackslash(input: string): string {
32 | return input.replace(/\\/g, '\\\\');
33 | }
34 | }
35 |
36 | const sox = new Sox();
37 |
38 | export {
39 | sox,
40 | Sox,
41 | };
42 |
--------------------------------------------------------------------------------
/src/tshark/index.spec.ts:
--------------------------------------------------------------------------------
1 | // tslint:disable:max-line-length
2 |
3 | import * as path from 'path';
4 | import * as os from 'os';
5 | import { expect } from 'chai';
6 | import { tshark } from './';
7 |
8 | describe('tshark', () => {
9 | const pcap = path.resolve(__dirname, '../../samples/aaa.pcap');
10 | it('rtpInfo', async () => {
11 | const result = await tshark.rtpInfo({ pcap });
12 | const due = {
13 | info: [
14 | {
15 | srcIp: '192.168.1.2',
16 | srcPort: '30000',
17 | dstIp: '212.242.33.36',
18 | dstPort: '40392',
19 | ssrc: '0x3796CB71',
20 | codec: 'PCMA',
21 | packets: '9',
22 | lostPackets: '0',
23 | lostPercent: '(0.0%)',
24 | maxDelta: '69.95',
25 | maxJitter: '7.80',
26 | meanJitter: '18.02',
27 | problems: undefined,
28 | },
29 | ],
30 | };
31 | expect(true).equal(result.success);
32 | expect(due.info).deep.equal(result.info);
33 | // expect('').equal(result.stderr);
34 | });
35 |
36 | it('extractPayload', async () => {
37 | const ssrc = '0x3796cb71';
38 | const dstIp = '212.242.33.36';
39 | const dstPort = '40392';
40 | const result = await tshark.extractPayload({ pcap, ssrc, dstIp, dstPort });
41 | const due = [
42 | 'd5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:d5:11:04:1c:18:18:12:12:1e:10:14:17:6a:13:1c:18:04:04:05:06:01:01:00:07:05:05:19:13:05:1b:19:10:13:19:05:04:04:07:03:02:03:03:00:00:02:0d:0d:0d:00:01:03:0d:0c:0d:00:00:01:02:03:01:06:06:01:0f:0e:0e:0c:03:00:07:06:00:03:03:06:07:01:04:06:06:1b:1f:1c:11:69:60:62:15:11:10:14:6a:13:15:60:69:61:7d:74:52:5b:59:d7:47:5c:56:52:55:44:4b:42:75:59:73:78:5a:7c:6e:68:14:6a',
43 | '6e:68:15:14:6a:14:14:15:69:60:6e:6a:6c:6e:64:6c:6a:16:17:6c:6e:6d:60:66:7e:7f:45:c6:c9:f0:fc:e7:f3:fa:e5:f0:cb:f1:f6:cf:cd:e4:fa:c2:53:74:5f:42:5b:f6:f0:f2:fc:e0:ee:97:e8:f2:57:5a:4f:4d:75:67:7f:7d:66:65:74:75:43:78:4b:47:55:43:67:66:6d:63:6c:64:66:64:78:64:6f:6f:14:14:6c:17:11:13:10:17:10:1c:1f:1d:10:10:16:10:10:1f:1c:1f:19:1e:18:10:17:12:14:6c:62:6d:63:6a:15:15:17:6e:65:77:72:40:d0:f7:73:7d:7e:62:67:62:6a:15:6a:17:15:65:43:71:5a:59:7e:60:66:7a:72:72:49:65:7a:60:78:5d:44:42',
44 | '71:7e:70:76:d6:c5:d0:4b:74:76:7f:76:4f:50:41:d1:58:66:67:65:7f:67:6f:78:63:66:66:6a:14:17:16:14:11:10:10:15:6f:66:4f:7a:65:65:61:62:68:60:4f:7f:61:66:64:72:75:78:6d:6c:15:15:15:6a:67:6c:69:62:7f:78:66:60:67:63:61:74:cd:f8:d7:76:63:62:61:78:6f:78:72:60:69:6e:63:50:59:70:65:6d:64:61:67:65:6a:6a:11:12:10:10:13:1e:1f:1f:1d:17:6a:14:6f:46:5d:45:dd:5e:44:49:d6:d0:c4:51:51:df:d4:df:41:74:7f:67:d2:f5:e5:e6:ec:e8:97:96:ef:e0:ec:94:93:94:ea:ea:94:9f:90:9c:9c:92:97:f8:e7:ec:e7:e1:e0:ea',
45 | '92:97:e8:e9:97:ea:e5:fa:e7:e6:ec:fa:fa:c0:78:7a:61:64:70:60:67:78:cb:ef:ef:ea:ec:95:91:ee:e4:e2:ea:92:92:9d:92:90:94:95:91:9c:9e:9b:87:87:81:80:82:83:83:81:81:86:86:81:81:80:81:83:83:81:80:86:84:85:85:9e:99:85:84:85:85:87:87:86:85:85:84:80:82:80:83:81:98:9c:90:9d:9f:98:9f:90:96:ea:ee:ec:e9:ee:e8:97:e8:e2:ee:fa:dc:5a:dc:c9:f3:f2:f3:f6:e8:ea:ee:ee:97:91:96:96:91:9d:98:9b:98:85:87:86:86:85:9c:9e:99:9e:9f:99:9f:9f:93:93:9f:85:87:84:93:94:93:93:97:94:e9:f8:f7:4f:58:43:54:cf:41:42',
46 | '44:7d:70:56:de:f5:f6:f2:e0:ee:e1:f1:c3:78:78:64:64:61:7c:4f:54:59:5f:d1:cf:e0:ed:e7:f3:e4:94:93:94:94:95:ed:e2:ec:f1:f8:f8:e6:e4:f3:c7:cd:fd:fc:fd:fa:f4:e7:ed:e2:92:ea:e3:e1:ec:e7:e3:e1:fa:ff:de:c0:c0:42:7c:4b:d0:cd:f5:57:75:5d:dc:c9:f1:e0:e9:e9:e5:f0:cd:c5:d6:45:42:67:64:78:67:61:7f:7a:68:72:d6:fa:e6:e8:e9:e1:e0:e7:f0:c6:fc:c3:51:70:4d:c1:fa:e6:cd:cb:e5:ee:ec:e6:ed:ef:ea:97:ea:ee:e8:cb:d7:f0:de:f2:d3:dc:dd:56:d7:d5:f8:f4:f0:41:7f:7f:63:66:78:66:6c:11:1d:11:6a:6a:6f:60:70:78',
47 | '65:65:66:14:1d:1c:05:04:07:07:04:1b:1f:16:60:63:6d:62:14:6a:68:15:17:6f:17:13:16:10:10:1d:16:11:10:16:17:11:10:15:68:6a:6d:61:6e:63:63:14:16:10:1f:1e:12:1d:16:16:12:1d:17:69:6d:15:69:64:7f:68:6a:14:17:69:62:68:11:14:16:6f:66:66:6d:61:6d:68:15:11:1d:19:1c:1d:1f:1d:1b:1b:1e:1c:1d:1f:18:1b:19:11:15:6e:6a:14:12:1b:05:04:18:05:1b:1d:13:16:6c:7a:71:46:71:65:66:68:69:72:76:72:6a:13:13:11:12:13:14:6a:64:53:cb:c9:f1:f8:ed:fa:e3:fa:cb:cf:d4:f4:fa:5f:4f:d1:5b:4b:7f:49:75:54:cb:fe:e6:ec',
48 | 'e4:d9:de:4b:49:7c:63:69:15:62:6f:68:15:6f:6d:6d:6d:63:65:64:72:73:78:6f:66:6a:68:68:6a:63:68:7a:73:4d:74:67:7a:7e:59:da:5d:45:cd:d1:d4:d1:db:d9:cb:ec:f1:dc:fc:e6:ee:97:95:95:97:97:ee:e9:e3:c3:f3:f4:f7:f5:f3:e1:fc:f3:f5:cd:c2:f6:e5:e5:fa:f3:f6:5a:49:74:68:6d:66:67:4b:70:47:54:d0:59:4d:4f:7e:5a:c1:cb:f3:c1:47:70:64:67:66:6c:64:73:7a:61:64:72:78:75:c7:e3:ff:f1:f1:4d:56:fc:d6:f5:e5:ec:ef:ee:95:91:90:9d:85:99:9b:9b:85:85:84:85:98:99:9b:84:85:84:84:98:9e:85:9b:84:84:9b:9c:96:97:97',
49 | 'ea:ea:ec:e6:e7:94:90:93:97:95:91:96:94:ec:95:94:e0:f8:e8:ee:e1:cd:75:db:c6:c7:f3:fc:e2:e0:e6:e7:da:c0:f1:f8:c2:4d:cd:f0:e6:ee:ef:e3:ef:ea:e9:e4:e1:f8:ff:db:d8:d9:d7:fe:e5:e3:e1:ed:ec:93:97:94:ea:ec:e2:f3:cf:51:f5:50:cf:de:c9:e5:f2:e3:97:91:97:92:9c:91:97:e8:ea:93:96:90:95:ea:e8:e2:e2:e1:ef:ea:ec:94:97:e9:ea:e3:fe:f6:f6:cb:f8:e2:e0:e6:f8:fd:f7:f2:cb:f6:e6:f8:fa:e4:ec:e9:94:95:94:95:e9:e8:e8:ef:ed:ea:96:91:93:93:9c:93:91:92:90:93:93:91:97:96:96:91:90:90:96:e9:ea:e9:ec:95:97:97',
50 | '96:90:e9:96:9d:9c:99:9e:9f:92:96:91:95:ed:e7:f4:f4:f2:fc:fc:95:91:92:9e:84:87:84:98:91:91:97:9d:90:94:96:97:e8:e3:94:e8:96:91:96:9d:9c:9f:85:84:85:9d:91:90:97:95:e9:96:90:9d:9e:84:84:9b:85:87:85:85:99:85:98:93:9f:9d:92:90:90:ea:ef:ea:91:9d:9f:99:84:98:9d:9e:91:93:93:94:ec:e0:fa:f8:f6:e1:e0:f4:e5:f8:e4:e8:ea:e9:e5:f5:e5:e2:ed:fe:dc:d5:54:ff:fa:e8:97:e8:94:94:90:90:95:ee:e5:e6:fc:e6:ee:ee:95:96:91:97:96:ec:e3:e9:93:93:9f:9b:9f:98:93:95:95:ee:e9:ed:94:97:92:92:97:95:ef:ea:96:90',
51 | '',
52 | ].join(os.EOL);
53 | expect(due).equal(result);
54 | });
55 |
56 | it('rtpInfo GSM', async () => {
57 | const gsm = path.resolve(__dirname, '../../samples/sip-rtp-gsm.pcap');
58 | const result = await tshark.rtpInfo({ pcap: gsm });
59 | const due = {
60 | info: [
61 | {
62 | srcIp: '10.0.2.15',
63 | srcPort: '18924',
64 | dstIp: '10.0.2.20',
65 | dstPort: '6000',
66 | ssrc: '0x043DAAF1',
67 | codec: 'GSM',
68 | packets: '425',
69 | lostPackets: '0',
70 | lostPercent: '(0.0%)',
71 | maxDelta: '21.72',
72 | maxJitter: '0.21',
73 | meanJitter: '0.02',
74 | problems: undefined,
75 | },
76 | ],
77 | };
78 | expect(true).equal(result.success);
79 | expect(due.info).deep.equal(result.info);
80 | // expect('').equal(result.stderr);
81 | });
82 |
83 | it('rtp start', async () => {
84 | const result = await tshark.rtpInfo({ pcap });
85 | expect(1120470985000).equal(result.rtpStart);
86 | });
87 | });
88 |
--------------------------------------------------------------------------------
/src/tshark/index.ts:
--------------------------------------------------------------------------------
1 | const debug = require('debug')('pcap2wav:tshark:index');
2 | import { helpers } from '../helpers';
3 | import { rtpInfo } from './rtp-info';
4 |
5 | import { RtpInfoOptions } from '../typings';
6 |
7 | const maxBuffer = 1024 * 50000; // 50 mb
8 |
9 | class Tshark {
10 | public async rtpInfo(options: RtpInfoOptions) {
11 | return await rtpInfo.init(options);
12 | }
13 | public async extractPayload(options: { pcap: string, ssrc: string, dstIp: string, dstPort: string }) {
14 | const filter = `rtp.ssrc == ${options.ssrc} && ip.dst == ${options.dstIp} && udp.dstport == ${options.dstPort}`;
15 | const command = `tshark -n -r ${options.pcap} -Y "${filter}" -T fields -e rtp.payload`;
16 | const { stderr, stdout } = await helpers.cp.execAsync(command, { maxBuffer });
17 | if (stderr) {
18 | debug(stderr);
19 | }
20 | return stdout;
21 | }
22 |
23 | }
24 |
25 | const tshark = new Tshark();
26 |
27 | export {
28 | tshark,
29 | Tshark,
30 | };
31 |
--------------------------------------------------------------------------------
/src/tshark/rtp-info.ts:
--------------------------------------------------------------------------------
1 | import { helpers } from '../helpers';
2 | import * as os from 'os';
3 |
4 | const debug = require('debug')('pcap2wav:tshark:rtp-info');
5 | import { RtpInfoOptions, RtpInfoData } from '../typings';
6 |
7 | class RtpInfo {
8 | public async init(options: RtpInfoOptions) {
9 | const { pcap } = options;
10 | const [info, rtpStart] = await Promise.all([
11 | this.execRtpInfo(pcap),
12 | this.execRtpStart(pcap),
13 | ]);
14 | return {
15 | success: true,
16 | info,
17 | rtpStart,
18 | };
19 | }
20 |
21 | private async execRtpInfo(pcap: string) {
22 | const command = `tshark -r ${pcap} -qz rtp,streams`;
23 | const { stderr, stdout } = await helpers.cp.execAsync(command);
24 | if (stderr) { debug(stderr); }
25 | const success = !stderr;
26 | const info = this.rtpInfoParser(stdout);
27 | return info;
28 | }
29 |
30 | private clearCodec(input: string) {
31 | return input
32 | .replace(/GSM\s+06.10/gi, 'GSM')
33 | .replace(/ITU-T\s+G.711\s+PCMA/gi, 'PCMA')
34 | .replace(/ITU-T\s+G.711\s+PCMU/gi, 'PCMU')
35 | .replace(/ITU-T\s+G.729/gi, 'G729');
36 | }
37 | private rtpInfoParser(input: string): RtpInfoData[] {
38 | debug('parser input:', os.EOL, input);
39 | const rows = this.clearCodec(input).split(os.EOL).slice(2, -2);
40 | const columns = rows.map((row) => row.trim().split(/\s+/));
41 | const result = columns.map((column) => {
42 | const [
43 | srcIp,
44 | srcPort,
45 | dstIp,
46 | dstPort,
47 | ssrc,
48 | codec,
49 | packets,
50 | lostPackets,
51 | lostPercent,
52 | maxDelta,
53 | maxJitter,
54 | meanJitter,
55 | problems,
56 | ] = column;
57 |
58 | return {
59 | srcIp,
60 | srcPort,
61 | dstIp,
62 | dstPort,
63 | ssrc,
64 | codec,
65 | packets,
66 | lostPackets,
67 | lostPercent,
68 | maxDelta,
69 | maxJitter,
70 | meanJitter,
71 | problems,
72 | };
73 | });
74 | return result;
75 | }
76 |
77 | private async execRtpStart(pcap: string) {
78 | const command = `tshark -r ${pcap} -Y "rtp" -o "gui.column.format:\"Time\",\"%Yt\"" | head -n 1`;
79 | const { stderr, stdout } = await helpers.cp.execAsync(command);
80 | if (stderr) { debug(stderr); }
81 | const success = !stderr;
82 | const rtpStart = this.rtpStartParser(stdout);
83 | return rtpStart;
84 | }
85 |
86 | private rtpStartParser(input: string) {
87 | debug('rtpStartParser input', input);
88 | const [timeRaw] = input.split(os.EOL);
89 | const [time] = timeRaw.split(/[,\.]/);
90 | const timestamp = +new Date(time);
91 | return timestamp;
92 | }
93 | }
94 |
95 | const rtpInfo = new RtpInfo();
96 |
97 | export {
98 | rtpInfo,
99 | RtpInfo,
100 | };
101 |
--------------------------------------------------------------------------------
/src/typings.d.ts:
--------------------------------------------------------------------------------
1 | declare class Pcap2WavOptions {
2 | pcap: string;
3 | wav?: string;
4 | filters?: RtpInfoData[] | Filters[];
5 | clean?: boolean;
6 | }
7 |
8 | declare class Filters {
9 | ssrc: string;
10 | dstPort: string;
11 | dstIp: string;
12 | }
13 |
14 | declare class RtpInfoOptions {
15 | pcap: string;
16 | }
17 |
18 | declare class RtpInfoData {
19 | srcIp: string;
20 | srcPort: string;
21 | dstIp: string;
22 | dstPort: string;
23 | ssrc: string;
24 | codec: string;
25 | packets: string
26 | lostPackets: string;
27 | lostPercent: string;
28 | maxDelta: string;
29 | maxJitter: string;
30 | meanJitter: string;
31 | problems: string;
32 | }
33 |
34 | declare class RtpData extends RtpInfoData {
35 | payloadType: string;
36 | payloads: string;
37 | hexPayloads: string;
38 | codecFile: string;
39 | wavFile: string;
40 | i: number;
41 | }
42 |
43 | export {
44 | Pcap2WavOptions,
45 | RtpInfoOptions,
46 | RtpInfoData,
47 | RtpData,
48 | };
49 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "include": [
3 | "src"
4 | ],
5 | "compilerOptions": {
6 | /* Basic Options */
7 | "target": "es2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
8 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
9 | "lib": ["es2017"], /* Specify library files to be included in the compilation. */
10 | // "allowJs": true, /* Allow javascript files to be compiled. */
11 | // "checkJs": true, /* Report errors in .js files. */
12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */
14 | // "sourceMap": true, /* Generates corresponding '.map' file. */
15 | // "outFile": "./", /* Concatenate and emit output to single file. */
16 | "outDir": "./out", /* Redirect output structure to the directory. */
17 | "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
18 | // "removeComments": true, /* Do not emit comments to output. */
19 | // "noEmit": true, /* Do not emit outputs. */
20 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */
21 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
22 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
23 |
24 | /* Strict Type-Checking Options */
25 | "strict": true, /* Enable all strict type-checking options. */
26 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
27 | // "strictNullChecks": true, /* Enable strict null checks. */
28 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */
29 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
30 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
31 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
32 |
33 | /* Additional Checks */
34 | // "noUnusedLocals": true, /* Report errors on unused locals. */
35 | // "noUnusedParameters": true, /* Report errors on unused parameters. */
36 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
37 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
38 |
39 | /* Module Resolution Options */
40 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
41 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
42 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
43 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
44 | // "typeRoots": [], /* List of folders to include type definitions from. */
45 | // "types": [], /* Type declaration files to be included in compilation. */
46 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
47 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
48 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
49 |
50 | /* Source Map Options */
51 | // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
52 | // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */
53 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
54 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
55 |
56 | /* Experimental Options */
57 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
58 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
59 | }
60 | }
--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "defaultSeverity": "error",
3 | "extends": [
4 | "tslint:recommended"
5 | ],
6 | "jsRules": {},
7 | "rules": {
8 | "quotemark": [
9 | true,
10 | "single"
11 | ],
12 | "object-literal-sort-keys": false,
13 | "no-var-requires": false,
14 | "ordered-imports": false
15 | },
16 | "rulesDirectory": []
17 | }
--------------------------------------------------------------------------------