├── .gitignore
├── LICENSE
├── README.md
├── app
├── app.js
├── bin
│ └── www
├── cert.pem
├── models
│ ├── booking.js
│ └── index.js
├── package-lock.json
├── package.json
├── public
│ └── stylesheets
│ │ └── style.css
├── routes
│ ├── index.js
│ └── list.js
├── utils.js
└── views
│ ├── confirm.pug
│ ├── error.pug
│ ├── index.pug
│ ├── layout.pug
│ ├── list.pug
│ ├── payment.pug
│ └── select.pug
└── images
├── list_insecure.png
├── list_secure.png
├── redaction.gif
├── redaction.png
├── self_revealing.gif
├── self_revealing.png
├── third_revealing.gif
└── third_revealing.png
/.gitignore:
--------------------------------------------------------------------------------
1 | ### IntelliJ template
2 | .idea/
3 | *.iml
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Very Good Security, Inc.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |

2 | vgs-nodejs-sample
3 | Integration of node.js app with VGS
4 |
5 | # Instructions for using this App
6 | This demo app demonstrates the typical scenario for secure/revealing traffic from customer application to payments operator.
7 |
8 | ## Requirements
9 | - VGS [account](https://dashboard.verygoodsecurity.com/)
10 | - Stripe [account](https://dashboard.stripe.com/register)
11 | - HomeAway [account](https://www.homeaway.com/platform/lead-form)
12 | - [ngrok](https://ngrok.com/)
13 |
14 | ## Third-party services
15 | 1. Create account on Stripe
16 | 2. Generate Stripe sandbox API key (https://dashboard.stripe.com/account/apikeys)
17 | 3. Create account on HomeAway
18 | 4. Get your HomeAway client_id and secret (https://www.homeaway.com/platform/myClients)
19 |
20 | ## VGS base setup
21 | 1. Go to [VGS-Dashboard](https://dashboard.verygoodsecurity.com), create a new organization, create a new vault.
22 | 2. Select your vault, go to `Integration` page
23 | 3. Copy your proxy URL, it should be in format:
24 | ```
25 | http://:@.SANDBOX.verygoodproxy.com:8080
26 | ```
27 | * Proxy URL should start with `http://`, otherwise `https-proxy-agent` lib won't work
28 | * This application contains SSL certificate `cert.pem` for VGS Sandbox environment only
29 |
30 | ## Run application
31 | 1. Clone repository and go to `app` folder
32 | 2. Install all dependencies `npm install`
33 | 3. Run the app
34 | ```
35 | HA_CLIENT='' HA_SECRET='' STRIPE_TOKEN='' HTTP_PROXY='' npm start
36 | ```
37 | 4. Run ngrok `ngrok http 3000`
38 | 5. Copy provided address `https://.ngrok.io`
39 |
40 | ## Application structure
41 | - `/` - search form, after selecting some hotel will redirect to the payment page
42 | - `/list` - list of payments for booked hotels
43 | - `/list/:id` - revealed payment data page
44 |
45 | ## Secure inbound traffic with VGS
46 | 
47 |
48 | 1. Go to VGS dashboard
49 | 2. Go to `Secure traffic` -> `Inbound`
50 | 3. Put ngrok url to upstream
51 | 4. Application should be available by `https://.sandbox.verygoodproxy.com/`
52 | 5. Fill forms in app, submit payment data
53 | 6. Take a look at list of payments `https://.sandbox.verygoodproxy.com/list`. The data was saved as is.
54 |
55 |
56 | 7. Next we are going to save and use tokens instead of the sensitive data. Open VGS dashboard, go to `Logs`
57 | 8. Ensure that logger is recording payloads
58 | 9. Find the request with payment data, click on it
59 | 10. Click on `Secure this payload`
60 | 11. Select fields, click `Secure`
61 | 12. Done, you inbound secure route has been created and should look like this:
62 |
63 |
64 | 13. Take a look at list of payments again `https://.sandbox.verygoodproxy.com/list`
65 | to ensure using tokens instead of sensitive data.
66 |
67 |
68 | ## Setup self-revealing
69 | 
70 |
71 | 1. Open payments list page at `https://.sandbox.verygoodproxy.com/list`
72 | 2. All fields should be replaced with tokens
73 | 3. Click on `Reveal`, nothing should change because revealing rule isn't setup yet
74 | 4. Open VGS dashboard, go to `Routes`
75 | 5. Click `New Route` -> `New inbound route`
76 | 6. Put ngrok url to upstream
77 | 7. Set one filter condition: `Pathinfo matches /list/\\d+`
78 | 8. Phase: `On response`
79 | 9. Basic type: `REVEAL`
80 | 10. Operation: `RegExp`
81 | 11. Fields in Regexp: `tok_[a-z]*_[0-9a-zA-Z]{20,22}`
82 | 12. Click Save
83 | 13. Go back to the payments page at `https://.sandbox.verygoodproxy.com/list`
84 | 14. Click on `Reveal`, now instead of tokens you should see real data there
85 | 13. Done, you inbound self-revealing route has been created correctly and should look like this:
86 |
87 |
88 | ## Secure outbound traffic to Stripe
89 |
90 |
91 | 1. Go to VGS dashboard
92 | 2. Go to `Secure traffic` -> `Outbound`
93 | 3. Switch to the application, submit payment data again
94 | 4. Go back to VGS dashboard, it should detect the outbound connection, click on `Secure data`
95 | 5. Find the request to Stripe API `https://api.stripe.com/v1/tokens`, click on it
96 | 6. Click on `Secure this payload`
97 | 7. Select fields, click `Secure`, now Stripe will be receiving revealed data
98 | 8. Done, you outbound secure route has been created and should look like this:
99 |
100 |
101 | ## What is VGS?
102 |
103 | _**Want to just jump right in?** Check out our [getting started
104 | guide](https://www.verygoodsecurity.com/docs/getting-started)._
105 |
106 | Very Good Security (VGS) allows you to enhance your security standing while
107 | maintaining the utility of your data internally and with third-parties. As an
108 | added benefit, we accelerate your compliance certification process and help you
109 | quickly obtain security-related compliances that stand between you and your
110 | market opportunities.
111 |
112 | To learn more, visit us at https://www.verygoodsecurity.com/
113 |
114 | ## License
115 |
116 | This project is licensed under the MIT license. See the [LICENSE](LICENSE) file
117 | for details.
--------------------------------------------------------------------------------
/app/app.js:
--------------------------------------------------------------------------------
1 | var createError = require('http-errors');
2 | var express = require('express');
3 | var sqlite = require('sqlite3');
4 | var path = require('path');
5 | var cookieParser = require('cookie-parser');
6 | var logger = require('morgan');
7 |
8 | var indexRouter = require('./routes/index');
9 | var listRouter = require('./routes/list');
10 |
11 | var app = express();
12 |
13 | // models
14 | var models = require('./models');
15 |
16 | models.sequelize.sync().then(function() {
17 | console.log('connected to database')
18 | }).catch(function(err) {
19 | console.log(err)
20 | });
21 |
22 | // view engine setup
23 | app.set('views', path.join(__dirname, 'views'));
24 | app.set('view engine', 'pug');
25 |
26 | app.use(logger('dev'));
27 | app.use(express.json());
28 | app.use(express.urlencoded({ extended: false }));
29 | app.use(cookieParser());
30 | app.use(express.static(path.join(__dirname, 'public')));
31 |
32 | app.use('/', indexRouter);
33 | app.use('/list', listRouter);
34 |
35 | // catch 404 and forward to error handler
36 | app.use(function(req, res, next) {
37 | next(createError(404));
38 | });
39 |
40 | // error handler
41 | app.use(function(err, req, res, next) {
42 | // set locals, only providing error in development
43 | res.locals.message = err.message;
44 | res.locals.error = req.app.get('env') === 'development' ? err : {};
45 |
46 | // render the error page
47 | res.status(err.status || 500);
48 | res.render('error');
49 | });
50 |
51 | module.exports = app;
52 |
--------------------------------------------------------------------------------
/app/bin/www:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /**
4 | * Module dependencies.
5 | */
6 |
7 | var app = require('../app');
8 | var debug = require('debug')('nodejs-demo:server');
9 | var http = require('http');
10 |
11 | /**
12 | * Get port from environment and store in Express.
13 | */
14 |
15 | var port = normalizePort(process.env.PORT || '3000');
16 | app.set('port', port);
17 |
18 | /**
19 | * Create HTTP server.
20 | */
21 |
22 | var server = http.createServer(app);
23 |
24 | /**
25 | * Listen on provided port, on all network interfaces.
26 | */
27 |
28 | server.listen(port);
29 | server.on('error', onError);
30 | server.on('listening', onListening);
31 |
32 | /**
33 | * Normalize a port into a number, string, or false.
34 | */
35 |
36 | function normalizePort(val) {
37 | var port = parseInt(val, 10);
38 |
39 | if (isNaN(port)) {
40 | // named pipe
41 | return val;
42 | }
43 |
44 | if (port >= 0) {
45 | // port number
46 | return port;
47 | }
48 |
49 | return false;
50 | }
51 |
52 | /**
53 | * Event listener for HTTP server "error" event.
54 | */
55 |
56 | function onError(error) {
57 | if (error.syscall !== 'listen') {
58 | throw error;
59 | }
60 |
61 | var bind = typeof port === 'string'
62 | ? 'Pipe ' + port
63 | : 'Port ' + port;
64 |
65 | // handle specific listen errors with friendly messages
66 | switch (error.code) {
67 | case 'EACCES':
68 | console.error(bind + ' requires elevated privileges');
69 | process.exit(1);
70 | break;
71 | case 'EADDRINUSE':
72 | console.error(bind + ' is already in use');
73 | process.exit(1);
74 | break;
75 | default:
76 | throw error;
77 | }
78 | }
79 |
80 | /**
81 | * Event listener for HTTP server "listening" event.
82 | */
83 |
84 | function onListening() {
85 | var addr = server.address();
86 | var bind = typeof addr === 'string'
87 | ? 'pipe ' + addr
88 | : 'port ' + addr.port;
89 | debug('Listening on ' + bind);
90 | }
91 |
--------------------------------------------------------------------------------
/app/cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIID2TCCAsGgAwIBAgIHAN4Gs/LGhzANBgkqhkiG9w0BAQ0FADB5MSQwIgYDVQQD
3 | DBsqLnNhbmRib3gudmVyeWdvb2Rwcm94eS5jb20xITAfBgNVBAoMGFZlcnkgR29v
4 | ZCBTZWN1cml0eSwgSW5jLjEuMCwGA1UECwwlVmVyeSBHb29kIFNlY3VyaXR5IC0g
5 | RW5naW5lZXJpbmcgVGVhbTAgFw0xNjAyMDkyMzUzMzZaGA8yMTE3MDExNTIzNTMz
6 | NloweTEkMCIGA1UEAwwbKi5zYW5kYm94LnZlcnlnb29kcHJveHkuY29tMSEwHwYD
7 | VQQKDBhWZXJ5IEdvb2QgU2VjdXJpdHksIEluYy4xLjAsBgNVBAsMJVZlcnkgR29v
8 | ZCBTZWN1cml0eSAtIEVuZ2luZWVyaW5nIFRlYW0wggEiMA0GCSqGSIb3DQEBAQUA
9 | A4IBDwAwggEKAoIBAQDI3ukHpxIlDCvFjpqn4gAkrQVdWll/uI0Kv3wirwZ3Qrpg
10 | BVeXjInJ+rV9r0ouBIoY8IgRLak5Hy/tSeV6nAVHv0t41B7VyoeTAsZYSWU11deR
11 | DBSBXHWH9zKEvXkkPdy9tgHnvLIzui2H59OPljV7z3sCLguRIvIIw8djaV9z7FRm
12 | KRsfmYHKOBlSO4TlpfXQg7jQ5ds65q8FFGvTB5qAgLXS8W8pvdk8jccmuzQXFUY+
13 | ZtHgjThg7BHWWUn+7m6hQ6iHHCj34Qu69F8nLamd+KJ//14lukdyKs3AMrYsFaby
14 | k+UGemM/s2q3B+39B6YKaHao0SRzSJC7qDwbWPy3AgMBAAGjZDBiMB0GA1UdDgQW
15 | BBRWlIRrE2p2P018VTzTb6BaeOFhAzAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQE
16 | AwIBtjAjBgNVHSUEHDAaBggrBgEFBQcDAQYIKwYBBQUHAwIGBFUdJQAwDQYJKoZI
17 | hvcNAQENBQADggEBAGWxLFlr0b9lWkOLcZtR9IDVxDL9z+UPFEk70D3NPaqXkoE/
18 | TNNUkXgS6+VBA2G8nigq2Yj8qoIM+kTXPb8TzWv+lrcLm+i+4AShKVknpB15cC1C
19 | /NJfyYGRW66s/w7HNS20RmrdN+bWS0PA4CVLXdGzUJn0PCsfsS+6Acn7RPAE+0A8
20 | WB7JzXWi8x9mOJwiOhodp4j41mv+5eHM0reMh6ycuYbjquDNpiNnsLztk6MGsgAP
21 | 5C59drQWJU47738BcfbByuSTYFog6zNYCm7ACqbtiwvFTwjneNebOhsOlaEAHjup
22 | d4QBqYVs7pzkhNNp9oUvv4wGf/KJcw5B9E6Tpfk=
23 | -----END CERTIFICATE-----
--------------------------------------------------------------------------------
/app/models/booking.js:
--------------------------------------------------------------------------------
1 | module.exports = function(sequelize, Sequalize) {
2 | var BookingSchema = sequelize.define("Booking", {
3 | homeaway_id: Sequalize.STRING,
4 | first_name: Sequalize.STRING,
5 | last_name: Sequalize.STRING,
6 | address: Sequalize.STRING,
7 | city: Sequalize.STRING,
8 | state: Sequalize.STRING,
9 | zip: Sequalize.STRING,
10 | cc_name: Sequalize.STRING,
11 | cc_number: Sequalize.STRING,
12 | cc_exp: Sequalize.STRING,
13 | cc_month: Sequalize.STRING,
14 | cc_year: Sequalize.STRING,
15 | cc_cvv: Sequalize.STRING
16 | },{
17 | timestamps: false
18 | });
19 | return BookingSchema;
20 | }
--------------------------------------------------------------------------------
/app/models/index.js:
--------------------------------------------------------------------------------
1 | var fs = require("fs");
2 | var path = require("path");
3 | var Sequelize = require("sequelize");
4 | var sequelize = new Sequelize('demo', 'user', null, {dialect: 'sqlite', torage: './database.sqlite'});
5 | var db = {};
6 |
7 | fs.readdirSync(__dirname).filter(function(file) {
8 | return (file.indexOf(".") !== 0) && (file !== "index.js");
9 | }).forEach(function(file) {
10 | var model = sequelize.import(path.join(__dirname, file));
11 | db[model.name] = model;
12 | });
13 |
14 | Object.keys(db).forEach(function(modelName) {
15 | if ("associate" in db[modelName]) {
16 | db[modelName].associate(db);
17 | }
18 | });
19 |
20 | db.sequelize = sequelize;
21 | db.Sequelize = Sequelize;
22 |
23 | module.exports = db;
24 |
--------------------------------------------------------------------------------
/app/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nodejs-demo",
3 | "version": "0.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/babel-types": {
8 | "version": "7.0.7",
9 | "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz",
10 | "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ=="
11 | },
12 | "@types/babylon": {
13 | "version": "6.16.5",
14 | "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz",
15 | "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==",
16 | "requires": {
17 | "@types/babel-types": "*"
18 | }
19 | },
20 | "@types/node": {
21 | "version": "12.12.6",
22 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.6.tgz",
23 | "integrity": "sha512-FjsYUPzEJdGXjwKqSpE0/9QEh6kzhTAeObA54rn6j3rR4C/mzpI9L0KNfoeASSPMMdxIsoJuCLDWcM/rVjIsSA=="
24 | },
25 | "abbrev": {
26 | "version": "1.1.1",
27 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
28 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
29 | },
30 | "accepts": {
31 | "version": "1.3.7",
32 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
33 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
34 | "requires": {
35 | "mime-types": "~2.1.24",
36 | "negotiator": "0.6.2"
37 | }
38 | },
39 | "acorn": {
40 | "version": "3.3.0",
41 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
42 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
43 | },
44 | "acorn-globals": {
45 | "version": "3.1.0",
46 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
47 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
48 | "requires": {
49 | "acorn": "^4.0.4"
50 | },
51 | "dependencies": {
52 | "acorn": {
53 | "version": "4.0.13",
54 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
55 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
56 | }
57 | }
58 | },
59 | "agent-base": {
60 | "version": "4.2.1",
61 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
62 | "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
63 | "requires": {
64 | "es6-promisify": "^5.0.0"
65 | }
66 | },
67 | "ajv": {
68 | "version": "6.10.0",
69 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
70 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
71 | "requires": {
72 | "fast-deep-equal": "^2.0.1",
73 | "fast-json-stable-stringify": "^2.0.0",
74 | "json-schema-traverse": "^0.4.1",
75 | "uri-js": "^4.2.2"
76 | }
77 | },
78 | "align-text": {
79 | "version": "0.1.4",
80 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
81 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
82 | "requires": {
83 | "kind-of": "^3.0.2",
84 | "longest": "^1.0.1",
85 | "repeat-string": "^1.5.2"
86 | }
87 | },
88 | "ansi-regex": {
89 | "version": "2.1.1",
90 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
91 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
92 | },
93 | "any-promise": {
94 | "version": "1.3.0",
95 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
96 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
97 | },
98 | "aproba": {
99 | "version": "1.2.0",
100 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
101 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
102 | },
103 | "are-we-there-yet": {
104 | "version": "1.1.5",
105 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
106 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
107 | "requires": {
108 | "delegates": "^1.0.0",
109 | "readable-stream": "^2.0.6"
110 | }
111 | },
112 | "array-flatten": {
113 | "version": "1.1.1",
114 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
115 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
116 | },
117 | "asap": {
118 | "version": "2.0.6",
119 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
120 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
121 | },
122 | "asn1": {
123 | "version": "0.2.4",
124 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
125 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
126 | "requires": {
127 | "safer-buffer": "~2.1.0"
128 | }
129 | },
130 | "assert-plus": {
131 | "version": "1.0.0",
132 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
133 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
134 | },
135 | "asynckit": {
136 | "version": "0.4.0",
137 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
138 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
139 | },
140 | "aws-sign2": {
141 | "version": "0.7.0",
142 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
143 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
144 | },
145 | "aws4": {
146 | "version": "1.8.0",
147 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
148 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
149 | },
150 | "babel-runtime": {
151 | "version": "6.26.0",
152 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
153 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
154 | "requires": {
155 | "core-js": "^2.4.0",
156 | "regenerator-runtime": "^0.11.0"
157 | }
158 | },
159 | "babel-types": {
160 | "version": "6.26.0",
161 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
162 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
163 | "requires": {
164 | "babel-runtime": "^6.26.0",
165 | "esutils": "^2.0.2",
166 | "lodash": "^4.17.4",
167 | "to-fast-properties": "^1.0.3"
168 | }
169 | },
170 | "babylon": {
171 | "version": "6.18.0",
172 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
173 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
174 | },
175 | "balanced-match": {
176 | "version": "1.0.0",
177 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
178 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
179 | },
180 | "basic-auth": {
181 | "version": "2.0.1",
182 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
183 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
184 | "requires": {
185 | "safe-buffer": "5.1.2"
186 | }
187 | },
188 | "bcrypt-pbkdf": {
189 | "version": "1.0.2",
190 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
191 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
192 | "requires": {
193 | "tweetnacl": "^0.14.3"
194 | }
195 | },
196 | "bluebird": {
197 | "version": "3.7.1",
198 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz",
199 | "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg=="
200 | },
201 | "body-parser": {
202 | "version": "1.18.3",
203 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
204 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
205 | "requires": {
206 | "bytes": "3.0.0",
207 | "content-type": "~1.0.4",
208 | "debug": "2.6.9",
209 | "depd": "~1.1.2",
210 | "http-errors": "~1.6.3",
211 | "iconv-lite": "0.4.23",
212 | "on-finished": "~2.3.0",
213 | "qs": "6.5.2",
214 | "raw-body": "2.3.3",
215 | "type-is": "~1.6.16"
216 | },
217 | "dependencies": {
218 | "debug": {
219 | "version": "2.6.9",
220 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
221 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
222 | "requires": {
223 | "ms": "2.0.0"
224 | }
225 | },
226 | "http-errors": {
227 | "version": "1.6.3",
228 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
229 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
230 | "requires": {
231 | "depd": "~1.1.2",
232 | "inherits": "2.0.3",
233 | "setprototypeof": "1.1.0",
234 | "statuses": ">= 1.4.0 < 2"
235 | }
236 | },
237 | "ms": {
238 | "version": "2.0.0",
239 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
240 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
241 | }
242 | }
243 | },
244 | "brace-expansion": {
245 | "version": "1.1.11",
246 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
247 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
248 | "requires": {
249 | "balanced-match": "^1.0.0",
250 | "concat-map": "0.0.1"
251 | }
252 | },
253 | "bytes": {
254 | "version": "3.0.0",
255 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
256 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
257 | },
258 | "camelcase": {
259 | "version": "1.2.1",
260 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
261 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
262 | },
263 | "caseless": {
264 | "version": "0.12.0",
265 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
266 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
267 | },
268 | "center-align": {
269 | "version": "0.1.3",
270 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
271 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
272 | "requires": {
273 | "align-text": "^0.1.3",
274 | "lazy-cache": "^1.0.3"
275 | }
276 | },
277 | "character-parser": {
278 | "version": "2.2.0",
279 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
280 | "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
281 | "requires": {
282 | "is-regex": "^1.0.3"
283 | }
284 | },
285 | "chownr": {
286 | "version": "1.1.1",
287 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
288 | "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g=="
289 | },
290 | "clean-css": {
291 | "version": "4.2.1",
292 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
293 | "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
294 | "requires": {
295 | "source-map": "~0.6.0"
296 | }
297 | },
298 | "cliui": {
299 | "version": "2.1.0",
300 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
301 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
302 | "requires": {
303 | "center-align": "^0.1.1",
304 | "right-align": "^0.1.1",
305 | "wordwrap": "0.0.2"
306 | }
307 | },
308 | "cls-bluebird": {
309 | "version": "2.1.0",
310 | "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz",
311 | "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=",
312 | "requires": {
313 | "is-bluebird": "^1.0.2",
314 | "shimmer": "^1.1.0"
315 | }
316 | },
317 | "code-point-at": {
318 | "version": "1.1.0",
319 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
320 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
321 | },
322 | "combined-stream": {
323 | "version": "1.0.8",
324 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
325 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
326 | "requires": {
327 | "delayed-stream": "~1.0.0"
328 | }
329 | },
330 | "component-emitter": {
331 | "version": "1.3.0",
332 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
333 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
334 | },
335 | "concat-map": {
336 | "version": "0.0.1",
337 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
338 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
339 | },
340 | "console-control-strings": {
341 | "version": "1.1.0",
342 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
343 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
344 | },
345 | "constantinople": {
346 | "version": "3.1.2",
347 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
348 | "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==",
349 | "requires": {
350 | "@types/babel-types": "^7.0.0",
351 | "@types/babylon": "^6.16.2",
352 | "babel-types": "^6.26.0",
353 | "babylon": "^6.18.0"
354 | }
355 | },
356 | "content-disposition": {
357 | "version": "0.5.2",
358 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
359 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
360 | },
361 | "content-type": {
362 | "version": "1.0.4",
363 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
364 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
365 | },
366 | "cookie": {
367 | "version": "0.3.1",
368 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
369 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
370 | },
371 | "cookie-parser": {
372 | "version": "1.4.4",
373 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz",
374 | "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==",
375 | "requires": {
376 | "cookie": "0.3.1",
377 | "cookie-signature": "1.0.6"
378 | }
379 | },
380 | "cookie-signature": {
381 | "version": "1.0.6",
382 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
383 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
384 | },
385 | "cookiejar": {
386 | "version": "2.1.2",
387 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
388 | "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
389 | },
390 | "core-js": {
391 | "version": "2.6.5",
392 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz",
393 | "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A=="
394 | },
395 | "core-util-is": {
396 | "version": "1.0.2",
397 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
398 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
399 | },
400 | "dashdash": {
401 | "version": "1.14.1",
402 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
403 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
404 | "requires": {
405 | "assert-plus": "^1.0.0"
406 | }
407 | },
408 | "debug": {
409 | "version": "4.1.1",
410 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
411 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
412 | "requires": {
413 | "ms": "^2.1.1"
414 | }
415 | },
416 | "decamelize": {
417 | "version": "1.2.0",
418 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
419 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
420 | },
421 | "deep-extend": {
422 | "version": "0.6.0",
423 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
424 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
425 | },
426 | "delayed-stream": {
427 | "version": "1.0.0",
428 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
429 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
430 | },
431 | "delegates": {
432 | "version": "1.0.0",
433 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
434 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
435 | },
436 | "depd": {
437 | "version": "1.1.2",
438 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
439 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
440 | },
441 | "destroy": {
442 | "version": "1.0.4",
443 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
444 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
445 | },
446 | "detect-libc": {
447 | "version": "1.0.3",
448 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
449 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
450 | },
451 | "doctypes": {
452 | "version": "1.1.0",
453 | "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
454 | "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
455 | },
456 | "dottie": {
457 | "version": "2.0.1",
458 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz",
459 | "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw=="
460 | },
461 | "ecc-jsbn": {
462 | "version": "0.1.2",
463 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
464 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
465 | "requires": {
466 | "jsbn": "~0.1.0",
467 | "safer-buffer": "^2.1.0"
468 | }
469 | },
470 | "ee-first": {
471 | "version": "1.1.1",
472 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
473 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
474 | },
475 | "encodeurl": {
476 | "version": "1.0.2",
477 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
478 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
479 | },
480 | "es6-promise": {
481 | "version": "4.2.6",
482 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz",
483 | "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q=="
484 | },
485 | "es6-promisify": {
486 | "version": "5.0.0",
487 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
488 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
489 | "requires": {
490 | "es6-promise": "^4.0.3"
491 | }
492 | },
493 | "escape-html": {
494 | "version": "1.0.3",
495 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
496 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
497 | },
498 | "esutils": {
499 | "version": "2.0.2",
500 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
501 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
502 | },
503 | "etag": {
504 | "version": "1.8.1",
505 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
506 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
507 | },
508 | "express": {
509 | "version": "4.16.4",
510 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
511 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
512 | "requires": {
513 | "accepts": "~1.3.5",
514 | "array-flatten": "1.1.1",
515 | "body-parser": "1.18.3",
516 | "content-disposition": "0.5.2",
517 | "content-type": "~1.0.4",
518 | "cookie": "0.3.1",
519 | "cookie-signature": "1.0.6",
520 | "debug": "2.6.9",
521 | "depd": "~1.1.2",
522 | "encodeurl": "~1.0.2",
523 | "escape-html": "~1.0.3",
524 | "etag": "~1.8.1",
525 | "finalhandler": "1.1.1",
526 | "fresh": "0.5.2",
527 | "merge-descriptors": "1.0.1",
528 | "methods": "~1.1.2",
529 | "on-finished": "~2.3.0",
530 | "parseurl": "~1.3.2",
531 | "path-to-regexp": "0.1.7",
532 | "proxy-addr": "~2.0.4",
533 | "qs": "6.5.2",
534 | "range-parser": "~1.2.0",
535 | "safe-buffer": "5.1.2",
536 | "send": "0.16.2",
537 | "serve-static": "1.13.2",
538 | "setprototypeof": "1.1.0",
539 | "statuses": "~1.4.0",
540 | "type-is": "~1.6.16",
541 | "utils-merge": "1.0.1",
542 | "vary": "~1.1.2"
543 | },
544 | "dependencies": {
545 | "debug": {
546 | "version": "2.6.9",
547 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
548 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
549 | "requires": {
550 | "ms": "2.0.0"
551 | }
552 | },
553 | "ms": {
554 | "version": "2.0.0",
555 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
556 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
557 | }
558 | }
559 | },
560 | "extend": {
561 | "version": "3.0.2",
562 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
563 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
564 | },
565 | "extsprintf": {
566 | "version": "1.3.0",
567 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
568 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
569 | },
570 | "fast-deep-equal": {
571 | "version": "2.0.1",
572 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
573 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
574 | },
575 | "fast-json-stable-stringify": {
576 | "version": "2.0.0",
577 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
578 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
579 | },
580 | "finalhandler": {
581 | "version": "1.1.1",
582 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
583 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
584 | "requires": {
585 | "debug": "2.6.9",
586 | "encodeurl": "~1.0.2",
587 | "escape-html": "~1.0.3",
588 | "on-finished": "~2.3.0",
589 | "parseurl": "~1.3.2",
590 | "statuses": "~1.4.0",
591 | "unpipe": "~1.0.0"
592 | },
593 | "dependencies": {
594 | "debug": {
595 | "version": "2.6.9",
596 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
597 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
598 | "requires": {
599 | "ms": "2.0.0"
600 | }
601 | },
602 | "ms": {
603 | "version": "2.0.0",
604 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
605 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
606 | }
607 | }
608 | },
609 | "forever-agent": {
610 | "version": "0.6.1",
611 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
612 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
613 | },
614 | "form-data": {
615 | "version": "2.3.3",
616 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
617 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
618 | "requires": {
619 | "asynckit": "^0.4.0",
620 | "combined-stream": "^1.0.6",
621 | "mime-types": "^2.1.12"
622 | }
623 | },
624 | "formidable": {
625 | "version": "1.2.1",
626 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
627 | "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg=="
628 | },
629 | "forwarded": {
630 | "version": "0.1.2",
631 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
632 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
633 | },
634 | "fresh": {
635 | "version": "0.5.2",
636 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
637 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
638 | },
639 | "fs-minipass": {
640 | "version": "1.2.5",
641 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
642 | "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
643 | "requires": {
644 | "minipass": "^2.2.1"
645 | }
646 | },
647 | "fs.realpath": {
648 | "version": "1.0.0",
649 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
650 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
651 | },
652 | "function-bind": {
653 | "version": "1.1.1",
654 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
655 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
656 | },
657 | "gauge": {
658 | "version": "2.7.4",
659 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
660 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
661 | "requires": {
662 | "aproba": "^1.0.3",
663 | "console-control-strings": "^1.0.0",
664 | "has-unicode": "^2.0.0",
665 | "object-assign": "^4.1.0",
666 | "signal-exit": "^3.0.0",
667 | "string-width": "^1.0.1",
668 | "strip-ansi": "^3.0.1",
669 | "wide-align": "^1.1.0"
670 | }
671 | },
672 | "getpass": {
673 | "version": "0.1.7",
674 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
675 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
676 | "requires": {
677 | "assert-plus": "^1.0.0"
678 | }
679 | },
680 | "glob": {
681 | "version": "7.1.4",
682 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
683 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
684 | "requires": {
685 | "fs.realpath": "^1.0.0",
686 | "inflight": "^1.0.4",
687 | "inherits": "2",
688 | "minimatch": "^3.0.4",
689 | "once": "^1.3.0",
690 | "path-is-absolute": "^1.0.0"
691 | }
692 | },
693 | "har-schema": {
694 | "version": "2.0.0",
695 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
696 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
697 | },
698 | "har-validator": {
699 | "version": "5.1.3",
700 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
701 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
702 | "requires": {
703 | "ajv": "^6.5.5",
704 | "har-schema": "^2.0.0"
705 | }
706 | },
707 | "has": {
708 | "version": "1.0.3",
709 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
710 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
711 | "requires": {
712 | "function-bind": "^1.1.1"
713 | }
714 | },
715 | "has-unicode": {
716 | "version": "2.0.1",
717 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
718 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
719 | },
720 | "homeaway": {
721 | "version": "0.2.7",
722 | "resolved": "https://registry.npmjs.org/homeaway/-/homeaway-0.2.7.tgz",
723 | "integrity": "sha512-9jFZ/4tNPfRAmJcDlKHeZK984/XyaKOinMCr+mMbJW5j+IZ/MKxzg8nUONBceXCVSEXG/Bh5JKEQ1KqB0BqNTA==",
724 | "requires": {
725 | "superagent": "^3.8.0"
726 | }
727 | },
728 | "http-errors": {
729 | "version": "1.7.2",
730 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
731 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
732 | "requires": {
733 | "depd": "~1.1.2",
734 | "inherits": "2.0.3",
735 | "setprototypeof": "1.1.1",
736 | "statuses": ">= 1.5.0 < 2",
737 | "toidentifier": "1.0.0"
738 | },
739 | "dependencies": {
740 | "setprototypeof": {
741 | "version": "1.1.1",
742 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
743 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
744 | },
745 | "statuses": {
746 | "version": "1.5.0",
747 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
748 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
749 | }
750 | }
751 | },
752 | "http-signature": {
753 | "version": "1.2.0",
754 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
755 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
756 | "requires": {
757 | "assert-plus": "^1.0.0",
758 | "jsprim": "^1.2.2",
759 | "sshpk": "^1.7.0"
760 | }
761 | },
762 | "https-proxy-agent": {
763 | "version": "2.2.1",
764 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
765 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
766 | "requires": {
767 | "agent-base": "^4.1.0",
768 | "debug": "^3.1.0"
769 | },
770 | "dependencies": {
771 | "debug": {
772 | "version": "3.2.6",
773 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
774 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
775 | "requires": {
776 | "ms": "^2.1.1"
777 | }
778 | }
779 | }
780 | },
781 | "iconv-lite": {
782 | "version": "0.4.23",
783 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
784 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
785 | "requires": {
786 | "safer-buffer": ">= 2.1.2 < 3"
787 | }
788 | },
789 | "ignore-walk": {
790 | "version": "3.0.1",
791 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
792 | "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
793 | "requires": {
794 | "minimatch": "^3.0.4"
795 | }
796 | },
797 | "inflection": {
798 | "version": "1.12.0",
799 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz",
800 | "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY="
801 | },
802 | "inflight": {
803 | "version": "1.0.6",
804 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
805 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
806 | "requires": {
807 | "once": "^1.3.0",
808 | "wrappy": "1"
809 | }
810 | },
811 | "inherits": {
812 | "version": "2.0.3",
813 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
814 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
815 | },
816 | "ini": {
817 | "version": "1.3.5",
818 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
819 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
820 | },
821 | "ipaddr.js": {
822 | "version": "1.9.0",
823 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
824 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
825 | },
826 | "is-bluebird": {
827 | "version": "1.0.2",
828 | "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz",
829 | "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI="
830 | },
831 | "is-buffer": {
832 | "version": "1.1.6",
833 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
834 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
835 | },
836 | "is-expression": {
837 | "version": "3.0.0",
838 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
839 | "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
840 | "requires": {
841 | "acorn": "~4.0.2",
842 | "object-assign": "^4.0.1"
843 | },
844 | "dependencies": {
845 | "acorn": {
846 | "version": "4.0.13",
847 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
848 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
849 | }
850 | }
851 | },
852 | "is-fullwidth-code-point": {
853 | "version": "1.0.0",
854 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
855 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
856 | "requires": {
857 | "number-is-nan": "^1.0.0"
858 | }
859 | },
860 | "is-promise": {
861 | "version": "2.1.0",
862 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
863 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
864 | },
865 | "is-regex": {
866 | "version": "1.0.4",
867 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
868 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
869 | "requires": {
870 | "has": "^1.0.1"
871 | }
872 | },
873 | "is-typedarray": {
874 | "version": "1.0.0",
875 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
876 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
877 | },
878 | "isarray": {
879 | "version": "1.0.0",
880 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
881 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
882 | },
883 | "isstream": {
884 | "version": "0.1.2",
885 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
886 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
887 | },
888 | "js-stringify": {
889 | "version": "1.0.2",
890 | "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
891 | "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
892 | },
893 | "jsbn": {
894 | "version": "0.1.1",
895 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
896 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
897 | },
898 | "json-schema": {
899 | "version": "0.2.3",
900 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
901 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
902 | },
903 | "json-schema-traverse": {
904 | "version": "0.4.1",
905 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
906 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
907 | },
908 | "json-stringify-safe": {
909 | "version": "5.0.1",
910 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
911 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
912 | },
913 | "jsprim": {
914 | "version": "1.4.1",
915 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
916 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
917 | "requires": {
918 | "assert-plus": "1.0.0",
919 | "extsprintf": "1.3.0",
920 | "json-schema": "0.2.3",
921 | "verror": "1.10.0"
922 | }
923 | },
924 | "jstransformer": {
925 | "version": "1.0.0",
926 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
927 | "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
928 | "requires": {
929 | "is-promise": "^2.0.0",
930 | "promise": "^7.0.1"
931 | }
932 | },
933 | "kind-of": {
934 | "version": "3.2.2",
935 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
936 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
937 | "requires": {
938 | "is-buffer": "^1.1.5"
939 | }
940 | },
941 | "lazy-cache": {
942 | "version": "1.0.4",
943 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
944 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
945 | },
946 | "lodash": {
947 | "version": "4.17.11",
948 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
949 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
950 | },
951 | "lodash.isplainobject": {
952 | "version": "4.0.6",
953 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
954 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
955 | },
956 | "longest": {
957 | "version": "1.0.1",
958 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
959 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
960 | },
961 | "media-typer": {
962 | "version": "0.3.0",
963 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
964 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
965 | },
966 | "merge-descriptors": {
967 | "version": "1.0.1",
968 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
969 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
970 | },
971 | "methods": {
972 | "version": "1.1.2",
973 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
974 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
975 | },
976 | "mime": {
977 | "version": "1.4.1",
978 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
979 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
980 | },
981 | "mime-db": {
982 | "version": "1.40.0",
983 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
984 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
985 | },
986 | "mime-types": {
987 | "version": "2.1.24",
988 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
989 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
990 | "requires": {
991 | "mime-db": "1.40.0"
992 | }
993 | },
994 | "minimatch": {
995 | "version": "3.0.4",
996 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
997 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
998 | "requires": {
999 | "brace-expansion": "^1.1.7"
1000 | }
1001 | },
1002 | "minimist": {
1003 | "version": "0.0.8",
1004 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1005 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
1006 | },
1007 | "minipass": {
1008 | "version": "2.3.5",
1009 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
1010 | "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
1011 | "requires": {
1012 | "safe-buffer": "^5.1.2",
1013 | "yallist": "^3.0.0"
1014 | }
1015 | },
1016 | "minizlib": {
1017 | "version": "1.2.1",
1018 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz",
1019 | "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==",
1020 | "requires": {
1021 | "minipass": "^2.2.1"
1022 | }
1023 | },
1024 | "mkdirp": {
1025 | "version": "0.5.1",
1026 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1027 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1028 | "requires": {
1029 | "minimist": "0.0.8"
1030 | }
1031 | },
1032 | "moment": {
1033 | "version": "2.24.0",
1034 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
1035 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
1036 | },
1037 | "moment-timezone": {
1038 | "version": "0.5.27",
1039 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz",
1040 | "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==",
1041 | "requires": {
1042 | "moment": ">= 2.9.0"
1043 | }
1044 | },
1045 | "morgan": {
1046 | "version": "1.9.1",
1047 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
1048 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
1049 | "requires": {
1050 | "basic-auth": "~2.0.0",
1051 | "debug": "2.6.9",
1052 | "depd": "~1.1.2",
1053 | "on-finished": "~2.3.0",
1054 | "on-headers": "~1.0.1"
1055 | },
1056 | "dependencies": {
1057 | "debug": {
1058 | "version": "2.6.9",
1059 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1060 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1061 | "requires": {
1062 | "ms": "2.0.0"
1063 | }
1064 | },
1065 | "ms": {
1066 | "version": "2.0.0",
1067 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1068 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1069 | }
1070 | }
1071 | },
1072 | "ms": {
1073 | "version": "2.1.1",
1074 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1075 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
1076 | },
1077 | "nan": {
1078 | "version": "2.13.2",
1079 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
1080 | "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw=="
1081 | },
1082 | "needle": {
1083 | "version": "2.4.0",
1084 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz",
1085 | "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==",
1086 | "requires": {
1087 | "debug": "^3.2.6",
1088 | "iconv-lite": "^0.4.4",
1089 | "sax": "^1.2.4"
1090 | },
1091 | "dependencies": {
1092 | "debug": {
1093 | "version": "3.2.6",
1094 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1095 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1096 | "requires": {
1097 | "ms": "^2.1.1"
1098 | }
1099 | }
1100 | }
1101 | },
1102 | "negotiator": {
1103 | "version": "0.6.2",
1104 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1105 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
1106 | },
1107 | "node-pre-gyp": {
1108 | "version": "0.11.0",
1109 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
1110 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
1111 | "requires": {
1112 | "detect-libc": "^1.0.2",
1113 | "mkdirp": "^0.5.1",
1114 | "needle": "^2.2.1",
1115 | "nopt": "^4.0.1",
1116 | "npm-packlist": "^1.1.6",
1117 | "npmlog": "^4.0.2",
1118 | "rc": "^1.2.7",
1119 | "rimraf": "^2.6.1",
1120 | "semver": "^5.3.0",
1121 | "tar": "^4"
1122 | }
1123 | },
1124 | "nopt": {
1125 | "version": "4.0.1",
1126 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
1127 | "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
1128 | "requires": {
1129 | "abbrev": "1",
1130 | "osenv": "^0.1.4"
1131 | }
1132 | },
1133 | "npm-bundled": {
1134 | "version": "1.0.6",
1135 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
1136 | "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g=="
1137 | },
1138 | "npm-packlist": {
1139 | "version": "1.4.1",
1140 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz",
1141 | "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
1142 | "requires": {
1143 | "ignore-walk": "^3.0.1",
1144 | "npm-bundled": "^1.0.1"
1145 | }
1146 | },
1147 | "npmlog": {
1148 | "version": "4.1.2",
1149 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
1150 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
1151 | "requires": {
1152 | "are-we-there-yet": "~1.1.2",
1153 | "console-control-strings": "~1.1.0",
1154 | "gauge": "~2.7.3",
1155 | "set-blocking": "~2.0.0"
1156 | }
1157 | },
1158 | "number-is-nan": {
1159 | "version": "1.0.1",
1160 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1161 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
1162 | },
1163 | "oauth-sign": {
1164 | "version": "0.9.0",
1165 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1166 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1167 | },
1168 | "object-assign": {
1169 | "version": "4.1.1",
1170 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1171 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1172 | },
1173 | "on-finished": {
1174 | "version": "2.3.0",
1175 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1176 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1177 | "requires": {
1178 | "ee-first": "1.1.1"
1179 | }
1180 | },
1181 | "on-headers": {
1182 | "version": "1.0.2",
1183 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
1184 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
1185 | },
1186 | "once": {
1187 | "version": "1.4.0",
1188 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1189 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1190 | "requires": {
1191 | "wrappy": "1"
1192 | }
1193 | },
1194 | "os-homedir": {
1195 | "version": "1.0.2",
1196 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1197 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
1198 | },
1199 | "os-tmpdir": {
1200 | "version": "1.0.2",
1201 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1202 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
1203 | },
1204 | "osenv": {
1205 | "version": "0.1.5",
1206 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
1207 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
1208 | "requires": {
1209 | "os-homedir": "^1.0.0",
1210 | "os-tmpdir": "^1.0.0"
1211 | }
1212 | },
1213 | "parseurl": {
1214 | "version": "1.3.3",
1215 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1216 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1217 | },
1218 | "path-is-absolute": {
1219 | "version": "1.0.1",
1220 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1221 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1222 | },
1223 | "path-parse": {
1224 | "version": "1.0.6",
1225 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1226 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
1227 | },
1228 | "path-to-regexp": {
1229 | "version": "0.1.7",
1230 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1231 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1232 | },
1233 | "performance-now": {
1234 | "version": "2.1.0",
1235 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1236 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
1237 | },
1238 | "process-nextick-args": {
1239 | "version": "2.0.0",
1240 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1241 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
1242 | },
1243 | "promise": {
1244 | "version": "7.3.1",
1245 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
1246 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
1247 | "requires": {
1248 | "asap": "~2.0.3"
1249 | }
1250 | },
1251 | "proxy-addr": {
1252 | "version": "2.0.5",
1253 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
1254 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
1255 | "requires": {
1256 | "forwarded": "~0.1.2",
1257 | "ipaddr.js": "1.9.0"
1258 | }
1259 | },
1260 | "psl": {
1261 | "version": "1.1.31",
1262 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
1263 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
1264 | },
1265 | "pug": {
1266 | "version": "2.0.3",
1267 | "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz",
1268 | "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=",
1269 | "requires": {
1270 | "pug-code-gen": "^2.0.1",
1271 | "pug-filters": "^3.1.0",
1272 | "pug-lexer": "^4.0.0",
1273 | "pug-linker": "^3.0.5",
1274 | "pug-load": "^2.0.11",
1275 | "pug-parser": "^5.0.0",
1276 | "pug-runtime": "^2.0.4",
1277 | "pug-strip-comments": "^1.0.3"
1278 | }
1279 | },
1280 | "pug-attrs": {
1281 | "version": "2.0.3",
1282 | "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz",
1283 | "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=",
1284 | "requires": {
1285 | "constantinople": "^3.0.1",
1286 | "js-stringify": "^1.0.1",
1287 | "pug-runtime": "^2.0.4"
1288 | }
1289 | },
1290 | "pug-code-gen": {
1291 | "version": "2.0.1",
1292 | "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz",
1293 | "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=",
1294 | "requires": {
1295 | "constantinople": "^3.0.1",
1296 | "doctypes": "^1.1.0",
1297 | "js-stringify": "^1.0.1",
1298 | "pug-attrs": "^2.0.3",
1299 | "pug-error": "^1.3.2",
1300 | "pug-runtime": "^2.0.4",
1301 | "void-elements": "^2.0.1",
1302 | "with": "^5.0.0"
1303 | }
1304 | },
1305 | "pug-error": {
1306 | "version": "1.3.2",
1307 | "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz",
1308 | "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY="
1309 | },
1310 | "pug-filters": {
1311 | "version": "3.1.0",
1312 | "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz",
1313 | "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=",
1314 | "requires": {
1315 | "clean-css": "^4.1.11",
1316 | "constantinople": "^3.0.1",
1317 | "jstransformer": "1.0.0",
1318 | "pug-error": "^1.3.2",
1319 | "pug-walk": "^1.1.7",
1320 | "resolve": "^1.1.6",
1321 | "uglify-js": "^2.6.1"
1322 | }
1323 | },
1324 | "pug-lexer": {
1325 | "version": "4.0.0",
1326 | "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz",
1327 | "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=",
1328 | "requires": {
1329 | "character-parser": "^2.1.1",
1330 | "is-expression": "^3.0.0",
1331 | "pug-error": "^1.3.2"
1332 | }
1333 | },
1334 | "pug-linker": {
1335 | "version": "3.0.5",
1336 | "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz",
1337 | "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=",
1338 | "requires": {
1339 | "pug-error": "^1.3.2",
1340 | "pug-walk": "^1.1.7"
1341 | }
1342 | },
1343 | "pug-load": {
1344 | "version": "2.0.11",
1345 | "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz",
1346 | "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=",
1347 | "requires": {
1348 | "object-assign": "^4.1.0",
1349 | "pug-walk": "^1.1.7"
1350 | }
1351 | },
1352 | "pug-parser": {
1353 | "version": "5.0.0",
1354 | "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz",
1355 | "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=",
1356 | "requires": {
1357 | "pug-error": "^1.3.2",
1358 | "token-stream": "0.0.1"
1359 | }
1360 | },
1361 | "pug-runtime": {
1362 | "version": "2.0.4",
1363 | "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz",
1364 | "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g="
1365 | },
1366 | "pug-strip-comments": {
1367 | "version": "1.0.3",
1368 | "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz",
1369 | "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=",
1370 | "requires": {
1371 | "pug-error": "^1.3.2"
1372 | }
1373 | },
1374 | "pug-walk": {
1375 | "version": "1.1.7",
1376 | "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz",
1377 | "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM="
1378 | },
1379 | "punycode": {
1380 | "version": "2.1.1",
1381 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1382 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1383 | },
1384 | "qs": {
1385 | "version": "6.5.2",
1386 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1387 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
1388 | },
1389 | "range-parser": {
1390 | "version": "1.2.1",
1391 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1392 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1393 | },
1394 | "raw-body": {
1395 | "version": "2.3.3",
1396 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
1397 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
1398 | "requires": {
1399 | "bytes": "3.0.0",
1400 | "http-errors": "1.6.3",
1401 | "iconv-lite": "0.4.23",
1402 | "unpipe": "1.0.0"
1403 | },
1404 | "dependencies": {
1405 | "http-errors": {
1406 | "version": "1.6.3",
1407 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1408 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
1409 | "requires": {
1410 | "depd": "~1.1.2",
1411 | "inherits": "2.0.3",
1412 | "setprototypeof": "1.1.0",
1413 | "statuses": ">= 1.4.0 < 2"
1414 | }
1415 | }
1416 | }
1417 | },
1418 | "rc": {
1419 | "version": "1.2.8",
1420 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1421 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1422 | "requires": {
1423 | "deep-extend": "^0.6.0",
1424 | "ini": "~1.3.0",
1425 | "minimist": "^1.2.0",
1426 | "strip-json-comments": "~2.0.1"
1427 | },
1428 | "dependencies": {
1429 | "minimist": {
1430 | "version": "1.2.0",
1431 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1432 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
1433 | }
1434 | }
1435 | },
1436 | "readable-stream": {
1437 | "version": "2.3.6",
1438 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1439 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1440 | "requires": {
1441 | "core-util-is": "~1.0.0",
1442 | "inherits": "~2.0.3",
1443 | "isarray": "~1.0.0",
1444 | "process-nextick-args": "~2.0.0",
1445 | "safe-buffer": "~5.1.1",
1446 | "string_decoder": "~1.1.1",
1447 | "util-deprecate": "~1.0.1"
1448 | }
1449 | },
1450 | "regenerator-runtime": {
1451 | "version": "0.11.1",
1452 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
1453 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
1454 | },
1455 | "repeat-string": {
1456 | "version": "1.6.1",
1457 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1458 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
1459 | },
1460 | "request": {
1461 | "version": "2.88.0",
1462 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
1463 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
1464 | "requires": {
1465 | "aws-sign2": "~0.7.0",
1466 | "aws4": "^1.8.0",
1467 | "caseless": "~0.12.0",
1468 | "combined-stream": "~1.0.6",
1469 | "extend": "~3.0.2",
1470 | "forever-agent": "~0.6.1",
1471 | "form-data": "~2.3.2",
1472 | "har-validator": "~5.1.0",
1473 | "http-signature": "~1.2.0",
1474 | "is-typedarray": "~1.0.0",
1475 | "isstream": "~0.1.2",
1476 | "json-stringify-safe": "~5.0.1",
1477 | "mime-types": "~2.1.19",
1478 | "oauth-sign": "~0.9.0",
1479 | "performance-now": "^2.1.0",
1480 | "qs": "~6.5.2",
1481 | "safe-buffer": "^5.1.2",
1482 | "tough-cookie": "~2.4.3",
1483 | "tunnel-agent": "^0.6.0",
1484 | "uuid": "^3.3.2"
1485 | }
1486 | },
1487 | "resolve": {
1488 | "version": "1.10.1",
1489 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
1490 | "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
1491 | "requires": {
1492 | "path-parse": "^1.0.6"
1493 | }
1494 | },
1495 | "retry-as-promised": {
1496 | "version": "3.2.0",
1497 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz",
1498 | "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==",
1499 | "requires": {
1500 | "any-promise": "^1.3.0"
1501 | }
1502 | },
1503 | "right-align": {
1504 | "version": "0.1.3",
1505 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
1506 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
1507 | "requires": {
1508 | "align-text": "^0.1.1"
1509 | }
1510 | },
1511 | "rimraf": {
1512 | "version": "2.6.3",
1513 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1514 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1515 | "requires": {
1516 | "glob": "^7.1.3"
1517 | }
1518 | },
1519 | "safe-buffer": {
1520 | "version": "5.1.2",
1521 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1522 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1523 | },
1524 | "safer-buffer": {
1525 | "version": "2.1.2",
1526 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1527 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1528 | },
1529 | "sax": {
1530 | "version": "1.2.4",
1531 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
1532 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
1533 | },
1534 | "semver": {
1535 | "version": "5.7.0",
1536 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
1537 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
1538 | },
1539 | "send": {
1540 | "version": "0.16.2",
1541 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
1542 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
1543 | "requires": {
1544 | "debug": "2.6.9",
1545 | "depd": "~1.1.2",
1546 | "destroy": "~1.0.4",
1547 | "encodeurl": "~1.0.2",
1548 | "escape-html": "~1.0.3",
1549 | "etag": "~1.8.1",
1550 | "fresh": "0.5.2",
1551 | "http-errors": "~1.6.2",
1552 | "mime": "1.4.1",
1553 | "ms": "2.0.0",
1554 | "on-finished": "~2.3.0",
1555 | "range-parser": "~1.2.0",
1556 | "statuses": "~1.4.0"
1557 | },
1558 | "dependencies": {
1559 | "debug": {
1560 | "version": "2.6.9",
1561 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1562 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1563 | "requires": {
1564 | "ms": "2.0.0"
1565 | }
1566 | },
1567 | "http-errors": {
1568 | "version": "1.6.3",
1569 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
1570 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
1571 | "requires": {
1572 | "depd": "~1.1.2",
1573 | "inherits": "2.0.3",
1574 | "setprototypeof": "1.1.0",
1575 | "statuses": ">= 1.4.0 < 2"
1576 | }
1577 | },
1578 | "ms": {
1579 | "version": "2.0.0",
1580 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1581 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1582 | }
1583 | }
1584 | },
1585 | "sequelize": {
1586 | "version": "5.15.1",
1587 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.15.1.tgz",
1588 | "integrity": "sha512-DCzzJYvJLMKnyf8G3at2A+yM9M2fSQmTmuOYIpCWM8Gjqx3XfgNTd1NkuyPWFoi1/d1AXQsN2VDPXkPczida8A==",
1589 | "requires": {
1590 | "bluebird": "^3.5.0",
1591 | "cls-bluebird": "^2.1.0",
1592 | "debug": "^4.1.1",
1593 | "dottie": "^2.0.0",
1594 | "inflection": "1.12.0",
1595 | "lodash": "^4.17.11",
1596 | "moment": "^2.24.0",
1597 | "moment-timezone": "^0.5.21",
1598 | "retry-as-promised": "^3.1.0",
1599 | "semver": "^6.1.1",
1600 | "sequelize-pool": "^2.3.0",
1601 | "toposort-class": "^1.0.1",
1602 | "uuid": "^3.2.1",
1603 | "validator": "^10.11.0",
1604 | "wkx": "^0.4.6"
1605 | },
1606 | "dependencies": {
1607 | "semver": {
1608 | "version": "6.3.0",
1609 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
1610 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
1611 | }
1612 | }
1613 | },
1614 | "sequelize-pool": {
1615 | "version": "2.3.0",
1616 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz",
1617 | "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA=="
1618 | },
1619 | "serve-static": {
1620 | "version": "1.13.2",
1621 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
1622 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
1623 | "requires": {
1624 | "encodeurl": "~1.0.2",
1625 | "escape-html": "~1.0.3",
1626 | "parseurl": "~1.3.2",
1627 | "send": "0.16.2"
1628 | }
1629 | },
1630 | "set-blocking": {
1631 | "version": "2.0.0",
1632 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1633 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
1634 | },
1635 | "setprototypeof": {
1636 | "version": "1.1.0",
1637 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1638 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
1639 | },
1640 | "shimmer": {
1641 | "version": "1.2.1",
1642 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
1643 | "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
1644 | },
1645 | "signal-exit": {
1646 | "version": "3.0.2",
1647 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1648 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
1649 | },
1650 | "source-map": {
1651 | "version": "0.6.1",
1652 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1653 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
1654 | },
1655 | "sqlite3": {
1656 | "version": "4.0.8",
1657 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.8.tgz",
1658 | "integrity": "sha512-kgwHu4j10KhpCHtx//dejd/tVQot7jc3sw+Sn0vMuKOw0X00Ckyg9VceKgzPyGmmz+zEoYue9tOLriWTvYy0ww==",
1659 | "requires": {
1660 | "nan": "^2.12.1",
1661 | "node-pre-gyp": "^0.11.0",
1662 | "request": "^2.87.0"
1663 | }
1664 | },
1665 | "sshpk": {
1666 | "version": "1.16.1",
1667 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1668 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1669 | "requires": {
1670 | "asn1": "~0.2.3",
1671 | "assert-plus": "^1.0.0",
1672 | "bcrypt-pbkdf": "^1.0.0",
1673 | "dashdash": "^1.12.0",
1674 | "ecc-jsbn": "~0.1.1",
1675 | "getpass": "^0.1.1",
1676 | "jsbn": "~0.1.0",
1677 | "safer-buffer": "^2.0.2",
1678 | "tweetnacl": "~0.14.0"
1679 | }
1680 | },
1681 | "statuses": {
1682 | "version": "1.4.0",
1683 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1684 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
1685 | },
1686 | "string-width": {
1687 | "version": "1.0.2",
1688 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1689 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1690 | "requires": {
1691 | "code-point-at": "^1.0.0",
1692 | "is-fullwidth-code-point": "^1.0.0",
1693 | "strip-ansi": "^3.0.0"
1694 | }
1695 | },
1696 | "string_decoder": {
1697 | "version": "1.1.1",
1698 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1699 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1700 | "requires": {
1701 | "safe-buffer": "~5.1.0"
1702 | }
1703 | },
1704 | "strip-ansi": {
1705 | "version": "3.0.1",
1706 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1707 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1708 | "requires": {
1709 | "ansi-regex": "^2.0.0"
1710 | }
1711 | },
1712 | "strip-json-comments": {
1713 | "version": "2.0.1",
1714 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1715 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
1716 | },
1717 | "stripe": {
1718 | "version": "6.36.0",
1719 | "resolved": "https://registry.npmjs.org/stripe/-/stripe-6.36.0.tgz",
1720 | "integrity": "sha512-7vjyVO4NCWvX38CH1AuSQH16uRxcQN+UhUTBPs4UHsIl5+SJXLBvCsHrMgd+bY9k1YDliT0fQB1fH9OI3GrEhw==",
1721 | "requires": {
1722 | "lodash.isplainobject": "^4.0.6",
1723 | "qs": "^6.6.0",
1724 | "safe-buffer": "^5.1.1",
1725 | "uuid": "^3.3.2"
1726 | },
1727 | "dependencies": {
1728 | "qs": {
1729 | "version": "6.7.0",
1730 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
1731 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
1732 | }
1733 | }
1734 | },
1735 | "superagent": {
1736 | "version": "3.8.3",
1737 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
1738 | "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
1739 | "requires": {
1740 | "component-emitter": "^1.2.0",
1741 | "cookiejar": "^2.1.0",
1742 | "debug": "^3.1.0",
1743 | "extend": "^3.0.0",
1744 | "form-data": "^2.3.1",
1745 | "formidable": "^1.2.0",
1746 | "methods": "^1.1.1",
1747 | "mime": "^1.4.1",
1748 | "qs": "^6.5.1",
1749 | "readable-stream": "^2.3.5"
1750 | },
1751 | "dependencies": {
1752 | "debug": {
1753 | "version": "3.2.6",
1754 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1755 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1756 | "requires": {
1757 | "ms": "^2.1.1"
1758 | }
1759 | }
1760 | }
1761 | },
1762 | "tar": {
1763 | "version": "4.4.8",
1764 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz",
1765 | "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==",
1766 | "requires": {
1767 | "chownr": "^1.1.1",
1768 | "fs-minipass": "^1.2.5",
1769 | "minipass": "^2.3.4",
1770 | "minizlib": "^1.1.1",
1771 | "mkdirp": "^0.5.0",
1772 | "safe-buffer": "^5.1.2",
1773 | "yallist": "^3.0.2"
1774 | }
1775 | },
1776 | "to-fast-properties": {
1777 | "version": "1.0.3",
1778 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
1779 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
1780 | },
1781 | "toidentifier": {
1782 | "version": "1.0.0",
1783 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1784 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
1785 | },
1786 | "token-stream": {
1787 | "version": "0.0.1",
1788 | "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
1789 | "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
1790 | },
1791 | "toposort-class": {
1792 | "version": "1.0.1",
1793 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
1794 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg="
1795 | },
1796 | "tough-cookie": {
1797 | "version": "2.4.3",
1798 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
1799 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
1800 | "requires": {
1801 | "psl": "^1.1.24",
1802 | "punycode": "^1.4.1"
1803 | },
1804 | "dependencies": {
1805 | "punycode": {
1806 | "version": "1.4.1",
1807 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1808 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
1809 | }
1810 | }
1811 | },
1812 | "tunnel-agent": {
1813 | "version": "0.6.0",
1814 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1815 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1816 | "requires": {
1817 | "safe-buffer": "^5.0.1"
1818 | }
1819 | },
1820 | "tweetnacl": {
1821 | "version": "0.14.5",
1822 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1823 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1824 | },
1825 | "type-is": {
1826 | "version": "1.6.18",
1827 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1828 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1829 | "requires": {
1830 | "media-typer": "0.3.0",
1831 | "mime-types": "~2.1.24"
1832 | }
1833 | },
1834 | "uglify-js": {
1835 | "version": "2.8.29",
1836 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
1837 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
1838 | "requires": {
1839 | "source-map": "~0.5.1",
1840 | "uglify-to-browserify": "~1.0.0",
1841 | "yargs": "~3.10.0"
1842 | },
1843 | "dependencies": {
1844 | "source-map": {
1845 | "version": "0.5.7",
1846 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1847 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
1848 | }
1849 | }
1850 | },
1851 | "uglify-to-browserify": {
1852 | "version": "1.0.2",
1853 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
1854 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
1855 | "optional": true
1856 | },
1857 | "unpipe": {
1858 | "version": "1.0.0",
1859 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1860 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1861 | },
1862 | "uri-js": {
1863 | "version": "4.2.2",
1864 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1865 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1866 | "requires": {
1867 | "punycode": "^2.1.0"
1868 | }
1869 | },
1870 | "util-deprecate": {
1871 | "version": "1.0.2",
1872 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1873 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1874 | },
1875 | "utils-merge": {
1876 | "version": "1.0.1",
1877 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1878 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1879 | },
1880 | "uuid": {
1881 | "version": "3.3.2",
1882 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1883 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
1884 | },
1885 | "validator": {
1886 | "version": "10.11.0",
1887 | "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
1888 | "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw=="
1889 | },
1890 | "vary": {
1891 | "version": "1.1.2",
1892 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1893 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1894 | },
1895 | "verror": {
1896 | "version": "1.10.0",
1897 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1898 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1899 | "requires": {
1900 | "assert-plus": "^1.0.0",
1901 | "core-util-is": "1.0.2",
1902 | "extsprintf": "^1.2.0"
1903 | }
1904 | },
1905 | "void-elements": {
1906 | "version": "2.0.1",
1907 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
1908 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
1909 | },
1910 | "wide-align": {
1911 | "version": "1.1.3",
1912 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
1913 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
1914 | "requires": {
1915 | "string-width": "^1.0.2 || 2"
1916 | }
1917 | },
1918 | "window-size": {
1919 | "version": "0.1.0",
1920 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
1921 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
1922 | },
1923 | "with": {
1924 | "version": "5.1.1",
1925 | "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
1926 | "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
1927 | "requires": {
1928 | "acorn": "^3.1.0",
1929 | "acorn-globals": "^3.0.0"
1930 | }
1931 | },
1932 | "wkx": {
1933 | "version": "0.4.8",
1934 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz",
1935 | "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==",
1936 | "requires": {
1937 | "@types/node": "*"
1938 | }
1939 | },
1940 | "wordwrap": {
1941 | "version": "0.0.2",
1942 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
1943 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
1944 | },
1945 | "wrappy": {
1946 | "version": "1.0.2",
1947 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1948 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1949 | },
1950 | "yallist": {
1951 | "version": "3.0.3",
1952 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
1953 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A=="
1954 | },
1955 | "yargs": {
1956 | "version": "3.10.0",
1957 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
1958 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
1959 | "requires": {
1960 | "camelcase": "^1.0.2",
1961 | "cliui": "^2.1.0",
1962 | "decamelize": "^1.0.0",
1963 | "window-size": "0.1.0"
1964 | }
1965 | }
1966 | }
1967 | }
1968 |
--------------------------------------------------------------------------------
/app/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nodejs-demo",
3 | "version": "0.0.0",
4 | "private": true,
5 | "scripts": {
6 | "start": "node ./bin/www"
7 | },
8 | "dependencies": {
9 | "cookie-parser": "~1.4.4",
10 | "debug": "~4.1.1",
11 | "express": "~4.16.4",
12 | "homeaway": "^0.2.7",
13 | "http-errors": "~1.7.2",
14 | "morgan": "~1.9.1",
15 | "pug": "2.0.3",
16 | "sequelize": "~5.15.1",
17 | "sqlite3": "~4.0.8",
18 | "stripe": "~6.36.0",
19 | "https-proxy-agent": "~2.2.1"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/public/stylesheets/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding: 50px;
3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
4 | }
5 |
6 | a {
7 | color: #00B7FF;
8 | }
9 |
--------------------------------------------------------------------------------
/app/routes/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var Booking = require('../models').Booking;
3 | var homeaway = require('../utils').homeaway;
4 | var charge_card = require('../utils').charge_card;
5 | var router = express.Router();
6 |
7 | router.get('/', function(req, res, next) {
8 | res.render('index');
9 | });
10 |
11 | router.post('/', function(req, res, next) {
12 | homeaway.quickSearch(req.body['arrival-city'], 10).then((listings) => {
13 | console.log(listings.entries);
14 | res.render('select', {listings: listings.entries});
15 | });
16 | });
17 |
18 | router.post('/payment', function(req, res, next) {
19 | res.render('payment', {homeaway_id: req.body.homeaway_id});
20 | });
21 |
22 | router.post('/confirm', function(req, res, next) {
23 | Booking.create({
24 | homeaway_id: req.body['homeaway_id'],
25 | first_name: req.body['first-name'],
26 | last_name: req.body['last-name'],
27 | address: req.body['address'],
28 | city: req.body['city'],
29 | state: req.body['state'],
30 | zip: req.body['zip'],
31 | cc_name: req.body['cc-name'],
32 | cc_number: req.body['cc-number'],
33 | cc_month: req.body['cc-month'],
34 | cc_year: req.body['cc-year'],
35 | cc_cvv: req.body['cc-cvv']
36 | }).then(booking => {
37 | charge_card(booking.cc_number, booking.cc_month, booking.cc_year, booking.cc_cvv, () => {
38 | res.render('confirm');
39 | });
40 | }).error(err => {
41 | res.status(405).json('Error has occured');
42 | });
43 | });
44 |
45 | module.exports = router;
46 |
--------------------------------------------------------------------------------
/app/routes/list.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var Booking = require('../models').Booking;
3 | var router = express.Router();
4 |
5 | router.get('/', function(req, res, next) {
6 | Booking.findAll().then(bookings => {
7 | res.render('list', {bookings: bookings});
8 | });
9 | });
10 |
11 | router.get('/:id', function(req, res, next) {
12 | Booking.findById(req.params.id).then(booking => {
13 | res.render('list', {bookings: [booking], revealed: true});
14 | });
15 | });
16 |
17 | module.exports = router;
18 |
--------------------------------------------------------------------------------
/app/utils.js:
--------------------------------------------------------------------------------
1 | var utils = {}
2 |
3 | var HomeAway = require('homeaway');
4 | utils.homeaway = new HomeAway({
5 | client: process.env.HA_CLIENT,
6 | secret: process.env.HA_SECRET
7 | });
8 | utils.homeaway.connect();
9 |
10 |
11 | var stripe = require('stripe')(process.env.STRIPE_TOKEN);
12 | var HttpsProxyAgent = require('https-proxy-agent');
13 | var url = require('url');
14 | var fs = require('fs');
15 | var path = require('path');
16 |
17 | // Double check that HTTP_PROXY starts with http:// otherwise there will be ssl errors
18 | var options = url.parse(process.env.HTTP_PROXY);
19 | options.ca = [fs.readFileSync(path.resolve(__dirname, 'cert.pem'))];
20 | var proxy = new HttpsProxyAgent(options);
21 | stripe.setHttpAgent(proxy);
22 |
23 | utils.charge_card = (number, exp_month, exp_year, cvc, callback) => {
24 | stripe.tokens.create({
25 | card: {
26 | number: number,
27 | exp_month: exp_month,
28 | exp_year: exp_year,
29 | cvc: cvc
30 | }
31 | }, (err, card) => {
32 | if (err!=null){
33 | console.log(err)
34 | callback();
35 | } else {
36 | stripe.charges.create({
37 | amount: 100,
38 | currency: 'USD',
39 | source: card.id
40 | }, callback);
41 | }})
42 |
43 | }
44 |
45 | module.exports = utils;
46 |
--------------------------------------------------------------------------------
/app/views/confirm.pug:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | .container
5 | .card
6 | h5.card-header Thank you
7 | .card-body
8 | | Your data has been sucessfully submited, more details
9 | a(href='/list') here
--------------------------------------------------------------------------------
/app/views/error.pug:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | h1= message
5 | h2= error.status
6 | pre #{error.stack}
7 |
--------------------------------------------------------------------------------
/app/views/index.pug:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | .container
5 | .card
6 | h5.card-header Search
7 | .card-body
8 | form(method='POST' action='/')
9 | .form-row
10 | .form-group.col-md-4.offset-md-1
11 | label(for='departure-city' required) Departure city
12 | select(required)#departure-city.form-control
13 | option(value='') Choose...
14 | option New York City
15 | option Los Angeles
16 | option Chicago
17 | option Houston
18 | option Philadelphia
19 | .form-group.col-md-4.offset-md-2
20 | label(for='arrival-city') Arrival city
21 | select( name='arrival-city' required)#arrival-city.form-control
22 | option(value='') Choose...
23 | option Istanbul
24 | option London
25 | option Ankara
26 | option Berlin
27 | option Madrid
28 |
29 | .form-row
30 | .form-group.col-md-4.offset-md-1
31 | label(for='departure-date') Departure date
32 | .input-group.date(data-provide='datepicker')
33 | input#departure-date.form-control(type='text' required)
34 | .input-group-addon.input-group-append
35 | span#basic-addon2.input-group-text.fa.fa-calendar-check-o
36 | .form-group.col-md-4.offset-md-2
37 | label(for='arrival-date') Arrival date
38 | .input-group.date(data-provide='datepicker')
39 | input#arrival-date.form-control(type='text' required)
40 | .input-group-addon.input-group-append
41 | span#basic-addon2.input-group-text.fa.fa-calendar-check-o
42 |
43 | .form-row
44 | .form-group.col-md-4.offset-md-1
45 | label(for='tickets') Tickets
46 | select(required)#tickets.form-control
47 | option(value='') Choose...
48 | option 1
49 | option 2
50 | .form-group.col-md-4.offset-md-2
51 | .form-check.form-check-inline.mb-2
52 | input#greturning.form-check-input(type='checkbox')
53 | label.form-check-label(for='returning') Returning
54 |
55 | br
56 | .form-row
57 | .form-group.offset-md-1
58 | button.btn.btn-primary(type='submit') Search
59 |
--------------------------------------------------------------------------------
/app/views/layout.pug:
--------------------------------------------------------------------------------
1 | doctype html
2 | html
3 | head
4 | meta(charset='utf-8')
5 | meta(name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no')
6 | link(rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css')
7 | link(rel="stylesheet", href='https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.8.0/css/bootstrap-datepicker.standalone.css')
8 | link(rel="stylesheet", href='https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css')
9 | title Vacation rental
10 | body
11 | nav.navbar.navbar-expand-lg.navbar-dark.bg-dark
12 | .container
13 | a.navbar-brand(href='/') Vacation rental
14 | button.navbar-toggler(type='button' data-toggle='collapse' data-target='#navbarNav' aria-controls='navbarNav' aria-expanded='false' aria-label='Toggle navigation')
15 | span.navbar-toggler-icon
16 | #navbarNav.collapse.navbar-collapse
17 | ul.navbar-nav
18 | li.nav-item.active
19 | a.nav-link(href='/') New
20 | li.nav-item
21 | a.nav-link(href='/list') Booked
22 |
23 | br
24 |
25 | block content
26 |
27 | script(src='https://code.jquery.com/jquery-3.2.1.slim.min.js')
28 | script(src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js')
29 | script(src='https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js')
30 | script(src='https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.8.0/js/bootstrap-datepicker.min.js')
31 |
--------------------------------------------------------------------------------
/app/views/list.pug:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | .container
5 | for booking in bookings
6 | .card
7 | .row
8 | .col-md-4
9 | .card-body
10 | .form-group
11 | label.control-label.mb-1(for='cc-name') Name on card
12 | input#cc-name.form-control(type='text' value=booking.cc_name disabled)
13 | .form-group
14 | label.control-label.mb-1(for='cc-number') Card number
15 | input#cc-number.form-control(type='text' value=booking.cc_number disabled)
16 | .row
17 | .col-6
18 | .form-group
19 | label.control-label.mb-1(for='cc-exp') Expiration
20 | .input-group
21 | input#cc-exp.form-control(type='text' value=booking.cc_month disabled)
22 | input.form-control(type='text' value=booking.cc_year disabled)
23 | .col-6
24 | label.control-label.mb-1(for='cc-cvv') Security code
25 | input#cc-cvv.form-control(type='text' value=booking.cc_cvv disabled)
26 |
27 | .col-md-8
28 | .card-body
29 | .form-row
30 | .form-group.col-md-6
31 | label.mb-1(for='first-name') First name
32 | input#first-name.form-control(type='text' value=booking.first_name disabled)
33 | .form-group.col-md-6
34 | label.mb-1(for='last-name') Last name
35 | input#last-name.form-control(type='text' value=booking.last_name disabled)
36 | .form-group
37 | label.mb-1(for='address') Address
38 | input#address.form-control(type='text' value=booking.address disabled)
39 | .form-row
40 | .form-group.col-md-6
41 | label.mb-1(for='city') City
42 | input#city.form-control(type='text' value=booking.city disabled)
43 | .form-group.col-md-4
44 | label.mb-1(for='state') State
45 | input#state.form-control(type='text' value=booking.state disabled)
46 | .form-group.col-md-2
47 | label.mb-1(for='zip') Zip
48 | input#zip.form-control(type='text' value=booking.zip disabled)
49 |
50 | if !revealed
51 | .col-md-4.offset-md-4
52 | .card-body
53 | a.btn.btn-lg.btn-danger.btn-block(href='/list/' + booking.id)
54 | i.fa.fa-unlock.fa-lg
55 | span Reveal
56 | br
57 |
--------------------------------------------------------------------------------
/app/views/payment.pug:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | .container
5 | .card
6 | form.row(method='POST' action='/confirm')
7 | .col-md-4
8 | .card-body
9 | .card-title
10 | h3.text-center Payment
11 | hr
12 |
13 | .form-group
14 | label.control-label.mb-1(for='cc-name') Name on card
15 | input#cc-name.form-control.cc-name(name='cc-name' type='text' required)
16 | .form-group
17 | label.control-label.mb-1(for='cc-number') Card number
18 | input#cc-number.form-control.cc-number.identified.visa(name='cc-number' type='tel' required pattern='[0-9]{16}')
19 | .row
20 | .col-6
21 | label.control-label.mb-1(for='cc-exp') Expiration
22 | .input-group
23 | input#cc-exp.form-control(name='cc-month' type='tel' required placeholder='MM')
24 | input.form-control(name='cc-year' type='tel' required placeholder='YY')
25 | .col-6
26 | label.control-label.mb-1(for='cc-cvv') Security code
27 | input#cc-cvv.form-control.cc-cvc(name='cc-cvv' type='tel' required placeholder='CVV')
28 |
29 | .col-md-8
30 | .card-body
31 | .card-title
32 | h3 Personal info
33 | hr
34 | .form-row
35 | .form-group.col-md-6
36 | label.mb-1(for='first-name') First name
37 | input#first-name.form-control(name='first-name' type='text' required='')
38 | .form-group.col-md-6
39 | label.mb-1(for='last-name') Last name
40 | input#last-name.form-control(name='last-name' type='text' required='')
41 | .form-group
42 | label.mb-1(for='address') Address
43 | input#address.form-control(name='address' type='text' required='')
44 | .form-row
45 | .form-group.col-md-6
46 | label.mb-1(for='city') City
47 | input#city.form-control(name='city' type='text' required='')
48 | .form-group.col-md-4
49 | label.mb-1(for='state') State
50 | input#state.form-control(name='state' type='text' required='')
51 | .form-group.col-md-2
52 | label.mb-1(for='zip') Zip
53 | input#zip.form-control(name='zip' type='text' required='')
54 |
55 | .col-md-4.offset-md-4
56 | .card-body
57 | input(type='hidden' name='homeaway_id' value=homeaway_id)
58 | button.btn.btn-lg.btn-info.btn-block(type='submit')
59 | i.fa.fa-lock.fa-lg
60 | span Send
61 |
--------------------------------------------------------------------------------
/app/views/select.pug:
--------------------------------------------------------------------------------
1 | extends layout
2 |
3 | block content
4 | .container
5 | .card
6 | h5.card-header Select
7 | .card-body
8 | .row
9 | for listing in listings
10 | .col-sm-3
11 | form.card(method='POST' action='/payment')
12 | img.card-img-top(src=listing.thumbnail.secureUri alt='Card image cap')
13 | .card-body
14 | p.card-text= listing.headline
15 | ul.list-group.list-group-flush
16 | li.list-group-item.small #{listing.location.city}, #{listing.location.state}
17 | li.list-group-item.small= listing.regionPath
18 | .card-body
19 | input(type='hidden' name='homeaway_id' value=listing.listingId)
20 | button.btn.btn-primary(type='submit') Rent
21 |
--------------------------------------------------------------------------------
/images/list_insecure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/list_insecure.png
--------------------------------------------------------------------------------
/images/list_secure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/list_secure.png
--------------------------------------------------------------------------------
/images/redaction.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/redaction.gif
--------------------------------------------------------------------------------
/images/redaction.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/redaction.png
--------------------------------------------------------------------------------
/images/self_revealing.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/self_revealing.gif
--------------------------------------------------------------------------------
/images/self_revealing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/self_revealing.png
--------------------------------------------------------------------------------
/images/third_revealing.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/third_revealing.gif
--------------------------------------------------------------------------------
/images/third_revealing.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vgs-samples/vgs-nodejs-sample/b4309a94e907dbc2ba19f8ab1d913745e1db59d2/images/third_revealing.png
--------------------------------------------------------------------------------