ignite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From anovi...@apache.org
Subject [31/52] [partial] incubator-ignite git commit: # ignite-843 WIP.
Date Fri, 08 May 2015 11:36:56 GMT
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/HISTORY.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/HISTORY.md b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/HISTORY.md
new file mode 100644
index 0000000..88f1a0c
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/HISTORY.md
@@ -0,0 +1,81 @@
+2.2.1 / 2015-04-22
+==================
+
+  * Fix `isFinished(req)` when data buffered
+
+2.2.0 / 2014-12-22
+==================
+
+  * Add message object to callback arguments
+
+2.1.1 / 2014-10-22
+==================
+
+  * Fix handling of pipelined requests
+
+2.1.0 / 2014-08-16
+==================
+
+  * Check if `socket` is detached
+  * Return `undefined` for `isFinished` if state unknown
+
+2.0.0 / 2014-08-16
+==================
+
+  * Add `isFinished` function
+  * Move to `jshttp` organization
+  * Remove support for plain socket argument
+  * Rename to `on-finished`
+  * Support both `req` and `res` as arguments
+  * deps: ee-first@1.0.5
+
+1.2.2 / 2014-06-10
+==================
+
+  * Reduce listeners added to emitters
+    - avoids "event emitter leak" warnings when used multiple times on same request
+
+1.2.1 / 2014-06-08
+==================
+
+  * Fix returned value when already finished
+
+1.2.0 / 2014-06-05
+==================
+
+  * Call callback when called on already-finished socket
+
+1.1.4 / 2014-05-27
+==================
+
+  * Support node.js 0.8
+
+1.1.3 / 2014-04-30
+==================
+
+  * Make sure errors passed as instanceof `Error`
+
+1.1.2 / 2014-04-18
+==================
+
+  * Default the `socket` to passed-in object
+
+1.1.1 / 2014-01-16
+==================
+
+  * Rename module to `finished`
+
+1.1.0 / 2013-12-25
+==================
+
+  * Call callback when called on already-errored socket
+
+1.0.1 / 2013-12-20
+==================
+
+  * Actually pass the error to the callback
+
+1.0.0 / 2013-12-20
+==================
+
+  * Initial release

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/LICENSE
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/LICENSE b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/LICENSE
new file mode 100644
index 0000000..5931fd2
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2013 Jonathan Ong <me@jongleberry.com>
+Copyright (c) 2014 Douglas Christopher Wilson <doug@somethingdoug.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/README.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/README.md b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/README.md
new file mode 100644
index 0000000..b58ebd0
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/README.md
@@ -0,0 +1,109 @@
+# on-finished
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Execute a callback when a request closes, finishes, or errors.
+
+## Install
+
+```sh
+$ npm install on-finished
+```
+
+## API
+
+```js
+var onFinished = require('on-finished')
+```
+
+### onFinished(res, listener)
+
+Attach a listener to listen for the response to finish. The listener will
+be invoked only once when the response finished. If the response finished
+to to an error, the first argument will contain the error. If the response
+has already finished, the listener will be invoked.
+
+Listening to the end of a response would be used to close things associated
+with the response, like open files.
+
+Listener is invoked as `listener(err, res)`.
+
+```js
+onFinished(res, function (err, res) {
+  // clean up open fds, etc.
+  // err contains the error is request error'd
+})
+```
+
+### onFinished(req, listener)
+
+Attach a listener to listen for the request to finish. The listener will
+be invoked only once when the request finished. If the request finished
+to to an error, the first argument will contain the error. If the request
+has already finished, the listener will be invoked.
+
+Listening to the end of a request would be used to know when to continue
+after reading the data.
+
+Listener is invoked as `listener(err, req)`.
+
+```js
+var data = ''
+
+req.setEncoding('utf8')
+res.on('data', function (str) {
+  data += str
+})
+
+onFinished(req, function (err, req) {
+  // data is read unless there is err
+})
+```
+
+### onFinished.isFinished(res)
+
+Determine if `res` is already finished. This would be useful to check and
+not even start certain operations if the response has already finished.
+
+### onFinished.isFinished(req)
+
+Determine if `req` is already finished. This would be useful to check and
+not even start certain operations if the request has already finished.
+
+### Example
+
+The following code ensures that file descriptors are always closed
+once the response finishes.
+
+```js
+var destroy = require('destroy')
+var http = require('http')
+var onFinished = require('on-finished')
+
+http.createServer(function onRequest(req, res) {
+  var stream = fs.createReadStream('package.json')
+  stream.pipe(res)
+  onFinished(res, function (err) {
+    destroy(stream)
+  })
+})
+```
+
+## License
+
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/on-finished.svg
+[npm-url]: https://npmjs.org/package/on-finished
+[node-version-image]: https://img.shields.io/node/v/on-finished.svg
+[node-version-url]: http://nodejs.org/download/
+[travis-image]: https://img.shields.io/travis/jshttp/on-finished/master.svg
+[travis-url]: https://travis-ci.org/jshttp/on-finished
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/on-finished/master.svg
+[coveralls-url]: https://coveralls.io/r/jshttp/on-finished?branch=master
+[downloads-image]: https://img.shields.io/npm/dm/on-finished.svg
+[downloads-url]: https://npmjs.org/package/on-finished

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/index.js b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/index.js
new file mode 100644
index 0000000..2402c76
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/index.js
@@ -0,0 +1,191 @@
+/*!
+ * on-finished
+ * Copyright(c) 2013 Jonathan Ong
+ * Copyright(c) 2014 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module exports.
+ */
+
+module.exports = onFinished;
+module.exports.isFinished = isFinished;
+
+/**
+* Module dependencies.
+*/
+
+var first = require('ee-first')
+
+/**
+* Variables.
+*/
+
+/* istanbul ignore next */
+var defer = typeof setImmediate === 'function'
+  ? setImmediate
+  : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
+
+/**
+ * Invoke callback when the response has finished, useful for
+ * cleaning up resources afterwards.
+ *
+ * @param {object} msg
+ * @param {function} listener
+ * @return {object}
+ * @api public
+ */
+
+function onFinished(msg, listener) {
+  if (isFinished(msg) !== false) {
+    defer(listener, null, msg)
+    return msg
+  }
+
+  // attach the listener to the message
+  attachListener(msg, listener)
+
+  return msg
+}
+
+/**
+ * Determine if message is already finished.
+ *
+ * @param {object} msg
+ * @return {boolean}
+ * @api public
+ */
+
+function isFinished(msg) {
+  var socket = msg.socket
+
+  if (typeof msg.finished === 'boolean') {
+    // OutgoingMessage
+    return Boolean(msg.finished || (socket && !socket.writable))
+  }
+
+  if (typeof msg.complete === 'boolean') {
+    // IncomingMessage
+    return Boolean(!socket || !socket.readable || (msg.complete && !msg.readable))
+  }
+
+  // don't know
+  return undefined
+}
+
+/**
+ * Attach a finished listener to the message.
+ *
+ * @param {object} msg
+ * @param {function} callback
+ * @private
+ */
+
+function attachFinishedListener(msg, callback) {
+  var eeMsg
+  var eeSocket
+  var finished = false
+
+  function onFinish(error) {
+    eeMsg.cancel()
+    eeSocket.cancel()
+
+    finished = true
+    callback(error)
+  }
+
+  // finished on first message event
+  eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish)
+
+  function onSocket(socket) {
+    // remove listener
+    msg.removeListener('socket', onSocket)
+
+    if (finished) return
+    if (eeMsg !== eeSocket) return
+
+    // finished on first socket event
+    eeSocket = first([[socket, 'error', 'close']], onFinish)
+  }
+
+  if (msg.socket) {
+    // socket already assigned
+    onSocket(msg.socket)
+    return
+  }
+
+  // wait for socket to be assigned
+  msg.on('socket', onSocket)
+
+  if (msg.socket === undefined) {
+    // node.js 0.8 patch
+    patchAssignSocket(msg, onSocket)
+  }
+}
+
+/**
+ * Attach the listener to the message.
+ *
+ * @param {object} msg
+ * @return {function}
+ * @api private
+ */
+
+function attachListener(msg, listener) {
+  var attached = msg.__onFinished
+
+  // create a private single listener with queue
+  if (!attached || !attached.queue) {
+    attached = msg.__onFinished = createListener(msg)
+    attachFinishedListener(msg, attached)
+  }
+
+  attached.queue.push(listener)
+}
+
+/**
+ * Create listener on message.
+ *
+ * @param {object} msg
+ * @return {function}
+ * @api private
+ */
+
+function createListener(msg) {
+  function listener(err) {
+    if (msg.__onFinished === listener) msg.__onFinished = null
+    if (!listener.queue) return
+
+    var queue = listener.queue
+    listener.queue = null
+
+    for (var i = 0; i < queue.length; i++) {
+      queue[i](err, msg)
+    }
+  }
+
+  listener.queue = []
+
+  return listener
+}
+
+/**
+ * Patch ServerResponse.prototype.assignSocket for node.js 0.8.
+ *
+ * @param {ServerResponse} res
+ * @param {function} callback
+ * @private
+ */
+
+function patchAssignSocket(res, callback) {
+  var assignSocket = res.assignSocket
+
+  if (typeof assignSocket !== 'function') return
+
+  // res.on('socket', callback) is broken in 0.8
+  res.assignSocket = function _assignSocket(socket) {
+    assignSocket.call(this, socket)
+    callback(socket)
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE
new file mode 100644
index 0000000..a7ae8ee
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE
@@ -0,0 +1,22 @@
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Jonathan Ong me@jongleberry.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md
new file mode 100644
index 0000000..cbd2478
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md
@@ -0,0 +1,80 @@
+# EE First
+
+[![NPM version][npm-image]][npm-url]
+[![Build status][travis-image]][travis-url]
+[![Test coverage][coveralls-image]][coveralls-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+[![Gittip][gittip-image]][gittip-url]
+
+Get the first event in a set of event emitters and event pairs,
+then clean up after itself.
+
+## Install
+
+```sh
+$ npm install ee-first
+```
+
+## API
+
+```js
+var first = require('ee-first')
+```
+
+### first(arr, listener)
+
+Invoke `listener` on the first event from the list specified in `arr`. `arr` is
+an array of arrays, with each array in the format `[ee, ...event]`. `listener`
+will be called only once, the first time any of the given events are emitted. If
+`error` is one of the listened events, then if that fires first, the `listener`
+will be given the `err` argument.
+
+The `listener` is invoked as `listener(err, ee, event, args)`, where `err` is the
+first argument emitted from an `error` event, if applicable; `ee` is the event
+emitter that fired; `event` is the string event name that fired; and `args` is an
+array of the arguments that were emitted on the event.
+
+```js
+var ee1 = new EventEmitter()
+var ee2 = new EventEmitter()
+
+first([
+  [ee1, 'close', 'end', 'error'],
+  [ee2, 'error']
+], function (err, ee, event, args) {
+  // listener invoked
+})
+```
+
+#### .cancel()
+
+The group of listeners can be cancelled before being invoked and have all the event
+listeners removed from the underlying event emitters.
+
+```js
+var thunk = first([
+  [ee1, 'close', 'end', 'error'],
+  [ee2, 'error']
+], function (err, ee, event, args) {
+  // listener invoked
+})
+
+// cancel and clean up
+thunk.cancel()
+```
+
+[npm-image]: https://img.shields.io/npm/v/ee-first.svg?style=flat-square
+[npm-url]: https://npmjs.org/package/ee-first
+[github-tag]: http://img.shields.io/github/tag/jonathanong/ee-first.svg?style=flat-square
+[github-url]: https://github.com/jonathanong/ee-first/tags
+[travis-image]: https://img.shields.io/travis/jonathanong/ee-first.svg?style=flat-square
+[travis-url]: https://travis-ci.org/jonathanong/ee-first
+[coveralls-image]: https://img.shields.io/coveralls/jonathanong/ee-first.svg?style=flat-square
+[coveralls-url]: https://coveralls.io/r/jonathanong/ee-first?branch=master
+[license-image]: http://img.shields.io/npm/l/ee-first.svg?style=flat-square
+[license-url]: LICENSE.md
+[downloads-image]: http://img.shields.io/npm/dm/ee-first.svg?style=flat-square
+[downloads-url]: https://npmjs.org/package/ee-first
+[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square
+[gittip-url]: https://www.gittip.com/jonathanong/

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js
new file mode 100644
index 0000000..c8b820d
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js
@@ -0,0 +1,68 @@
+
+module.exports = function first(stuff, done) {
+  if (!Array.isArray(stuff))
+    throw new TypeError('arg must be an array of [ee, events...] arrays')
+
+  var cleanups = []
+
+  for (var i = 0; i < stuff.length; i++) {
+    var arr = stuff[i]
+
+    if (!Array.isArray(arr) || arr.length < 2)
+      throw new TypeError('each array member must be [ee, events...]')
+
+    var ee = arr[0]
+
+    for (var j = 1; j < arr.length; j++) {
+      var event = arr[j]
+      var fn = listener(event, callback)
+
+      // listen to the event
+      ee.on(event, fn)
+      // push this listener to the list of cleanups
+      cleanups.push({
+        ee: ee,
+        event: event,
+        fn: fn,
+      })
+    }
+  }
+
+  function callback() {
+    cleanup()
+    done.apply(null, arguments)
+  }
+
+  function cleanup() {
+    var x
+    for (var i = 0; i < cleanups.length; i++) {
+      x = cleanups[i]
+      x.ee.removeListener(x.event, x.fn)
+    }
+  }
+
+  function thunk(fn) {
+    done = fn
+  }
+
+  thunk.cancel = cleanup
+
+  return thunk
+}
+
+function listener(event, done) {
+  return function onevent(arg1) {
+    var args = new Array(arguments.length)
+    var ee = this
+    var err = event === 'error'
+      ? arg1
+      : null
+
+    // copy args to prevent arguments escaping scope
+    for (var i = 0; i < args.length; i++) {
+      args[i] = arguments[i]
+    }
+
+    done(err, ee, event, args)
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json
new file mode 100644
index 0000000..c9865b2
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json
@@ -0,0 +1,64 @@
+{
+  "name": "ee-first",
+  "description": "return the first event in a set of ee/event pairs",
+  "version": "1.1.0",
+  "author": {
+    "name": "Jonathan Ong",
+    "email": "me@jongleberry.com",
+    "url": "http://jongleberry.com"
+  },
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jonathanong/ee-first.git"
+  },
+  "devDependencies": {
+    "istanbul": "0.3.2",
+    "mocha": "1"
+  },
+  "files": [
+    "index.js",
+    "LICENSE"
+  ],
+  "scripts": {
+    "test": "mocha --reporter spec --bail --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
+  },
+  "gitHead": "a6412004da4745941af2fc98ec30c8da570da7ea",
+  "bugs": {
+    "url": "https://github.com/jonathanong/ee-first/issues"
+  },
+  "homepage": "https://github.com/jonathanong/ee-first",
+  "_id": "ee-first@1.1.0",
+  "_shasum": "6a0d7c6221e490feefd92ec3f441c9ce8cd097f4",
+  "_from": "ee-first@1.1.0",
+  "_npmVersion": "1.4.21",
+  "_npmUser": {
+    "name": "dougwilson",
+    "email": "doug@somethingdoug.com"
+  },
+  "maintainers": [
+    {
+      "name": "jongleberry",
+      "email": "jonathanrichardong@gmail.com"
+    },
+    {
+      "name": "dougwilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "dist": {
+    "shasum": "6a0d7c6221e490feefd92ec3f441c9ce8cd097f4",
+    "tarball": "http://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.0.tgz",
+  "readme": "ERROR: No README data found!"
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/package.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/package.json b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/package.json
new file mode 100644
index 0000000..e30a702
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/on-finished/package.json
@@ -0,0 +1,71 @@
+{
+  "name": "on-finished",
+  "description": "Execute a callback when a request closes, finishes, or errors",
+  "version": "2.2.1",
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    },
+    {
+      "name": "Jonathan Ong",
+      "email": "me@jongleberry.com",
+      "url": "http://jongleberry.com"
+    }
+  ],
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jshttp/on-finished.git"
+  },
+  "dependencies": {
+    "ee-first": "1.1.0"
+  },
+  "devDependencies": {
+    "istanbul": "0.3.9",
+    "mocha": "~2.2.4"
+  },
+  "engines": {
+    "node": ">= 0.8"
+  },
+  "files": [
+    "HISTORY.md",
+    "LICENSE",
+    "index.js"
+  ],
+  "scripts": {
+    "test": "mocha --reporter spec --bail --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
+  },
+  "gitHead": "f3ecb92fb09d590d314ffe772a6ffd6f76c84223",
+  "bugs": {
+    "url": "https://github.com/jshttp/on-finished/issues"
+  },
+  "homepage": "https://github.com/jshttp/on-finished",
+  "_id": "on-finished@2.2.1",
+  "_shasum": "5c85c1cc36299f78029653f667f27b6b99ebc029",
+  "_from": "on-finished@>=2.2.0 <2.3.0",
+  "_npmVersion": "1.4.28",
+  "_npmUser": {
+    "name": "dougwilson",
+    "email": "doug@somethingdoug.com"
+  },
+  "maintainers": [
+    {
+      "name": "dougwilson",
+      "email": "doug@somethingdoug.com"
+    },
+    {
+      "name": "jongleberry",
+      "email": "jonathanrichardong@gmail.com"
+    }
+  ],
+  "dist": {
+    "shasum": "5c85c1cc36299f78029653f667f27b6b99ebc029",
+    "tarball": "http://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.2.1.tgz",
+  "readme": "ERROR: No README data found!"
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/.npmignore
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/.npmignore b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/.npmignore
new file mode 100644
index 0000000..85c82a5
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/.npmignore
@@ -0,0 +1,4 @@
+benchmark/
+coverage/
+test/
+.travis.yml

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/HISTORY.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/HISTORY.md b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/HISTORY.md
new file mode 100644
index 0000000..65a0860
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/HISTORY.md
@@ -0,0 +1,42 @@
+1.3.0 / 2014-08-09
+==================
+
+  * Add `parseurl.original` for parsing `req.originalUrl` with fallback
+  * Return `undefined` if `req.url` is `undefined`
+
+1.2.0 / 2014-07-21
+==================
+
+  * Cache URLs based on original value
+  * Remove no-longer-needed URL mis-parse work-around
+  * Simplify the "fast-path" `RegExp`
+
+1.1.3 / 2014-07-08
+==================
+
+  * Fix typo
+
+1.1.2 / 2014-07-08
+==================
+
+  * Seriously fix Node.js 0.8 compatibility
+
+1.1.1 / 2014-07-08
+==================
+
+  * Fix Node.js 0.8 compatibility
+
+1.1.0 / 2014-07-08
+==================
+
+  * Incorporate URL href-only parse fast-path
+
+1.0.1 / 2014-03-08
+==================
+
+  * Add missing `require`
+
+1.0.0 / 2014-03-08
+==================
+
+  * Genesis from `connect`

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/LICENSE
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/LICENSE b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/LICENSE
new file mode 100644
index 0000000..ec7dfe7
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/LICENSE
@@ -0,0 +1,24 @@
+
+(The MIT License)
+
+Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
+Copyright (c) 2014 Douglas Christopher Wilson <doug@somethingdoug.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/README.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/README.md b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/README.md
new file mode 100644
index 0000000..0db1d02
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/README.md
@@ -0,0 +1,107 @@
+# parseurl
+
+[![NPM version](https://badge.fury.io/js/parseurl.svg)](http://badge.fury.io/js/parseurl)
+[![Build Status](https://travis-ci.org/expressjs/parseurl.svg?branch=master)](https://travis-ci.org/expressjs/parseurl)
+[![Coverage Status](https://img.shields.io/coveralls/expressjs/parseurl.svg?branch=master)](https://coveralls.io/r/expressjs/parseurl)
+
+Parse a URL with memoization.
+
+## Install
+
+```bash
+$ npm install parseurl
+```
+
+## API
+
+```js
+var parseurl = require('parseurl')
+```
+
+### parseurl(req)
+
+Parse the URL of the given request object (looks at the `req.url` property)
+and return the result. The result is the same as `url.parse` in Node.js core.
+Calling this function multiple times on the same `req` where `req.url` does
+not change will return a cached parsed object, rather than parsing again.
+
+### parseurl.original(req)
+
+Parse the original URL of the given request object and return the result.
+This works by trying to parse `req.originalUrl` if it is a string, otherwise
+parses `req.url`. The result is the same as `url.parse` in Node.js core.
+Calling this function multiple times on the same `req` where `req.originalUrl`
+does not change will return a cached parsed object, rather than parsing again.
+
+## Benchmark
+
+```bash
+$ npm run-script bench
+
+> parseurl@1.3.0 bench nodejs-parseurl
+> node benchmark/index.js
+
+> node benchmark/fullurl.js
+
+  Parsing URL "http://localhost:8888/foo/bar?user=tj&pet=fluffy"
+
+  1 test completed.
+  2 tests completed.
+  3 tests completed.
+
+  fasturl   x 1,290,780 ops/sec ±0.46% (195 runs sampled)
+  nativeurl x    56,401 ops/sec ±0.22% (196 runs sampled)
+  parseurl  x    55,231 ops/sec ±0.22% (194 runs sampled)
+
+> node benchmark/pathquery.js
+
+  Parsing URL "/foo/bar?user=tj&pet=fluffy"
+
+  1 test completed.
+  2 tests completed.
+  3 tests completed.
+
+  fasturl   x 1,986,668 ops/sec ±0.27% (190 runs sampled)
+  nativeurl x    98,740 ops/sec ±0.21% (195 runs sampled)
+  parseurl  x 2,628,171 ops/sec ±0.36% (195 runs sampled)
+
+> node benchmark/samerequest.js
+
+  Parsing URL "/foo/bar?user=tj&pet=fluffy" on same request object
+
+  1 test completed.
+  2 tests completed.
+  3 tests completed.
+
+  fasturl   x  2,184,468 ops/sec ±0.40% (194 runs sampled)
+  nativeurl x     99,437 ops/sec ±0.71% (194 runs sampled)
+  parseurl  x 10,498,005 ops/sec ±0.61% (186 runs sampled)
+
+> node benchmark/simplepath.js
+
+  Parsing URL "/foo/bar"
+
+  1 test completed.
+  2 tests completed.
+  3 tests completed.
+
+  fasturl   x 4,535,825 ops/sec ±0.27% (191 runs sampled)
+  nativeurl x    98,769 ops/sec ±0.54% (191 runs sampled)
+  parseurl  x 4,164,865 ops/sec ±0.34% (192 runs sampled)
+
+> node benchmark/slash.js
+
+  Parsing URL "/"
+
+  1 test completed.
+  2 tests completed.
+  3 tests completed.
+
+  fasturl   x 4,908,405 ops/sec ±0.42% (191 runs sampled)
+  nativeurl x   100,945 ops/sec ±0.59% (188 runs sampled)
+  parseurl  x 4,333,208 ops/sec ±0.27% (194 runs sampled)
+```
+
+## License
+
+  [MIT](LICENSE)

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/index.js b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/index.js
new file mode 100644
index 0000000..8632347
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/index.js
@@ -0,0 +1,136 @@
+/*!
+ * parseurl
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2014 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var url = require('url')
+var parse = url.parse
+var Url = url.Url
+
+/**
+ * Pattern for a simple path case.
+ * See: https://github.com/joyent/node/pull/7878
+ */
+
+var simplePathRegExp = /^(\/\/?(?!\/)[^\?#\s]*)(\?[^#\s]*)?$/
+
+/**
+ * Exports.
+ */
+
+module.exports = parseurl
+module.exports.original = originalurl
+
+/**
+ * Parse the `req` url with memoization.
+ *
+ * @param {ServerRequest} req
+ * @return {Object}
+ * @api public
+ */
+
+function parseurl(req) {
+  var url = req.url
+
+  if (url === undefined) {
+    // URL is undefined
+    return undefined
+  }
+
+  var parsed = req._parsedUrl
+
+  if (fresh(url, parsed)) {
+    // Return cached URL parse
+    return parsed
+  }
+
+  // Parse the URL
+  parsed = fastparse(url)
+  parsed._raw = url
+
+  return req._parsedUrl = parsed
+};
+
+/**
+ * Parse the `req` original url with fallback and memoization.
+ *
+ * @param {ServerRequest} req
+ * @return {Object}
+ * @api public
+ */
+
+function originalurl(req) {
+  var url = req.originalUrl
+
+  if (typeof url !== 'string') {
+    // Fallback
+    return parseurl(req)
+  }
+
+  var parsed = req._parsedOriginalUrl
+
+  if (fresh(url, parsed)) {
+    // Return cached URL parse
+    return parsed
+  }
+
+  // Parse the URL
+  parsed = fastparse(url)
+  parsed._raw = url
+
+  return req._parsedOriginalUrl = parsed
+};
+
+/**
+ * Parse the `str` url with fast-path short-cut.
+ *
+ * @param {string} str
+ * @return {Object}
+ * @api private
+ */
+
+function fastparse(str) {
+  // Try fast path regexp
+  // See: https://github.com/joyent/node/pull/7878
+  var simplePath = typeof str === 'string' && simplePathRegExp.exec(str)
+
+  // Construct simple URL
+  if (simplePath) {
+    var pathname = simplePath[1]
+    var search = simplePath[2] || null
+    var url = Url !== undefined
+      ? new Url()
+      : {}
+    url.path = str
+    url.href = str
+    url.pathname = pathname
+    url.search = search
+    url.query = search && search.substr(1)
+
+    return url
+  }
+
+  return parse(str)
+}
+
+/**
+ * Determine if parsed is still fresh for url.
+ *
+ * @param {string} url
+ * @param {object} parsedUrl
+ * @return {boolean}
+ * @api private
+ */
+
+function fresh(url, parsedUrl) {
+  return typeof parsedUrl === 'object'
+    && parsedUrl !== null
+    && (Url === undefined || parsedUrl instanceof Url)
+    && parsedUrl._raw === url
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/package.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/package.json b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/package.json
new file mode 100644
index 0000000..5edaecb
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/parseurl/package.json
@@ -0,0 +1,80 @@
+{
+  "name": "parseurl",
+  "description": "parse a url with memoization",
+  "version": "1.3.0",
+  "author": {
+    "name": "Jonathan Ong",
+    "email": "me@jongleberry.com",
+    "url": "http://jongleberry.com"
+  },
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/expressjs/parseurl.git"
+  },
+  "license": "MIT",
+  "devDependencies": {
+    "benchmark": "1.0.0",
+    "beautify-benchmark": "0.2.4",
+    "fast-url-parser": "~1.0.0",
+    "istanbul": "0.3.0",
+    "mocha": "~1.21.4"
+  },
+  "scripts": {
+    "bench": "node benchmark/index.js",
+    "test": "mocha --check-leaks --bail --reporter spec test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/"
+  },
+  "gitHead": "03b7ccca240e2bef5df6c25797e99175d28fb2cb",
+  "bugs": {
+    "url": "https://github.com/expressjs/parseurl/issues"
+  },
+  "homepage": "https://github.com/expressjs/parseurl",
+  "_id": "parseurl@1.3.0",
+  "_shasum": "b58046db4223e145afa76009e61bac87cc2281b3",
+  "_from": "parseurl@>=1.3.0 <1.4.0",
+  "_npmVersion": "1.4.21",
+  "_npmUser": {
+    "name": "dougwilson",
+    "email": "doug@somethingdoug.com"
+  },
+  "maintainers": [
+    {
+      "name": "jongleberry",
+      "email": "jonathanrichardong@gmail.com"
+    },
+    {
+      "name": "shtylman",
+      "email": "shtylman@gmail.com"
+    },
+    {
+      "name": "dougwilson",
+      "email": "doug@somethingdoug.com"
+    },
+    {
+      "name": "tjholowaychuk",
+      "email": "tj@vision-media.ca"
+    },
+    {
+      "name": "mscdex",
+      "email": "mscdex@mscdex.net"
+    },
+    {
+      "name": "fishrock123",
+      "email": "fishrock123@rocketmail.com"
+    }
+  ],
+  "dist": {
+    "shasum": "b58046db4223e145afa76009e61bac87cc2281b3",
+    "tarball": "http://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.0.tgz",
+  "readme": "ERROR: No README data found!"
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/.npmignore
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/.npmignore b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/.npmignore
new file mode 100644
index 0000000..ba2a97b
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/.npmignore
@@ -0,0 +1,2 @@
+node_modules
+coverage

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/History.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/History.md b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/History.md
new file mode 100644
index 0000000..f962cfa
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/History.md
@@ -0,0 +1,16 @@
+0.1.3 / 2014-07-06
+==================
+
+  * Better array support
+  * Improved support for trailing slash in non-ending mode
+
+0.1.0 / 2014-03-06
+==================
+
+  * add options.end
+
+0.0.2 / 2013-02-10
+==================
+
+  * Update to match current express
+  * add .license property to component.json

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/Readme.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/Readme.md b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/Readme.md
new file mode 100644
index 0000000..9199e38
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/Readme.md
@@ -0,0 +1,33 @@
+
+# Path-to-RegExp
+
+  Turn an Express-style path string such as `/user/:name` into a regular expression.
+
+## Usage
+
+```javascript
+var pathToRegexp = require('path-to-regexp');
+```
+### pathToRegexp(path, keys, options)
+
+ - **path** A string in the express format, an array of such strings, or a regular expression
+ - **keys** An array to be populated with the keys present in the url.  Once the function completes, this will be an array of strings.
+ - **options**
+   - **options.sensitive** Defaults to false, set this to true to make routes case sensitive
+   - **options.strict** Defaults to false, set this to true to make the trailing slash matter.
+   - **options.end** Defaults to true, set this to false to only match the prefix of the URL.
+
+```javascript
+var keys = [];
+var exp = pathToRegexp('/foo/:bar', keys);
+//keys = ['bar']
+//exp = /^\/foo\/(?:([^\/]+?))\/?$/i
+```
+
+## Live Demo
+
+You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/).
+
+## License
+
+  MIT
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/component.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/component.json b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/component.json
new file mode 100644
index 0000000..6ab37d3
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/component.json
@@ -0,0 +1,15 @@
+{
+  "name": "path-to-regexp",
+  "description": "Express style path to RegExp utility",
+  "version": "0.1.3",
+  "keywords": [
+    "express",
+    "regexp",
+    "route",
+    "routing"
+  ],
+  "scripts": [
+    "index.js"
+  ],
+  "license": "MIT"
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/index.js b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/index.js
new file mode 100644
index 0000000..2801f91
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/index.js
@@ -0,0 +1,70 @@
+/**
+ * Expose `pathtoRegexp`.
+ */
+
+module.exports = pathtoRegexp;
+
+/**
+ * Normalize the given path string,
+ * returning a regular expression.
+ *
+ * An empty array should be passed,
+ * which will contain the placeholder
+ * key names. For example "/user/:id" will
+ * then contain ["id"].
+ *
+ * @param  {String|RegExp|Array} path
+ * @param  {Array} keys
+ * @param  {Object} options
+ * @return {RegExp}
+ * @api private
+ */
+
+function pathtoRegexp(path, keys, options) {
+  options = options || {};
+  var strict = options.strict;
+  var end = options.end !== false;
+  var flags = options.sensitive ? '' : 'i';
+  keys = keys || [];
+
+  if (path instanceof RegExp) {
+    return path;
+  }
+
+  if (Array.isArray(path)) {
+    // Map array parts into regexps and return their source. We also pass
+    // the same keys and options instance into every generation to get
+    // consistent matching groups before we join the sources together.
+    path = path.map(function (value) {
+      return pathtoRegexp(value, keys, options).source;
+    });
+
+    return new RegExp('(?:' + path.join('|') + ')', flags);
+  }
+
+  path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?'))
+    .replace(/\/\(/g, '/(?:')
+    .replace(/([\/\.])/g, '\\$1')
+    .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional) {
+      slash = slash || '';
+      format = format || '';
+      capture = capture || '([^\\/' + format + ']+?)';
+      optional = optional || '';
+
+      keys.push({ name: key, optional: !!optional });
+
+      return ''
+        + (optional ? '' : slash)
+        + '(?:'
+        + format + (optional ? slash : '') + capture
+        + (star ? '((?:[\\/' + format + '].+?)?)' : '')
+        + ')'
+        + optional;
+    })
+    .replace(/\*/g, '(.*)');
+
+  // If the path is non-ending, match until the end or a slash.
+  path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)'));
+
+  return new RegExp(path, flags);
+};

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/package.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/package.json b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/package.json
new file mode 100644
index 0000000..5826acf
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/package.json
@@ -0,0 +1,162 @@
+{
+  "name": "path-to-regexp",
+  "description": "Express style path to RegExp utility",
+  "version": "0.1.3",
+  "scripts": {
+    "test": "istanbul cover _mocha -- -R spec"
+  },
+  "keywords": [
+    "express",
+    "regexp"
+  ],
+  "component": {
+    "scripts": {
+      "path-to-regexp": "index.js"
+    }
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/component/path-to-regexp.git"
+  },
+  "devDependencies": {
+    "mocha": "^1.17.1",
+    "istanbul": "^0.2.6"
+  },
+  "bugs": {
+    "url": "https://github.com/component/path-to-regexp/issues"
+  },
+  "homepage": "https://github.com/component/path-to-regexp",
+  "_id": "path-to-regexp@0.1.3",
+  "_shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb",
+  "_from": "path-to-regexp@0.1.3",
+  "_npmVersion": "1.4.9",
+  "_npmUser": {
+    "name": "blakeembrey",
+    "email": "hello@blakeembrey.com"
+  },
+  "maintainers": [
+    {
+      "name": "tjholowaychuk",
+      "email": "tj@vision-media.ca"
+    },
+    {
+      "name": "jongleberry",
+      "email": "jonathanrichardong@gmail.com"
+    },
+    {
+      "name": "dominicbarnes",
+      "email": "dominic@dbarnes.info"
+    },
+    {
+      "name": "tootallnate",
+      "email": "nathan@tootallnate.net"
+    },
+    {
+      "name": "rauchg",
+      "email": "rauchg@gmail.com"
+    },
+    {
+      "name": "retrofox",
+      "email": "rdsuarez@gmail.com"
+    },
+    {
+      "name": "coreh",
+      "email": "thecoreh@gmail.com"
+    },
+    {
+      "name": "forbeslindesay",
+      "email": "forbes@lindesay.co.uk"
+    },
+    {
+      "name": "kelonye",
+      "email": "kelonyemitchel@gmail.com"
+    },
+    {
+      "name": "mattmueller",
+      "email": "mattmuelle@gmail.com"
+    },
+    {
+      "name": "yields",
+      "email": "yields@icloud.com"
+    },
+    {
+      "name": "anthonyshort",
+      "email": "antshort@gmail.com"
+    },
+    {
+      "name": "ianstormtaylor",
+      "email": "ian@ianstormtaylor.com"
+    },
+    {
+      "name": "cristiandouce",
+      "email": "cristian@gravityonmars.com"
+    },
+    {
+      "name": "swatinem",
+      "email": "arpad.borsos@googlemail.com"
+    },
+    {
+      "name": "stagas",
+      "email": "gstagas@gmail.com"
+    },
+    {
+      "name": "amasad",
+      "email": "amjad.masad@gmail.com"
+    },
+    {
+      "name": "juliangruber",
+      "email": "julian@juliangruber.com"
+    },
+    {
+      "name": "shtylman",
+      "email": "shtylman@gmail.com"
+    },
+    {
+      "name": "calvinfo",
+      "email": "calvin@calv.info"
+    },
+    {
+      "name": "blakeembrey",
+      "email": "hello@blakeembrey.com"
+    },
+    {
+      "name": "timoxley",
+      "email": "secoif@gmail.com"
+    },
+    {
+      "name": "jonathanong",
+      "email": "jonathanrichardong@gmail.com"
+    },
+    {
+      "name": "queckezz",
+      "email": "fabian.eichenberger@gmail.com"
+    },
+    {
+      "name": "nami-doc",
+      "email": "vendethiel@hotmail.fr"
+    },
+    {
+      "name": "clintwood",
+      "email": "clint@anotherway.co.za"
+    },
+    {
+      "name": "thehydroimpulse",
+      "email": "dnfagnan@gmail.com"
+    },
+    {
+      "name": "stephenmathieson",
+      "email": "me@stephenmathieson.com"
+    },
+    {
+      "name": "trevorgerhardt",
+      "email": "trevorgerhardt@gmail.com"
+    }
+  ],
+  "dist": {
+    "shasum": "21b9ab82274279de25b156ea08fd12ca51b8aecb",
+    "tarball": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.3.tgz",
+  "readme": "ERROR: No README data found!"
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/test.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/test.js b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/test.js
new file mode 100644
index 0000000..4a0c270
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/path-to-regexp/test.js
@@ -0,0 +1,616 @@
+var pathToRegExp = require('./');
+var assert = require('assert');
+
+describe('path-to-regexp', function () {
+  describe('strings', function () {
+    it('should match simple paths', function () {
+      var params = [];
+      var m = pathToRegExp('/test', params).exec('/test');
+
+      assert.equal(params.length, 0);
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/test');
+    });
+
+    it('should match express format params', function () {
+      var params = [];
+      var m = pathToRegExp('/:test', params).exec('/pathname');
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/pathname');
+      assert.equal(m[1], 'pathname');
+    });
+
+    it('should do strict matches', function () {
+      var params = [];
+      var re = pathToRegExp('/:test', params, { strict: true });
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      m = re.exec('/route');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/route');
+      assert.equal(m[1], 'route');
+
+      m = re.exec('/route/');
+
+      assert.ok(!m);
+    });
+
+    it('should do strict matches with trailing slashes', function () {
+      var params = [];
+      var re = pathToRegExp('/:test/', params, { strict: true });
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      m = re.exec('/route');
+
+      assert.ok(!m);
+
+      m = re.exec('/route/');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/route/');
+      assert.equal(m[1], 'route');
+
+      m = re.exec('/route//');
+
+      assert.ok(!m);
+    });
+
+    it('should allow optional express format params', function () {
+      var params = [];
+      var re = pathToRegExp('/:test?', params);
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, true);
+
+      m = re.exec('/route');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/route');
+      assert.equal(m[1], 'route');
+
+      m = re.exec('/');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/');
+      assert.equal(m[1], undefined);
+    });
+
+    it('should allow express format param regexps', function () {
+      var params = [];
+      var m = pathToRegExp('/:page(\\d+)', params).exec('/56');
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'page');
+      assert.equal(params[0].optional, false);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/56');
+      assert.equal(m[1], '56');
+    });
+
+    it('should match without a prefixed slash', function () {
+      var params = [];
+      var m = pathToRegExp(':test', params).exec('string');
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], 'string');
+      assert.equal(m[1], 'string');
+    });
+
+    it('should not match format parts', function () {
+      var params = [];
+      var m = pathToRegExp('/:test.json', params).exec('/route.json');
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/route.json');
+      assert.equal(m[1], 'route');
+    });
+
+    it('should match format parts', function () {
+      var params = [];
+      var re = pathToRegExp('/:test.:format', params);
+      var m;
+
+      assert.equal(params.length, 2);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+      assert.equal(params[1].name, 'format');
+      assert.equal(params[1].optional, false);
+
+      m = re.exec('/route.json');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/route.json');
+      assert.equal(m[1], 'route');
+      assert.equal(m[2], 'json');
+
+      m = re.exec('/route');
+
+      assert.ok(!m);
+    });
+
+    it('should match route parts with a trailing format', function () {
+      var params = [];
+      var m = pathToRegExp('/:test.json', params).exec('/route.json');
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/route.json');
+      assert.equal(m[1], 'route');
+    });
+
+    it('should match optional trailing routes', function () {
+      var params = [];
+      var m = pathToRegExp('/test*', params).exec('/test/route');
+
+      assert.equal(params.length, 0);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/test/route');
+      assert.equal(m[1], '/route');
+    });
+
+    it('should match optional trailing routes after a param', function () {
+      var params = [];
+      var re = pathToRegExp('/:test*', params);
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      m = re.exec('/test/route');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/test/route');
+      assert.equal(m[1], 'test');
+      assert.equal(m[2], '/route');
+
+      m = re.exec('/testing');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/testing');
+      assert.equal(m[1], 'testing');
+      assert.equal(m[2], '');
+    });
+
+    it('should match optional trailing routes before a format', function () {
+      var params = [];
+      var re = pathToRegExp('/test*.json', params);
+      var m;
+
+      assert.equal(params.length, 0);
+
+      m = re.exec('/test.json');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/test.json');
+      assert.equal(m[1], '');
+
+      m = re.exec('/testing.json');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/testing.json');
+      assert.equal(m[1], 'ing');
+
+      m = re.exec('/test/route.json');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/test/route.json');
+      assert.equal(m[1], '/route');
+    });
+
+    it('should match optional trailing routes after a param and before a format', function () {
+      var params = [];
+      var re = pathToRegExp('/:test*.json', params);
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      m = re.exec('/testing.json');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/testing.json');
+      assert.equal(m[1], 'testing');
+      assert.equal(m[2], '');
+
+      m = re.exec('/test/route.json');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/test/route.json');
+      assert.equal(m[1], 'test');
+      assert.equal(m[2], '/route');
+
+      m = re.exec('.json');
+
+      assert.ok(!m);
+    });
+
+    it('should match optional trailing routes between a normal param and a format param', function () {
+      var params = [];
+      var re = pathToRegExp('/:test*.:format', params);
+      var m;
+
+      assert.equal(params.length, 2);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+      assert.equal(params[1].name, 'format');
+      assert.equal(params[1].optional, false);
+
+      m = re.exec('/testing.json');
+
+      assert.equal(m.length, 4);
+      assert.equal(m[0], '/testing.json');
+      assert.equal(m[1], 'testing');
+      assert.equal(m[2], '');
+      assert.equal(m[3], 'json');
+
+      m = re.exec('/test/route.json');
+
+      assert.equal(m.length, 4);
+      assert.equal(m[0], '/test/route.json');
+      assert.equal(m[1], 'test');
+      assert.equal(m[2], '/route');
+      assert.equal(m[3], 'json');
+
+      m = re.exec('/test');
+
+      assert.ok(!m);
+
+      m = re.exec('.json');
+
+      assert.ok(!m);
+    });
+
+    it('should match optional trailing routes after a param and before an optional format param', function () {
+      var params = [];
+      var re = pathToRegExp('/:test*.:format?', params);
+      var m;
+
+      assert.equal(params.length, 2);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+      assert.equal(params[1].name, 'format');
+      assert.equal(params[1].optional, true);
+
+      m = re.exec('/testing.json');
+
+      assert.equal(m.length, 4);
+      assert.equal(m[0], '/testing.json');
+      assert.equal(m[1], 'testing');
+      assert.equal(m[2], '');
+      assert.equal(m[3], 'json');
+
+      m = re.exec('/test/route.json');
+
+      assert.equal(m.length, 4);
+      assert.equal(m[0], '/test/route.json');
+      assert.equal(m[1], 'test');
+      assert.equal(m[2], '/route');
+      assert.equal(m[3], 'json');
+
+      m = re.exec('/test');
+
+      assert.equal(m.length, 4);
+      assert.equal(m[0], '/test');
+      assert.equal(m[1], 'test');
+      assert.equal(m[2], '');
+      assert.equal(m[3], undefined);
+
+      m = re.exec('.json');
+
+      assert.ok(!m);
+    });
+
+    it('should match optional trailing routes inside optional express param', function () {
+      var params = [];
+      var re = pathToRegExp('/:test*?', params);
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, true);
+
+      m = re.exec('/test/route');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/test/route');
+      assert.equal(m[1], 'test');
+      assert.equal(m[2], '/route');
+
+      m = re.exec('/test');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/test');
+      assert.equal(m[1], 'test');
+      assert.equal(m[2], '');
+
+      m = re.exec('/');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/');
+      assert.equal(m[1], undefined);
+      assert.equal(m[2], undefined);
+    });
+
+    it('should do case insensitive matches', function () {
+      var m = pathToRegExp('/test').exec('/TEST');
+
+      assert.equal(m[0], '/TEST');
+    });
+
+    it('should do case sensitive matches', function () {
+      var re = pathToRegExp('/test', null, { sensitive: true });
+      var m;
+
+      m = re.exec('/test');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/test');
+
+      m = re.exec('/TEST');
+
+      assert.ok(!m);
+    });
+
+    it('should do non-ending matches', function () {
+      var params = [];
+      var m = pathToRegExp('/:test', params, { end: false }).exec('/test/route');
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/test');
+      assert.equal(m[1], 'test');
+    });
+
+    it('should match trailing slashes in non-ending non-strict mode', function () {
+      var params = [];
+      var re = pathToRegExp('/:test', params, { end: false });
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      m = re.exec('/test/');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/test/');
+      assert.equal(m[1], 'test');
+    });
+
+    it('should match trailing slashes in non-ending non-strict mode', function () {
+      var params = [];
+      var re = pathToRegExp('/route/', params, { end: false });
+      var m;
+
+      assert.equal(params.length, 0);
+
+      m = re.exec('/route/');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route/');
+
+      m = re.exec('/route/test');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route');
+
+      m = re.exec('/route');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route');
+
+      m = re.exec('/route//');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route/');
+    });
+
+    it('should match trailing slashing in non-ending strict mode', function () {
+      var params = [];
+      var re = pathToRegExp('/route/', params, { end: false, strict: true });
+
+      assert.equal(params.length, 0);
+
+      m = re.exec('/route/');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route/');
+
+      m = re.exec('/route/test');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route/');
+
+      m = re.exec('/route');
+
+      assert.ok(!m);
+
+      m = re.exec('/route//');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route/');
+    });
+
+    it('should not match trailing slashes in non-ending strict mode', function () {
+      var params = [];
+      var re = pathToRegExp('/route', params, { end: false, strict: true });
+
+      assert.equal(params.length, 0);
+
+      m = re.exec('/route');
+
+      assert.equal(m.length, 1);
+      assert.equal(m[0], '/route');
+
+      m = re.exec('/route/');
+
+      assert.ok(m.length, 1);
+      assert.equal(m[0], '/route');
+    });
+
+    it('should match text after an express param', function () {
+      var params = [];
+      var re = pathToRegExp('/(:test)route', params);
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      m = re.exec('/route');
+
+      assert.ok(!m);
+
+      m = re.exec('/testroute');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/testroute');
+      assert.equal(m[1], 'test');
+
+      m = re.exec('testroute');
+
+      assert.ok(!m);
+    });
+
+    it('should match text after an optional express param', function () {
+      var params = [];
+      var re = pathToRegExp('/(:test?)route', params);
+      var m;
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, true);
+
+      m = re.exec('/route');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/route');
+      assert.equal(m[1], undefined);
+
+      m = re.exec('/testroute');
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/testroute');
+      assert.equal(m[1], 'test');
+
+      m = re.exec('route');
+
+      assert.ok(!m);
+    });
+
+    it('should match optional formats', function () {
+      var params = [];
+      var re = pathToRegExp('/:test.:format?', params);
+      var m;
+
+      assert.equal(params.length, 2);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+      assert.equal(params[1].name, 'format');
+      assert.equal(params[1].optional, true);
+
+      m = re.exec('/route');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/route');
+      assert.equal(m[1], 'route');
+      assert.equal(m[2], undefined);
+
+      m = re.exec('/route.json');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/route.json');
+      assert.equal(m[1], 'route');
+      assert.equal(m[2], 'json');
+    });
+
+    it('should match full paths with format by default', function () {
+      var params = [];
+      var m = pathToRegExp('/:test', params).exec('/test.json');
+
+      assert.equal(params.length, 1);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+
+      assert.equal(m.length, 2);
+      assert.equal(m[0], '/test.json');
+      assert.equal(m[1], 'test.json');
+    });
+  });
+
+  describe('regexps', function () {
+    it('should return the regexp', function () {
+      assert.deepEqual(pathToRegExp(/.*/), /.*/);
+    });
+  });
+
+  describe('arrays', function () {
+    it('should join arrays parts', function () {
+      var re = pathToRegExp(['/test', '/route']);
+
+      assert.ok(re.test('/test'));
+      assert.ok(re.test('/route'));
+      assert.ok(!re.test('/else'));
+    });
+
+    it('should match parts properly', function () {
+      var params = [];
+      var re = pathToRegExp(['/:test', '/test/:route'], params);
+      var m;
+
+      assert.equal(params.length, 2);
+      assert.equal(params[0].name, 'test');
+      assert.equal(params[0].optional, false);
+      assert.equal(params[1].name, 'route');
+      assert.equal(params[1].optional, false);
+
+      m = re.exec('/route');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/route');
+      assert.equal(m[1], 'route');
+      assert.equal(m[2], undefined);
+
+      m = re.exec('/test/path');
+
+      assert.equal(m.length, 3);
+      assert.equal(m[0], '/test/path');
+      assert.equal(m[1], undefined);
+      assert.equal(m[2], 'path');
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/HISTORY.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/HISTORY.md b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/HISTORY.md
new file mode 100644
index 0000000..0a695fd
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/HISTORY.md
@@ -0,0 +1,61 @@
+1.0.7 / 2015-03-16
+==================
+
+  * deps: ipaddr.js@0.1.9
+    - Fix OOM on certain inputs to `isValid`
+
+1.0.6 / 2015-02-01
+==================
+
+  * deps: ipaddr.js@0.1.8
+
+1.0.5 / 2015-01-08
+==================
+
+  * deps: ipaddr.js@0.1.6
+
+1.0.4 / 2014-11-23
+==================
+
+  * deps: ipaddr.js@0.1.5
+    - Fix edge cases with `isValid`
+
+1.0.3 / 2014-09-21
+==================
+
+  * Use `forwarded` npm module
+
+1.0.2 / 2014-09-18
+==================
+
+  * Fix a global leak when multiple subnets are trusted
+  * Support Node.js 0.6
+  * deps: ipaddr.js@0.1.3
+
+1.0.1 / 2014-06-03
+==================
+
+  * Fix links in npm package
+
+1.0.0 / 2014-05-08
+==================
+
+  * Add `trust` argument to determine proxy trust on
+    * Accepts custom function
+    * Accepts IPv4/IPv6 address(es)
+    * Accepts subnets
+    * Accepts pre-defined names
+  * Add optional `trust` argument to `proxyaddr.all` to
+    stop at first untrusted
+  * Add `proxyaddr.compile` to pre-compile `trust` function
+    to make subsequent calls faster
+
+0.0.1 / 2014-05-04
+==================
+
+  * Fix bad npm publish
+
+0.0.0 / 2014-05-04
+==================
+
+  * Initial release

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/LICENSE
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/LICENSE b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/LICENSE
new file mode 100644
index 0000000..b7dce6c
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2014 Douglas Christopher Wilson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/README.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/README.md b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/README.md
new file mode 100644
index 0000000..57ec4cd
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/README.md
@@ -0,0 +1,137 @@
+# proxy-addr
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Determine address of proxied request
+
+## Install
+
+```sh
+$ npm install proxy-addr
+```
+
+## API
+
+```js
+var proxyaddr = require('proxy-addr')
+```
+
+### proxyaddr(req, trust)
+
+Return the address of the request, using the given `trust` parameter.
+
+The `trust` argument is a function that returns `true` if you trust
+the address, `false` if you don't. The closest untrusted address is
+returned.
+
+```js
+proxyaddr(req, function(addr){ return addr === '127.0.0.1' })
+proxyaddr(req, function(addr, i){ return i < 1 })
+```
+
+The `trust` arugment may also be a single IP address string or an
+array of trusted addresses, as plain IP addresses, CIDR-formatted
+strings, or IP/netmask strings.
+
+```js
+proxyaddr(req, '127.0.0.1')
+proxyaddr(req, ['127.0.0.0/8', '10.0.0.0/8'])
+proxyaddr(req, ['127.0.0.0/255.0.0.0', '192.168.0.0/255.255.0.0'])
+```
+
+This module also supports IPv6. Your IPv6 addresses will be normalized
+automatically (i.e. `fe80::00ed:1` equals `fe80:0:0:0:0:0:ed:1`).
+
+```js
+proxyaddr(req, '::1')
+proxyaddr(req, ['::1/128', 'fe80::/10'])
+proxyaddr(req, ['fe80::/ffc0::'])
+```
+
+This module will automatically work with IPv4-mapped IPv6 addresses
+as well to support node.js in IPv6-only mode. This means that you do
+not have to specify both `::ffff:a00:1` and `10.0.0.1`.
+
+As a convenience, this module also takes certain pre-defined names
+in addition to IP addresses, which expand into IP addresses:
+
+```js
+proxyaddr(req, 'loopback')
+proxyaddr(req, ['loopback', 'fc00:ac:1ab5:fff::1/64'])
+```
+
+  * `loopback`: IPv4 and IPv6 loopback addresses (like `::1` and
+    `127.0.0.1`).
+  * `linklocal`: IPv4 and IPv6 link-local addresses (like
+    `fe80::1:1:1:1` and `169.254.0.1`).
+  * `uniquelocal`: IPv4 private addresses and IPv6 unique-local
+    addresses (like `fc00:ac:1ab5:fff::1` and `192.168.0.1`).
+
+When `trust` is specified as a function, it will be called for each
+address to determine if it is a trusted address. The function is
+given two arguments: `addr` and `i`, where `addr` is a string of
+the address to check and `i` is a number that represents the distance
+from the socket address.
+
+### proxyaddr.all(req, [trust])
+
+Return all the addresses of the request, optionally stopping at the
+first untrusted. This array is ordered from closest to furthest
+(i.e. `arr[0] === req.connection.remoteAddress`).
+
+```js
+proxyaddr.all(req)
+```
+
+The optional `trust` argument takes the same arguments as `trust`
+does in `proxyaddr(req, trust)`.
+
+```js
+proxyaddr.all(req, 'loopback')
+```
+
+### proxyaddr.compile(val)
+
+Compiles argument `val` into a `trust` function. This function takes
+the same arguments as `trust` does in `proxyaddr(req, trust)` and
+returns a function suitable for `proxyaddr(req, trust)`.
+
+```js
+var trust = proxyaddr.compile('localhost')
+var addr  = proxyaddr(req, trust)
+```
+
+This function is meant to be optimized for use against every request.
+It is recommend to compile a trust function up-front for the trusted
+configuration and pass that to `proxyaddr(req, trust)` for each request.
+
+## Testing
+
+```sh
+$ npm test
+```
+
+## Benchmarks
+
+```sh
+$ npm run-script bench
+```
+
+## License
+
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/proxy-addr.svg?style=flat
+[npm-url]: https://npmjs.org/package/proxy-addr
+[node-version-image]: https://img.shields.io/node/v/proxy-addr.svg?style=flat
+[node-version-url]: http://nodejs.org/download/
+[travis-image]: https://img.shields.io/travis/jshttp/proxy-addr.svg?style=flat
+[travis-url]: https://travis-ci.org/jshttp/proxy-addr
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/proxy-addr.svg?style=flat
+[coveralls-url]: https://coveralls.io/r/jshttp/proxy-addr?branch=master
+[downloads-image]: https://img.shields.io/npm/dm/proxy-addr.svg?style=flat
+[downloads-url]: https://npmjs.org/package/proxy-addr

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/index.js b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/index.js
new file mode 100644
index 0000000..d739513
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/index.js
@@ -0,0 +1,345 @@
+/*!
+ * proxy-addr
+ * Copyright(c) 2014 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module exports.
+ */
+
+module.exports = proxyaddr;
+module.exports.all = alladdrs;
+module.exports.compile = compile;
+
+/**
+ * Module dependencies.
+ */
+
+var forwarded = require('forwarded');
+var ipaddr = require('ipaddr.js');
+
+/**
+ * Variables.
+ */
+
+var digitre = /^[0-9]+$/;
+var isip = ipaddr.isValid;
+var parseip = ipaddr.parse;
+
+/**
+ * Pre-defined IP ranges.
+ */
+
+var ipranges = {
+  linklocal: ['169.254.0.0/16', 'fe80::/10'],
+  loopback: ['127.0.0.1/8', '::1/128'],
+  uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7']
+};
+
+/**
+ * Get all addresses in the request, optionally stopping
+ * at the first untrusted.
+ *
+ * @param {Object} request
+ * @param {Function|Array|String} [trust]
+ * @api public
+ */
+
+function alladdrs(req, trust) {
+  // get addresses
+  var addrs = forwarded(req);
+
+  if (!trust) {
+    // Return all addresses
+    return addrs;
+  }
+
+  if (typeof trust !== 'function') {
+    trust = compile(trust);
+  }
+
+  for (var i = 0; i < addrs.length - 1; i++) {
+    if (trust(addrs[i], i)) continue;
+
+    addrs.length = i + 1;
+  }
+
+  return addrs;
+}
+
+/**
+ * Compile argument into trust function.
+ *
+ * @param {Array|String} val
+ * @api private
+ */
+
+function compile(val) {
+  if (!val) {
+    throw new TypeError('argument is required');
+  }
+
+  var trust = typeof val === 'string'
+    ? [val]
+    : val;
+
+  if (!Array.isArray(trust)) {
+    throw new TypeError('unsupported trust argument');
+  }
+
+  for (var i = 0; i < trust.length; i++) {
+    val = trust[i];
+
+    if (!ipranges.hasOwnProperty(val)) {
+      continue;
+    }
+
+    // Splice in pre-defined range
+    val = ipranges[val];
+    trust.splice.apply(trust, [i, 1].concat(val));
+    i += val.length - 1;
+  }
+
+  return compileTrust(compileRangeSubnets(trust));
+}
+
+/**
+ * Compile `arr` elements into range subnets.
+ *
+ * @param {Array} arr
+ * @api private
+ */
+
+function compileRangeSubnets(arr) {
+  var rangeSubnets = new Array(arr.length);
+
+  for (var i = 0; i < arr.length; i++) {
+    rangeSubnets[i] = parseipNotation(arr[i]);
+  }
+
+  return rangeSubnets;
+}
+
+/**
+ * Compile range subnet array into trust function.
+ *
+ * @param {Array} rangeSubnets
+ * @api private
+ */
+
+function compileTrust(rangeSubnets) {
+  // Return optimized function based on length
+  var len = rangeSubnets.length;
+  return len === 0
+    ? trustNone
+    : len === 1
+    ? trustSingle(rangeSubnets[0])
+    : trustMulti(rangeSubnets);
+}
+
+/**
+ * Parse IP notation string into range subnet.
+ *
+ * @param {String} note
+ * @api private
+ */
+
+function parseipNotation(note) {
+  var ip;
+  var kind;
+  var max;
+  var pos = note.lastIndexOf('/');
+  var range;
+
+  ip = pos !== -1
+    ? note.substring(0, pos)
+    : note;
+
+  if (!isip(ip)) {
+    throw new TypeError('invalid IP address: ' + ip);
+  }
+
+  ip = parseip(ip);
+
+  kind = ip.kind();
+  max = kind === 'ipv6'
+    ? 128
+    : 32;
+
+  range = pos !== -1
+    ? note.substring(pos + 1, note.length)
+    : max;
+
+  if (typeof range !== 'number') {
+    range = digitre.test(range)
+      ? parseInt(range, 10)
+      : isip(range)
+      ? parseNetmask(range)
+      : 0;
+  }
+
+  if (ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) {
+    // Store as IPv4
+    ip = ip.toIPv4Address();
+    range = range <= max
+      ? range - 96
+      : range;
+  }
+
+  if (range <= 0 || range > max) {
+    throw new TypeError('invalid range on address: ' + note);
+  }
+
+  return [ip, range];
+}
+
+/**
+ * Parse netmask string into CIDR range.
+ *
+ * @param {String} note
+ * @api private
+ */
+
+function parseNetmask(netmask) {
+  var ip = parseip(netmask);
+  var parts;
+  var size;
+
+  switch (ip.kind()) {
+    case 'ipv4':
+      parts = ip.octets;
+      size = 8;
+      break;
+    case 'ipv6':
+      parts = ip.parts;
+      size = 16;
+      break;
+  }
+
+  var max = Math.pow(2, size) - 1;
+  var part;
+  var range = 0;
+
+  for (var i = 0; i < parts.length; i++) {
+    part = parts[i] & max;
+
+    if (part === max) {
+      range += size;
+      continue;
+    }
+
+    while (part) {
+      part = (part << 1) & max;
+      range += 1;
+    }
+
+    break;
+  }
+
+  return range;
+}
+
+/**
+ * Determine address of proxied request.
+ *
+ * @param {Object} request
+ * @param {Function|Array|String} trust
+ * @api public
+ */
+
+function proxyaddr(req, trust) {
+  if (!req) {
+    throw new TypeError('req argument is required');
+  }
+
+  if (!trust) {
+    throw new TypeError('trust argument is required');
+  }
+
+  var addrs = alladdrs(req, trust);
+  var addr = addrs[addrs.length - 1];
+
+  return addr;
+}
+
+/**
+ * Static trust function to trust nothing.
+ *
+ * @api private
+ */
+
+function trustNone() {
+  return false;
+}
+
+/**
+ * Compile trust function for multiple subnets.
+ *
+ * @param {Array} subnets
+ * @api private
+ */
+
+function trustMulti(subnets) {
+  return function trust(addr) {
+    if (!isip(addr)) return false;
+
+    var ip = parseip(addr);
+    var ipv4;
+    var kind = ip.kind();
+    var subnet;
+    var subnetip;
+    var subnetkind;
+    var subnetrange;
+    var trusted;
+
+    for (var i = 0; i < subnets.length; i++) {
+      subnet = subnets[i];
+      subnetip = subnet[0];
+      subnetkind = subnetip.kind();
+      subnetrange = subnet[1];
+      trusted = ip;
+
+      if (kind !== subnetkind) {
+        if (kind !== 'ipv6' || subnetkind !== 'ipv4' || !ip.isIPv4MappedAddress()) {
+          continue;
+        }
+
+        // Store addr as IPv4
+        ipv4 = ipv4 || ip.toIPv4Address();
+        trusted = ipv4;
+      }
+
+      if (trusted.match(subnetip, subnetrange)) return true;
+    }
+
+    return false;
+  };
+}
+
+/**
+ * Compile trust function for single subnet.
+ *
+ * @param {Object} subnet
+ * @api private
+ */
+
+function trustSingle(subnet) {
+  var subnetip = subnet[0];
+  var subnetkind = subnetip.kind();
+  var subnetisipv4 = subnetkind === 'ipv4';
+  var subnetrange = subnet[1];
+
+  return function trust(addr) {
+    if (!isip(addr)) return false;
+
+    var ip = parseip(addr);
+    var kind = ip.kind();
+
+    return kind === subnetkind
+      ? ip.match(subnetip, subnetrange)
+      : subnetisipv4 && kind === 'ipv6' && ip.isIPv4MappedAddress()
+      ? ip.toIPv4Address().match(subnetip, subnetrange)
+      : false;
+  };
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md
new file mode 100644
index 0000000..97fa1d1
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md
@@ -0,0 +1,4 @@
+0.1.0 / 2014-09-21
+==================
+
+  * Initial release

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE
new file mode 100644
index 0000000..b7dce6c
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2014 Douglas Christopher Wilson
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md
new file mode 100644
index 0000000..2b4988f
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md
@@ -0,0 +1,53 @@
+# forwarded
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Parse HTTP X-Forwarded-For header
+
+## Installation
+
+```sh
+$ npm install forwarded
+```
+
+## API
+
+```js
+var forwarded = require('forwarded')
+```
+
+### forwarded(req)
+
+```js
+var addresses = forwarded(req)
+```
+
+Parse the `X-Forwarded-For` header from the request. Returns an array
+of the addresses, including the socket address for the `req`. In reverse
+order (i.e. index `0` is the socket address and the last index is the
+furthest address, typically the end-user).
+
+## Testing
+
+```sh
+$ npm test
+```
+
+## License
+
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/forwarded.svg?style=flat
+[npm-url]: https://npmjs.org/package/forwarded
+[node-version-image]: https://img.shields.io/node/v/forwarded.svg?style=flat
+[node-version-url]: http://nodejs.org/download/
+[travis-image]: https://img.shields.io/travis/jshttp/forwarded.svg?style=flat
+[travis-url]: https://travis-ci.org/jshttp/forwarded
+[coveralls-image]: https://img.shields.io/coveralls/jshttp/forwarded.svg?style=flat
+[coveralls-url]: https://coveralls.io/r/jshttp/forwarded?branch=master
+[downloads-image]: https://img.shields.io/npm/dm/forwarded.svg?style=flat
+[downloads-url]: https://npmjs.org/package/forwarded

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js
new file mode 100644
index 0000000..2f5c340
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js
@@ -0,0 +1,35 @@
+/*!
+ * forwarded
+ * Copyright(c) 2014 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module exports.
+ */
+
+module.exports = forwarded
+
+/**
+ * Get all addresses in the request, using the `X-Forwarded-For` header.
+ *
+ * @param {Object} req
+ * @api public
+ */
+
+function forwarded(req) {
+  if (!req) {
+    throw new TypeError('argument req is required')
+  }
+
+  // simple header parsing
+  var proxyAddrs = (req.headers['x-forwarded-for'] || '')
+    .split(/ *, */)
+    .filter(Boolean)
+    .reverse()
+  var socketAddr = req.connection.remoteAddress
+  var addrs = [socketAddr].concat(proxyAddrs)
+
+  // return all addresses
+  return addrs
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ef79031/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json
----------------------------------------------------------------------
diff --git a/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json
new file mode 100644
index 0000000..7d24004
--- /dev/null
+++ b/modules/webconfig/nodejs/node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json
@@ -0,0 +1,65 @@
+{
+  "name": "forwarded",
+  "description": "Parse HTTP X-Forwarded-For header",
+  "version": "0.1.0",
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "license": "MIT",
+  "keywords": [
+    "x-forwarded-for",
+    "http",
+    "req"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jshttp/forwarded.git"
+  },
+  "devDependencies": {
+    "istanbul": "0.3.2",
+    "mocha": "~1.21.4"
+  },
+  "files": [
+    "LICENSE",
+    "HISTORY.md",
+    "README.md",
+    "index.js"
+  ],
+  "engines": {
+    "node": ">= 0.6"
+  },
+  "scripts": {
+    "test": "mocha --reporter spec --bail --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
+  },
+  "gitHead": "e9a9faeb3cfaadf40eb57d144fff26bca9b818e8",
+  "bugs": {
+    "url": "https://github.com/jshttp/forwarded/issues"
+  },
+  "homepage": "https://github.com/jshttp/forwarded",
+  "_id": "forwarded@0.1.0",
+  "_shasum": "19ef9874c4ae1c297bcf078fde63a09b66a84363",
+  "_from": "forwarded@>=0.1.0 <0.2.0",
+  "_npmVersion": "1.4.21",
+  "_npmUser": {
+    "name": "dougwilson",
+    "email": "doug@somethingdoug.com"
+  },
+  "maintainers": [
+    {
+      "name": "dougwilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "dist": {
+    "shasum": "19ef9874c4ae1c297bcf078fde63a09b66a84363",
+    "tarball": "http://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz"
+  },
+  "directories": {},
+  "_resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz",
+  "readme": "ERROR: No README data found!"
+}



Mime
View raw message