You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ea...@apache.org on 2019/12/11 22:40:09 UTC

[qpid-dispatch] branch master updated: DISPATCH-1358 Removing stand-alone directory. Fixing refresh of console's topology view when there are new or lost connections

This is an automated email from the ASF dual-hosted git repository.

eallen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/master by this push:
     new 8257ecf  DISPATCH-1358 Removing stand-alone directory. Fixing refresh of console's topology view when there are new or lost connections
8257ecf is described below

commit 8257ecfd3b5ace5c0d38019a2d109cf3772affc5
Author: Ernest Allen <ea...@redhat.com>
AuthorDate: Wed Dec 11 17:39:50 2019 -0500

    DISPATCH-1358 Removing stand-alone directory. Fixing refresh of console's topology view when there are new or lost connections
---
 .gitignore                                         |     3 -
 console/CMakeLists.txt                             |     1 -
 console/react/package.json                         |     2 +-
 console/react/src/App.css                          |    38 +-
 console/react/src/chord/data.js                    |     9 +-
 console/react/src/chord/optionsComponent.js        |    10 +-
 console/react/src/common/addressesComponent.js     |    11 +-
 console/react/src/common/amqp/topology.js          |   331 +-
 console/react/src/common/amqp/utilities.js         |    12 +-
 console/react/src/common/contextMenuComponent.js   |    15 +-
 console/react/src/details/createTablePage.js       |     2 +-
 .../src/overview/dashboard/activeAddressesCard.js  |     9 +-
 console/react/src/overview/dashboard/layout.js     |     2 +-
 .../src/topology/clientInfoDetailsComponent.js     |     3 +-
 console/react/src/topology/contextMenu.js          |    34 +-
 console/react/src/topology/legend.js               |    96 +-
 console/react/src/topology/legendComponent.js      |     4 +
 console/react/src/topology/links.js                |    55 +-
 console/react/src/topology/map.js                  |    36 +-
 console/react/src/topology/nodes.js                |    22 +-
 console/react/src/topology/svgUtils.js             |    39 +-
 console/react/src/topology/topoUtils.js            |   109 +
 console/react/src/topology/topologyPage.js         |     5 +-
 console/react/src/topology/topologyToolbar.js      |     3 +-
 console/react/src/topology/topologyToolbar.test.js |     8 +-
 console/react/src/topology/topologyViewer.js       |   722 +-
 console/react/src/topology/topologyViewer.test.js  |     3 +-
 console/react/src/topology/trafficComponent.js     |     6 +-
 console/react/test_data/qdrService.mock.js         |    13 +
 console/stand-alone/.babelrc                       |    23 -
 console/stand-alone/README.md                      |    59 -
 console/stand-alone/config.json                    |     3 -
 console/stand-alone/favicon-32x32.png              |   Bin 1055 -> 0 bytes
 console/stand-alone/gulpfile.js                    |   256 -
 console/stand-alone/index.html                     |   142 -
 console/stand-alone/main.js                        |   402 -
 console/stand-alone/package-lock.json              | 11342 -------------------
 console/stand-alone/package.json                   |    90 -
 console/stand-alone/plugin/css/brokers.ttf         |   Bin 2272 -> 0 bytes
 console/stand-alone/plugin/css/dispatch.css        |  2145 ----
 console/stand-alone/plugin/data/countries.json     |     2 -
 console/stand-alone/plugin/html/qdrCharts.html     |    48 -
 console/stand-alone/plugin/html/qdrChord.html      |   282 -
 console/stand-alone/plugin/html/qdrConnect.html    |   105 -
 console/stand-alone/plugin/html/qdrList.html       |   211 -
 console/stand-alone/plugin/html/qdrOverview.html   |   319 -
 console/stand-alone/plugin/html/qdrSchema.html     |    60 -
 console/stand-alone/plugin/html/qdrTopology.html   |   338 -
 .../stand-alone/plugin/html/tmplChartConfig.html   |    81 -
 .../stand-alone/plugin/html/tmplClientDetail.html  |   252 -
 console/stand-alone/plugin/html/tmplListChart.html |    40 -
 console/stand-alone/plugin/html/tmplListTree.html  |    42 -
 .../stand-alone/plugin/html/tmplOverviewTree.html  |    48 -
 .../stand-alone/plugin/html/tmplRouterDetail.html  |   123 -
 .../stand-alone/plugin/img/bg-modal-about-pf.png   |   Bin 10987 -> 0 bytes
 console/stand-alone/plugin/img/console_logo.png    |   Bin 6568 -> 0 bytes
 console/stand-alone/plugin/img/logo-alt.svg        |    97 -
 console/stand-alone/plugin/js/amqp/connection.js   |   348 -
 console/stand-alone/plugin/js/amqp/correlator.js   |    50 -
 console/stand-alone/plugin/js/amqp/management.js   |    63 -
 console/stand-alone/plugin/js/amqp/topology.js     |   609 -
 console/stand-alone/plugin/js/amqp/utilities.js    |   229 -
 console/stand-alone/plugin/js/chord/data.js        |   232 -
 console/stand-alone/plugin/js/chord/filters.js     |    61 -
 .../stand-alone/plugin/js/chord/layout/README.md   |    85 -
 .../stand-alone/plugin/js/chord/layout/layout.js   |   147 -
 console/stand-alone/plugin/js/chord/matrix.js      |   215 -
 console/stand-alone/plugin/js/chord/qdrChord.js    |   842 --
 .../stand-alone/plugin/js/chord/ribbon/README.md   |    40 -
 .../stand-alone/plugin/js/chord/ribbon/ribbon.js   |   165 -
 .../stand-alone/plugin/js/dlgChartController.js    |   195 -
 .../stand-alone/plugin/js/dlgDetailController.js   |   387 -
 .../stand-alone/plugin/js/dlgRouterController.js   |    37 -
 console/stand-alone/plugin/js/navbar.js            |   149 -
 console/stand-alone/plugin/js/posintDirective.js   |    75 -
 console/stand-alone/plugin/js/qdrAbout.js          |    96 -
 console/stand-alone/plugin/js/qdrChartService.js   |   889 --
 console/stand-alone/plugin/js/qdrCharts.js         |   149 -
 .../plugin/js/qdrDelayedDeliveriesController.js    |   185 -
 console/stand-alone/plugin/js/qdrGlobals.js        |    81 -
 console/stand-alone/plugin/js/qdrList.js           |  1006 --
 console/stand-alone/plugin/js/qdrOverview.js       |  1849 ---
 .../plugin/js/qdrOverviewChartsController.js       |   145 -
 .../plugin/js/qdrOverviewKillController.js         |    35 -
 .../plugin/js/qdrOverviewLogsController.js         |    69 -
 console/stand-alone/plugin/js/qdrSchema.js         |    81 -
 console/stand-alone/plugin/js/qdrService.js        |   113 -
 console/stand-alone/plugin/js/qdrSettings.js       |   113 -
 .../plugin/js/qdrTopAddressesController.js         |   216 -
 console/stand-alone/plugin/js/topology/legend.js   |   138 -
 console/stand-alone/plugin/js/topology/links.js    |   319 -
 console/stand-alone/plugin/js/topology/map.js      |   267 -
 console/stand-alone/plugin/js/topology/nodes.js    |   496 -
 .../stand-alone/plugin/js/topology/qdrTopology.js  |  1087 --
 console/stand-alone/plugin/js/topology/svgUtils.js |   249 -
 .../stand-alone/plugin/js/topology/topoUtils.js    |   288 -
 console/stand-alone/plugin/js/topology/traffic.js  |   705 --
 console/stand-alone/test/filter.js                 |    73 -
 console/stand-alone/test/links.js                  |   106 -
 console/stand-alone/test/matrix.js                 |    51 -
 console/stand-alone/test/nodes-edge.json           |  1156 --
 console/stand-alone/test/nodes.json                |     1 -
 console/stand-alone/test/utilities.js              |   212 -
 console/stand-alone/tsconfig.json                  |    30 -
 console/stand-alone/tslint.json                    |    60 -
 console/stand-alone/vendor-css.txt                 |    26 -
 console/stand-alone/vendor-js.txt                  |    54 -
 licenses/angular-ui-license                        |    19 -
 licenses/d3.js-license                             |    27 -
 licenses/fontawesome-license                       |    93 -
 licenses/jquery-ui-license                         |    43 -
 licenses/jquery.dynatree-license                   |    14 -
 licenses/jquery.tipsy.license                      |    21 -
 licenses/tooltipsy-license                         |    21 -
 114 files changed, 932 insertions(+), 31693 deletions(-)

diff --git a/.gitignore b/.gitignore
index 97c83df..262259e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,10 +21,7 @@ tests/system_tests_topology_disposition.py
 .vscode
 tools/qdmanage
 tools/qdstat
-console/stand-alone/node_modules/
 console/react/node_modules/
-console/stand-alone/dist/
-console/stand-alone/package-lock.json
 console/react/build/
 console/react/coverage/
 console/react/.prettierrc
diff --git a/console/CMakeLists.txt b/console/CMakeLists.txt
index 749cff4..46bb249 100644
--- a/console/CMakeLists.txt
+++ b/console/CMakeLists.txt
@@ -66,7 +66,6 @@ if(CONSOLE_INSTALL)
           ## then rebuild the console
           set(CONSOLE_ARTIFACTS
             ${CONSOLE_BUILD_DIR}/build/index.html
-            ${CONSOLE_BUILD_DIR}/build/app.js
           )
 
           ## Tell cmake how and when to build ${CONSOLE_ARTIFACTS}
diff --git a/console/react/package.json b/console/react/package.json
index 4ab79c5..76e6bb2 100644
--- a/console/react/package.json
+++ b/console/react/package.json
@@ -19,7 +19,7 @@
     "react-dom": "^16.12.0",
     "react-fontawesome": "^1.7.1",
     "react-router-dom": "^5.0.1",
-    "react-scripts": "^3.2.0",
+    "react-scripts": "^3.3.0",
     "rhea": "^1.0.8",
     "topojson-client": "^3.0.1"
   },
diff --git a/console/react/src/App.css b/console/react/src/App.css
index f97bd66..7c25676 100644
--- a/console/react/src/App.css
+++ b/console/react/src/App.css
@@ -95,11 +95,6 @@ g.selected line {
 #messageFlowPage .pf-l-stack__item {
   border-bottom: 1px solid #aaa;
 }
-path.hittarget {
-  stroke-width: 15px;
-  stroke: transparent;
-}
-
 .node.client rect {
   stroke: black;
   fill: white;
@@ -529,7 +524,7 @@ circle.node.normal.out {
   fill: #c0f0c0;
 }
 circle.node.edge {
-  fill: #e0e0ff;
+  fill: #efefff;
 }
 circle.node.on-demand {
   fill: #c0ffc0;
@@ -538,7 +533,6 @@ circle.node.on-demand.artemis {
   fill: #fcc;
   /*opacity: 0.2; */
 }
-
 circle.node.normal.console {
   fill: lightcyan;
 }
@@ -548,11 +542,13 @@ circle.node.artemis {
 circle.node.route-container {
   fill: orange;
 }
+circle.node.edge.multiple {
+  fill: #e0e0ff;
+}
 
 text.console,
 text.on-demand,
 text.normal,
-text.edge,
 text.address-checkbox {
   font-family: FontAwesome !important;
   font-weight: normal;
@@ -569,10 +565,14 @@ text.id {
 }
 
 text.label {
-  text-anchor: start;
+  text-anchor: middle;
   font-weight: bold;
 }
 
+text.label.long {
+  text-anchor: start;
+}
+
 @font-face {
   font-family: "Brokers";
   src: url("./assets/brokers.ttf"); /* TTF file for CSS3 browsers */
@@ -701,9 +701,10 @@ path.empty {
   border: 1px solid gray;
   background-color: white;
   color: black;
-  opacity: 0.95;
+  opacity: 1;
   padding: 12px;
   font-size: 16px;
+  box-shadow: var(--pf-global--BoxShadow--md);
 }
 
 #popover-div h5 {
@@ -844,6 +845,8 @@ div.qdrChord .legend-text {
   border-top: 1px solid #888;
   border-left: 1px solid #888;
   border-right: 1px solid #888;
+  text-align: left;
+  box-shadow: rgba(3, 3, 3, 0.05) 0px 1px 1px 0px, rgba(3, 3, 3, 0.06) 0px 4px 8px 4px;
 }
 
 .context-menu.layout-dropdown li {
@@ -851,7 +854,7 @@ div.qdrChord .legend-text {
 }
 
 .context-menu .menu-item {
-  padding: 0.5em 1.5em;
+  padding: 0.25em 1em;
 }
 .context-menu .menu-item.separator {
   border-bottom: 1px solid #888;
@@ -983,7 +986,9 @@ div.qdrChord .legend-text {
 .overview-header.details .pf-c-breadcrumb__item.link-button:hover {
   text-decoration: underline;
 }
-
+.pf-c-button.pf-m-link.link-button:hover {
+  text-decoration: underline;
+}
 .noWrap {
   white-space: nowrap;
 }
@@ -1490,3 +1495,12 @@ button.dropdown-panel-toggle.pf-c-accordion__toggle span.pf-c-accordion__toggle-
 #emptyResults {
   height: auto;
 }
+
+.node-name-underline {
+  stroke: black;
+  stroke-width: 0.8px;
+}
+
+.node-name {
+  text-decoration: underline;
+}
diff --git a/console/react/src/chord/data.js b/console/react/src/chord/data.js
index cdf00d8..014d40c 100644
--- a/console/react/src/chord/data.js
+++ b/console/react/src/chord/data.js
@@ -18,6 +18,7 @@ under the License.
 */
 
 import { MIN_CHORD_THRESHOLD } from "./matrix.js";
+import { utils } from "../common/amqp/utilities.js";
 
 const SAMPLES = 5; // number of snapshots to use for rate calculations
 
@@ -79,8 +80,12 @@ class ChordData {
   getMatrix() {
     let self = this;
     return new Promise(function(resolve, reject) {
-      // get the router.node and router.link info
-      self.QDRService.management.topology.fetchAllEntities(
+      // get the router.node and router.link info for interior routers
+      const interior = self.QDRService.management.topology
+        .nodeIdList()
+        .filter(n => utils.typeFromId(n) !== "_edge");
+      self.QDRService.management.topology.fetchEntities(
+        interior,
         [
           { entity: "router.node", attrs: ["id", "index"] },
           {
diff --git a/console/react/src/chord/optionsComponent.js b/console/react/src/chord/optionsComponent.js
index 35b9331..a56e037 100644
--- a/console/react/src/chord/optionsComponent.js
+++ b/console/react/src/chord/optionsComponent.js
@@ -39,6 +39,13 @@ class OptionsComponent extends Component {
   }
 
   render() {
+    const addressInfo = {};
+    for (const address in this.props.addressColors) {
+      addressInfo[address] = {
+        color: this.props.addressColors[address],
+        checked: this.props.addresses[address]
+      };
+    }
     return (
       <React.Fragment>
         <Checkbox
@@ -60,8 +67,7 @@ class OptionsComponent extends Component {
         {this.props.byAddress && (
           <div className="chord-addresses">
             <AddressesComponent
-              addresses={this.props.addresses}
-              addressColors={this.props.addressColors}
+              addressColors={addressInfo}
               handleChangeAddress={this.props.handleChangeAddress}
               handleHoverAddress={this.props.handleHoverAddress}
             />
diff --git a/console/react/src/common/addressesComponent.js b/console/react/src/common/addressesComponent.js
index acd6395..5a4cd38 100644
--- a/console/react/src/common/addressesComponent.js
+++ b/console/react/src/common/addressesComponent.js
@@ -24,7 +24,6 @@ const FA = require("react-fontawesome");
 
 class AddressesComponent extends Component {
   static propTypes = {
-    addresses: PropTypes.object.isRequired,
     handleChangeAddress: PropTypes.func.isRequired,
     handleHoverAddress: PropTypes.func.isRequired,
     addressColors: PropTypes.object.isRequired
@@ -35,7 +34,7 @@ class AddressesComponent extends Component {
   }
 
   dotClicked = address => {
-    this.props.handleChangeAddress(address, !this.props.addresses[address]);
+    this.props.handleChangeAddress(address, !this.props.addressColors[address].checked);
   };
 
   dotHover = (address, over) => {
@@ -45,8 +44,8 @@ class AddressesComponent extends Component {
   };
 
   coloredDot = (address, i) => {
-    const color = this.props.addressColors[address];
-    const checkColor = this.props.addresses[address] ? "white" : color;
+    const color = this.props.addressColors[address].color;
+    const checkColor = this.props.addressColors[address].checked ? "white" : color;
     const darker = d3.rgb(color).darker();
     const bgColor = {
       backgroundColor: color,
@@ -73,10 +72,10 @@ class AddressesComponent extends Component {
   render() {
     return (
       <ul className="addresses">
-        {Object.keys(this.props.addresses).length === 0 ? (
+        {Object.keys(this.props.addressColors).length === 0 ? (
           <li key={`address-empty`}>There is no traffic</li>
         ) : (
-          Object.keys(this.props.addresses).map((address, i) => {
+          Object.keys(this.props.addressColors).map((address, i) => {
             return (
               <li key={`address-${i}`} className="legend-line">
                 {this.coloredDot(address, i)}
diff --git a/console/react/src/common/amqp/topology.js b/console/react/src/common/amqp/topology.js
index c0ca63e..7c86e7d 100644
--- a/console/react/src/common/amqp/topology.js
+++ b/console/react/src/common/amqp/topology.js
@@ -29,6 +29,7 @@ class Topology {
     this.entities = []; // which entities to request each topology update
     this.entityAttribs = { connection: [] };
     this._nodeInfo = {}; // info about all known nodes and entities
+    this.edgeList = [];
     this.filtering = false; // filter out nodes that don't have connection info
     this.timeout = 5000;
     this.updateInterval = interval;
@@ -44,9 +45,9 @@ class Topology {
   delUpdatedAction(key) {
     if (key in this.updatedActions) delete this.updatedActions[key];
   }
-  executeUpdatedActions(error) {
+  executeUpdatedActions(results) {
     for (var action in this.updatedActions) {
-      this.updatedActions[action].apply(this, [error]);
+      this.updatedActions[action](results);
     }
   }
   setUpdateEntities(entities) {
@@ -56,9 +57,6 @@ class Topology {
     }
   }
   addUpdateEntities(entityAttribs) {
-    if (Object.prototype.toString.call(entityAttribs) !== "[object Array]") {
-      entityAttribs = [entityAttribs];
-    }
     for (var i = 0; i < entityAttribs.length; i++) {
       var entity = entityAttribs[i].entity;
       this.entityAttribs[entity] = entityAttribs[i].attrs || [];
@@ -74,7 +72,7 @@ class Topology {
   }
   executeChangedActions(error) {
     for (var action in this.changedActions) {
-      this.changedActions[action].apply(this, [error]);
+      this.changedActions[action](error);
     }
   }
   on(eventName, fn, key) {
@@ -90,9 +88,31 @@ class Topology {
   nodeInfo() {
     return this._nodeInfo;
   }
+
+  edgesPerRouter() {
+    const perRouter = {};
+    for (const id in this._nodeInfo) {
+      if (utils.typeFromId(id) === "_topo") {
+        const node = this._nodeInfo[id];
+        perRouter[id] = [];
+        if (node.connection) {
+          const roleIndex = node.connection.attributeNames.indexOf("role");
+          const containerIndex = node.connection.attributeNames.indexOf("container");
+          if (roleIndex >= 0 && containerIndex >= 0) {
+            node.connection.results.forEach(result => {
+              if (result[roleIndex] === "edge") {
+                perRouter[id].push(result[containerIndex]);
+              }
+            });
+          }
+        }
+      }
+    }
+    return perRouter;
+  }
+
   saveResults(workInfo, all) {
     const changes = { newRouters: [], lostRouters: [], connections: [] };
-    let changed = false;
     let workSet = new Set(Object.keys(workInfo));
     for (let rId in this._nodeInfo) {
       if (workSet.has(rId)) {
@@ -116,7 +136,6 @@ class Topology {
                   from: oldConnections,
                   to: newConnections
                 });
-                changed = true;
               }
             }
             this._nodeInfo[rId][entity] = utils.copy(workInfo[rId][entity]);
@@ -124,19 +143,25 @@ class Topology {
         }
       } else if (all) {
         changes.lostRouters.push(rId);
-        changed = true;
       }
     }
     // add any new routers
-    let nodeSet = new Set(Object.keys(this._nodeInfo));
-    for (let rId in workInfo) {
-      if (!nodeSet.has(rId)) {
-        this._nodeInfo[rId] = utils.copy(workInfo[rId]);
-        changes.newRouters.push(rId);
-        changed = true;
+    if (all) {
+      let nodeSet = new Set(Object.keys(this._nodeInfo));
+      for (let rId in workInfo) {
+        if (!nodeSet.has(rId)) {
+          this._nodeInfo[rId] = utils.copy(workInfo[rId]);
+          if (!this.edgeList.some(edgeId => edgeId === rId)) {
+            changes.newRouters.push(rId);
+          }
+        }
       }
     }
-    if (changed) {
+    if (
+      changes.connections.length > 0 ||
+      changes.lostRouters.length > 0 ||
+      changes.newRouters.length > 0
+    ) {
       this.executeChangedActions(changes);
     }
   }
@@ -184,11 +209,27 @@ class Topology {
                 }
                 return routerId;
               };
-              this.doget(routerIds).then(
+              // list of router Ids to query
+              let allIds;
+              let onlyConnections;
+              // if we are connected to an edge router, we don't need to
+              // get the workInfo for the edgeList here since we will be
+              // calling doget() again
+              if (utils.typeFromId(routerIds[0]) === "_edge") {
+                allIds = routerIds;
+                onlyConnections = true;
+              } else {
+                allIds = [...routerIds, ...this.edgeList];
+                onlyConnections = false;
+              }
+              this.doget(allIds, onlyConnections).then(
                 function(workInfo) {
-                  // test for edge case
+                  // test for edge case of being connected to an edge router
+                  // get the routerId of the interior router to which we are connected
                   let routerId = connectedToEdge(routerIds, workInfo);
                   if (routerId) {
+                    // if we are connected to an edge router, send the request for
+                    // all routers to the edge router's interior router
                     this.connection.sendMgmtQuery("GET-MGMT-NODES", routerId).then(
                       function(results) {
                         let response = results.response;
@@ -201,7 +242,7 @@ class Topology {
                           if (response.length === 0) {
                             response = [routerId];
                           }
-                          this.doget(response).then(
+                          this.doget([...response, ...this.edgeList]).then(
                             function(workInfo) {
                               finish.call(this, workInfo);
                             }.bind(this)
@@ -223,27 +264,37 @@ class Topology {
       }.bind(this)
     );
   }
-  doget(ids) {
+  doget(allIds, onlyConnections) {
+    // dedup ids
+    const ids = [...new Set(allIds)];
     return new Promise(resolve => {
       let workInfo = {};
-      for (var i = 0; i < ids.length; ++i) {
+      for (let i = 0; i < ids.length; ++i) {
         workInfo[ids[i]] = {};
       }
-      var gotResponse = (nodeName, entity, response) => {
+      const gotResponse = (nodeName, entity, response) => {
         workInfo[nodeName][entity] = response;
         workInfo[nodeName][entity]["timestamp"] = new Date();
       };
-      var q = queue(this.connection.availableQeueuDepth());
-      for (var id in workInfo) {
-        for (var entity in this.entityAttribs) {
-          q.defer(
-            this.q_fetchNodeInfo.bind(this),
-            id,
-            entity,
-            this.entityAttribs[entity],
-            q,
-            gotResponse
-          );
+      let q = queue(this.connection.availableQeueuDepth());
+      let entityAttribs = this.entityAttribs;
+      if (onlyConnections) {
+        entityAttribs = { connection: [] };
+      }
+      for (let id in workInfo) {
+        const type = utils.typeFromId(id);
+        for (let entity in entityAttribs) {
+          // don't bother asking for router.node info from edge routers
+          if (type !== "_edge" || entity !== "router.node") {
+            q.defer(
+              this.q_fetchNodeInfo.bind(this),
+              id,
+              entity,
+              entityAttribs[entity],
+              q,
+              gotResponse
+            );
+          }
         }
       }
       q.await(() => {
@@ -267,11 +318,20 @@ class Topology {
       this._getTimer = setTimeout(this.get.bind(this), this.updateInterval);
     this.executeUpdatedActions(result);
   }
-  startUpdating(filter) {
-    this.stopUpdating();
-    this.updating = true;
-    this.filtering = filter;
-    this.get();
+  startUpdating(filter, edgeList) {
+    return new Promise((resolve, reject) => {
+      if (!edgeList) edgeList = [];
+      if (this._getTimer) {
+        clearTimeout(this._getTimer);
+        this._getTimer = null;
+      }
+      this.updating = true;
+      // combine and dedup the existing edgeList and the
+      // passed in edgeList
+      this.edgeList = [...new Set([...edgeList, ...this.edgeList])];
+      this.filtering = filter;
+      this.get().then(resolve);
+    });
   }
   stopUpdating() {
     this.updating = false;
@@ -279,7 +339,32 @@ class Topology {
       clearTimeout(this._getTimer);
       this._getTimer = null;
     }
+    this.removeEdgeIds();
+  }
+  removeEdgeIds() {
+    // remove the edge ids
+    this.edgeList = [];
+    const ids = Object.keys(this._nodeInfo);
+    ids.forEach(id => {
+      if (utils.typeFromId(id) === "_edge") {
+        delete this._nodeInfo[id];
+      }
+    });
+  }
+
+  removeTheseEdgeNames(names) {
+    this.edgeList = this.edgeList.filter(edge => {
+      const edgeName = utils.nameFromId(edge);
+      return !names.some(name => edgeName === name);
+    });
+    const ids = Object.keys(this._nodeInfo);
+    ids.forEach(id => {
+      if (names.some(name => name === utils.nameFromId(id))) {
+        delete this._nodeInfo[id];
+      }
+    });
   }
+
   fetchEntity(node, entity, attrs, callback) {
     var results = {};
     var gotResponse = function(nodeName, dotentity, response) {
@@ -298,8 +383,11 @@ class Topology {
       callback(null);
     });
   }
-  // get all the requested entities/attributes for a single router
+  // get all the requested entities/attributes for specific router(s)
   fetchEntities(node, entityAttribs, doneCallback, resultCallback) {
+    const nodes =
+      Object.prototype.toString.call(node) !== "[object Array]" ? [node] : node;
+
     var q = queue(this.connection.availableQeueuDepth());
     var results = {};
     if (!resultCallback) {
@@ -314,16 +402,19 @@ class Topology {
     if (Object.prototype.toString.call(entityAttribs) !== "[object Array]") {
       entityAttribs = [entityAttribs];
     }
-    for (var i = 0; i < entityAttribs.length; ++i) {
-      var ea = entityAttribs[i];
-      q.defer(
-        this.q_fetchNodeInfo.bind(this),
-        node,
-        ea.entity,
-        ea.attrs || [],
-        q,
-        gotAResponse
-      );
+    for (var n = 0; n < nodes.length; ++n) {
+      node = nodes[n];
+      for (var i = 0; i < entityAttribs.length; ++i) {
+        var ea = entityAttribs[i];
+        q.defer(
+          this.q_fetchNodeInfo.bind(this),
+          node,
+          ea.entity,
+          ea.attrs || [],
+          q,
+          gotAResponse
+        );
+      }
     }
     q.await(function() {
       doneCallback(results);
@@ -363,22 +454,40 @@ class Topology {
       doneCallback(results);
     });
   }
-  // enusre all the topology nones have all these entities
+
+  // ensure all the topology nones have all these entities
   ensureAllEntities(entityAttribs, callback, extra) {
     this.ensureEntities(Object.keys(this._nodeInfo), entityAttribs, callback, extra);
   }
   // ensure these nodes have all these entities. don't fetch unless forced to
   ensureEntities(nodes, entityAttribs, callback, extra) {
+    // make sure nodes is an array
     if (Object.prototype.toString.call(nodes) !== "[object Array]") {
       nodes = [nodes];
     }
-    this.addUpdateEntities(entityAttribs);
-    this.doget(nodes).then(
-      function(results) {
+    // make sure entityAttribs is an array
+    if (Object.prototype.toString.call(entityAttribs) !== "[object Array]") {
+      entityAttribs = [entityAttribs];
+    }
+    // if all the requested nodes are already in the latest results
+    if (entityAttribs.every(eattr => eattr.entity in this.entityAttribs)) {
+      // only return the info for the requested nodes
+      const results = {};
+      nodes.forEach(node => {
+        if (node in this._nodeInfo) {
+          results[node] = this._nodeInfo[node];
+        }
+      });
+      callback(extra, results);
+    } else {
+      // we need to add the entities to the list that will be fetched each update
+      this.addUpdateEntities(entityAttribs);
+      // and then get all the entities from the requested nodes
+      this.doget(nodes).then(results => {
         this.saveResults(results, false);
         callback(extra, results);
-      }.bind(this)
-    );
+      });
+    }
   }
   addNodeInfo(id, entity, values) {
     // save the results in the nodeInfo object
@@ -412,12 +521,7 @@ class Topology {
     return nl.sort();
   }
   nodeIdList() {
-    var nl = [];
-    for (var id in this._nodeInfo) {
-      //if (this._nodeInfo['connection'])
-      nl.push(id);
-    }
-    return nl.sort();
+    return Object.keys(this._nodeInfo).sort();
   }
   nodeList() {
     var nl = [];
@@ -429,24 +533,6 @@ class Topology {
     }
     return nl;
   }
-  // queue'd function to make a management query for entities/attributes
-  q_ensureNodeInfo(nodeId, entity, attrs, q, callback) {
-    this.getNodeInfo(
-      nodeId,
-      entity,
-      attrs,
-      q,
-      function(nodeName, dotentity, response) {
-        this.addNodeInfo(nodeName, dotentity, response);
-        callback(null);
-      }.bind(this)
-    );
-    return {
-      abort: function() {
-        delete this._nodeInfo[nodeId];
-      }
-    };
-  }
   getSingelRouterNode(nodeName, attrs) {
     let node = {
       id: utils.nameFromId(nodeName),
@@ -497,25 +583,6 @@ class Topology {
       }
     );
   }
-  getMultipleNodeInfo(nodeNames, entity, attrs, callback, selectedNodeId, aggregate) {
-    var self = this;
-    if (typeof aggregate === "undefined") aggregate = true;
-    var responses = {};
-    var gotNodesResult = function(nodeName, dotentity, response) {
-      responses[nodeName] = response;
-    };
-    var q = queue(this.connection.availableQeueuDepth());
-    nodeNames.forEach(function(id) {
-      q.defer(self.q_fetchNodeInfo.bind(self), id, entity, attrs, q, gotNodesResult);
-    });
-    q.await(function() {
-      if (aggregate)
-        self.aggregateNodeInfo(nodeNames, entity, selectedNodeId, responses, callback);
-      else {
-        callback(nodeNames, entity, responses);
-      }
-    });
-  }
   quiesceLink(nodeId, name) {
     var attributes = {
       adminStatus: "disabled",
@@ -523,74 +590,6 @@ class Topology {
     };
     return this.connection.sendMethod(nodeId, "router.link", attributes, "UPDATE");
   }
-  aggregateNodeInfo(nodeNames, entity, selectedNodeId, responses, callback) {
-    // aggregate the responses
-    var self = this;
-    var newResponse = {};
-    var thisNode = responses[selectedNodeId];
-    newResponse.attributeNames = thisNode.attributeNames;
-    newResponse.results = thisNode.results;
-    newResponse.aggregates = [];
-    const addVal = (vals, val) => {
-      vals.push({ sum: val, detail: [] });
-    };
-    // initialize the aggregates
-    for (var i = 0; i < thisNode.results.length; ++i) {
-      // there is a result for each unique entity found (ie addresses, links, etc.)
-      var result = thisNode.results[i];
-      var vals = [];
-      // there is a val for each attribute in this entity
-      for (let i = 0; i < result.length; i++) {
-        addVal(vals, result[i]);
-      }
-      newResponse.aggregates.push(vals);
-    }
-    var nameIndex = thisNode.attributeNames.indexOf("name");
-    var ent = self.connection.schema.entityTypes[entity];
-    var ids = Object.keys(responses);
-    ids.sort();
-    ids.forEach(function(id) {
-      var response = responses[id];
-      var results = response.results;
-      results.forEach(function(result) {
-        // find the matching result in the aggregates
-        var found = newResponse.aggregates.some(function(aggregate) {
-          if (aggregate[nameIndex].sum === result[nameIndex]) {
-            // result and aggregate are now the same record, add the graphable values
-            newResponse.attributeNames.forEach(function(key, i) {
-              if (ent.attributes[key] && ent.attributes[key].graph) {
-                if (id !== selectedNodeId) aggregate[i].sum += result[i];
-              }
-              aggregate[i].detail.push({
-                node: utils.nameFromId(id) + ":",
-                val: result[i]
-              });
-            });
-            return true; // stop looping
-          }
-          return false; // continute looking for the aggregate record
-        });
-        if (!found) {
-          // this attribute was not found in the aggregates yet
-          // because it was not in the selectedNodeId's results
-          var vals = [];
-          result.forEach(function(val) {
-            vals.push({
-              sum: val,
-              detail: [
-                {
-                  node: utils.nameFromId(id),
-                  val: val
-                }
-              ]
-            });
-          });
-          newResponse.aggregates.push(vals);
-        }
-      });
-    });
-    callback(nodeNames, entity, newResponse);
-  }
 }
 
 export default Topology;
diff --git a/console/react/src/common/amqp/utilities.js b/console/react/src/common/amqp/utilities.js
index 61073c2..f0016e8 100644
--- a/console/react/src/common/amqp/utilities.js
+++ b/console/react/src/common/amqp/utilities.js
@@ -34,14 +34,16 @@ var utils = {
   isArtemis: function(d) {
     return (
       (d.nodeType === "route-container" || d.nodeType === "on-demand") &&
-      d.properties && d.properties.product === "apache-activemq-artemis"
+      d.properties &&
+      d.properties.product === "apache-activemq-artemis"
     );
   },
 
   isQpid: function(d) {
     return (
       (d.nodeType === "route-container" || d.nodeType === "on-demand") &&
-      d.properties && d.properties.product === "qpid-cpp"
+      d.properties &&
+      d.properties.product === "qpid-cpp"
     );
   },
 
@@ -169,6 +171,12 @@ var utils = {
     return parts.join("/");
   },
 
+  typeFromId: function(id) {
+    var parts = id.split("/");
+    if (parts.length > 1) return parts[1];
+    return "unknown";
+  },
+
   // calculate the average rate of change per second for a list of fields on the given obj
   // store the historical raw values in storage[key] for future rate calcs
   // keep 'history' number of historical values
diff --git a/console/react/src/common/contextMenuComponent.js b/console/react/src/common/contextMenuComponent.js
index b021ff0..8e660fa 100644
--- a/console/react/src/common/contextMenuComponent.js
+++ b/console/react/src/common/contextMenuComponent.js
@@ -67,11 +67,22 @@ class ContextMenuComponent extends React.Component {
       );
     });
 
+    const top = Math.max(
+      Math.min(
+        window.innerHeight - menuItems.length * 35,
+        this.props.contextEventPosition[1]
+      ),
+      0
+    );
+    const left = Math.max(
+      Math.min(window.innerWidth - 200, this.props.contextEventPosition[0]),
+      0
+    );
     const style =
       this.props.contextEventPosition[0] >= 0
         ? {
-            left: `${this.props.contextEventPosition[0]}px`,
-            top: `${this.props.contextEventPosition[1]}px`
+            left: `${left}px`,
+            top: `${top}px`
           }
         : {};
     return (
diff --git a/console/react/src/details/createTablePage.js b/console/react/src/details/createTablePage.js
index 616fad9..697734f 100644
--- a/console/react/src/details/createTablePage.js
+++ b/console/react/src/details/createTablePage.js
@@ -78,7 +78,7 @@ class CreateTablePage extends React.Component {
         this.props.location.state.entity);
 
     if (!this.entity) {
-      this.props.history.push("/dashboard");
+      this.props.history.replace("/dashboard");
     } else {
       this.dataSource = !detailsDataMap[this.entity]
         ? new defaultData(this.props.service, this.props.schema)
diff --git a/console/react/src/overview/dashboard/activeAddressesCard.js b/console/react/src/overview/dashboard/activeAddressesCard.js
index 937faf5..b4add80 100644
--- a/console/react/src/overview/dashboard/activeAddressesCard.js
+++ b/console/react/src/overview/dashboard/activeAddressesCard.js
@@ -60,7 +60,6 @@ class ActiveAddressesCard extends React.Component {
         if (!this.mounted) return;
         let active = {};
         for (let id in results) {
-          console.log(id);
           const linkData = results[id]["router.link"];
           const addressData = results[id]["router.address"];
           const addresses = this.props.service.utilities.flattenAll(addressData);
@@ -73,7 +72,6 @@ class ActiveAddressesCard extends React.Component {
             if (link.linkType === "endpoint") {
               if (link.owningAddr && !link.owningAddr.startsWith("Ltemp.")) {
                 if (!active[link.owningAddr]) {
-                  console.log(`initializing active for ${link.owningAddr}`);
                   active[link.owningAddr] = {
                     addr: this.props.service.utilities.addr_text(link.owningAddr),
                     in: 0,
@@ -85,17 +83,18 @@ class ActiveAddressesCard extends React.Component {
                   address => address.identity === link.owningAddr
                 );
                 if (address) {
-                  console.log(address);
                   active[link.owningAddr].in += parseInt(address.deliveriesIngress);
                   active[link.owningAddr].out += parseInt(address.deliveriesEgress);
                 }
                 active[link.owningAddr].settleRate += parseInt(link.settleRate);
-                console.log(active[link.owningAddr]);
               }
             }
           }
         }
-        let rows = Object.keys(active).map(addr => {
+        const activeKeys = Object.keys(active).filter(
+          key => active[key].in > 0 && active[key].out > 0
+        );
+        const rows = activeKeys.map(addr => {
           return {
             cells: [
               active[addr].addr,
diff --git a/console/react/src/overview/dashboard/layout.js b/console/react/src/overview/dashboard/layout.js
index e823899..e49ee26 100644
--- a/console/react/src/overview/dashboard/layout.js
+++ b/console/react/src/overview/dashboard/layout.js
@@ -208,7 +208,7 @@ class PageLayout extends React.PureComponent {
         true
       );
 
-      this.redirect = true;
+      //this.redirect = true;
       this.props.history.replace(connectPath);
       this.setState({
         activeItem,
diff --git a/console/react/src/topology/clientInfoDetailsComponent.js b/console/react/src/topology/clientInfoDetailsComponent.js
index 5045309..682f55e 100644
--- a/console/react/src/topology/clientInfoDetailsComponent.js
+++ b/console/react/src/topology/clientInfoDetailsComponent.js
@@ -29,8 +29,7 @@ class DetailsTable extends React.Component {
   }
 
   render() {
-    const { columns } = this.state;
-    let subRows = this.props.subRows || [];
+    const { columns, subRows } = this.props;
     return (
       <Table aria-label="client-info-details-table" cells={columns} rows={subRows}>
         <TableHeader />
diff --git a/console/react/src/topology/contextMenu.js b/console/react/src/topology/contextMenu.js
index abfb77a..9e09008 100644
--- a/console/react/src/topology/contextMenu.js
+++ b/console/react/src/topology/contextMenu.js
@@ -38,15 +38,39 @@ class ContextMenu extends Component {
       },
       {
         title: "Unselect",
-        action: this.setSelected,
+        action: this.props.setSelected,
         enabled: this.isSelected
       },
       {
         title: "Select",
-        action: this.setSelected,
-        enabled: data => !this.isSelected(data)
+        action: this.props.setSelected,
+        enabled: data => !this.isSelected(data),
+        endGroup: true
       }
     ];
+    // on a router or edge group, allow separate/collapse edges
+    if (
+      this.props.contextEventData.nodeType === "_topo" ||
+      this.props.contextEventData.nodeType === "edge"
+    ) {
+      const additional = [];
+      if (this.props.canExpandAll) {
+        additional.push({
+          title: "Expand all edges",
+          action: this.props.separateAllEdges,
+          enabled: () => true
+        });
+      }
+      if (this.props.canCollapseAll) {
+        additional.push({
+          title: "Collapse all edges",
+          action: this.props.collapseAllEdges,
+          enabled: () => true
+        });
+      }
+      // append expand/collapse items
+      this.contextMenuItems = [...this.contextMenuItems, ...additional];
+    }
   }
 
   setFixed = (item, data) => {
@@ -57,10 +81,6 @@ class ContextMenu extends Component {
     return data.isFixed();
   };
 
-  setSelected = (item, data) => {
-    this.props.setSelected(item, data);
-  };
-
   isSelected = data => {
     return data.selected ? true : false;
   };
diff --git a/console/react/src/topology/legend.js b/console/react/src/topology/legend.js
index 3c7a38f..8f3d700 100644
--- a/console/react/src/topology/legend.js
+++ b/console/react/src/topology/legend.js
@@ -26,16 +26,22 @@ const lookFor = [
   {
     role: "_topo",
     title: "Router",
-    text: "",
+    text: "Router",
     cmp: n => n.nodeType === "_topo"
   },
   {
     role: "edge",
-    title: "Router",
-    text: "Edge",
+    title: "Edge Group",
+    text: "Edge Group",
     cmp: n => n.nodeType === "edge"
   },
   {
+    role: "_edge",
+    title: "Edge Router",
+    text: "Edge Router",
+    cmp: n => n.nodeType === "_edge"
+  },
+  {
     role: "normal",
     title: "Console",
     text: "console",
@@ -104,52 +110,35 @@ export class Legend {
       .selectAll("g");
   }
 
-  gap = d => {
-    let g = Nodes.radius(d.nodeType) * 2 + PADDING;
-    if (d.nodeType === "_topo") {
-      g -= Nodes.radius(d.nodeType) / 2;
-    }
-    return g;
-  };
-
   // create or update the legend
   update() {
     let lsvg;
-    if (d3.select("#topo_svg_legend svg").empty()) {
-      lsvg = this.init();
-    } else {
-      lsvg = d3.select("#topo_svg_legend svg g").selectAll("g");
-    }
+    d3.select("#svglegend").remove();
+    lsvg = this.init();
+
     // add a node to legendNodes for each node type that is currently in the svg
     let legendNodes = new Nodes();
-    this.nodes.nodes.forEach((n, i) => {
-      let node = lookFor.find(lf => lf.cmp(n));
-      if (node) {
-        if (!legendNodes.nodes.some(ln => ln.key === node.title)) {
-          let newNode = legendNodes.addUsing({
-            id: node.title,
-            name: node.text,
-            nodeType: node.role,
-            nodeIndex: undefined,
-            x: 0,
-            y: 0,
-            connectionContainer: i,
-            resultIndex: 0,
-            fixed: 0,
-            properties: node.props ? node.props : {}
-          });
-          if (node.cdir) {
-            newNode.cdir = node.cdir;
-          }
+    lookFor.forEach((node, i) => {
+      if (this.nodes.nodes.some(n => node.cmp(n))) {
+        let newNode = legendNodes.addUsing({
+          id: node.title,
+          name: node.text,
+          nodeType: node.role,
+          nodeIndex: undefined,
+          x: 0,
+          y: 0,
+          connectionContainer: i,
+          resultIndex: 0,
+          fixed: 0,
+          properties: node.props ? node.props : {}
+        });
+        if (node.cdir) {
+          newNode.cdir = node.cdir;
         }
       }
     });
-
-    // determine the y coordinate of the last existing node in the legend
+    // cury is the y position to add the next legend node
     let cury = 2;
-    lsvg.each((d, i) => {
-      cury += this.gap(d);
-    });
 
     // associate the legendNodes with lsvg
     lsvg = lsvg.data(legendNodes.nodes, function(d) {
@@ -161,14 +150,16 @@ export class Legend {
       .enter()
       .append("svg:g")
       .attr("transform", d => {
+        if (d.nodeType === "edge") cury += 4;
         let t = `translate(2, ${cury})`;
-        cury += this.gap(d);
+        cury = cury + Nodes.radius(d.nodeType) * 2 + PADDING;
         return t;
       });
     appendCircle(legendEnter, this.urlPrefix);
     appendContent(legendEnter);
     appendTitle(legendEnter);
     legendEnter
+      .filter(d => d.nodeType !== "_edge" && d.nodeType !== "_topo")
       .append("svg:text")
       .attr("x", 35)
       .attr("y", 6)
@@ -177,32 +168,9 @@ export class Legend {
         return d.key;
       });
 
-    // remove any nodes that dropped out of legendNodes
-    lsvg.exit().remove();
-
     let svgEl = document.getElementById("svglegend");
     if (svgEl) {
       svgEl.style.height = `${cury + 20}px`;
     }
-    /*
-    // position the legend based on it's size
-    let svgEl = document.getElementById("svglegend");
-    if (svgEl) {
-      let bb;
-      // firefox can throw an exception on getBBox on an svg element
-      try {
-        bb = svgEl.getBBox();
-      } catch (e) {
-        bb = {
-          y: 0,
-          height: 200,
-          x: 0,
-          width: 200
-        };
-      }
-      svgEl.style.height = bb.y + bb.height + "px";
-      svgEl.style.width = bb.x + bb.width + "px";
-    }
-    */
   }
 }
diff --git a/console/react/src/topology/legendComponent.js b/console/react/src/topology/legendComponent.js
index 7ee02ae..8386c2e 100644
--- a/console/react/src/topology/legendComponent.js
+++ b/console/react/src/topology/legendComponent.js
@@ -31,6 +31,10 @@ class LegendComponent extends Component {
     this.legend.update();
   };
 
+  componentDidUpdate = () => {
+    console.log("legend did update");
+  };
+
   render() {
     return (
       <div
diff --git a/console/react/src/topology/links.js b/console/react/src/topology/links.js
index 1dabbe8..eacbf48 100644
--- a/console/react/src/topology/links.js
+++ b/console/react/src/topology/links.js
@@ -20,13 +20,15 @@ under the License.
 import { utils } from "../common/amqp/utilities.js";
 
 class Link {
-  constructor(source, target, dir, cls, uid) {
+  constructor(source, target, dir, cls, uid, suid, tuid) {
     this.source = source;
     this.target = target;
+    this.suid = suid;
+    this.tuid = tuid;
     this.left = dir === "in" || dir === "both";
     this.right = dir === "out" || dir === "both";
     this.cls = cls;
-    this.uid = uid;
+    this.uuid = uid;
   }
 
   markerId(end) {
@@ -34,6 +36,10 @@ class Link {
     if (selhigh === "" && !this.left && !this.right) selhigh = "unknown";
     return `-${selhigh}-${end === "end" ? this.target.radius() : this.source.radius()}`;
   }
+
+  uid() {
+    return this.uuid;
+  }
 }
 
 export class Links {
@@ -53,7 +59,7 @@ export class Links {
     return -1;
   }
 
-  getLink(_source, _target, dir, cls, uid) {
+  getLink(_source, _target, dir, cls, suid, tuid) {
     for (let i = 0; i < this.links.length; i++) {
       let s = this.links[i].source,
         t = this.links[i].target;
@@ -69,14 +75,11 @@ export class Links {
         return -i;
       }
     }
-    //this.logger.debug("creating new link (" + (links.length) + ") between " + nodes[_source].name + " and " + nodes[_target].name);
-    if (
-      this.links.some(function(l) {
-        return l.uid === uid;
-      })
-    )
+    let uid = `${suid}-${tuid}`;
+    if (this.links.some(l => l.uid() === uid)) {
       uid = uid + "." + this.links.length;
-    return this.links.push(new Link(_source, _target, dir, cls, uid)) - 1;
+    }
+    return this.links.push(new Link(_source, _target, dir, cls, uid, suid, tuid)) - 1;
   }
 
   linkFor(source, target) {
@@ -87,7 +90,7 @@ export class Links {
         return this.links[i];
     }
     // the selected node was a client/broker
-    return null;
+    return undefined;
   }
 
   getPosition(name, nodes, source, client, height, localStorage) {
@@ -117,10 +120,11 @@ export class Links {
     return position;
   }
 
-  initialize(nodeInfo, nodes, unknowns, height, localStorage) {
+  initialize(nodeInfo, nodes, separateContainers, unknowns, height, localStorage) {
     this.reset();
-    let connectionsPerContainer = {};
-    let nodeIds = Object.keys(nodeInfo);
+    const connectionsPerContainer = {};
+    const nodeIds = Object.keys(nodeInfo);
+    const nodeNames = new Set(nodeIds.map(n => utils.nameFromId(n)));
     // collect connection info for each router
     for (let source = 0; source < nodeIds.length; source++) {
       let onode = nodeInfo[nodeIds[source]];
@@ -132,7 +136,6 @@ export class Links {
       )
         continue;
 
-      const suid = nodes.get(source).uid();
       for (let c = 0; c < onode.connection.results.length; c++) {
         let connection = utils.flatten(
           onode.connection.attributeNames,
@@ -144,12 +147,17 @@ export class Links {
           connection.container = connection.name.replace("/", "").replace(":", "-");
           //utils.uuidv4();
         }
-        // this is a connection to another interior router
-        if (connection.role === "inter-router") {
+        // this is a connection to another interior/edge router
+        if (
+          connection.role === "inter-router" ||
+          (connection.role === "edge" && separateContainers.has(connection.container)) ||
+          nodeNames.has(connection.container)
+        ) {
+          const suid = nodes.get(source).uid();
           const target = getContainerIndex(connection.container, nodeInfo);
           if (target >= 0) {
             const tuid = nodes.get(target).uid();
-            this.getLink(source, target, connection.dir, "", `${suid}-${tuid}`);
+            this.getLink(source, target, connection.dir, "", suid, tuid);
           }
           continue;
         }
@@ -157,8 +165,7 @@ export class Links {
           connectionsPerContainer[connection.container] = [];
         let linksDir = getLinkDir(connection, onode);
         if (linksDir === "unknown") {
-          continue;
-          //unknowns.push(nodeIds[source]);
+          unknowns.push(nodeIds[source]);
         }
         connectionsPerContainer[connection.container].push({
           source: source,
@@ -241,13 +248,7 @@ export class Links {
         let source = links[l].source;
         const suid = nodes.get(source).uid();
         const tuid = nodes.get(target).uid();
-        this.getLink(
-          links[l].source,
-          target,
-          links[l].linksDir,
-          "small",
-          `${suid}-${tuid}`
-        );
+        this.getLink(links[l].source, target, links[l].linksDir, "small", suid, tuid);
       }
     }
   }
diff --git a/console/react/src/topology/map.js b/console/react/src/topology/map.js
index 0e412e4..5e3137e 100644
--- a/console/react/src/topology/map.js
+++ b/console/react/src/topology/map.js
@@ -124,13 +124,31 @@ export class BackgroundMap {
     this.geo.selectAll(".land").attr("d", this.geoPath);
   }
 
+  setSvg(svg, width, height) {
+    this.svg = svg;
+    this.geo = svg
+      .append("g")
+      .attr("class", "geo")
+      .style("opacity", this.options.show ? "1" : "0");
+
+    this.geo
+      .append("rect")
+      .attr("class", "ocean")
+      .attr("width", width)
+      .attr("height", height)
+      .attr("fill", "#FFF");
+
+    if (this.options.show) {
+      this.svg.call(this.zoom).on("dblclick.zoom", null);
+    }
+  }
+
   init(_unused, svg, width, height) {
     return new Promise((resolve, reject) => {
       if (this.initialized) {
         resolve();
         return;
       }
-      this.svg = svg;
       this.width = width;
       this.height = height;
       // track last translation and scale event we processed
@@ -170,21 +188,7 @@ export class BackgroundMap {
         .translate([0, 0]) // not linked directly to projection
         .on("zoom", this.zoomed);
 
-      this.geo = svg
-        .append("g")
-        .attr("class", "geo")
-        .style("opacity", this.options.show ? "1" : "0");
-
-      this.geo
-        .append("rect")
-        .attr("class", "ocean")
-        .attr("width", width)
-        .attr("height", height)
-        .attr("fill", "#FFF");
-
-      if (this.options.show) {
-        this.svg.call(this.zoom).on("dblclick.zoom", null);
-      }
+      if (!this.svg) this.setSvg(svg, width, height);
 
       fetch("data/countries.json")
         .then(res => res.json())
diff --git a/console/react/src/topology/nodes.js b/console/react/src/topology/nodes.js
index 29c6c6b..f15b806 100644
--- a/console/react/src/topology/nodes.js
+++ b/console/react/src/topology/nodes.js
@@ -185,12 +185,21 @@ const nodeProperties = {
     charge: [-1800, -900]
   },
   edge: {
+    radius: 30,
+    refX: {
+      end: 34,
+      start: -21
+    },
+    linkDistance: [90, 55],
+    charge: [-1350, -900]
+  },
+  _edge: {
     radius: 24,
     refX: {
       end: 24,
-      start: -12
+      start: -17
     },
-    linkDistance: [110, 55],
+    linkDistance: [90, 55],
     charge: [-1350, -900]
   },
   // generated nodes from connections. key is from connection.role
@@ -206,7 +215,6 @@ const nodeProperties = {
 };
 // aliases
 nodeProperties._topo = nodeProperties["inter-router"];
-nodeProperties._edge = nodeProperties["edge"];
 nodeProperties["on-demand"] = nodeProperties["normal"];
 nodeProperties["route-container"] = nodeProperties["normal"];
 
@@ -218,10 +226,12 @@ export class Nodes {
     if (nodeProperties[type].radius) return nodeProperties[type].radius;
     return 15;
   }
-  static textOffset(type) {
+  static textOffset(type, len) {
     let r = Nodes.radius(type);
-    let ret = type === "inter-router" || type === "_topo" ? r + 10 : 0;
-    return ret;
+    if (type === "inter-router" || type === "_topo" || type === "_edge") {
+      if (len > 4) return -(r - 5);
+    }
+    return 0;
   }
   static maxRadius() {
     let max = 0;
diff --git a/console/react/src/topology/svgUtils.js b/console/react/src/topology/svgUtils.js
index 9243f7f..d441bcf 100644
--- a/console/react/src/topology/svgUtils.js
+++ b/console/react/src/topology/svgUtils.js
@@ -34,7 +34,7 @@ export function updateState(circle) {
       return d.fixed ? d.fixed & 1 : false;
     })
     .classed("multiple", function(d) {
-      return d.normals && d.normals.length > 1;
+      return d.normals;
     });
 }
 
@@ -49,6 +49,9 @@ export function appendCircle(g) {
         return Nodes.radius(d.nodeType);
       })
       .attr("fill", function(d) {
+        if (d.nodeType === "edge" && d.normals && d.normals.length > 1) {
+          return "url(#diagonal-stripe-1) #fff;";
+        }
         if (d.cdir === "both" && !utils.isConsole(d)) {
           return "url(#half-circle)";
         }
@@ -101,7 +104,7 @@ export function appendCircle(g) {
 export function appendContent(g) {
   // show node IDs
   g.append("svg:text")
-    .attr("x", d => Nodes.textOffset(d.nodeType))
+    .attr("x", d => Nodes.textOffset(d.nodeType, d.name.length))
     .attr("y", function(d) {
       let y = 7;
       if (utils.isArtemis(d)) y = 8;
@@ -111,7 +114,10 @@ export function appendContent(g) {
       else if (d.nodeType === "edge" || d.nodeType === "_edge") y = 4;
       return y;
     })
-    .attr("class", d => (d.nodeType === "_topo" ? "label" : "id"))
+    .attr("class", d =>
+      d.nodeType === "_topo" || d.nodeType === "_edge" ? "label" : "id"
+    )
+    .classed("long", d => d.name.length > 4)
     .classed("console", function(d) {
       return utils.isConsole(d);
     })
@@ -144,11 +150,11 @@ export function appendContent(g) {
         return d.properties.product ? d.properties.product[0].toUpperCase() : "S";
       } else if (d.nodeType === "normal") {
         return "\uf109"; // icon-laptop for clients
-      } else if (d.nodeType === "edge" || d.nodeType === "_edge") {
-        return "Edge";
+      } else if (d.nodeType === "edge") {
+        return "Edges";
       }
-      return d.name.length > 7
-        ? d.name.substr(0, 3) + "..." + d.name.substr(d.name.length - 3, 3)
+      return d.name.length > 15
+        ? d.name.substr(0, 5) + "..." + d.name.substr(d.name.length - 5)
         : d.name;
     });
 }
@@ -199,6 +205,25 @@ export function addDefs(svg) {
     .attr("d", function(d) {
       return d.sten === "end" ? "M 0 -5 L 10 0 L 0 5 z" : "M 10 -5 L 0 0 L 10 5 z";
     });
+
+  // based on http://iros.github.io/patternfills/sample_svg.html
+  svg
+    .append("svg:defs")
+    .append("pattern")
+    .attr("id", "diagonal-stripe-1")
+    .attr("patternUnits", "userSpaceOnUse")
+    .attr("width", 10)
+    .attr("height", 10)
+    .append("image")
+    .attr(
+      "xlink:href",
+      "data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMCcgaGVpZ2h0PScxMCc+CiAgPHJlY3Qgd2lkdGg9JzEwJyBoZWlnaHQ9JzEwJyBmaWxsPSd3aGl0ZScvPgogIDxwYXRoIGQ9J00tMSwxIGwyLC0yCiAgICAgICAgICAgTTAsMTAgbDEwLC0xMAogICAgICAgICAgIE05LDExIGwyLC0yJyBzdHJva2U9J2JsYWNrJyBzdHJva2Utd2lkdGg9JzEnLz4KPC9zdmc+Cg=="
+    )
+    .attr("x", 0)
+    .attr("y", 0)
+    .attr("width", 10)
+    .attr("height", 10);
+
   addStyles(
     sten,
     {
diff --git a/console/react/src/topology/topoUtils.js b/console/react/src/topology/topoUtils.js
index 8fc12ac..a3ed52c 100644
--- a/console/react/src/topology/topoUtils.js
+++ b/console/react/src/topology/topoUtils.js
@@ -68,6 +68,7 @@ export function connectionPopupHTML(d, nodeInfo) {
   }
   // return all of onode's connections that connecto to right
   let getConnsArray = function(onode, key, right) {
+    if (!onode) return [];
     if (right.normals) {
       // if we want connections between a router and a client[s]
       let connIds = new Set();
@@ -106,6 +107,7 @@ export function connectionPopupHTML(d, nodeInfo) {
   // construct HTML to be used in a popup when the mouse is moved over a link.
   // The HTML is sanitized elsewhere before it is displayed
   let linksHTML = function(onode, conns) {
+    if (!onode) return "";
     const max_links = 10;
     const fields = [
       "deliveryCount",
@@ -260,3 +262,110 @@ export function getSizes(id) {
   }
   return { width: window.innerWidth - 200, height: window.innerHeight - 100 };
 }
+
+// The following 2 reconcile functions are needed due to the way
+// d3 associates data with svg elements.
+// If we were to create new nodes and links arrays, even if the
+// new array elements had the same uid, the svg elements would not be
+// associated with the new array elements. This would cause
+// multiple, difficult to diagnose problems.
+
+// combine two arrays into the 1st array without creating a new array
+export function reconcileArrays(existing, newArray) {
+  // remove from existing, any elements that are not in newArray
+  for (let i = existing.length - 1; i >= 0; --i) {
+    const uid = existing[i].uid();
+    if (!newArray.some(n => n.uid() === uid)) {
+      existing.splice(i, 1);
+    }
+  }
+  // add to existing, any elements that are only in newArray
+  newArray.forEach(n => {
+    const uid = n.uid();
+    if (!existing.some(e => e.uid() === uid)) {
+      existing.push(n);
+    }
+  });
+}
+
+// Links are 'special' in that each link contians a reference
+// to the two nodes that it is linking.
+// So we need to fix the new links' source and target
+export function reconcileLinks(existingLinks, newLinks, existingNodes) {
+  reconcileArrays(existingLinks, newLinks);
+  existingLinks.forEach(e => {
+    // in new links, the source and target will be a number
+    // instead of references to the node
+    if (typeof e.source === "number") {
+      e.source = existingNodes.findIndex(nn => nn.uid() === e.suid);
+      e.target = existingNodes.findIndex(nn => nn.uid() === e.tuid);
+    }
+  });
+}
+
+function getNearestRouter(node, nodes, links) {
+  let link = null;
+  while (node && node.nodeType !== "_topo" && link !== undefined) {
+    if (node.nodeType === "_edge") {
+      // we are at an edge, find the link between the edge and a router
+      const uid = node.uid();
+      for (let l = 0; l < links.links.length; ++l) {
+        const lnk = links.links[l];
+        if (lnk.suid === uid && lnk.target.nodeType === "_topo") {
+          link = lnk;
+          node = lnk.target;
+          break;
+        } else if (lnk.tuid === uid && lnk.source.nodeType === "_topo") {
+          link = lnk;
+          node = lnk.source;
+          break;
+        }
+      }
+    } else {
+      // we are at a client (or group)
+      let connected_node = nodes.find(node.routerId, {}, node.routerId);
+      link = links.linkFor(node, connected_node);
+      node = connected_node;
+    }
+    // highlight the link between the target_node and its router
+    if (link) {
+      node.highlighted = true;
+      link.highlighted = true;
+      d3.select(`path[id='hitpath-${link.uid()}']`).classed("highlighted", true);
+    }
+  }
+  return node;
+}
+
+// entry point when highlighting path between selected node and
+// the node the mouse is over
+export function nextHopHighlight(selected_node, d, nodes, links, nodeInfo) {
+  selected_node.highlighted = true;
+  d.highlighted = true;
+
+  // if the selected node isn't a router,
+  // find the router to which it is connected
+  selected_node = getNearestRouter(selected_node, nodes, links);
+
+  // this the hovered node isn't a router
+  // find the router to which it is connected
+  d = getNearestRouter(d, nodes, links);
+
+  // selected_node and d are now routers
+  nextHop(
+    selected_node,
+    d,
+    nodes,
+    links,
+    nodeInfo,
+    selected_node,
+    (link, fnode, tnode) => {
+      link.highlighted = true;
+      d3.select(`path[id='hitpath-${link.uid()}']`).classed("highlighted", true);
+      fnode.highlighted = true;
+      tnode.highlighted = true;
+    }
+  );
+  let hnode = nodes.nodeFor(d.name);
+  hnode.highlighted = true;
+}
diff --git a/console/react/src/topology/topologyPage.js b/console/react/src/topology/topologyPage.js
index b907b82..183e772 100644
--- a/console/react/src/topology/topologyPage.js
+++ b/console/react/src/topology/topologyPage.js
@@ -34,7 +34,10 @@ class TopologyPage extends Component {
         variant={PageSectionVariants.light}
         id="topologyPage"
       >
-        <TopologyViewer service={this.props.service} />
+        <TopologyViewer
+          service={this.props.service}
+          handleAddNotification={this.props.handleAddNotification}
+        />
       </PageSection>
     );
   }
diff --git a/console/react/src/topology/topologyToolbar.js b/console/react/src/topology/topologyToolbar.js
index 071807f..e013552 100644
--- a/console/react/src/topology/topologyToolbar.js
+++ b/console/react/src/topology/topologyToolbar.js
@@ -37,8 +37,7 @@ class TopologyToolbar extends React.Component {
               title="Traffic"
               panel={
                 <TrafficComponent
-                  addresses={this.props.legendOptions.traffic.addresses}
-                  addressColors={this.props.legendOptions.traffic.addressColors}
+                  addressColors={this.props.addressColors}
                   handleChangeTrafficAnimation={this.props.handleChangeTrafficAnimation}
                   handleChangeTrafficFlowAddress={
                     this.props.handleChangeTrafficFlowAddress
diff --git a/console/react/src/topology/topologyToolbar.test.js b/console/react/src/topology/topologyToolbar.test.js
index 317602b..7b2e8c4 100644
--- a/console/react/src/topology/topologyToolbar.test.js
+++ b/console/react/src/topology/topologyToolbar.test.js
@@ -28,9 +28,6 @@ it("renders a TopologyToolbar", () => {
         addresses: {
           testAddress: true
         },
-        addressColors: {
-          testAddress: "#EAEAEA"
-        },
         dots: true,
         congestion: true
       },
@@ -43,7 +40,10 @@ it("renders a TopologyToolbar", () => {
     handleHoverAddress: () => {},
     handleUpdateMapColor: () => {},
     handleUpdateMapShown: () => {},
-    handleChangeArrows: () => {}
+    handleChangeArrows: () => {},
+    addressColors: {
+      testAddress: { color: "#EAEAEA", checked: true }
+    }
   };
   const { getByTestId } = render(<TopologyToolbar {...props} />);
 
diff --git a/console/react/src/topology/topologyViewer.js b/console/react/src/topology/topologyViewer.js
index d9423fb..13d0e23 100644
--- a/console/react/src/topology/topologyViewer.js
+++ b/console/react/src/topology/topologyViewer.js
@@ -30,7 +30,13 @@ import { Traffic } from "./traffic.js";
 import { separateAddresses } from "../chord/filters.js";
 import { Nodes } from "./nodes.js";
 import { Links } from "./links.js";
-import { nextHop, connectionPopupHTML, getSizes } from "./topoUtils.js";
+import {
+  connectionPopupHTML,
+  getSizes,
+  reconcileArrays,
+  reconcileLinks,
+  nextHopHighlight
+} from "./topoUtils.js";
 import { BackgroundMap } from "./map.js";
 import { utils } from "../common/amqp/utilities.js";
 import { Legend } from "./legend.js";
@@ -48,10 +54,12 @@ import {
 } from "./svgUtils.js";
 import { QDRLogger } from "../common/qdrGlobals";
 const TOPOOPTIONSKEY = "topologyLegendOptionsKey";
+const SEPARATES = "topoSeparates";
 
 class TopologyViewer extends Component {
   constructor(props) {
     super(props);
+    this.topology = this.props.service.management.topology;
     // restore the state of the legend sections
     let savedOptions = localStorage.getItem(TOPOOPTIONSKEY);
     savedOptions = savedOptions
@@ -60,9 +68,7 @@ class TopologyViewer extends Component {
           traffic: {
             open: false,
             dots: false,
-            congestion: false,
-            addresses: {},
-            addressColors: {}
+            congestion: false
           },
           legend: {
             open: true
@@ -86,7 +92,9 @@ class TopologyViewer extends Component {
       showRouterInfo: false,
       showClientInfo: false,
       showContextMenu: false,
-      showLegend: false
+      showLegend: false,
+      mapOptions: { areaColor: "#000000", oceanColor: "#FFFFFF" },
+      addressColors: {}
     };
     this.QDRLog = new QDRLogger(console, "Topology");
     this.popupCancelled = true;
@@ -95,18 +103,29 @@ class TopologyViewer extends Component {
     //  - links is an array of connections between the routers. these are the lines with arrows
     this.forceData = {
       nodes: new Nodes(this.QDRLog),
-      links: new Links(this.QDRLog)
+      links: new Links(this.QDRLog),
+      edges: {}
     };
 
     this.force = null;
+    this.currentScale = 1;
+    let seps = localStorage.getItem(SEPARATES);
+    seps = seps ? JSON.parse(seps) : [];
+    this.separateContainers = new Set(seps);
     this.traffic = new Traffic(
       this,
       this.props.service,
       separateAddresses,
       Nodes.radius("inter-router"),
       this.forceData,
-      ["dots", "congestion"].filter(t => this.state.legendOptions.traffic[t])
+      [],
+      this.addressesChanged
     );
+  }
+
+  // called only once when the component is initialized
+  componentDidMount = () => {
+    this.mounted = true;
     this.backgroundMap = new BackgroundMap(
       this,
       this.state.legendOptions.map,
@@ -122,46 +141,65 @@ class TopologyViewer extends Component {
         }
       }
     );
-    this.state.mapOptions = this.backgroundMap.mapOptions;
-    this.currentScale = 1;
-  }
-
-  // called only once when the component is initialized
-  componentDidMount = () => {
     window.addEventListener("resize", this.resize);
-    // we only need to update connections during steady-state
-    this.props.service.management.topology.setUpdateEntities([
-      "connection",
-      "router.link"
-    ]);
-    // poll the routers for their latest entities (set to connection above)
-    this.props.service.management.topology.startUpdating();
-    this.props.service.management.topology.ensureAllEntities(
-      [
-        {
-          entity: "router.link",
-          attrs: ["linkType", "connectionId", "linkDir", "owningAddr"],
-          force: true
-        }
-      ],
-      () => {
-        // create the svg
-        setTimeout(this.init, 1);
-      }
-    );
+    // we need to get data for connections and links
+    this.topology.setUpdateEntities(["connection", "router.link"]);
+    this.traffic
+      .getAddressColors(this.props.service, separateAddresses)
+      .then(addressColors => {
+        if (!this.mounted) return;
+        this.setState({
+          addressColors,
+          mapOptions: this.backgroundMap.mapOptions
+        });
 
-    // get notified when a router is added/dropped and when
-    // the number of connections for a router changes
-    this.props.service.management.topology.addChangedAction("topology", () => {
-      return this.init;
-    });
+        // poll the routers for their latest data
+        this.topology.get().then(() => {
+          if (!this.mounted) return;
+
+          // create the svg
+          this.props.service.management.topology
+            .startUpdating(null, this.getEdgeNodes())
+            .then(() => {
+              this.init().then(() => {
+                if (!this.mounted) return;
+                // get notified when a router is added/dropped and when
+                // the number of connections for a router changes
+                this.topology.addChangedAction("topology", this.topologyChanged);
+              });
+            });
+        });
+      });
+  };
+
+  topologyChanged = changed => {
+    let message;
+    let silent = true;
+    if (changed.connections.length > 0) {
+      message = `${
+        changed.connections[0].from > changed.connections[0].to ? "Lost" : "New"
+      } connection for ${utils.nameFromId(changed.connections[0].router)}`;
+      this.reInit();
+    } else {
+      silent = false;
+      if (changed.lostRouters.length > 0) {
+        message = `Lost connection to ${utils.nameFromId(changed.lostRouters[0])}`;
+      } else if (changed.newRouters.length > 0) {
+        message = `New router discovered: ${utils.nameFromId(changed.newRouters[0])}`;
+      }
+      this.reInit();
+    }
+    this.props.handleAddNotification("event", message, new Date(), "info", silent);
   };
 
   componentWillUnmount = () => {
-    this.props.service.management.topology.setUpdateEntities([]);
-    this.props.service.management.topology.stopUpdating();
-    this.props.service.management.topology.delChangedAction("topology");
-    this.props.service.management.topology.delUpdatedAction("connectionPopupHTML");
+    // set this flag so we can abandon the results from any
+    // pending management calls
+    this.mounted = false;
+    this.topology.setUpdateEntities([]);
+    this.topology.stopUpdating();
+    this.topology.delChangedAction("topology");
+    this.topology.delUpdatedAction("connectionPopupHTML");
 
     d3.select("#SVG_ID .links").remove();
     d3.select("#SVG_ID .nodes").remove();
@@ -169,11 +207,44 @@ class TopologyViewer extends Component {
     d3.select("#SVG_ID").remove();
 
     this.traffic.remove();
+    delete this.traffic;
     this.forceData.nodes.savePositions();
     window.removeEventListener("resize", this.resize);
     d3.select(".pf-c-page__main").style("background-color", "white");
   };
 
+  getEdgeNodes = () => {
+    // get list of edge routers per interior router
+    const edgesPerRouter = this.topology.edgesPerRouter();
+    const edgeList = new Set(this.topology.edgeList.map(e => utils.nameFromId(e)));
+    const visibleEdgeIds = [];
+    for (const routerId in edgesPerRouter) {
+      let notSeparate = [];
+      edgesPerRouter[routerId].forEach(name => {
+        if (!edgeList.has(name)) {
+          if (this.separateContainers.has(name)) {
+            visibleEdgeIds.push(utils.idFromName(name, "_edge"));
+          } else {
+            notSeparate.push(name);
+          }
+        }
+      });
+      /*
+      // if only 1 edge router is not separate, add it to the list
+      if (notSeparate.length === 1) {
+        visibleEdgeIds.push(utils.idFromName(notSeparate[0], "_edge"));
+      }
+      */
+    }
+    return visibleEdgeIds;
+  };
+
+  // called by traffic when a new address is detected or
+  // when an existing address is dropped
+  addressesChanged = () => {
+    this.setState({ addressColors: this.traffic.addressColors() });
+  };
+
   resize = () => {
     if (!this.svg) return;
     const { width, height } = getSizes("topology");
@@ -188,6 +259,7 @@ class TopologyViewer extends Component {
     }
   };
 
+  // called from contextMenu
   setSelected = (item, data) => {
     // remove the selected attr from each node
     this.circle.each(function(d) {
@@ -199,207 +271,207 @@ class TopologyViewer extends Component {
     this.restart();
   };
 
-  updateLegend = () => {
-    this.legend.update();
+  canExpandAll = data =>
+    this.forceData.nodes.nodes.find(
+      node => node.key === data.key && node.nodeType === "edge"
+    );
+
+  canCollapseAll = data => {
+    // get all possible edges for this router
+    const edgeNames = new Set(this.topology.edgesPerRouter()[data.key]);
+    // difference = edgeNames - expanded
+    const difference = new Set(
+      [...edgeNames].filter(x => !this.separateContainers.has(x))
+    );
+    return difference.size < edgeNames.size;
   };
-  clearPopups = () => {};
 
-  // initialize the nodes and links array from the QDRService.topology._nodeInfo object
-  init = () => {
-    const { width, height } = getSizes("topology");
-    this.width = width;
-    this.height = height;
-    if (this.width < 768) {
-      const legendOptions = this.state.legendOptions;
-      legendOptions.map.open = false;
-      legendOptions.map.show = false;
-      this.setState({ legendOptions });
+  // called from contextMenu
+  separateAllEdges = (item, data) => {
+    // find the node for the group of edges for this router
+    const edgeGroup = this.forceData.nodes.nodes.find(
+      node => node.key === data.key && node.nodeType === "edge"
+    );
+    if (edgeGroup) {
+      edgeGroup.normals.forEach(n => {
+        this.separateContainers.add(n.container);
+      });
+      localStorage.setItem(SEPARATES, JSON.stringify([...this.separateContainers]));
+      this.reInit();
     }
-    let nodeInfo = this.props.service.management.topology.nodeInfo();
-    let nodeCount = Object.keys(nodeInfo).length;
+  };
+  // called from contextMenu
+  collapseAllEdges = (item, data) => {
+    // find all the separated edge nodes for this router
+    const edgeNames = this.topology.edgesPerRouter()[data.key];
+    if (edgeNames) {
+      this.topology.removeTheseEdgeNames(edgeNames);
+      edgeNames.forEach(name => this.separateContainers.delete(name));
+      localStorage.setItem(SEPARATES, JSON.stringify([...this.separateContainers]));
+      this.reInit();
+    }
+  };
 
-    this.mouseover_node = null;
-    this.selected_node = null;
+  updateLegend = () => {
+    this.legend.update();
+  };
+  clearPopups = () => {};
 
+  createSvg = () => {
     d3.select("#SVG_ID .links").remove();
     d3.select("#SVG_ID .nodes").remove();
     d3.select("#SVG_ID circle.flow").remove();
     d3.select("#SVG_ID").remove();
-    this.svg = null;
-    if (!this.svg) {
-      this.svg = d3
-        .select("#topology")
-        .append("svg")
-        .attr("id", "SVG_ID")
-        .attr("width", this.width)
-        .attr("height", this.height)
-        .attr("aria-label", "topology-svg")
-        .on("click", this.clearPopups);
-      // read the map data from the data file and build the map layer
-      if (this.backgroundMap) {
-        this.backgroundMap.init(this, this.svg, this.width, this.height).then(() => {
-          this.forceData.nodes.saveLonLat(this.backgroundMap);
-          this.backgroundMap.setMapOpacity(this.state.legendOptions.map.show);
-        });
-      }
-      addDefs(this.svg);
-      addGradient(this.svg);
-
-      // handles to link and node element groups
-      this.path = this.svg
-        .append("svg:g")
-        .attr("class", "links")
-        .selectAll("g");
-      this.circle = this.svg
-        .append("svg:g")
-        .attr("class", "nodes")
-        .selectAll("g");
+    this.svg = d3
+      .select("#topology")
+      .append("svg")
+      .attr("id", "SVG_ID")
+      .attr("xmlns", "http://www.w3.org/2000/svg")
+      .attr("width", this.width)
+      .attr("height", this.height)
+      .attr("aria-label", "topology-svg")
+      .on("click", this.clearPopups);
+
+    // append the map layer before the nodes/links
+    if (this.backgroundMap) {
+      this.backgroundMap.setSvg(this.svg, this.width, this.height);
     }
 
-    this.traffic.remove();
-    if (this.state.legendOptions.traffic.dots)
-      this.traffic.addAnimationType(
-        "dots",
-        separateAddresses,
-        Nodes.radius("inter-router")
-      );
-    if (this.state.legendOptions.traffic.congestion)
-      this.traffic.addAnimationType(
-        "congestion",
-        separateAddresses,
-        Nodes.radius("inter-router")
-      );
-
-    // mouse event vars
-    this.mousedown_node = null;
-
-    // initialize the list of nodes
-    this.forceData.nodes.initialize(nodeInfo, this.width, this.height, localStorage);
-    this.forceData.nodes.savePositions();
-
-    // initialize the list of links
-    let unknowns = [];
-    this.forceData.links.initialize(
-      nodeInfo,
-      this.forceData.nodes,
-      unknowns,
-      this.height,
-      localStorage
-    );
-    // init D3 force layout
-    this.force = d3.layout
-      .force()
-      .nodes(this.forceData.nodes.nodes)
-      .links(this.forceData.links.links)
-      .size([this.width, this.height])
-      .linkDistance(d => {
-        return this.forceData.nodes.linkDistance(d, nodeCount);
-      })
-      .charge(d => {
-        return this.forceData.nodes.charge(d, nodeCount);
-      })
-      .friction(0.1)
-      .gravity(d => {
-        return this.forceData.nodes.gravity(d, nodeCount);
-      })
-      .on("tick", this.tick)
-      .on("end", () => {
-        this.forceData.nodes.savePositions();
-        if (this.backgroundMap) this.forceData.nodes.saveLonLat(this.backgroundMap);
-      })
-      .start();
-    this.circle.call(this.force.drag);
-
-    // app starts here
+    addDefs(this.svg);
+    addGradient(this.svg);
+
+    // handles to link and node element groups
+    this.path = this.svg
+      .append("svg:g")
+      .attr("class", "links")
+      .selectAll("g");
+    this.circle = this.svg
+      .append("svg:g")
+      .attr("class", "nodes")
+      .selectAll("g");
+  };
 
-    this.restart();
-    // the legend
-    this.legend = new Legend(this.forceData.nodes, this.QDRLog);
-    this.updateLegend();
-
-    if (this.oldSelectedNode) {
-      d3.selectAll("circle.inter-router").classed("selected", function(d) {
-        if (d.key === this.oldSelectedNode.key) {
-          this.selected_node = d;
-          return true;
+  // initialize the nodes and links array from the QDRService.topology._nodeInfo object
+  init = () => {
+    return new Promise((resolve, reject) => {
+      if (this.mounted) {
+        const { width, height } = getSizes("topology");
+        this.width = width;
+        this.height = height;
+        if (this.width < 768) {
+          const legendOptions = this.state.legendOptions;
+          legendOptions.map.open = false;
+          legendOptions.map.show = false;
+          this.setState({ legendOptions });
         }
-        return false;
-      });
-    }
-    if (this.oldMouseoverNode && this.selected_node) {
-      d3.selectAll("circle.inter-router").each(function(d) {
-        if (d.key === this.oldMouseoverNode.key) {
-          this.mouseover_node = d;
-          this.props.service.management.topology.ensureAllEntities(
-            [
-              {
-                entity: "router.node",
-                attrs: ["id", "nextHop"]
-              }
-            ],
-            function() {
-              this.nextHopHighlight(this.selected_node, d);
-              this.restart();
-            }
-          );
+        let nodeInfo = this.topology.nodeInfo();
+        let nodeCount = Object.keys(nodeInfo).length;
+
+        this.mouseover_node = null;
+        this.selected_node = null;
+        this.createSvg();
+
+        // read the map data from the data file and build the map layer
+        if (this.backgroundMap) {
+          this.backgroundMap.init(this, this.svg, this.width, this.height).then(() => {
+            this.forceData.nodes.saveLonLat(this.backgroundMap);
+            this.backgroundMap.setMapOpacity(this.state.legendOptions.map.show);
+          });
         }
-      });
-    }
-    // if any clients don't yet have link directions, get the links for those nodes and restart the graph
-    //if (unknowns.length > 0) setTimeout(this.resolveUnknowns, 10, nodeInfo, unknowns);
+        this.traffic.remove();
+        if (this.state.legendOptions.traffic.dots)
+          this.traffic.addAnimationType(
+            "dots",
+            separateAddresses,
+            Nodes.radius("inter-router")
+          );
+        if (this.state.legendOptions.traffic.congestion)
+          this.traffic.addAnimationType(
+            "congestion",
+            separateAddresses,
+            Nodes.radius("inter-router")
+          );
+
+        // mouse event vars
+        this.mousedown_node = null;
 
-    var continueForce = function(extra) {
-      if (extra > 0) {
-        --extra;
-        this.force.start();
-        setTimeout(continueForce, 100, extra);
-      }
-    };
-    continueForce(Nodes.forceScale(nodeCount, [0, 200])); // give large graphs time to settle down
-  };
-  // To start up quickly, we only get the connection info for each router.
-  // That means we don't have the router.link info when links.initialize() is first called
-  // and the initial graph is drawn.
-  // The router.link info is needed to determine which direction the arrows between routers
-  // and client should point. (Direction between interior routers is determined by connection.dir)
-  // So, the first time through links.initialize() we keep track of the nodes for which we
-  // need router.link info and fill in that info here.
-  resolveUnknowns = (nodeInfo, unknowns) => {
-    let unknownNodes = {};
-    // collapse the unknown nodes using an object
-    for (let i = 0; i < unknowns.length; ++i) {
-      unknownNodes[unknowns[i]] = 1;
-    }
-    unknownNodes = Object.keys(unknownNodes);
-    this.props.service.management.topology.ensureEntities(
-      unknownNodes,
-      [
-        {
-          entity: "router.link",
-          attrs: ["linkType", "connectionId", "linkDir", "owningAddr"],
-          force: true
-        }
-      ],
-      () => {
-        let nodeInfo = this.props.service.management.topology.nodeInfo();
         this.forceData.nodes.initialize(nodeInfo, this.width, this.height, localStorage);
-        let edgeUnknowns = [];
         this.forceData.links.initialize(
           nodeInfo,
           this.forceData.nodes,
-          edgeUnknowns,
+          this.separateContainers,
+          [],
           this.height,
           localStorage
         );
-        this.force
+
+        this.force = d3.layout
+          .force()
           .nodes(this.forceData.nodes.nodes)
           .links(this.forceData.links.links)
-          .start();
+          .size([this.width, this.height])
+          .linkDistance(d => {
+            return this.forceData.nodes.linkDistance(d, nodeCount);
+          })
+          .charge(d => {
+            return this.forceData.nodes.charge(d, nodeCount);
+          })
+          .friction(0.1)
+          .gravity(d => {
+            return this.forceData.nodes.gravity(d, nodeCount);
+          })
+          .on("tick", this.tick)
+          .on("end", () => {
+            this.forceData.nodes.savePositions();
+            if (this.backgroundMap) this.forceData.nodes.saveLonLat(this.backgroundMap);
+          });
+        //.start();
+        this.force.stop();
+        this.force.start();
+
         if (this.backgroundMap) this.forceData.nodes.saveLonLat(this.backgroundMap);
         this.restart();
+        this.circle.call(this.force.drag);
+        this.legend = new Legend(this.forceData.nodes, this.QDRLog);
         this.updateLegend();
+
+        if (this.oldSelectedNode) {
+          d3.selectAll("circle.inter-router").classed("selected", function(d) {
+            if (d.key === this.oldSelectedNode.key) {
+              this.selected_node = d;
+              return true;
+            }
+            return false;
+          });
+        }
+        if (this.oldMouseoverNode && this.selected_node) {
+          d3.selectAll("circle.inter-router").each(function(d) {
+            if (d.key === this.oldMouseoverNode.key) {
+              this.mouseover_node = d;
+              this.topology.ensureAllEntities(
+                [
+                  {
+                    entity: "router.node",
+                    attrs: ["id", "nextHop"]
+                  }
+                ],
+                () => {
+                  nextHopHighlight(
+                    this.selected_node,
+                    d,
+                    this.forceData.nodes,
+                    this.forceData.links,
+                    this.topology.nodeInfo()
+                  );
+                  this.restart();
+                }
+              );
+            }
+          });
+        }
       }
-    );
+      resolve();
+    });
   };
 
   resetMouseVars = () => {
@@ -411,7 +483,7 @@ class TopologyViewer extends Component {
   handleMouseOutPath = d => {
     // mouse out of a path
     this.popupCancelled = true;
-    this.props.service.management.topology.delUpdatedAction("connectionPopupHTML");
+    this.topology.delUpdatedAction("connectionPopupHTML");
     this.hideTooltip();
     d.selected = false;
     connectionPopupHTML();
@@ -431,13 +503,15 @@ class TopologyViewer extends Component {
   // Also updates any existing svg elements based on the updated values in forceData.nodes
   // and forceData.links
   restart = () => {
+    if (!this.circle) return;
+
     this.circle.call(this.force.drag);
 
     // path is a selection of all g elements under the g.links svg:group
     // here we associate the links.links array with the {g.links g} selection
     // based on the link.uid
     this.path = this.path.data(this.forceData.links.links, d => {
-      return d.uid;
+      return d.uid();
     });
 
     // add new links. if a link with a new uid is found in the data, add a new path
@@ -452,22 +526,16 @@ class TopologyViewer extends Component {
         let updateTooltip = () => {
           if (this.popupCancelled) return;
           if (d.selected) {
-            const popupContent = connectionPopupHTML(
-              d,
-              this.props.service.management.topology._nodeInfo
-            );
+            const popupContent = connectionPopupHTML(d, this.topology._nodeInfo);
             this.displayTooltip(popupContent, { x: event.pageX, y: event.pageY });
           } else {
             this.handleMouseOutPath(d);
           }
         };
         // update the contents of the popup tooltip each time the data is polled
-        this.props.service.management.topology.addUpdatedAction(
-          "connectionPopupHTML",
-          updateTooltip
-        );
+        this.topology.addUpdatedAction("connectionPopupHTML", updateTooltip);
         // request the data and update the tooltip as soon as it arrives
-        this.props.service.management.topology.ensureAllEntities(
+        this.topology.ensureAllEntities(
           [
             {
               entity: "router.link",
@@ -497,11 +565,7 @@ class TopologyViewer extends Component {
     enterpath
       .append("path")
       .attr("class", "link")
-      .attr("id", function(d) {
-        const si = d.source.uid();
-        const ti = d.target.uid();
-        return ["path", si, ti].join("-");
-      });
+      .attr("id", d => `path-${d.source.uid()}-${d.target.uid()}`);
 
     enterpath
       .append("path")
@@ -553,10 +617,12 @@ class TopologyViewer extends Component {
         self.props.service.management.topology.delUpdatedAction("connectionPopupHTML");
         let e = d3.event;
         self.popupCancelled = false;
-        d.toolTip(self.props.service.management.topology).then(function(toolTip) {
-          if (self.popupCancelled) return;
-          self.displayTooltip(toolTip, { x: e.pageX, y: e.pageY });
-        });
+        if (!self.state.showContextMenu) {
+          d.toolTip(self.props.service.management.topology).then(function(toolTip) {
+            if (self.popupCancelled) return;
+            self.displayTooltip(toolTip, { x: e.pageX, y: e.pageY });
+          });
+        }
         if (d === self.mousedown_node) return;
         // enlarge target node
         d3.select(this).attr("transform", "scale(1.1)");
@@ -565,20 +631,30 @@ class TopologyViewer extends Component {
         }
         // highlight the next-hop route from the selected node to this node
         self.clearAllHighlights();
+
         // we need .router.node info to highlight hops
-        self.props.service.management.topology.ensureAllEntities(
+        self.topology.ensureAllEntities(
           [
             {
               entity: "router.node",
               attrs: ["id", "nextHop"]
             }
           ],
-          function() {
+          () => {
+            // the mouse left the circle before the data came in
+            if (!self.current_node) return;
             self.mouseover_node = d; // save this node in case the topology changes so we can restore the highlights
-            self.nextHopHighlight(self.selected_node, d);
+            nextHopHighlight(
+              self.selected_node,
+              d,
+              self.forceData.nodes,
+              self.forceData.links,
+              self.topology.nodeInfo()
+            );
             self.restart();
           }
         );
+        self.restart();
       })
       .on("mouseout", function() {
         // mouse out for a circle
@@ -602,6 +678,7 @@ class TopologyViewer extends Component {
         this.mousedown_node = d;
         // mouse position relative to svg
         this.initial_mouse_down_position = d3.mouse(this.svg.node());
+        this.hideTooltip();
       })
       .on("mouseup", function(d) {
         // mouse up for circle
@@ -621,7 +698,7 @@ class TopologyViewer extends Component {
           cur_mouse[1] !== self.initial_mouse_down_position[1]
         ) {
           self.forceData.nodes.setFixed(d, true);
-          if (self.backgroundMap) self.forceData.nodes.saveLonLat(self.backgroundMap);
+          self.forceData.nodes.saveLonLat(self.backgroundMap);
           self.forceData.nodes.savePositions();
           self.restart();
           self.resetMouseVars();
@@ -631,9 +708,9 @@ class TopologyViewer extends Component {
         self.clearAllHighlights();
         self.mousedown_node = null;
         // handle clicking on nodes that represent multiple sub-nodes
-        if (d.normals && !d.isArtemis && !d.isQpid && d.nodeType !== "edge") {
+        if (d.normals && !d.isArtemis && !d.isQpid && d.nodeType !== "_edge") {
           self.doDialog(d, "client");
-        } else if (d.nodeType === "_topo" || d.nodeType === "edge") {
+        } else if (d.nodeType === "_topo" || d.nodeType === "_edge") {
           self.doDialog(d, "router");
         }
         // apply any data changes to the interface
@@ -693,17 +770,19 @@ class TopologyViewer extends Component {
     multiples.each(function(d) {
       let g = d3.select(this.parentNode);
       let r = Nodes.radius(d.nodeType);
-      g.append("svg:text")
-        .attr("x", r + 4)
-        .attr("y", Math.floor(r / 2 - 4))
-        .attr("class", "subtext")
-        .text("* " + d.normals.length);
+      if (d.nodeType === "edge" || d.normals.length > 1) {
+        g.append("svg:text")
+          .attr("x", r + 4)
+          .attr("y", Math.floor(r / 2 - 8))
+          .attr("class", "subtext")
+          .text(`* ${d.normals.length}`);
+      }
     });
 
     if (!this.mousedown_node || !this.selected_node) return;
 
     // set the graph in motion
-    this.force.start();
+    //this.force.start();
   };
 
   // update force layout (called automatically each iteration)
@@ -718,58 +797,10 @@ class TopologyViewer extends Component {
     });
 
     // draw lines from node centers
-    this.path.selectAll("path").attr("d", (d, i) => {
-      return `M${d.source.x},${d.source.y}L${d.target.x},${d.target.y}`;
-    });
-  };
-
-  nextHopHighlight = (selected_node, d) => {
-    selected_node.highlighted = true;
-    d.highlighted = true;
-    // if the selected node isn't a router,
-    // find the router to which it is connected
-    if (selected_node.nodeType !== "_topo") {
-      let connected_node = this.forceData.nodes.find(
-        selected_node.routerId,
-        {},
-        selected_node.routerId
-      );
-      // push the link between the selected_node and the router
-      let link = this.forceData.links.linkFor(selected_node, connected_node);
-      if (link) {
-        link.highlighted = true;
-        d3.select(`path[id='hitpath-${link.uid}']`).classed("highlighted", true);
-      }
-      // start at the router
-      selected_node = connected_node;
-    }
-    if (d.nodeType !== "_topo") {
-      let connected_node = this.forceData.nodes.find(d.routerId, {}, d.routerId);
-      // push the link between the target_node and its router
-      let link = this.forceData.links.linkFor(d, connected_node);
-      if (link) {
-        link.highlighted = true;
-        d3.select(`path[id='hitpath-${link.uid}']`).classed("highlighted", true);
-      }
-      // end at the router
-      d = connected_node;
-    }
-    nextHop(
-      selected_node,
-      d,
-      this.forceData.nodes,
-      this.forceData.links,
-      this.props.service.management.topology.nodeInfo(),
-      selected_node,
-      (link, fnode, tnode) => {
-        link.highlighted = true;
-        d3.select(`path[id='hitpath-${link.uid}']`).classed("highlighted", true);
-        fnode.highlighted = true;
-        tnode.highlighted = true;
-      }
-    );
-    let hnode = this.forceData.nodes.nodeFor(d.name);
-    hnode.highlighted = true;
+    // There are 2 paths under each this.path selection.
+    this.path
+      .selectAll("path")
+      .attr("d", d => `M${d.source.x},${d.source.y}L${d.target.x},${d.target.y}`);
   };
 
   // show the details dialog for a client or group of clients
@@ -790,14 +821,69 @@ class TopologyViewer extends Component {
     this.setState({ showClientInfo: false });
   };
 
+  handleSeparate = container => {
+    return new Promise(resolve => {
+      const oldKey = this.d.key;
+      this.separateContainers.add(container);
+      localStorage.setItem(SEPARATES, JSON.stringify([...this.separateContainers]));
+      this.reInit().then(() => {
+        // find the node with oldKey that has a list of edge normals
+        const newD = this.forceData.nodes.nodes.find(
+          node => node.key === oldKey && node.nodeType === "edge" && node.normals
+        );
+        resolve(newD);
+      });
+    });
+  };
+
+  reInit = () => {
+    return new Promise(resolve => {
+      this.props.service.management.topology
+        .startUpdating(null, this.getEdgeNodes())
+        .then(() => {
+          const nodeInfo = this.topology.nodeInfo();
+          const newNodes = new Nodes(this.QDRLog);
+          const newLinks = new Links(this.QDRLog);
+          newNodes.initialize(nodeInfo, this.width, this.height, localStorage);
+          newLinks.initialize(
+            nodeInfo,
+            newNodes,
+            this.separateContainers,
+            [],
+            this.height,
+            localStorage
+          );
+          reconcileArrays(this.forceData.nodes.nodes, newNodes.nodes);
+          reconcileLinks(
+            this.forceData.links.links,
+            newLinks.links,
+            this.forceData.nodes.nodes
+          );
+
+          this.force.nodes(this.forceData.nodes.nodes).links(this.forceData.links.links);
+          this.force.stop();
+          this.force.start();
+          this.restart();
+          this.circle.call(this.force.drag);
+          delete this.legend;
+          this.legend = new Legend(this.forceData.nodes, this.QDRLog);
+          this.updateLegend();
+          resolve();
+        });
+    });
+  };
+
   displayTooltip = (content, xy) => {
     if (this.popupCancelled) {
       return this.hideTooltip();
     }
+    const top = Math.max(Math.min(window.innerHeight - 100, xy.y), 0);
+    const left = Math.max(Math.min(window.innerWidth - 200, xy.x), 0);
+
     // position the popup
     d3.select("#popover-div")
-      .style("left", `${xy.x + 5}px`)
-      .style("top", `${xy.y}px`)
+      .style("left", `${left + 5}px`)
+      .style("top", `${top}px`)
       .style("display", "block")
       .html(content);
   };
@@ -857,7 +943,7 @@ class TopologyViewer extends Component {
   };
 
   addressFilterChanged = () => {
-    this.traffic.remove("dots");
+    //this.traffic.remove("dots");
     this.traffic.addAnimationType(
       "dots",
       separateAddresses,
@@ -866,9 +952,8 @@ class TopologyViewer extends Component {
   };
 
   handleChangeTrafficFlowAddress = (address, checked) => {
-    const { legendOptions } = this.state;
-    legendOptions.traffic.addresses[address] = checked;
-    this.handleLegendOptionsChange(legendOptions, this.addressFilterChanged);
+    this.traffic.updateAddressColors(address, checked);
+    this.setState({ addressColors: this.traffic.addressColors() });
   };
 
   // called from traffic
@@ -895,27 +980,6 @@ class TopologyViewer extends Component {
     }
   };
 
-  handleUpdateAddressColors = addressColors => {
-    const { legendOptions } = this.state;
-    let changed = false;
-    // set any new keys to the passed in value
-    Object.keys(addressColors).forEach(address => {
-      if (typeof legendOptions.traffic.addressColors[address] === "undefined") {
-        legendOptions.traffic.addressColors[address] = addressColors[address];
-        changed = true;
-      }
-    });
-    // remove any old keys that were not passed in
-    Object.keys(legendOptions.traffic.addressColors).forEach(address => {
-      if (typeof addressColors[address] === "undefined") {
-        delete legendOptions.traffic.addressColors[address];
-        changed = true;
-      }
-    });
-    if (changed) {
-      this.handleLegendOptionsChange(legendOptions);
-    }
-  };
   handleUpdateMapColor = (which, color) => {
     if (this.backgroundMap) {
       let mapOptions = this.backgroundMap.updateMapColor(which, color);
@@ -997,6 +1061,7 @@ class TopologyViewer extends Component {
         viewToolbar={
           <TopologyToolbar
             legendOptions={this.state.legendOptions}
+            addressColors={this.state.addressColors}
             mapOptions={this.state.mapOptions}
             handleOpenChange={this.handleOpenChange}
             handleChangeArrows={this.handleChangeArrows}
@@ -1019,6 +1084,10 @@ class TopologyViewer extends Component {
             contextEventData={this.contextEventData}
             handleContextHide={this.handleContextHide}
             setSelected={this.setSelected}
+            separateAllEdges={this.separateAllEdges}
+            collapseAllEdges={this.collapseAllEdges}
+            canExpandAll={this.canExpandAll(this.contextEventData)}
+            canCollapseAll={this.canCollapseAll(this.contextEventData)}
           />
         )}
         {this.state.showLegend && (
@@ -1042,6 +1111,7 @@ class TopologyViewer extends Component {
             d={this.d}
             topology={this.props.service.management.topology}
             handleCloseClientInfo={this.handleCloseClientInfo}
+            handleSeparate={this.handleSeparate}
           />
         )}
       </TopologyView>
diff --git a/console/react/src/topology/topologyViewer.test.js b/console/react/src/topology/topologyViewer.test.js
index 94884c7..ed60419 100644
--- a/console/react/src/topology/topologyViewer.test.js
+++ b/console/react/src/topology/topologyViewer.test.js
@@ -30,7 +30,8 @@ it("renders the TopologyViewer component", async () => {
     });
   });
   const props = {
-    service
+    service,
+    handleAddNotification: () => {}
   };
 
   await login();
diff --git a/console/react/src/topology/trafficComponent.js b/console/react/src/topology/trafficComponent.js
index 0f0bf3d..d53fbed 100644
--- a/console/react/src/topology/trafficComponent.js
+++ b/console/react/src/topology/trafficComponent.js
@@ -26,7 +26,6 @@ class TrafficComponent extends Component {
   static propTypes = {
     dots: PropTypes.bool.isRequired,
     congestion: PropTypes.bool.isRequired,
-    addresses: PropTypes.object.isRequired,
     addressColors: PropTypes.object.isRequired,
     handleChangeTrafficAnimation: PropTypes.func.isRequired,
     handleChangeTrafficFlowAddress: PropTypes.func.isRequired,
@@ -55,7 +54,6 @@ class TrafficComponent extends Component {
             {this.props.dots ? (
               <li id="traffic-dots-addresses">
                 <AddressesComponent
-                  addresses={this.props.addresses}
                   addressColors={this.props.addressColors}
                   handleChangeAddress={this.props.handleChangeTrafficFlowAddress}
                   handleHoverAddress={this.props.handleHoverAddress}
@@ -90,7 +88,7 @@ class TrafficComponent extends Component {
                 <defs>
                   <linearGradient
                     xmlns="http://www.w3.org/2000/svg"
-                    id="gradienta1bEihLEHL"
+                    id="colorGradient"
                     gradientUnits="userSpaceOnUse"
                     x1="0%"
                     y1="0%"
@@ -115,7 +113,7 @@ class TrafficComponent extends Component {
                     height="20"
                     x="0"
                     y="0"
-                    fill="url(#gradienta1bEihLEHL)"
+                    fill="url(#colorGradient)"
                   ></rect>
                   <text x="1" y="30" className="label">
                     Idle
diff --git a/console/react/test_data/qdrService.mock.js b/console/react/test_data/qdrService.mock.js
index b247a63..6c6840d 100644
--- a/console/react/test_data/qdrService.mock.js
+++ b/console/react/test_data/qdrService.mock.js
@@ -55,6 +55,19 @@ export const mockService = ({ onSendMethod }) => {
         delChangedAction: () => {},
         addUpdatedAction: () => {},
         delUpdatedAction: () => {},
+        get: () => {
+          return new Promise(resolve => {
+            resolve();
+          });
+        },
+        startUpdating: () => {
+          return new Promise(resolve => {
+            resolve();
+          });
+        },
+        edgesPerRouter: () => {},
+        edgeList: [],
+        nodeIdList: () => [],
         fetchAllEntities: (stuff, cb) => {
           cb(fetchResults);
         },
diff --git a/console/stand-alone/.babelrc b/console/stand-alone/.babelrc
deleted file mode 100644
index 12fe864..0000000
--- a/console/stand-alone/.babelrc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-{
-  "presets": [
-    "env"
-  ]
-}
\ No newline at end of file
diff --git a/console/stand-alone/README.md b/console/stand-alone/README.md
deleted file mode 100644
index 50b94c8..0000000
--- a/console/stand-alone/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# dispatch-standalone
-The stand-alone qpid dispatch console is an html web site that monitors and controls a qpid dispatch router
-
-## To install the console:
-
-  The console files are installed during a dispatch `make install`. By default, the console files are installed in /usr/share/qpid-dispatch/console
-
-## To run the web console:
-- Ensure one of the routers in your network is configured with a normal listener with `http: true`
-
-```
-listener {
-    role: normal
-    host: 0.0.0.0
-    port: 5673
-    http: true
-    saslMechanisms: ANONYMOUS
-}
-```
-- start the router
-- in a browser, navigate to http://localhost:5673/
-
-The router will serve the console's html/js/css from the install directory.
-The console will automatically connect to the router at localhost:5673
-
-## To disable the console and still allow the router to respond to other http traffic
-
-- in the listener portion of the config file, add an httpRootDir: None
-
-```
-listener {
-    role: normal
-    host: 0.0.0.0
-    port: 5673
-    http: true
-    httpRootDir: None
-    saslMechanisms: ANONYMOUS
-}
-```
-
-
diff --git a/console/stand-alone/config.json b/console/stand-alone/config.json
deleted file mode 100644
index e0eca01..0000000
--- a/console/stand-alone/config.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "title": "Apache Qpid Dispach Console"
-}
\ No newline at end of file
diff --git a/console/stand-alone/favicon-32x32.png b/console/stand-alone/favicon-32x32.png
deleted file mode 100644
index bd39a8b..0000000
Binary files a/console/stand-alone/favicon-32x32.png and /dev/null differ
diff --git a/console/stand-alone/gulpfile.js b/console/stand-alone/gulpfile.js
deleted file mode 100644
index 6ef121a..0000000
--- a/console/stand-alone/gulpfile.js
+++ /dev/null
@@ -1,256 +0,0 @@
-var license = `/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-`;
-
-const gulp = require('gulp'),
-  mocha = require('gulp-mocha'),
-  gulpif = require('gulp-if'),
-  rollup = require('rollup-stream'),
-  source = require('vinyl-source-stream'),
-  buffer = require('vinyl-buffer'),
-  concat = require('gulp-concat'),
-  uglify = require('gulp-uglify'),
-  terser = require('gulp-terser'),
-  babel = require('gulp-babel'),
-  ngAnnotate = require('gulp-ng-annotate'),
-  cleanCSS = require('gulp-clean-css'),
-  del = require('del'),
-  eslint = require('gulp-eslint'),
-  maps = require('gulp-sourcemaps'),
-  insert = require('gulp-insert'),
-  rename = require('gulp-rename'),
-  fs = require('fs'),
-  tsc = require('gulp-typescript'),
-  tslint = require('gulp-tslint'),
-  through = require('through2');
-
-// temp directory for converted typescript files
-const built_ts = 'built_ts';
-
-// fetch command line arguments
-const arg = (argList => {
-  let arg = {}, a, opt, thisOpt, curOpt;
-  for (a = 0; a < argList.length; a++) {
-    thisOpt = argList[a].trim();
-    opt = thisOpt.replace(/^-+/, '');
-
-    if (opt === thisOpt) {
-      // argument value
-      if (curOpt) arg[curOpt] = opt;
-      curOpt = null;
-    }
-    else {
-      // argument name
-      curOpt = opt;
-      arg[curOpt] = true;
-    }
-  }
-  return arg;
-})(process.argv);
-
-var src = arg.src ? arg.src + '/' : '';
-var production = (arg.target === 'production');
-
-const paths = {
-  typescript: {
-    src: src + 'plugin/**/*.ts',
-    dest: built_ts
-  },
-  styles: {
-    src: src + 'plugin/css/**/*.css',
-    dest: 'dist/css/'
-  },
-  scripts: {
-    src: [src + 'plugin/js/**/*.js'],
-    dest: 'dist/js/'
-  }
-};
-var touch = through.obj(function (file, enc, done) {
-  var now = new Date;
-  fs.utimes(file.path, now, now, done);
-});
-
-var clean = function () {
-  return del(['dist', built_ts]);
-};
-
-var cleanup = function () {
-  return del([built_ts]);
-};
-
-var styles = function () {
-  return gulp.src(paths.styles.src)
-    .pipe(maps.init())
-    .pipe(cleanCSS())
-    .pipe(rename({
-      basename: 'dispatch',
-      suffix: '.min'
-    }))
-    .pipe(insert.prepend(license))
-    .pipe(maps.write('./'))
-    .pipe(gulp.dest(paths.styles.dest));
-};
-
-var vendor_styles = function () {
-  var vendor_lines = fs.readFileSync('vendor-css.txt').toString().split('\n');
-  var vendor_files = vendor_lines.filter(function (line) {
-    return (!line.startsWith('-') && line.length > 0);
-  });
-  return gulp.src(vendor_files)
-    .pipe(maps.init())
-    .pipe(concat('vendor.css'))
-    .pipe(cleanCSS())
-    .pipe(rename({
-      basename: 'vendor',
-      suffix: '.min'
-    }))
-    .pipe(maps.write('./'))
-    .pipe(gulp.dest(paths.styles.dest));
-};
-
-
-var vendor_scripts = function () {
-  var vendor_lines = fs.readFileSync('vendor-js.txt').toString().split('\n');
-  var vendor_files = vendor_lines.filter(function (line) {
-    return (!line.startsWith('-') && line.length > 0);
-  });
-  return gulp.src(vendor_files, { allowEmpty: true })
-    .on('error', function (src) {
-      console.error(src.message);
-      this.emit('end');
-    })
-    .pipe(maps.init())
-    .pipe(uglify())
-    .pipe(concat('vendor.min.js'))
-    .pipe(maps.write('./'))
-    .pipe(gulp.dest(paths.scripts.dest))
-    .pipe(touch);
-};
-
-/*
-function watch() {
-  gulp.watch(paths.scripts.src, scripts);
-  gulp.watch(paths.styles.src, styles);
-}
-*/
-
-var lint = function () {
-  return gulp.src('plugin/**/*.js')
-    .pipe(eslint())
-    .pipe(eslint.format())
-    .pipe(eslint.failAfterError());
-};
-
-//function _typescript() {
-//  return tsProject.src({files: src + 'plugin/**/*.ts'})
-//    .pipe(tsProject())
-//    .js.pipe(gulp.dest('build/dist'));
-//}
-
-var typescript = function () {
-  var tsResult = gulp.src(paths.typescript.src)
-    .pipe(tsc());
-  return tsResult.js.pipe(gulp.dest(paths.typescript.dest));
-};
-
-var ts_lint = function () {
-  return gulp.src('plugin/js/**/*.ts')
-    .pipe(tslint({
-      formatter: 'verbose'
-    }))
-    .pipe(tslint.report());
-};
-
-var scripts = function () {
-  return rollup({
-    input: src + './main.js',
-    sourcemap: true,
-    format: 'es'
-  }).on('error', e => {
-    console.error(`${e.stack}`);
-  })
-
-    // point to the entry file and gives the name of the output file.
-    .pipe(source('main.min.js', src))
-
-    // buffer the output. most gulp plugins, including gulp-sourcemaps, don't support streams.
-    .pipe(buffer())
-
-    // tell gulp-sourcemaps to load the inline sourcemap produced by rollup-stream.
-    .pipe(maps.init({ loadMaps: true }))
-    // transform the code further here.
-    /*
-      .pipe(babel(
-        {presets: [
-          ['env', {
-            targets: {
-              'browsers': [
-                'Chrome >= 52',
-                'FireFox >= 44',
-                'Safari >= 7',
-                'Explorer 11',
-                'last 4 Edge versions'
-              ]
-            },
-            useBuiltIns: true,
-            //debug: true
-          }],
-          'es2015'
-        ],
-        'ignore': [
-          'node_modules'
-        ]
-        }
-      ))
-      */
-    .pipe(ngAnnotate())
-    //.pipe(gulpif(production, uglify()))
-    .pipe(gulpif(production, terser()))
-    .pipe(gulpif(production, insert.prepend(license)))
-    // write the sourcemap alongside the output file.
-    .pipe(maps.write('.'))
-
-    // and output to ./dist/main.js as normal.
-    .pipe(gulp.dest(paths.scripts.dest));
-};
-
-var test = function () {
-  return gulp.src(['test/**/*.js'], { read: false })
-    .pipe(mocha({ require: ['babel-core/register'], exit: true }))
-    .on('error', console.error);
-};
-
-var build = gulp.series(
-  clean,                          // removes the dist/ dir
-  lint,                           // lints the .js
-  gulp.parallel(vendor_styles, vendor_scripts, styles), // uglify and concat
-  cleanup                         // remove .js that were converted from .ts
-);
-var vendor = gulp.parallel(vendor_styles, vendor_scripts);
-
-exports.clean = clean;
-exports.build = build;
-exports.lint = lint;
-exports.tslint = ts_lint;
-exports.tsc = typescript;
-exports.scripts = scripts;
-exports.styles = styles;
-exports.vendor = vendor;
-exports.test = test;
-exports.build = build;
diff --git a/console/stand-alone/index.html b/console/stand-alone/index.html
deleted file mode 100644
index 6c7b50d..0000000
--- a/console/stand-alone/index.html
+++ /dev/null
@@ -1,142 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-<html xmlns:ng="https://angularjs.org">
-
-<head>
-    <meta charset="utf-8" />
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title></title>
-
-    <link rel="shortcut icon" type="image/png" href="favicon-32x32.png" sizes="32x32" />
-
-    <link rel="stylesheet" href="css/vendor.min.css" type="text/css" />
-    <link rel="stylesheet" href="css/dispatch.min.css" type="text/css" />
-
-    <style>
-        #installError {
-            display: none;
-        }
-    </style>
-</head>
-
-<body ng-app="QDR" ng-controller="QDR.Core">
-
-
-    <nav class="navbar navbar-default navbar-pf navbar-fixed-top" role="navigation">
-        <div class="navbar-header">
-            <button type='button' class='navbar-toggle left page-menu-button' ng-click="pageMenuClicked()"
-                data-toggle="collapse" data-target=".page-menu">
-                <span class="sr-only">Toggle navigation</span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-            </button>
-            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse-1">
-                <span class="sr-only">Toggle navigation</span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-                <span class="icon-bar"></span>
-            </button>
-            <span class="logo">{{console_logo}}</span>
-            <div class="masthead-icons">
-                <div class="about" ng-controller="QDR.AboutController" title="About this console">
-                    <span class="fa fa-question-circle-o" ng-click="open()"></span>
-                    <pf-about-modal is-open="isOpen" on-close="onClose()" additional-info="additionalInfo"
-                        product-info="productInfo" title="title" copyright="copyright" img-alt="imgAlt"
-                        img-src="imgSrc">
-                    </pf-about-modal>
-                </div>
-                <span class="pf pficon-user"></span>
-                <span class="user-name">{{user}}</span>
-                <div class="dropdown">
-                    <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1"
-                        data-toggle="dropdown">
-                        <span class="caret"></span>
-                    </button>
-                    <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
-                        <!-- logout is method of QDR.Core -->
-                        <li role="presentation" ng-click="logout()">
-                            <a role="menuitem" tabindex="-1">Log out</a>
-                        </li>
-                    </ul>
-                </div>
-            </div>
-        </div>
-
-        <div class="collapse navbar-collapse navbar-collapse-1">
-            <ul class="nav navbar-nav navbar-primary" ng-controller="QDR.NavBarController">
-                <li ng-repeat="link in breadcrumbs" title="{{link.title}}" ng-show="isValid(link)"
-                    ng-class='{active : isActive(link.href), "pull-right" : isRight(link), haschart: hasChart(link)}'>
-                    <a ng-href="{{link.href}}{{hash}}" ng-bind-html="link.content"></a>
-                </li>
-            </ul>
-        </div>
-    </nav>
-
-    <div class="container-fluid">
-        <div class="row">
-            <div id="main_container" class="col-md-12">
-                <div ng-view>
-                    <div id="installError">There was an error when installing the console. Please run make install for
-                        the router and check for errors.</div>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <script type="module" src="main.js"></script>
-    <script type="text/javascript" src="js/vendor.min.js"></script>
-    <script defer nomodule>
-        var installError = document.getElementById('installError');
-        if (installError) {
-            installError.innerHTML = 'This browser is not supported because it does not support es-2015 modules. <a href="https://www.ecma-international.org/ecma-262/6.0/">https://www.ecma-international.org/ecma-262/6.0/</a><br/>Please use a different browser.';
-        }
-    </script>
-
-    <script>
-        // If angular hasn't loaded a page after 1 second, display the error message
-        setTimeout(function () {
-            var installError = document.getElementById('installError');
-            if (installError)
-                installError.style.display = "block";
-        }, 1000);
-        $(function () {
-            $('.nav a').on('click', function () {
-                $('.navbar-collapse').collapse('hide');
-            });
-        })
-    </script>
-
-    <script type="text/ng-template" id="confirmKill.html">
-        <div class="modal-header">
-            <h3 class="modal-title">Confirm close of {{name}}</h3>
-        </div>
-        <div class="modal-body">
-            Are you sure you want to close this connection?
-        </div>
-        <div class="modal-footer">
-            <button class="btn btn-danger" type="button" ng-click="ok()">Close</button>
-            <button class="btn btn-secondary" type="button" ng-click="cancel()">Cancel</button>
-        </div>
-    </script>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/console/stand-alone/main.js b/console/stand-alone/main.js
deleted file mode 100644
index 0400876..0000000
--- a/console/stand-alone/main.js
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-/* global angular d3 */
-
-/**
- * @module QDR
- * @main QDR
- *
- * The main entry point for the QDR module
- *
- */
-
-//import angular from 'angular';
-import {
-  QDRLogger,
-  QDRTemplatePath,
-  QDR_LAST_LOCATION,
-  getConfigVars
-} from "./plugin/js/qdrGlobals.js";
-import { QDRService } from "./plugin/js/qdrService.js";
-import { QDRChartService } from "./plugin/js/qdrChartService.js";
-import { NavBarController } from "./plugin/js/navbar.js";
-import { OverviewController } from "./plugin/js/qdrOverview.js";
-import { OverviewChartsController } from "./plugin/js/qdrOverviewChartsController.js";
-import { OverviewLogsController } from "./plugin/js/qdrOverviewLogsController.js";
-import { OverviewKillController } from "./plugin/js/qdrOverviewKillController.js";
-import { TopologyController } from "./plugin/js/topology/qdrTopology.js";
-import { ChordController } from "./plugin/js/chord/qdrChord.js";
-import { ListController } from "./plugin/js/qdrList.js";
-import { TopAddressesController } from "./plugin/js/qdrTopAddressesController.js";
-import { DelayedDeliveriesController } from "./plugin/js/qdrDelayedDeliveriesController.js";
-import { ChartDialogController } from "./plugin/js/dlgChartController.js";
-import {
-  DetailDialogController,
-  SubTable
-} from "./plugin/js/dlgDetailController.js";
-import { RouterDialogController } from "./plugin/js/dlgRouterController.js";
-import { SettingsController } from "./plugin/js/qdrSettings.js";
-import { SchemaController } from "./plugin/js/qdrSchema.js";
-import { ChartsController } from "./plugin/js/qdrCharts.js";
-import { AboutController } from "./plugin/js/qdrAbout.js";
-import { posint } from "./plugin/js/posintDirective.js";
-
-(function(QDR) {
-  /**
-   * This plugin's angularjs module instance
-   */
-  QDR.module = angular.module("QDR", [
-    "ngRoute",
-    "ngSanitize",
-    "ngResource",
-    "ui.bootstrap",
-    "ui.grid",
-    "ui.grid.selection",
-    "ui.grid.autoResize",
-    "ui.grid.resizeColumns",
-    "ui.grid.saveState",
-    "ui.slider",
-    "ui.checkbox",
-    "patternfly.charts",
-    "patternfly.card",
-    "patternfly.modals"
-  ]);
-
-  // set up the routing for this plugin
-  QDR.module.config(function($routeProvider) {
-    $routeProvider
-      .when("/", {
-        templateUrl: QDRTemplatePath + "qdrOverview.html"
-      })
-      .when("/overview", {
-        templateUrl: QDRTemplatePath + "qdrOverview.html"
-      })
-      .when("/topology", {
-        templateUrl: QDRTemplatePath + "qdrTopology.html"
-      })
-      .when("/list", {
-        templateUrl: QDRTemplatePath + "qdrList.html"
-      })
-      .when("/schema", {
-        templateUrl: QDRTemplatePath + "qdrSchema.html"
-      })
-      .when("/charts", {
-        templateUrl: QDRTemplatePath + "qdrCharts.html"
-      })
-      .when("/chord", {
-        templateUrl: QDRTemplatePath + "qdrChord.html"
-      })
-      .when("/connect", {
-        templateUrl: QDRTemplatePath + "qdrConnect.html"
-      });
-  });
-
-  QDR.module.config(function($compileProvider) {
-    $compileProvider.aHrefSanitizationWhitelist(
-      /^\s*(https?|ftp|mailto|chrome-extension|file|blob):/
-    );
-    $compileProvider.imgSrcSanitizationWhitelist(
-      /^\s*(https?|ftp|mailto|chrome-extension):/
-    );
-  });
-
-  QDR.module.filter("to_trusted", [
-    "$sce",
-    function($sce) {
-      return function(text) {
-        return $sce.trustAsHtml(text + "");
-      };
-    }
-  ]);
-
-  QDR.module.filter("humanify", [
-    "QDRService",
-    function(QDRService) {
-      return function(input) {
-        return QDRService.utilities.humanify(input);
-      };
-    }
-  ]);
-
-  QDR.module.filter("Pascalcase", function() {
-    return function(str) {
-      if (!str) return "";
-      return str.replace(/(\w)(\w*)/g, function(g0, g1, g2) {
-        return g1.toUpperCase() + g2.toLowerCase();
-      });
-    };
-  });
-
-  QDR.module.filter("safePlural", function() {
-    return function(str) {
-      var es = ["x", "ch", "ss", "sh"];
-      for (var i = 0; i < es.length; ++i) {
-        if (str.endsWith(es[i])) return str + "es";
-      }
-      if (str.endsWith("y")) return str.substr(0, str.length - 2) + "ies";
-      if (str.endsWith("s")) return str;
-      return str + "s";
-    };
-  });
-
-  QDR.module.filter("pretty", function() {
-    return function(str) {
-      var formatComma = d3.format(",");
-      if (!isNaN(parseFloat(str)) && isFinite(str)) return formatComma(str);
-      return str;
-    };
-  });
-
-  QDR.module.filter("truncate", function() {
-    return function(str) {
-      if (!isNaN(parseFloat(str)) && isFinite(str)) return Math.round(str);
-      return str;
-    };
-  });
-  // one-time initialization happens in the run function
-  // of our module
-  QDR.module.run([
-    "$rootScope",
-    "$route",
-    "$timeout",
-    "$location",
-    "$log",
-    "QDRService",
-    "QDRChartService",
-    function(
-      $rootScope,
-      $route,
-      $timeout,
-      $location,
-      $log,
-      QDRService,
-      QDRChartService
-    ) {
-      let QDRLog = new QDRLogger($log, "main");
-      QDRLog.info("************* creating Dispatch Console ************");
-
-      var curPath = $location.path();
-      var org = curPath.substr(1);
-      if (org && org.length > 0 && org !== "connect") {
-        $location.search("org", org);
-      } else {
-        $location.search("org", null);
-      }
-      QDR.queue = d3.queue;
-
-      if (!QDRService.management.connection.is_connected()) {
-        // attempt to connect to the host:port that served this page
-        var host = $location.host();
-        var port = $location.port();
-        var search = $location.search();
-        if (search.org) {
-          if (search.org === "connect") $location.search("org", "overview");
-        }
-        var connectOptions = { address: host, port: port };
-        QDRLog.info(
-          "Attempting AMQP over websockets connection using address:port of browser (" +
-            host +
-            ":" +
-            port +
-            ")"
-        );
-        QDRService.management.connection.testConnect(connectOptions).then(
-          function() {
-            // We didn't connect with reconnect: true flag.
-            // The reason being that if we used reconnect:true and the connection failed, rhea would keep trying. There
-            // doesn't appear to be a way to tell it to stop trying to reconnect.
-            QDRService.disconnect();
-            QDRLog.info("Connect succeeded. Using address:port of browser");
-            connectOptions.reconnect = true;
-            // complete the connection (create the sender/receiver)
-            QDRService.connect(connectOptions).then(function() {
-              // register a callback for when the node list is available (needed for loading saved charts)
-              QDRService.management.topology.addUpdatedAction(
-                "initChartService",
-                function() {
-                  QDRService.management.topology.delUpdatedAction(
-                    "initChartService"
-                  );
-                  QDRChartService.init(); // initialize charting service after we are connected
-                }
-              );
-              // get the list of nodes
-              QDRService.management.topology.startUpdating(false);
-            });
-          },
-          function() {
-            QDRLog.info("failed to auto-connect to " + host + ":" + port);
-            QDRLog.info("redirecting to connect page");
-            $timeout(function() {
-              $location.path("/connect");
-              $location.search("org", org);
-              $location.replace();
-            });
-          }
-        );
-      }
-
-      $rootScope.$on("$routeChangeSuccess", function() {
-        var path = $location.path();
-        if (path !== "/connect") {
-          localStorage[QDR_LAST_LOCATION] = path;
-        }
-      });
-    }
-  ]);
-
-  QDR.module.controller("QDR.MainController", [
-    "$scope",
-    "$log",
-    "$location",
-    function($scope, $log, $location) {
-      let QDRLog = new QDRLogger($log, "MainController");
-      QDRLog.debug(
-        "started QDR.MainController with location.url: " + $location.url()
-      );
-      QDRLog.debug(
-        "started QDR.MainController with window.location.pathname : " +
-          window.location.pathname
-      );
-      $scope.topLevelTabs = [];
-      $scope.topLevelTabs.push({
-        id: "qdr",
-        content: document.title,
-        title: document.title,
-        isValid: function() {
-          return true;
-        },
-        href: function() {
-          return "#connect";
-        },
-        isActive: function() {
-          return true;
-        }
-      });
-    }
-  ]);
-
-  QDR.module.controller("QDR.Core", function(
-    $scope,
-    $rootScope,
-    $timeout,
-    QDRService
-  ) {
-    $scope.console_logo = "";
-    getConfigVars().then(response => {
-      $timeout(function() {
-        $scope.console_logo = response.QDR_CONSOLE_TITLE;
-      });
-    });
-    $scope.alerts = [];
-    $scope.breadcrumb = {};
-    $scope.closeAlert = function(index) {
-      $scope.alerts.splice(index, 1);
-    };
-    $scope.$on("setCrumb", function(event, data) {
-      $scope.breadcrumb = data;
-    });
-    $scope.$on("newAlert", function(event, data) {
-      $scope.alerts.push(data);
-      $scope.$apply();
-    });
-    $scope.$on("clearAlerts", function() {
-      $scope.alerts = [];
-      $scope.$apply();
-    });
-    $scope.pageMenuClicked = function() {
-      $rootScope.$broadcast("pageMenuClicked");
-    };
-    $scope.logout = function() {
-      QDRService.disconnect();
-      location.href = "#/connect";
-    };
-    $scope.user = "";
-    let onConnected = function() {
-      if (!QDRService.management.connection.is_connected()) {
-        setTimeout(onConnected, 1000);
-        return;
-      }
-      QDRService.management.connection.addDisconnectAction(onDisconnect);
-      let parts = QDRService.management.connection
-        .getReceiverAddress()
-        .split("/");
-      parts[parts.length - 1] = "$management";
-      let router = parts.join("/");
-      QDRService.management.topology.fetchEntity(
-        router,
-        "connection",
-        [],
-        function(nodeId, entity, response) {
-          $timeout(function() {
-            response.results.some(result => {
-              let c = QDRService.utilities.flatten(
-                response.attributeNames,
-                result
-              );
-              if (QDRService.utilities.isConsole(c)) {
-                $scope.user = c.user;
-                return true;
-              }
-              return false;
-            });
-          });
-        }
-      );
-    };
-
-    let onDisconnect = function() {
-      QDRService.management.connection.addConnectAction(onConnected);
-      $timeout(() => {
-        $scope.user = "";
-      });
-    };
-    onDisconnect();
-  });
-
-  QDR.module.controller("QDR.NavBarController", NavBarController);
-  QDR.module.controller("QDR.OverviewController", OverviewController);
-  QDR.module.controller(
-    "QDR.OverviewChartsController",
-    OverviewChartsController
-  );
-  QDR.module.controller("QDR.OverviewLogsController", OverviewLogsController);
-  QDR.module.controller("QDR.OverviewKillController", OverviewKillController);
-  QDR.module.controller("QDR.TopAddressesController", TopAddressesController);
-  QDR.module.controller(
-    "QDR.DelayedDeliveriesController",
-    DelayedDeliveriesController
-  );
-  QDR.module.controller("QDR.ChartDialogController", ChartDialogController);
-  QDR.module.controller("QDR.DetailDialogController", DetailDialogController);
-  QDR.module.controller("QDR.RouterDialogController", RouterDialogController);
-  QDR.module.controller("QDR.SettingsController", SettingsController);
-  QDR.module.controller("QDR.TopologyController", TopologyController);
-  QDR.module.controller("QDR.ChordController", ChordController);
-  QDR.module.controller("QDR.ListController", ListController);
-  QDR.module.controller("QDR.SchemaController", SchemaController);
-  QDR.module.controller("QDR.ChartsController", ChartsController);
-  QDR.module.controller("QDR.AboutController", AboutController);
-
-  QDR.module.service("QDRService", QDRService);
-  QDR.module.service("QDRChartService", QDRChartService);
-  QDR.module.directive("posint", posint);
-  QDR.module.directive("subTable", SubTable.create);
-  //  .directive('exampleDirective', () => new ExampleDirective);
-})({});
diff --git a/console/stand-alone/package-lock.json b/console/stand-alone/package-lock.json
deleted file mode 100644
index 1b8bb88..0000000
--- a/console/stand-alone/package-lock.json
+++ /dev/null
@@ -1,11342 +0,0 @@
-{
-  "name": "dispatch-console-stand-alone",
-  "version": "1.1.0",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@babel/code-frame": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
-      "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
-      "dev": true,
-      "requires": {
-        "@babel/highlight": "^7.0.0"
-      }
-    },
-    "@babel/core": {
-      "version": "7.6.4",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.4.tgz",
-      "integrity": "sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.5.5",
-        "@babel/generator": "^7.6.4",
-        "@babel/helpers": "^7.6.2",
-        "@babel/parser": "^7.6.4",
-        "@babel/template": "^7.6.0",
-        "@babel/traverse": "^7.6.3",
-        "@babel/types": "^7.6.3",
-        "convert-source-map": "^1.1.0",
-        "debug": "^4.1.0",
-        "json5": "^2.1.0",
-        "lodash": "^4.17.13",
-        "resolve": "^1.3.2",
-        "semver": "^5.4.1",
-        "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "json5": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
-          "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
-          "dev": true,
-          "requires": {
-            "minimist": "^1.2.0"
-          }
-        },
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "@babel/generator": {
-      "version": "7.6.4",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.4.tgz",
-      "integrity": "sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.6.3",
-        "jsesc": "^2.5.1",
-        "lodash": "^4.17.13",
-        "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "2.5.2",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "@babel/helper-annotate-as-pure": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
-      "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
-      "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-call-delegate": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz",
-      "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-hoist-variables": "^7.4.4",
-        "@babel/traverse": "^7.4.4",
-        "@babel/types": "^7.4.4"
-      }
-    },
-    "@babel/helper-define-map": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz",
-      "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/types": "^7.5.5",
-        "lodash": "^4.17.13"
-      }
-    },
-    "@babel/helper-explode-assignable-expression": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
-      "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
-      "dev": true,
-      "requires": {
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-function-name": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
-      "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-get-function-arity": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
-      "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-hoist-variables": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz",
-      "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.4.4"
-      }
-    },
-    "@babel/helper-member-expression-to-functions": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz",
-      "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.5.5"
-      }
-    },
-    "@babel/helper-module-imports": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
-      "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-module-transforms": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz",
-      "integrity": "sha512-jBeCvETKuJqeiaCdyaheF40aXnnU1+wkSiUs/IQg3tB85up1LyL8x77ClY8qJpuRJUcXQo+ZtdNESmZl4j56Pw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-simple-access": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.4.4",
-        "@babel/template": "^7.4.4",
-        "@babel/types": "^7.5.5",
-        "lodash": "^4.17.13"
-      }
-    },
-    "@babel/helper-optimise-call-expression": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
-      "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-plugin-utils": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz",
-      "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==",
-      "dev": true
-    },
-    "@babel/helper-regex": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
-      "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.13"
-      }
-    },
-    "@babel/helper-remap-async-to-generator": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
-      "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-wrap-function": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-replace-supers": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz",
-      "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.5.5",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/traverse": "^7.5.5",
-        "@babel/types": "^7.5.5"
-      }
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
-      "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
-      "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.4.4"
-      }
-    },
-    "@babel/helper-wrap-function": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
-      "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/template": "^7.1.0",
-        "@babel/traverse": "^7.1.0",
-        "@babel/types": "^7.2.0"
-      }
-    },
-    "@babel/helpers": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.6.2.tgz",
-      "integrity": "sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.6.0",
-        "@babel/traverse": "^7.6.2",
-        "@babel/types": "^7.6.0"
-      }
-    },
-    "@babel/highlight": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
-      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
-      "dev": true,
-      "requires": {
-        "chalk": "^2.0.0",
-        "esutils": "^2.0.2",
-        "js-tokens": "^4.0.0"
-      },
-      "dependencies": {
-        "js-tokens": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/parser": {
-      "version": "7.6.4",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.4.tgz",
-      "integrity": "sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A==",
-      "dev": true
-    },
-    "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
-      "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0",
-        "@babel/plugin-syntax-async-generators": "^7.2.0"
-      }
-    },
-    "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz",
-      "integrity": "sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-dynamic-import": "^7.2.0"
-      }
-    },
-    "@babel/plugin-proposal-json-strings": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
-      "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-json-strings": "^7.2.0"
-      }
-    },
-    "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz",
-      "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
-      }
-    },
-    "@babel/plugin-proposal-optional-catch-binding": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
-      "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
-      }
-    },
-    "@babel/plugin-proposal-unicode-property-regex": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz",
-      "integrity": "sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.6.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        },
-        "regexpu-core": {
-          "version": "4.6.0",
-          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
-          "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
-          "dev": true,
-          "requires": {
-            "regenerate": "^1.4.0",
-            "regenerate-unicode-properties": "^8.1.0",
-            "regjsgen": "^0.5.0",
-            "regjsparser": "^0.6.0",
-            "unicode-match-property-ecmascript": "^1.0.4",
-            "unicode-match-property-value-ecmascript": "^1.1.0"
-          }
-        },
-        "regjsgen": {
-          "version": "0.5.1",
-          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
-          "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
-          "dev": true
-        },
-        "regjsparser": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
-          "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
-          "dev": true,
-          "requires": {
-            "jsesc": "~0.5.0"
-          }
-        }
-      }
-    },
-    "@babel/plugin-syntax-async-generators": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
-      "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-dynamic-import": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
-      "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-json-strings": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
-      "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
-      "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
-      "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-arrow-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
-      "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-async-to-generator": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz",
-      "integrity": "sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-remap-async-to-generator": "^7.1.0"
-      }
-    },
-    "@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
-      "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-block-scoping": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz",
-      "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "lodash": "^4.17.13"
-      }
-    },
-    "@babel/plugin-transform-classes": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz",
-      "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-define-map": "^7.5.5",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-optimise-call-expression": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.5.5",
-        "@babel/helper-split-export-declaration": "^7.4.4",
-        "globals": "^11.1.0"
-      },
-      "dependencies": {
-        "globals": {
-          "version": "11.12.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/plugin-transform-computed-properties": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
-      "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-destructuring": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz",
-      "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-dotall-regex": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz",
-      "integrity": "sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.6.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        },
-        "regexpu-core": {
-          "version": "4.6.0",
-          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
-          "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
-          "dev": true,
-          "requires": {
-            "regenerate": "^1.4.0",
-            "regenerate-unicode-properties": "^8.1.0",
-            "regjsgen": "^0.5.0",
-            "regjsparser": "^0.6.0",
-            "unicode-match-property-ecmascript": "^1.0.4",
-            "unicode-match-property-value-ecmascript": "^1.1.0"
-          }
-        },
-        "regjsgen": {
-          "version": "0.5.1",
-          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
-          "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
-          "dev": true
-        },
-        "regjsparser": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
-          "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
-          "dev": true,
-          "requires": {
-            "jsesc": "~0.5.0"
-          }
-        }
-      }
-    },
-    "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz",
-      "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
-      "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-for-of": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz",
-      "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-function-name": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz",
-      "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
-      "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz",
-      "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-modules-amd": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz",
-      "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
-      }
-    },
-    "@babel/plugin-transform-modules-commonjs": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz",
-      "integrity": "sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.4.4",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-simple-access": "^7.1.0",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
-      }
-    },
-    "@babel/plugin-transform-modules-systemjs": {
-      "version": "7.5.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz",
-      "integrity": "sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-hoist-variables": "^7.4.4",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "babel-plugin-dynamic-import-node": "^2.3.0"
-      }
-    },
-    "@babel/plugin-transform-modules-umd": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
-      "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-transforms": "^7.1.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz",
-      "integrity": "sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw==",
-      "dev": true,
-      "requires": {
-        "regexpu-core": "^4.6.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        },
-        "regexpu-core": {
-          "version": "4.6.0",
-          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
-          "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
-          "dev": true,
-          "requires": {
-            "regenerate": "^1.4.0",
-            "regenerate-unicode-properties": "^8.1.0",
-            "regjsgen": "^0.5.0",
-            "regjsparser": "^0.6.0",
-            "unicode-match-property-ecmascript": "^1.0.4",
-            "unicode-match-property-value-ecmascript": "^1.1.0"
-          }
-        },
-        "regjsgen": {
-          "version": "0.5.1",
-          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
-          "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
-          "dev": true
-        },
-        "regjsparser": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
-          "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
-          "dev": true,
-          "requires": {
-            "jsesc": "~0.5.0"
-          }
-        }
-      }
-    },
-    "@babel/plugin-transform-new-target": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz",
-      "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-object-super": {
-      "version": "7.5.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz",
-      "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-replace-supers": "^7.5.5"
-      }
-    },
-    "@babel/plugin-transform-parameters": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz",
-      "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-call-delegate": "^7.4.4",
-        "@babel/helper-get-function-arity": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-property-literals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz",
-      "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-regenerator": {
-      "version": "7.4.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz",
-      "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==",
-      "dev": true,
-      "requires": {
-        "regenerator-transform": "^0.14.0"
-      },
-      "dependencies": {
-        "regenerator-transform": {
-          "version": "0.14.1",
-          "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
-          "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
-          "dev": true,
-          "requires": {
-            "private": "^0.1.6"
-          }
-        }
-      }
-    },
-    "@babel/plugin-transform-reserved-words": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz",
-      "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
-      "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-spread": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz",
-      "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-sticky-regex": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
-      "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-template-literals": {
-      "version": "7.4.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz",
-      "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-annotate-as-pure": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
-      "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0"
-      }
-    },
-    "@babel/plugin-transform-unicode-regex": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz",
-      "integrity": "sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/helper-regex": "^7.4.4",
-        "regexpu-core": "^4.6.0"
-      },
-      "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
-          "dev": true
-        },
-        "regexpu-core": {
-          "version": "4.6.0",
-          "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
-          "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
-          "dev": true,
-          "requires": {
-            "regenerate": "^1.4.0",
-            "regenerate-unicode-properties": "^8.1.0",
-            "regjsgen": "^0.5.0",
-            "regjsparser": "^0.6.0",
-            "unicode-match-property-ecmascript": "^1.0.4",
-            "unicode-match-property-value-ecmascript": "^1.1.0"
-          }
-        },
-        "regjsgen": {
-          "version": "0.5.1",
-          "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
-          "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
-          "dev": true
-        },
-        "regjsparser": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
-          "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
-          "dev": true,
-          "requires": {
-            "jsesc": "~0.5.0"
-          }
-        }
-      }
-    },
-    "@babel/preset-env": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.3.tgz",
-      "integrity": "sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.0.0",
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
-        "@babel/plugin-proposal-dynamic-import": "^7.5.0",
-        "@babel/plugin-proposal-json-strings": "^7.2.0",
-        "@babel/plugin-proposal-object-rest-spread": "^7.6.2",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.6.2",
-        "@babel/plugin-syntax-async-generators": "^7.2.0",
-        "@babel/plugin-syntax-dynamic-import": "^7.2.0",
-        "@babel/plugin-syntax-json-strings": "^7.2.0",
-        "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
-        "@babel/plugin-transform-arrow-functions": "^7.2.0",
-        "@babel/plugin-transform-async-to-generator": "^7.5.0",
-        "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
-        "@babel/plugin-transform-block-scoping": "^7.6.3",
-        "@babel/plugin-transform-classes": "^7.5.5",
-        "@babel/plugin-transform-computed-properties": "^7.2.0",
-        "@babel/plugin-transform-destructuring": "^7.6.0",
-        "@babel/plugin-transform-dotall-regex": "^7.6.2",
-        "@babel/plugin-transform-duplicate-keys": "^7.5.0",
-        "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
-        "@babel/plugin-transform-for-of": "^7.4.4",
-        "@babel/plugin-transform-function-name": "^7.4.4",
-        "@babel/plugin-transform-literals": "^7.2.0",
-        "@babel/plugin-transform-member-expression-literals": "^7.2.0",
-        "@babel/plugin-transform-modules-amd": "^7.5.0",
-        "@babel/plugin-transform-modules-commonjs": "^7.6.0",
-        "@babel/plugin-transform-modules-systemjs": "^7.5.0",
-        "@babel/plugin-transform-modules-umd": "^7.2.0",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.3",
-        "@babel/plugin-transform-new-target": "^7.4.4",
-        "@babel/plugin-transform-object-super": "^7.5.5",
-        "@babel/plugin-transform-parameters": "^7.4.4",
-        "@babel/plugin-transform-property-literals": "^7.2.0",
-        "@babel/plugin-transform-regenerator": "^7.4.5",
-        "@babel/plugin-transform-reserved-words": "^7.2.0",
-        "@babel/plugin-transform-shorthand-properties": "^7.2.0",
-        "@babel/plugin-transform-spread": "^7.6.2",
-        "@babel/plugin-transform-sticky-regex": "^7.2.0",
-        "@babel/plugin-transform-template-literals": "^7.4.4",
-        "@babel/plugin-transform-typeof-symbol": "^7.2.0",
-        "@babel/plugin-transform-unicode-regex": "^7.6.2",
-        "@babel/types": "^7.6.3",
-        "browserslist": "^4.6.0",
-        "core-js-compat": "^3.1.1",
-        "invariant": "^2.2.2",
-        "js-levenshtein": "^1.1.3",
-        "semver": "^5.5.0"
-      },
-      "dependencies": {
-        "browserslist": {
-          "version": "4.7.2",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
-          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
-          "dev": true,
-          "requires": {
-            "caniuse-lite": "^1.0.30001004",
-            "electron-to-chromium": "^1.3.295",
-            "node-releases": "^1.1.38"
-          }
-        },
-        "caniuse-lite": {
-          "version": "1.0.30001006",
-          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz",
-          "integrity": "sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw==",
-          "dev": true
-        },
-        "electron-to-chromium": {
-          "version": "1.3.296",
-          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz",
-          "integrity": "sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/template": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz",
-      "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@babel/parser": "^7.6.0",
-        "@babel/types": "^7.6.0"
-      }
-    },
-    "@babel/traverse": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.3.tgz",
-      "integrity": "sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.5.5",
-        "@babel/generator": "^7.6.3",
-        "@babel/helper-function-name": "^7.1.0",
-        "@babel/helper-split-export-declaration": "^7.4.4",
-        "@babel/parser": "^7.6.3",
-        "@babel/types": "^7.6.3",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0",
-        "lodash": "^4.17.13"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "globals": {
-          "version": "11.12.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/types": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.3.tgz",
-      "integrity": "sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.13",
-        "to-fast-properties": "^2.0.0"
-      },
-      "dependencies": {
-        "to-fast-properties": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-          "dev": true
-        }
-      }
-    },
-    "@gulp-sourcemaps/identity-map": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz",
-      "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==",
-      "dev": true,
-      "requires": {
-        "acorn": "^5.0.3",
-        "css": "^2.2.1",
-        "normalize-path": "^2.1.1",
-        "source-map": "^0.6.0",
-        "through2": "^2.0.3"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "5.7.3",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
-          "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
-          "dev": true
-        },
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "@gulp-sourcemaps/map-sources": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz",
-      "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^2.0.1",
-        "through2": "^2.0.3"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
-      "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "2.0.3",
-        "run-parallel": "^1.1.9"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
-      "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
-      "dev": true
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
-      "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.scandir": "2.1.3",
-        "fastq": "^1.6.0"
-      }
-    },
-    "@types/c3": {
-      "version": "0.6.4",
-      "resolved": "https://registry.npmjs.org/@types/c3/-/c3-0.6.4.tgz",
-      "integrity": "sha512-W7i7oSmHsXYhseZJsIYexelv9HitGsWdQhx3mcy4NWso+GedpCYr02ghpkNvnZ4oTIjNeISdrOnM70s7HiuV+g==",
-      "optional": true,
-      "requires": {
-        "@types/d3": "^4"
-      }
-    },
-    "@types/d3": {
-      "version": "4.13.2",
-      "resolved": "https://registry.npmjs.org/@types/d3/-/d3-4.13.2.tgz",
-      "integrity": "sha512-jaMix9nFUgLeBSdU0md3usx5BaZfnO9Z0idyRmEq7mo7Ux7FpenW1SvyLXI0e59BtrgyPGNHMaZ0y2rJcSCMiw==",
-      "optional": true,
-      "requires": {
-        "@types/d3-array": "^1",
-        "@types/d3-axis": "*",
-        "@types/d3-brush": "*",
-        "@types/d3-chord": "*",
-        "@types/d3-collection": "*",
-        "@types/d3-color": "*",
-        "@types/d3-dispatch": "*",
-        "@types/d3-drag": "*",
-        "@types/d3-dsv": "*",
-        "@types/d3-ease": "*",
-        "@types/d3-force": "*",
-        "@types/d3-format": "*",
-        "@types/d3-geo": "*",
-        "@types/d3-hierarchy": "*",
-        "@types/d3-interpolate": "*",
-        "@types/d3-path": "*",
-        "@types/d3-polygon": "*",
-        "@types/d3-quadtree": "*",
-        "@types/d3-queue": "*",
-        "@types/d3-random": "*",
-        "@types/d3-request": "*",
-        "@types/d3-scale": "^1",
-        "@types/d3-selection": "*",
-        "@types/d3-shape": "*",
-        "@types/d3-time": "*",
-        "@types/d3-time-format": "*",
-        "@types/d3-timer": "*",
-        "@types/d3-transition": "*",
-        "@types/d3-voronoi": "*",
-        "@types/d3-zoom": "*"
-      }
-    },
-    "@types/d3-array": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.7.tgz",
-      "integrity": "sha512-51vHWuUyDOi+8XuwPrTw3cFqyh2Slg9y8COYkRfjCPG9TfYqY0hoNPzv/8BrcAy0FeQBzqEo/D/8Nk2caOQJnA==",
-      "optional": true
-    },
-    "@types/d3-axis": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.12.tgz",
-      "integrity": "sha512-BZISgSD5M8TgURyNtcPAmUB9sk490CO1Thb6/gIn0WZTt3Y50IssX+2Z0vTccoqZksUDTep0b+o4ofXslvNbqg==",
-      "optional": true,
-      "requires": {
-        "@types/d3-selection": "*"
-      }
-    },
-    "@types/d3-brush": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.0.10.tgz",
-      "integrity": "sha512-J8jREATIrfJaAfhJivqaEKPnJsRlwwrOPje+ABqZFgamADjll+q9zaDXnYyjiGPPsiJEU+Qq9jQi5rECxIOfhg==",
-      "optional": true,
-      "requires": {
-        "@types/d3-selection": "*"
-      }
-    },
-    "@types/d3-chord": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.9.tgz",
-      "integrity": "sha512-UA6lI9CVW5cT5Ku/RV4hxoFn4mKySHm7HEgodtfRthAj1lt9rKZEPon58vyYfk+HIAm33DtJJgZwMXy2QgyPXw==",
-      "optional": true
-    },
-    "@types/d3-collection": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.8.tgz",
-      "integrity": "sha512-y5lGlazdc0HNO0F3UUX2DPE7OmYvd9Kcym4hXwrJcNUkDaypR5pX+apuMikl9LfTxKItJsY9KYvzBulpCKyvuQ==",
-      "optional": true
-    },
-    "@types/d3-color": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.2.2.tgz",
-      "integrity": "sha512-6pBxzJ8ZP3dYEQ4YjQ+NVbQaOflfgXq/JbDiS99oLobM2o72uAST4q6yPxHv6FOTCRC/n35ktuo8pvw/S4M7sw==",
-      "optional": true
-    },
-    "@types/d3-dispatch": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.7.tgz",
-      "integrity": "sha512-M+z84G7UKwK6hEPnGCSccOg8zJ3Nk2hgDQ9sCstHXgsFU0sMxlIZVKqKB5oxUDbALqQG6ucg0G9e8cmOSlishg==",
-      "optional": true
-    },
-    "@types/d3-drag": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.3.tgz",
-      "integrity": "sha512-rWB5SPvkYVxW3sqUxHOJUZwifD0KqvKwvt1bhNqcLpW6Azsd0BJgRNcyVW8GAferaAk5r8dzeZnf9zKlg9+xMQ==",
-      "optional": true,
-      "requires": {
-        "@types/d3-selection": "*"
-      }
-    },
-    "@types/d3-dsv": {
-      "version": "1.0.36",
-      "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.0.36.tgz",
-      "integrity": "sha512-jbIWQ27QJcBNMZbQv0NSQMHnBDCmxghAxePxgyiPH1XPCRkOsTBei7jcdi3fDrUCGpCV3lKrSZFSlOkhUQVClA==",
-      "optional": true
-    },
-    "@types/d3-ease": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.9.tgz",
-      "integrity": "sha512-U5ADevQ+W6fy32FVZZC9EXallcV/Mi12A5Tkd0My5MrC7T8soMQEhlDAg88XUWm0zoCQlB4XV0en/24LvuDB4Q==",
-      "optional": true
-    },
-    "@types/d3-force": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.1.tgz",
-      "integrity": "sha512-jqK+I36uz4kTBjyk39meed5y31Ab+tXYN/x1dn3nZEus9yOHCLc+VrcIYLc/aSQ0Y7tMPRlIhLetulME76EiiA==",
-      "optional": true
-    },
-    "@types/d3-format": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.3.1.tgz",
-      "integrity": "sha512-KAWvReOKMDreaAwOjdfQMm0HjcUMlQG47GwqdVKgmm20vTd2pucj0a70c3gUSHrnsmo6H2AMrkBsZU2UhJLq8A==",
-      "optional": true
-    },
-    "@types/d3-geo": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.11.1.tgz",
-      "integrity": "sha512-Ox8WWOG3igDRoep/dNsGbOiSJYdUG3ew/6z0ETvHyAtXZVBjOE0S96zSSmzgl0gqQ3RdZjn2eeJOj9oRcMZPkQ==",
-      "optional": true,
-      "requires": {
-        "@types/geojson": "*"
-      }
-    },
-    "@types/d3-hierarchy": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.6.tgz",
-      "integrity": "sha512-vvSaIDf/Ov0o3KwMT+1M8+WbnnlRiGjlGD5uvk83a1mPCTd/E5x12bUJ/oP55+wUY/4Kb5kc67rVpVGJ2KUHxg==",
-      "optional": true
-    },
-    "@types/d3-interpolate": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.3.1.tgz",
-      "integrity": "sha512-z8Zmi08XVwe8e62vP6wcA+CNuRhpuUU5XPEfqpG0hRypDE5BWNthQHB1UNWWDB7ojCbGaN4qBdsWp5kWxhT1IQ==",
-      "optional": true,
-      "requires": {
-        "@types/d3-color": "*"
-      }
-    },
-    "@types/d3-path": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.8.tgz",
-      "integrity": "sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA==",
-      "optional": true
-    },
-    "@types/d3-polygon": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.7.tgz",
-      "integrity": "sha512-Xuw0eSjQQKs8jTiNbntWH0S+Xp+JyhqxmQ0YAQ3rDu6c3kKMFfgsaGN7Jv5u3zG6yVX/AsLP/Xs/QRjmi9g43Q==",
-      "optional": true
-    },
-    "@types/d3-quadtree": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
-      "integrity": "sha512-0ajFawWicfjsaCLh6NzxOyVDYhQAmMFbsiI3MPGLInorauHFEh9/Cl6UHNf+kt/J1jfoxKY/ZJaKAoDpbvde5Q==",
-      "optional": true
-    },
-    "@types/d3-queue": {
-      "version": "3.0.8",
-      "resolved": "https://registry.npmjs.org/@types/d3-queue/-/d3-queue-3.0.8.tgz",
-      "integrity": "sha512-1FWOiI/MYwS5Z1Sa9EvS1Xet3isiVIIX5ozD6iGnwHonGcqL+RcC1eThXN5VfDmAiYt9Me9EWNEv/9J9k9RIKQ==",
-      "optional": true
-    },
-    "@types/d3-random": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.2.tgz",
-      "integrity": "sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA==",
-      "optional": true
-    },
-    "@types/d3-request": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@types/d3-request/-/d3-request-1.0.5.tgz",
-      "integrity": "sha512-X+/c/qXp92o056C5Qbcp7jL27YRHpmIqOchHb/WB7NwFFqkBtAircqO7oKWv2GTtX4LyEqiDF9gqXsV+ldOlIg==",
-      "optional": true,
-      "requires": {
-        "@types/d3-dsv": "*"
-      }
-    },
-    "@types/d3-scale": {
-      "version": "1.0.14",
-      "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-1.0.14.tgz",
-      "integrity": "sha512-dW6Ii8bH+10klJzVVPPeeQvRpCbX3BO3x9cLTngu/+lXNDbk2uC51aFAA/XhocehZroaG5ajwAFelMFsgpClMg==",
-      "optional": true,
-      "requires": {
-        "@types/d3-time": "*"
-      }
-    },
-    "@types/d3-selection": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.1.tgz",
-      "integrity": "sha512-bv8IfFYo/xG6dxri9OwDnK3yCagYPeRIjTlrcdYJSx+FDWlCeBDepIHUpqROmhPtZ53jyna0aUajZRk0I3rXNA==",
-      "optional": true
-    },
-    "@types/d3-shape": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.2.tgz",
-      "integrity": "sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==",
-      "optional": true,
-      "requires": {
-        "@types/d3-path": "*"
-      }
-    },
-    "@types/d3-time": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.10.tgz",
-      "integrity": "sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw==",
-      "optional": true
-    },
-    "@types/d3-time-format": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.1.tgz",
-      "integrity": "sha512-tJSyXta8ZyJ52wDDHA96JEsvkbL6jl7wowGmuf45+fAkj5Y+SQOnz0N7/H68OWmPshPsAaWMQh+GAws44IzH3g==",
-      "optional": true
-    },
-    "@types/d3-timer": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.9.tgz",
-      "integrity": "sha512-WvfJ3LFxBbWjqRGz9n7GJt08RrTHPJDVsIwwoCMROlqF+iDacYiAFjf9oqnq0mXpb2juA2N/qjKP+MKdal3YNQ==",
-      "optional": true
-    },
-    "@types/d3-transition": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.1.5.tgz",
-      "integrity": "sha512-4IexeQEmEk2u5/ZxqHPCiKxX+sn7uPsg+wb6zL3KLqj8jFlhcueAo3a5Tj1Z74VBeeeQjirdSFNtR87Gox/iwA==",
-      "optional": true,
-      "requires": {
-        "@types/d3-selection": "*"
-      }
-    },
-    "@types/d3-voronoi": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz",
-      "integrity": "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==",
-      "optional": true
-    },
-    "@types/d3-zoom": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.7.4.tgz",
-      "integrity": "sha512-5jnFo/itYhJeB2khO/lKe730kW/h2EbKMOvY0uNp3+7NdPm4w63DwPEMxifQZ7n902xGYK5DdU67FmToSoy4VA==",
-      "optional": true,
-      "requires": {
-        "@types/d3-interpolate": "*",
-        "@types/d3-selection": "*"
-      }
-    },
-    "@types/events": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
-      "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
-      "dev": true
-    },
-    "@types/fancy-log": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz",
-      "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw==",
-      "dev": true
-    },
-    "@types/geojson": {
-      "version": "7946.0.7",
-      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz",
-      "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==",
-      "optional": true
-    },
-    "@types/glob": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
-      "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
-      "dev": true,
-      "requires": {
-        "@types/events": "*",
-        "@types/minimatch": "*",
-        "@types/node": "*"
-      }
-    },
-    "@types/minimatch": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
-      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
-      "dev": true
-    },
-    "@types/mocha": {
-      "version": "5.2.7",
-      "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz",
-      "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==",
-      "dev": true
-    },
-    "@types/node": {
-      "version": "12.12.3",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.3.tgz",
-      "integrity": "sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw==",
-      "dev": true
-    },
-    "JSONStream": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
-      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
-      "dev": true,
-      "requires": {
-        "jsonparse": "^1.2.0",
-        "through": ">=2.2.7 <3"
-      }
-    },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "dev": true
-    },
-    "acorn": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
-      "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
-      "dev": true
-    },
-    "acorn-jsx": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
-      "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
-      "dev": true
-    },
-    "acorn-node": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
-      "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
-      "dev": true,
-      "requires": {
-        "acorn": "^7.0.0",
-        "acorn-walk": "^7.0.0",
-        "xtend": "^4.0.2"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.1.0",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
-          "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
-          "dev": true
-        },
-        "xtend": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-          "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-          "dev": true
-        }
-      }
-    },
-    "acorn-walk": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz",
-      "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==",
-      "dev": true
-    },
-    "aggregate-error": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
-      "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
-      "dev": true,
-      "requires": {
-        "clean-stack": "^2.0.0",
-        "indent-string": "^4.0.0"
-      }
-    },
-    "ajv": {
-      "version": "6.10.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
-      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
-      "dev": true,
-      "requires": {
-        "fast-deep-equal": "^2.0.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "alter": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz",
-      "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=",
-      "dev": true,
-      "requires": {
-        "stable": "~0.1.3"
-      }
-    },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
-      "dev": true
-    },
-    "angular": {
-      "version": "1.5.11",
-      "resolved": "https://registry.npmjs.org/angular/-/angular-1.5.11.tgz",
-      "integrity": "sha1-jFunOG8VllyazzQp9ogVU6raMNY="
-    },
-    "angular-animate": {
-      "version": "1.5.11",
-      "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.5.11.tgz",
-      "integrity": "sha1-G6pDwwPRuTxOaqiUU7ORFLehxmk="
-    },
-    "angular-bootstrap-checkbox": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/angular-bootstrap-checkbox/-/angular-bootstrap-checkbox-0.5.0.tgz",
-      "integrity": "sha1-zX+oSlN/5+tWnjlhLwVzGCw+MRg="
-    },
-    "angular-drag-and-drop-lists": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/angular-drag-and-drop-lists/-/angular-drag-and-drop-lists-2.0.0.tgz",
-      "integrity": "sha1-oB1EuUzyM8nC1FoxhCyzWp0Igso=",
-      "dev": true,
-      "optional": true
-    },
-    "angular-patternfly": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/angular-patternfly/-/angular-patternfly-5.0.3.tgz",
-      "integrity": "sha512-z9XchxAtqzNke+xVQyU/r+rYO3vsFMnr9jzUUge7R3EmB3bAtHdUfLtjA9E0OLlNn96T5+ZdEZs9h3eRnNRZyQ==",
-      "dev": true,
-      "requires": {
-        "angular": "^1.7.7",
-        "angular-animate": "^1.7.7",
-        "angular-drag-and-drop-lists": "2.0.0",
-        "angular-sanitize": "^1.7.7",
-        "angular-svg-base-fix": "2.0.0",
-        "angular-ui-bootstrap": "2.3.x",
-        "angularjs-datatables": "^0.5.9",
-        "bootstrap": "3.4.1",
-        "bootstrap-select": "~1.12.4",
-        "c3": "~0.4.11",
-        "d3": "~3.5.17",
-        "datatables.net": "^1.10.12",
-        "datatables.net-select": "~1.2.0",
-        "jquery": "3.4.1",
-        "jquery-ui-dist": "1.12.1",
-        "lodash": "^4.17.12",
-        "moment": "~2.24.0",
-        "node-sass": "^4.11.0",
-        "patternfly": "^3.59.4"
-      },
-      "dependencies": {
-        "angular": {
-          "version": "1.7.8",
-          "resolved": "https://registry.npmjs.org/angular/-/angular-1.7.8.tgz",
-          "integrity": "sha512-wtef/y4COxM7ZVhddd7JtAAhyYObq9YXKar9tsW7558BImeVYteJiTxCKeJOL45lJ/+7B4wrAC49j8gTFYEthg==",
-          "dev": true
-        },
-        "angular-animate": {
-          "version": "1.7.8",
-          "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.7.8.tgz",
-          "integrity": "sha512-bINtzizq7TbJzfVrDpwLfTxVl0Qd7fRNWFb5jKYI1vaFZobQNX/QONXlLow6ySsDbZ6eLECycB7mvWtfh1YYaw==",
-          "dev": true
-        },
-        "angular-sanitize": {
-          "version": "1.7.8",
-          "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.7.8.tgz",
-          "integrity": "sha512-sVq51is1cVNiPytH4JIEd7iRW0OBIRQGNETWkz1c/jnLv2sBf9oDxEd8enwDz/W2ULBIpqJPK/3AsIxmZyh9pA==",
-          "dev": true
-        },
-        "angular-ui-bootstrap": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/angular-ui-bootstrap/-/angular-ui-bootstrap-2.3.2.tgz",
-          "integrity": "sha1-v+yJTtmDreHl0/QC/BD4gpZSrJk=",
-          "dev": true
-        },
-        "moment": {
-          "version": "2.24.0",
-          "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
-          "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "angular-resource": {
-      "version": "1.5.11",
-      "resolved": "https://registry.npmjs.org/angular-resource/-/angular-resource-1.5.11.tgz",
-      "integrity": "sha1-2T6mGRhKLg7jrjOCZXWDYxcpKfA="
-    },
-    "angular-route": {
-      "version": "1.5.11",
-      "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.5.11.tgz",
-      "integrity": "sha1-SWFPOhZ/VCkeRJ/ougXTnFiSS4M="
-    },
-    "angular-sanitize": {
-      "version": "1.5.11",
-      "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.5.11.tgz",
-      "integrity": "sha1-6/s/ND5UP5su8FD7TC6e4EjRdy8="
-    },
-    "angular-svg-base-fix": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/angular-svg-base-fix/-/angular-svg-base-fix-2.0.0.tgz",
-      "integrity": "sha1-89X4W4ehDSExD0fahFUDi5DPsAA=",
-      "dev": true
-    },
-    "angular-ui-bootstrap": {
-      "version": "2.5.6",
-      "resolved": "https://registry.npmjs.org/angular-ui-bootstrap/-/angular-ui-bootstrap-2.5.6.tgz",
-      "integrity": "sha512-yzcHpPMLQl0232nDzm5P4iAFTFQ9dMw0QgFLuKYbDj9M0xJ62z0oudYD/Lvh1pWfRsukiytP4Xj6BHOSrSXP8A=="
-    },
-    "angular-ui-grid": {
-      "version": "4.8.3",
-      "resolved": "https://registry.npmjs.org/angular-ui-grid/-/angular-ui-grid-4.8.3.tgz",
-      "integrity": "sha512-Act6ftPzRMr8SKynMk/KiuIY7mvhkNnMEcDAD0rEBLdRVYk+9VTdzumGcMPj7KQae3rmMWegMi5R60Z+YxYPKA==",
-      "requires": {
-        "angular": ">=1.4.0 1.7.x"
-      },
-      "dependencies": {
-        "angular": {
-          "version": "1.7.8",
-          "resolved": "https://registry.npmjs.org/angular/-/angular-1.7.8.tgz",
-          "integrity": "sha512-wtef/y4COxM7ZVhddd7JtAAhyYObq9YXKar9tsW7558BImeVYteJiTxCKeJOL45lJ/+7B4wrAC49j8gTFYEthg=="
-        }
-      }
-    },
-    "angular-ui-slider": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/angular-ui-slider/-/angular-ui-slider-0.4.0.tgz",
-      "integrity": "sha1-12wKVGSNDRjVnIfmyDOPrnQTXHU="
-    },
-    "angularjs-datatables": {
-      "version": "0.5.9",
-      "resolved": "https://registry.npmjs.org/angularjs-datatables/-/angularjs-datatables-0.5.9.tgz",
-      "integrity": "sha1-JL3DuglRdB9BcilbanlcWM5jrZQ=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "angular": ">=1.3.0",
-        "datatables.net": "^1.10.11",
-        "datatables.net-dt": "^1.10.11",
-        "jquery": ">=1.11.0"
-      }
-    },
-    "ansi-colors": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-      "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "^0.1.0"
-      }
-    },
-    "ansi-cyan": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
-      "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-escapes": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
-      "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.5.2"
-      }
-    },
-    "ansi-gray": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
-      "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-red": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
-      "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
-      "dev": true,
-      "requires": {
-        "ansi-wrap": "0.1.0"
-      }
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^1.9.0"
-      }
-    },
-    "ansi-wrap": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
-      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
-      "dev": true
-    },
-    "anymatch": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
-      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
-      "dev": true,
-      "requires": {
-        "micromatch": "^3.1.4",
-        "normalize-path": "^2.1.1"
-      }
-    },
-    "append-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
-      "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
-      "dev": true,
-      "requires": {
-        "buffer-equal": "^1.0.0"
-      }
-    },
-    "aproba": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
-      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
-      "dev": true
-    },
-    "archy": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
-      "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
-      "dev": true
-    },
-    "are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
-      "dev": true,
-      "requires": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^2.0.6"
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "arr-diff": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
-      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
-      "dev": true
-    },
-    "arr-filter": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
-      "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-flatten": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
-      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
-      "dev": true
-    },
-    "arr-map": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
-      "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
-      "dev": true,
-      "requires": {
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "arr-union": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
-      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
-      "dev": true
-    },
-    "array-each": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
-      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
-      "dev": true
-    },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true
-    },
-    "array-initial": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
-      "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
-      "dev": true,
-      "requires": {
-        "array-slice": "^1.0.0",
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "array-last": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
-      "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
-      "dev": true,
-      "requires": {
-        "is-number": "^4.0.0"
-      },
-      "dependencies": {
-        "is-number": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
-          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
-          "dev": true
-        }
-      }
-    },
-    "array-slice": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
-      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
-      "dev": true
-    },
-    "array-sort": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
-      "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
-      "dev": true,
-      "requires": {
-        "default-compare": "^1.0.0",
-        "get-value": "^2.0.6",
-        "kind-of": "^5.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "dev": true
-    },
-    "array-unique": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-      "dev": true
-    },
-    "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "dev": true,
-      "requires": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "assert": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
-      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
-      "dev": true,
-      "requires": {
-        "object-assign": "^4.1.1",
-        "util": "0.10.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
-          "dev": true
-        },
-        "util": {
-          "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-          "dev": true,
-          "requires": {
-            "inherits": "2.0.1"
-          }
-        }
-      }
-    },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
-      "dev": true
-    },
-    "assertion-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
-      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
-      "dev": true
-    },
-    "assign-symbols": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
-      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
-      "dev": true
-    },
-    "astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
-      "dev": true
-    },
-    "async-done": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
-      "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.2",
-        "process-nextick-args": "^2.0.0",
-        "stream-exhaust": "^1.0.1"
-      }
-    },
-    "async-each": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
-      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
-      "dev": true
-    },
-    "async-foreach": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
-      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
-      "dev": true
-    },
-    "async-settle": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
-      "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
-      "dev": true,
-      "requires": {
-        "async-done": "^1.2.2"
-      }
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "dev": true
-    },
-    "atob": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
-      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
-      "dev": true
-    },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "dev": true
-    },
-    "aws4": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
-      "dev": true
-    },
-    "babel-code-frame": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
-      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
-      "dev": true,
-      "requires": {
-        "chalk": "^1.1.3",
-        "esutils": "^2.0.2",
-        "js-tokens": "^3.0.2"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
-        "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
-          }
-        },
-        "supports-color": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-          "dev": true
-        }
-      }
-    },
-    "babel-core": {
-      "version": "6.26.3",
-      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
-      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-generator": "^6.26.0",
-        "babel-helpers": "^6.24.1",
-        "babel-messages": "^6.23.0",
-        "babel-register": "^6.26.0",
-        "babel-runtime": "^6.26.0",
-        "babel-template": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "convert-source-map": "^1.5.1",
-        "debug": "^2.6.9",
-        "json5": "^0.5.1",
-        "lodash": "^4.17.4",
-        "minimatch": "^3.0.4",
-        "path-is-absolute": "^1.0.1",
-        "private": "^0.1.8",
-        "slash": "^1.0.0",
-        "source-map": "^0.5.7"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "babel-generator": {
-      "version": "6.26.1",
-      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
-      "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
-      "dev": true,
-      "requires": {
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "detect-indent": "^4.0.0",
-        "jsesc": "^1.3.0",
-        "lodash": "^4.17.4",
-        "source-map": "^0.5.7",
-        "trim-right": "^1.0.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "babel-helper-builder-binary-assignment-operator-visitor": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
-      "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
-      "dev": true,
-      "requires": {
-        "babel-helper-explode-assignable-expression": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-call-delegate": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
-      "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
-      "dev": true,
-      "requires": {
-        "babel-helper-hoist-variables": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-traverse": "^6.24.1",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-define-map": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
-      "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
-      "dev": true,
-      "requires": {
-        "babel-helper-function-name": "^6.24.1",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-helper-explode-assignable-expression": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
-      "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-traverse": "^6.24.1",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-function-name": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
-      "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
-      "dev": true,
-      "requires": {
-        "babel-helper-get-function-arity": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1",
-        "babel-traverse": "^6.24.1",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-get-function-arity": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
-      "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-hoist-variables": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
-      "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-optimise-call-expression": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
-      "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-regex": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
-      "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-helper-remap-async-to-generator": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
-      "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
-      "dev": true,
-      "requires": {
-        "babel-helper-function-name": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1",
-        "babel-traverse": "^6.24.1",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helper-replace-supers": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
-      "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
-      "dev": true,
-      "requires": {
-        "babel-helper-optimise-call-expression": "^6.24.1",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1",
-        "babel-traverse": "^6.24.1",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-helpers": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
-      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1"
-      }
-    },
-    "babel-messages": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
-      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-check-es2015-constants": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
-      "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-dynamic-import-node": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
-      "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
-      "dev": true,
-      "requires": {
-        "object.assign": "^4.1.0"
-      }
-    },
-    "babel-plugin-syntax-async-functions": {
-      "version": "6.13.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
-      "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
-      "dev": true
-    },
-    "babel-plugin-syntax-exponentiation-operator": {
-      "version": "6.13.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
-      "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
-      "dev": true
-    },
-    "babel-plugin-syntax-trailing-function-commas": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
-      "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
-      "dev": true
-    },
-    "babel-plugin-transform-async-to-generator": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
-      "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
-      "dev": true,
-      "requires": {
-        "babel-helper-remap-async-to-generator": "^6.24.1",
-        "babel-plugin-syntax-async-functions": "^6.8.0",
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-arrow-functions": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
-      "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-block-scoped-functions": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
-      "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-block-scoping": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
-      "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "babel-template": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-plugin-transform-es2015-classes": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
-      "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
-      "dev": true,
-      "requires": {
-        "babel-helper-define-map": "^6.24.1",
-        "babel-helper-function-name": "^6.24.1",
-        "babel-helper-optimise-call-expression": "^6.24.1",
-        "babel-helper-replace-supers": "^6.24.1",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1",
-        "babel-traverse": "^6.24.1",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-computed-properties": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
-      "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-destructuring": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
-      "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-duplicate-keys": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
-      "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-for-of": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
-      "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-function-name": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
-      "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
-      "dev": true,
-      "requires": {
-        "babel-helper-function-name": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-literals": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
-      "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-amd": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
-      "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-commonjs": {
-      "version": "6.26.2",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
-      "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
-      "dev": true,
-      "requires": {
-        "babel-plugin-transform-strict-mode": "^6.24.1",
-        "babel-runtime": "^6.26.0",
-        "babel-template": "^6.26.0",
-        "babel-types": "^6.26.0"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-systemjs": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
-      "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
-      "dev": true,
-      "requires": {
-        "babel-helper-hoist-variables": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-modules-umd": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
-      "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
-      "dev": true,
-      "requires": {
-        "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-object-super": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
-      "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
-      "dev": true,
-      "requires": {
-        "babel-helper-replace-supers": "^6.24.1",
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-parameters": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
-      "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
-      "dev": true,
-      "requires": {
-        "babel-helper-call-delegate": "^6.24.1",
-        "babel-helper-get-function-arity": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-template": "^6.24.1",
-        "babel-traverse": "^6.24.1",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-shorthand-properties": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
-      "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-spread": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
-      "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-sticky-regex": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
-      "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
-      "dev": true,
-      "requires": {
-        "babel-helper-regex": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-plugin-transform-es2015-template-literals": {
-      "version": "6.22.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
-      "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-typeof-symbol": {
-      "version": "6.23.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
-      "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-es2015-unicode-regex": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
-      "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
-      "dev": true,
-      "requires": {
-        "babel-helper-regex": "^6.24.1",
-        "babel-runtime": "^6.22.0",
-        "regexpu-core": "^2.0.0"
-      }
-    },
-    "babel-plugin-transform-exponentiation-operator": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
-      "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
-      "dev": true,
-      "requires": {
-        "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
-        "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
-        "babel-runtime": "^6.22.0"
-      }
-    },
-    "babel-plugin-transform-regenerator": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
-      "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
-      "dev": true,
-      "requires": {
-        "regenerator-transform": "^0.10.0"
-      }
-    },
-    "babel-plugin-transform-strict-mode": {
-      "version": "6.24.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
-      "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.22.0",
-        "babel-types": "^6.24.1"
-      }
-    },
-    "babel-polyfill": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
-      "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "core-js": "^2.5.0",
-        "regenerator-runtime": "^0.10.5"
-      },
-      "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.10.5",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
-          "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
-        }
-      }
-    },
-    "babel-preset-env": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
-      "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
-      "dev": true,
-      "requires": {
-        "babel-plugin-check-es2015-constants": "^6.22.0",
-        "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
-        "babel-plugin-transform-async-to-generator": "^6.22.0",
-        "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
-        "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
-        "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
-        "babel-plugin-transform-es2015-classes": "^6.23.0",
-        "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
-        "babel-plugin-transform-es2015-destructuring": "^6.23.0",
-        "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
-        "babel-plugin-transform-es2015-for-of": "^6.23.0",
-        "babel-plugin-transform-es2015-function-name": "^6.22.0",
-        "babel-plugin-transform-es2015-literals": "^6.22.0",
-        "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
-        "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
-        "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
-        "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
-        "babel-plugin-transform-es2015-object-super": "^6.22.0",
-        "babel-plugin-transform-es2015-parameters": "^6.23.0",
-        "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
-        "babel-plugin-transform-es2015-spread": "^6.22.0",
-        "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
-        "babel-plugin-transform-es2015-template-literals": "^6.22.0",
-        "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
-        "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
-        "babel-plugin-transform-exponentiation-operator": "^6.22.0",
-        "babel-plugin-transform-regenerator": "^6.22.0",
-        "browserslist": "^3.2.6",
-        "invariant": "^2.2.2",
-        "semver": "^5.3.0"
-      }
-    },
-    "babel-register": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
-      "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
-      "dev": true,
-      "requires": {
-        "babel-core": "^6.26.0",
-        "babel-runtime": "^6.26.0",
-        "core-js": "^2.5.0",
-        "home-or-tmp": "^2.0.0",
-        "lodash": "^4.17.4",
-        "mkdirp": "^0.5.1",
-        "source-map-support": "^0.4.15"
-      }
-    },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      }
-    },
-    "babel-template": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
-      "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "babel-traverse": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "lodash": "^4.17.4"
-      }
-    },
-    "babel-traverse": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
-      "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
-      "dev": true,
-      "requires": {
-        "babel-code-frame": "^6.26.0",
-        "babel-messages": "^6.23.0",
-        "babel-runtime": "^6.26.0",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0",
-        "debug": "^2.6.8",
-        "globals": "^9.18.0",
-        "invariant": "^2.2.2",
-        "lodash": "^4.17.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        }
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "dev": true,
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      }
-    },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
-      "dev": true
-    },
-    "bach": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
-      "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
-      "dev": true,
-      "requires": {
-        "arr-filter": "^1.1.1",
-        "arr-flatten": "^1.0.1",
-        "arr-map": "^2.0.0",
-        "array-each": "^1.0.0",
-        "array-initial": "^1.0.0",
-        "array-last": "^1.1.1",
-        "async-done": "^1.2.2",
-        "async-settle": "^1.0.0",
-        "now-and-later": "^2.0.0"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "base": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
-      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
-      "dev": true,
-      "requires": {
-        "cache-base": "^1.0.1",
-        "class-utils": "^0.3.5",
-        "component-emitter": "^1.2.1",
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.1",
-        "mixin-deep": "^1.2.0",
-        "pascalcase": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "base64-js": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
-      "dev": true
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "dev": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "binary-extensions": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
-      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
-      "dev": true
-    },
-    "bl": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
-      "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.3.5",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "block-stream": {
-      "version": "0.0.9",
-      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
-      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
-      "dev": true,
-      "requires": {
-        "inherits": "~2.0.0"
-      }
-    },
-    "bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
-      "dev": true
-    },
-    "bootstrap": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz",
-      "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA=="
-    },
-    "bootstrap-datepicker": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz",
-      "integrity": "sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA==",
-      "optional": true,
-      "requires": {
-        "jquery": ">=1.7.1 <4.0.0"
-      }
-    },
-    "bootstrap-sass": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz",
-      "integrity": "sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==",
-      "optional": true
-    },
-    "bootstrap-select": {
-      "version": "1.12.4",
-      "resolved": "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.12.4.tgz",
-      "integrity": "sha1-fxXTwM6XiGjZwJxw+WYk9V+gLuE=",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "jquery": ">=1.8"
-      }
-    },
-    "bootstrap-slider": {
-      "version": "9.10.0",
-      "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz",
-      "integrity": "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=",
-      "optional": true
-    },
-    "bootstrap-switch": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz",
-      "integrity": "sha1-cOCusqh3wNx2aZHeEI4hcPwpov8=",
-      "optional": true
-    },
-    "bootstrap-touchspin": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz",
-      "integrity": "sha1-l3nerHKq9Xfl52K4USx0fIcdlZc=",
-      "optional": true
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
-      "dev": true,
-      "requires": {
-        "arr-flatten": "^1.1.0",
-        "array-unique": "^0.3.2",
-        "extend-shallow": "^2.0.1",
-        "fill-range": "^4.0.0",
-        "isobject": "^3.0.1",
-        "repeat-element": "^1.1.2",
-        "snapdragon": "^0.8.1",
-        "snapdragon-node": "^2.0.1",
-        "split-string": "^3.0.2",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
-      "dev": true
-    },
-    "browser-pack": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
-      "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
-      "dev": true,
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "combine-source-map": "~0.8.0",
-        "defined": "^1.0.0",
-        "safe-buffer": "^5.1.1",
-        "through2": "^2.0.0",
-        "umd": "^3.0.0"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "browser-resolve": {
-      "version": "1.11.3",
-      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
-      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
-      "dev": true,
-      "requires": {
-        "resolve": "1.1.7"
-      },
-      "dependencies": {
-        "resolve": {
-          "version": "1.1.7",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
-          "dev": true
-        }
-      }
-    },
-    "browser-stdout": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
-      "dev": true
-    },
-    "browserify": {
-      "version": "16.5.0",
-      "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz",
-      "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==",
-      "dev": true,
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "assert": "^1.4.0",
-        "browser-pack": "^6.0.1",
-        "browser-resolve": "^1.11.0",
-        "browserify-zlib": "~0.2.0",
-        "buffer": "^5.0.2",
-        "cached-path-relative": "^1.0.0",
-        "concat-stream": "^1.6.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "~1.0.0",
-        "crypto-browserify": "^3.0.0",
-        "defined": "^1.0.0",
-        "deps-sort": "^2.0.0",
-        "domain-browser": "^1.2.0",
-        "duplexer2": "~0.1.2",
-        "events": "^2.0.0",
-        "glob": "^7.1.0",
-        "has": "^1.0.0",
-        "htmlescape": "^1.1.0",
-        "https-browserify": "^1.0.0",
-        "inherits": "~2.0.1",
-        "insert-module-globals": "^7.0.0",
-        "labeled-stream-splicer": "^2.0.0",
-        "mkdirp": "^0.5.0",
-        "module-deps": "^6.0.0",
-        "os-browserify": "~0.3.0",
-        "parents": "^1.0.1",
-        "path-browserify": "~0.0.0",
-        "process": "~0.11.0",
-        "punycode": "^1.3.2",
-        "querystring-es3": "~0.2.0",
-        "read-only-stream": "^2.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.1.4",
-        "shasum": "^1.0.0",
-        "shell-quote": "^1.6.1",
-        "stream-browserify": "^2.0.0",
-        "stream-http": "^3.0.0",
-        "string_decoder": "^1.1.1",
-        "subarg": "^1.0.0",
-        "syntax-error": "^1.1.1",
-        "through2": "^2.0.0",
-        "timers-browserify": "^1.0.1",
-        "tty-browserify": "0.0.1",
-        "url": "~0.11.0",
-        "util": "~0.10.1",
-        "vm-browserify": "^1.0.0",
-        "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "dev": true,
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "browserify-cipher": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "dev": true,
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "dev": true,
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "browserslist": {
-      "version": "3.2.8",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
-      "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
-      "dev": true,
-      "requires": {
-        "caniuse-lite": "^1.0.30000844",
-        "electron-to-chromium": "^1.3.47"
-      }
-    },
-    "buffer": {
-      "version": "5.4.3",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
-      "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
-      "dev": true,
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
-    },
-    "buffer-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
-      "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
-      "dev": true
-    },
-    "buffer-from": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
-      "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
-      "dev": true
-    },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
-      "dev": true
-    },
-    "bufferstreams": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.1.3.tgz",
-      "integrity": "sha512-HaJnVuslRF4g2kSDeyl++AaVizoitCpL9PglzCYwy0uHHyvWerfvEb8jWmYbF1z4kiVFolGomnxSGl+GUQp2jg==",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "builtin-modules": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
-      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
-      "dev": true
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
-      "dev": true
-    },
-    "c3": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.23.tgz",
-      "integrity": "sha512-fI6hbx1QoATU0gRQtPWsUGWX+ssXhxGH1ogew32KjVmGHFE4WmfmBkh+RkuHDoeCIoGFon7XTpKcwUZpBGW4mQ==",
-      "requires": {
-        "d3": "~3.5.0"
-      }
-    },
-    "cache-base": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
-      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
-      "dev": true,
-      "requires": {
-        "collection-visit": "^1.0.0",
-        "component-emitter": "^1.2.1",
-        "get-value": "^2.0.6",
-        "has-value": "^1.0.0",
-        "isobject": "^3.0.1",
-        "set-value": "^2.0.0",
-        "to-object-path": "^0.3.0",
-        "union-value": "^1.0.0",
-        "unset-value": "^1.0.0"
-      }
-    },
-    "cached-path-relative": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
-      "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==",
-      "dev": true
-    },
-    "callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true
-    },
-    "camelcase": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
-      "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
-      "dev": true
-    },
-    "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
-      "dev": true,
-      "requires": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-          "dev": true
-        }
-      }
-    },
-    "caniuse-lite": {
-      "version": "1.0.30000929",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz",
-      "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==",
-      "dev": true
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "dev": true
-    },
-    "chai": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
-      "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
-      "dev": true,
-      "requires": {
-        "assertion-error": "^1.1.0",
-        "check-error": "^1.0.2",
-        "deep-eql": "^3.0.1",
-        "get-func-name": "^2.0.0",
-        "pathval": "^1.1.0",
-        "type-detect": "^4.0.5"
-      }
-    },
-    "chalk": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-      "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.1",
-        "escape-string-regexp": "^1.0.5",
-        "supports-color": "^5.3.0"
-      }
-    },
-    "chardet": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
-      "dev": true
-    },
-    "check-error": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
-      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
-      "dev": true
-    },
-    "chokidar": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
-      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-each": "^1.0.1",
-        "braces": "^2.3.2",
-        "fsevents": "^1.2.7",
-        "glob-parent": "^3.1.0",
-        "inherits": "^2.0.3",
-        "is-binary-path": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "normalize-path": "^3.0.0",
-        "path-is-absolute": "^1.0.0",
-        "readdirp": "^2.2.1",
-        "upath": "^1.1.1"
-      },
-      "dependencies": {
-        "normalize-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-          "dev": true
-        }
-      }
-    },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "class-utils": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
-      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
-      "dev": true,
-      "requires": {
-        "arr-union": "^3.1.0",
-        "define-property": "^0.2.5",
-        "isobject": "^3.0.0",
-        "static-extend": "^0.1.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        }
-      }
-    },
-    "clean-css": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
-      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
-      "dev": true,
-      "requires": {
-        "source-map": "~0.6.0"
-      }
-    },
-    "clean-stack": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-      "dev": true
-    },
-    "cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
-      "requires": {
-        "restore-cursor": "^3.1.0"
-      }
-    },
-    "cli-width": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
-      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
-      "dev": true
-    },
-    "cliui": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
-      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wrap-ansi": "^2.0.0"
-      }
-    },
-    "clone": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
-      "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
-      "dev": true
-    },
-    "clone-buffer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
-      "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
-      "dev": true
-    },
-    "clone-stats": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
-      "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
-      "dev": true
-    },
-    "cloneable-readable": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
-      "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "process-nextick-args": "^2.0.0",
-        "readable-stream": "^2.3.5"
-      }
-    },
-    "code-point-at": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
-      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
-      "dev": true
-    },
-    "collection-map": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
-      "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
-      "dev": true,
-      "requires": {
-        "arr-map": "^2.0.2",
-        "for-own": "^1.0.0",
-        "make-iterator": "^1.0.0"
-      }
-    },
-    "collection-visit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
-      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
-      "dev": true,
-      "requires": {
-        "map-visit": "^1.0.0",
-        "object-visit": "^1.0.0"
-      }
-    },
-    "color-convert": {
-      "version": "1.9.2",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
-      "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
-      "dev": true,
-      "requires": {
-        "color-name": "1.1.1"
-      }
-    },
-    "color-name": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
-      "dev": true
-    },
-    "color-support": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-      "dev": true
-    },
-    "combine-source-map": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
-      "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
-      "dev": true,
-      "requires": {
-        "convert-source-map": "~1.1.0",
-        "inline-source-map": "~0.6.0",
-        "lodash.memoize": "~3.0.3",
-        "source-map": "~0.5.3"
-      },
-      "dependencies": {
-        "convert-source-map": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
-          "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=",
-          "dev": true
-        },
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-          "dev": true
-        }
-      }
-    },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "commander": {
-      "version": "2.15.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
-      "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
-    },
-    "component-emitter": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
-      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "concat-with-sourcemaps": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
-      "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
-      "dev": true,
-      "requires": {
-        "source-map": "^0.6.1"
-      }
-    },
-    "console-browserify": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
-      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
-      "dev": true
-    },
-    "console-control-strings": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-      "dev": true
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
-      "dev": true
-    },
-    "convert-source-map": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
-      "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
-      "dev": true
-    },
-    "copy-descriptor": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
-      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
-      "dev": true
-    },
-    "copy-props": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
-      "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
-      "dev": true,
-      "requires": {
-        "each-props": "^1.3.0",
-        "is-plain-object": "^2.0.1"
-      }
-    },
-    "core-js": {
-      "version": "2.5.7",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
-      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
-    },
-    "core-js-compat": {
-      "version": "3.3.5",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.3.5.tgz",
-      "integrity": "sha512-44ZORuapx0MUht0MUk0p9lcQPh7n/LDXehimTmjCs0CYblpKZcqVd5w0OQDUDq5OQjEbazWObHDQJWvvHYPNTg==",
-      "dev": true,
-      "requires": {
-        "browserslist": "^4.7.2",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "browserslist": {
-          "version": "4.7.2",
-          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz",
-          "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==",
-          "dev": true,
-          "requires": {
-            "caniuse-lite": "^1.0.30001004",
-            "electron-to-chromium": "^1.3.295",
-            "node-releases": "^1.1.38"
-          }
-        },
-        "caniuse-lite": {
-          "version": "1.0.30001006",
-          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz",
-          "integrity": "sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw==",
-          "dev": true
-        },
-        "electron-to-chromium": {
-          "version": "1.3.296",
-          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz",
-          "integrity": "sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ==",
-          "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
-      "dev": true
-    },
-    "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "dev": true,
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "cross-spawn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
-      "requires": {
-        "nice-try": "^1.0.4",
-        "path-key": "^2.0.1",
-        "semver": "^5.5.0",
-        "shebang-command": "^1.2.0",
-        "which": "^1.2.9"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "dev": true,
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
-    "css": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz",
-      "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.3",
-        "source-map": "^0.6.1",
-        "source-map-resolve": "^0.5.2",
-        "urix": "^0.1.0"
-      }
-    },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
-    "d": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
-      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
-      "dev": true,
-      "requires": {
-        "es5-ext": "^0.10.50",
-        "type": "^1.0.1"
-      }
-    },
-    "d3": {
-      "version": "3.5.17",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz",
-      "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g="
-    },
-    "d3-array": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
-      "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
-    },
-    "d3-geo": {
-      "version": "1.11.6",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.6.tgz",
-      "integrity": "sha512-z0J8InXR9e9wcgNtmVnPTj0TU8nhYT6lD/ak9may2PdKqXIeHUr8UbFLoCtrPYNsjv6YaLvSDQVl578k6nm7GA==",
-      "requires": {
-        "d3-array": "1"
-      }
-    },
-    "d3-geo-projection": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.7.0.tgz",
-      "integrity": "sha512-G8C/8gvUQVwuLloW88d/NGbyh5CLONowQzU6gB7cczfGbSjMrQHFbaCqipWUqUWaBdqpyfTlLE3GPGy0RMpKYw==",
-      "requires": {
-        "commander": "2",
-        "d3-array": "1",
-        "d3-geo": "^1.10.0",
-        "resolve": "^1.1.10"
-      }
-    },
-    "d3-path": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.8.tgz",
-      "integrity": "sha512-J6EfUNwcMQ+aM5YPOB8ZbgAZu6wc82f/0WFxrxwV6Ll8wBwLaHLKCqQ5Imub02JriCVVdPjgI+6P3a4EWJCxAg=="
-    },
-    "d3-queue": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz",
-      "integrity": "sha1-yTouVLQXwJWRKdfXP2z31Ckudhg="
-    },
-    "d3-time": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
-      "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
-    },
-    "d3-time-format": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.1.tgz",
-      "integrity": "sha512-VA6WqORO1+H1SvSzgl2oT0z3niANh3opa8Cencpen1LFthw/bEX71R/DgjPlWw78J4UHmD0jCPP1W0HpwMkhjg==",
-      "requires": {
-        "d3-time": "1"
-      }
-    },
-    "dargs": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
-      "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
-      "dev": true
-    },
-    "dash-ast": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
-      "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
-      "dev": true
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "datatables.net": {
-      "version": "1.10.19",
-      "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.19.tgz",
-      "integrity": "sha512-+ljXcI6Pj3PTGy5pesp3E5Dr3x3AV45EZe0o1r0gKENN2gafBKXodVnk2ypKwl2tTmivjxbkiqoWnipTefyBTA==",
-      "optional": true,
-      "requires": {
-        "jquery": ">=1.7"
-      }
-    },
-    "datatables.net-bs": {
-      "version": "1.10.20",
-      "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.10.20.tgz",
-      "integrity": "sha512-NsMoOOYZ6NlteOpzhltw21lXsNdhjIMbIOxnqmcrb62ntl8eL9pYzk2AeiDXBlIKY4e550ZrExCq3CYKQ9myEg==",
-      "optional": true,
-      "requires": {
-        "datatables.net": "1.10.20",
-        "jquery": ">=1.7"
-      },
-      "dependencies": {
-        "datatables.net": {
-          "version": "1.10.20",
-          "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.20.tgz",
-          "integrity": "sha512-4E4S7tTU607N3h0fZPkGmAtr9mwy462u+VJ6gxYZ8MxcRIjZqHy3Dv1GNry7i3zQCktTdWbULVKBbkAJkuHEnQ==",
-          "optional": true,
-          "requires": {
-            "jquery": ">=1.7"
-          }
-        }
-      }
-    },
-    "datatables.net-colreorder": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.5.2.tgz",
-      "integrity": "sha512-77ShdeM7QjKI6M1jfWQ4ZempSYMmmpe9NqjimHBp+o9lAto789YdCLiFrW71dwn1v8Awp4qcMShqHNxGzR/HVg==",
-      "optional": true,
-      "requires": {
-        "datatables.net": "^1.10.15",
-        "jquery": ">=1.7"
-      }
-    },
-    "datatables.net-colreorder-bs": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz",
-      "integrity": "sha1-Op3LCN7r612FQHlZHgbkk615OlM=",
-      "optional": true,
-      "requires": {
-        "datatables.net-bs": ">=1.10.9",
-        "datatables.net-colreorder": ">=1.2.0",
-        "jquery": ">=1.7"
-      }
-    },
-    "datatables.net-dt": {
-      "version": "1.10.20",
-      "resolved": "https://registry.npmjs.org/datatables.net-dt/-/datatables.net-dt-1.10.20.tgz",
-      "integrity": "sha512-D+65buDke96a3WlJo2re+SbcAVfjPh2nsFZG198Vbkz3i1wKPdB+wkV2K07qYIiIpypcXWOnD2pz3MvnUqM9Tw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "datatables.net": "1.10.20",
-        "jquery": ">=1.7"
-      },
-      "dependencies": {
-        "datatables.net": {
-          "version": "1.10.20",
-          "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.20.tgz",
-          "integrity": "sha512-4E4S7tTU607N3h0fZPkGmAtr9mwy462u+VJ6gxYZ8MxcRIjZqHy3Dv1GNry7i3zQCktTdWbULVKBbkAJkuHEnQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "jquery": ">=1.7"
-          }
-        }
-      }
-    },
-    "datatables.net-select": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.7.tgz",
-      "integrity": "sha512-C3XDi7wpruGjDXV36dc9hN/FrAX9GOFvBZ7+KfKJTBNkGFbbhdzHS91SMeGiwRXPYivAyxfPTcVVndVaO83uBQ==",
-      "optional": true,
-      "requires": {
-        "datatables.net": "^1.10.15",
-        "jquery": ">=1.7"
-      }
-    },
-    "debug": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "debug-fabulous": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz",
-      "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==",
-      "dev": true,
-      "requires": {
-        "debug": "3.X",
-        "memoizee": "0.4.X",
-        "object-assign": "4.X"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
-    },
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
-      "dev": true
-    },
-    "deep-eql": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
-      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
-      "dev": true,
-      "requires": {
-        "type-detect": "^4.0.0"
-      }
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
-      "dev": true
-    },
-    "default-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
-      "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^5.0.2"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
-          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
-          "dev": true
-        }
-      }
-    },
-    "default-resolution": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
-      "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
-      "dev": true
-    },
-    "define-properties": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
-      "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
-      "dev": true,
-      "requires": {
-        "foreach": "^2.0.5",
-        "object-keys": "^1.0.8"
-      }
-    },
-    "define-property": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
-      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
-      "dev": true,
-      "requires": {
-        "is-descriptor": "^1.0.2",
-        "isobject": "^3.0.1"
-      },
-      "dependencies": {
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "defined": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
-      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
-      "dev": true
-    },
-    "del": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
-      "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
-      "dev": true,
-      "requires": {
-        "globby": "^10.0.1",
-        "graceful-fs": "^4.2.2",
-        "is-glob": "^4.0.1",
-        "is-path-cwd": "^2.2.0",
-        "is-path-inside": "^3.0.1",
-        "p-map": "^3.0.0",
-        "rimraf": "^3.0.0",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "graceful-fs": {
-          "version": "4.2.3",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-          "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
-          "dev": true
-        },
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        }
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "delegates": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-      "dev": true
-    },
-    "deps-sort": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
-      "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
-      "dev": true,
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "shasum-object": "^1.0.0",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "des.js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
-      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detect-file": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
-      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
-      "dev": true
-    },
-    "detect-indent": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
-      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
-    },
-    "detect-newline": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
-      "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
-      "dev": true
-    },
-    "detective": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
-      "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
-      "dev": true,
-      "requires": {
-        "acorn-node": "^1.6.1",
-        "defined": "^1.0.0",
-        "minimist": "^1.1.1"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
-          "dev": true
-        }
-      }
-    },
-    "diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
-      "dev": true
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      }
-    },
-    "dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "dev": true,
-      "requires": {
-        "path-type": "^4.0.0"
-      },
-      "dependencies": {
-        "path-type": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-          "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-          "dev": true
-        }
-      }
-    },
-    "doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "domain-browser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
-      "dev": true
-    },
-    "drmonty-datatables-colvis": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz",
-      "integrity": "sha1-lque37SGQ8wu3aP4e4iTPN7oEnw=",
-      "optional": true,
-      "requires": {
-        "jquery": ">=1.7.0"
-      }
-    },
-    "duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "duplexify": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
-      "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
-      "dev": true,
-      "requires": {
-        "end-of-stream": "^1.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.0",
-        "stream-shift": "^1.0.0"
-      }
-    },
-    "each-props": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
-      "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
-      "dev": true,
-      "requires": {
-        "is-plain-object": "^2.0.1",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "dev": true,
-      "requires": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "electron-to-chromium": {
-      "version": "1.3.103",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz",
-      "integrity": "sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ==",
-      "dev": true
-    },
-    "elliptic": {
-      "version": "6.5.1",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz",
-      "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==",
-      "dev": true,
-      "requires": {
-        "bn.js": "^4.4.0",
-        "brorand": "^1.0.1",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.0"
-      }
-    },
-    "emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
-    },
-    "end-of-stream": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
-      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
-      "dev": true,
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "eonasdan-bootstrap-datetimepicker": {
-      "version": "4.17.47",
-      "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz",
-      "integrity": "sha1-ekmXAEQGUnbnll79Fvgic1IZ5zU=",
-      "optional": true,
-      "requires": {
-        "bootstrap": "^3.3",
-        "jquery": "^1.8.3 || ^2.0 || ^3.0",
-        "moment": "^2.10",
-        "moment-timezone": "^0.4.0"
-      }
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "es-abstract": {
-      "version": "1.16.0",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz",
-      "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==",
-      "dev": true,
-      "requires": {
-        "es-to-primitive": "^1.2.0",
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.0",
-        "is-callable": "^1.1.4",
-        "is-regex": "^1.0.4",
-        "object-inspect": "^1.6.0",
-        "object-keys": "^1.1.1",
-        "string.prototype.trimleft": "^2.1.0",
-        "string.prototype.trimright": "^2.1.0"
-      },
-      "dependencies": {
-        "object-keys": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-          "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-          "dev": true
-        }
-      }
-    },
-    "es-to-primitive": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
-      "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
-      "dev": true,
-      "requires": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      }
-    },
-    "es5-ext": {
-      "version": "0.10.52",
-      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.52.tgz",
-      "integrity": "sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag==",
-      "dev": true,
-      "requires": {
-        "es6-iterator": "~2.0.3",
-        "es6-symbol": "~3.1.2",
-        "next-tick": "~1.0.0"
-      }
-    },
-    "es6-iterator": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
-      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.35",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "es6-symbol": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
-      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
-      "dev": true,
-      "requires": {
-        "d": "^1.0.1",
-        "ext": "^1.1.2"
-      }
-    },
-    "es6-weak-map": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
-      "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "^0.10.46",
-        "es6-iterator": "^2.0.3",
-        "es6-symbol": "^3.1.1"
-      }
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
-    },
-    "eslint": {
-      "version": "6.6.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz",
-      "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "ajv": "^6.10.0",
-        "chalk": "^2.1.0",
-        "cross-spawn": "^6.0.5",
-        "debug": "^4.0.1",
-        "doctrine": "^3.0.0",
-        "eslint-scope": "^5.0.0",
-        "eslint-utils": "^1.4.3",
-        "eslint-visitor-keys": "^1.1.0",
-        "espree": "^6.1.2",
-        "esquery": "^1.0.1",
-        "esutils": "^2.0.2",
-        "file-entry-cache": "^5.0.1",
-        "functional-red-black-tree": "^1.0.1",
-        "glob-parent": "^5.0.0",
-        "globals": "^11.7.0",
-        "ignore": "^4.0.6",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "inquirer": "^7.0.0",
-        "is-glob": "^4.0.0",
-        "js-yaml": "^3.13.1",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.3.0",
-        "lodash": "^4.17.14",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.1",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.8.2",
-        "progress": "^2.0.0",
-        "regexpp": "^2.0.1",
-        "semver": "^6.1.2",
-        "strip-ansi": "^5.2.0",
-        "strip-json-comments": "^3.0.1",
-        "table": "^5.2.3",
-        "text-table": "^0.2.0",
-        "v8-compile-cache": "^2.0.3"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
-          "dev": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "glob-parent": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
-          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "globals": {
-          "version": "11.12.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-          "dev": true
-        },
-        "ignore": {
-          "version": "4.0.6",
-          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
-          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "eslint-scope": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
-      "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.1.0",
-        "estraverse": "^4.1.1"
-      }
-    },
-    "eslint-utils": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
-      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
-      "dev": true,
-      "requires": {
-        "eslint-visitor-keys": "^1.1.0"
-      }
-    },
-    "eslint-visitor-keys": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
-      "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
-      "dev": true
-    },
-    "espree": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
-      "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
-      "dev": true,
-      "requires": {
-        "acorn": "^7.1.0",
-        "acorn-jsx": "^5.1.0",
-        "eslint-visitor-keys": "^1.1.0"
-      }
-    },
-    "esprima": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
-      "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
-      "dev": true
-    },
-    "esquery": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
-      "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^4.0.0"
-      }
-    },
-    "esrecurse": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
-      "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^4.1.0"
-      }
-    },
-    "estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
-      "dev": true
-    },
-    "event-emitter": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
-      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
-      "dev": true,
-      "requires": {
-        "d": "1",
-        "es5-ext": "~0.10.14"
-      }
-    },
-    "events": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
-      "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
-      "dev": true
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "dev": true,
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "execa": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
-      "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.0",
-        "get-stream": "^5.0.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^3.0.0",
-        "onetime": "^5.1.0",
-        "p-finally": "^2.0.0",
-        "signal-exit": "^3.0.2",
-        "strip-final-newline": "^2.0.0"
-      },
-      "dependencies": {
-        "cross-spawn": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
-          "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
-          "dev": true,
-          "requires": {
-            "path-key": "^3.1.0",
-            "shebang-command": "^2.0.0",
-            "which": "^2.0.1"
-          }
-        },
-        "path-key": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz",
-          "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-          "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^3.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-          "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-          "dev": true
-        },
-        "which": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
-          "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
-          "dev": true,
-          "requires": {
-            "isexe": "^2.0.0"
-          }
-        }
-      }
-    },
-    "expand-brackets": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
-      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
-      "dev": true,
-      "requires": {
-        "debug": "^2.3.3",
-        "define-property": "^0.2.5",
-        "extend-shallow": "^2.0.1",
-        "posix-character-classes": "^0.1.0",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
-          "requires": {
-            "ms": "2.0.0"
-          }
-        },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^0.1.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "expand-tilde": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-      "dev": true,
-      "requires": {
-        "homedir-polyfill": "^1.0.1"
-      }
-    },
-    "ext": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/ext/-/ext-1.1.2.tgz",
-      "integrity": "sha512-/KLjJdTNyDepCihrk4HQt57nAE1IRCEo5jUt+WgWGCr1oARhibDvmI2DMcSNWood1T9AUWwq+jaV1wvRqaXfnA==",
-      "dev": true,
-      "requires": {
-        "type": "^2.0.0"
-      },
-      "dependencies": {
-        "type": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
-          "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==",
-          "dev": true
-        }
-      }
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
-    },
-    "extend-shallow": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
-      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
-      "dev": true,
-      "requires": {
-        "assign-symbols": "^1.0.0",
-        "is-extendable": "^1.0.1"
-      },
-      "dependencies": {
-        "is-extendable": {
-          "version": "1.0.1",
-          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
-          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
-          "dev": true,
-          "requires": {
-            "is-plain-object": "^2.0.4"
-          }
-        }
-      }
-    },
-    "external-editor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
-      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
-      "dev": true,
-      "requires": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      }
-    },
-    "extglob": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
-      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
-      "dev": true,
-      "requires": {
-        "array-unique": "^0.3.2",
-        "define-property": "^1.0.0",
-        "expand-brackets": "^2.1.4",
-        "extend-shallow": "^2.0.1",
-        "fragment-cache": "^0.2.1",
-        "regex-not": "^1.0.0",
-        "snapdragon": "^0.8.1",
-        "to-regex": "^3.0.1"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
-          "dev": true,
-          "requires": {
-            "is-descriptor": "^1.0.0"
-          }
-        },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
-          "dev": true,
-          "requires": {
-            "kind-of": "^6.0.0"
-          }
-        },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
-          "dev": true,
-          "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
-          }
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
-      "dev": true
-    },
-    "fancy-log": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
-      "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
-      "dev": true,
-      "requires": {
-        "ansi-gray": "^0.1.1",
-        "color-support": "^1.1.3",
-        "time-stamp": "^1.0.0"
-      }
-    },
-    "fast-deep-equal": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
-      "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
-      "dev": true
-    },
-    "fast-glob": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz",
-      "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.0",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.2"
-      },
-      "dependencies": {
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-          "dev": true,
-          "requires": {
-            "fill-range": "^7.0.1"
-          }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-          "dev": true,
-          "requires": {
-            "to-regex-range": "^5.0.1"
-          }
-        },
-        "glob-parent": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
-          "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.1"
-          }
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-          "dev": true,
-          "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.0.5"
-          }
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
-          "requires": {
-            "is-number": "^7.0.0"
-          }
-        }
-      }
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-      "dev": true
-    },
-    "fast-safe-stringify": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
-      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==",
-      "dev": true
-    },
-    "fastq": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz",
-      "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==",
-      "dev": true,
-      "requires": {
-        "reusify": "^1.0.0"
-      }
-    },
-    "figures": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
-      "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^1.0.5"
-      }
-    },
-    "file-entry-cache": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
-      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^2.0.1"
-      }
-    },
-    "fill-range": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-number": "^3.0.0",
-        "repeat-string": "^1.6.1",
-        "to-regex-range": "^2.1.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
-    "find-up": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
-      "dev": true,
-      "requires": {
-        "path-exists": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "findup-sync": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
-      "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
-      "dev": true,
-      "requires": {
-        "detect-file": "^1.0.0",
-        "is-glob": "^4.0.0",
-        "micromatch": "^3.0.4",
-        "resolve-dir": "^1.0.1"
-      }
-    },
-    "fined": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
-      "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "is-plain-object": "^2.0.3",
-        "object.defaults": "^1.1.0",
-        "object.pick": "^1.2.0",
-        "parse-filepath": "^1.0.1"
-      }
-    },
-    "flagged-respawn": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
-      "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
-      "dev": true
-    },
-    "flat": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
-      "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
-      "dev": true,
-      "requires": {
-        "is-buffer": "~2.0.3"
-      },
-      "dependencies": {
-        "is-buffer": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
-          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
-          "dev": true
-        }
-      }
-    },
-    "flat-cache": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
-      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
-      "dev": true,
-      "requires": {
-        "flatted": "^2.0.0",
-        "rimraf": "2.6.3",
-        "write": "1.0.3"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.6.3",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "flatted": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
-      "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
-      "dev": true
-    },
-    "flush-write-stream": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
-      "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
-      "dev": true,
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.4"
-      }
-    },
-    "font-awesome": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
-      "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM="
-    },
-    "font-awesome-sass": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz",
-      "integrity": "sha1-TtppPpFQCc4Asijglk3F7Km8NOE=",
-      "optional": true
-    },
-    "for-in": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
-      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
-      "dev": true
-    },
-    "for-own": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
-      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
-      "dev": true,
-      "requires": {
-        "for-in": "^1.0.1"
-      }
-    },
-    "foreach": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
-      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
-      "dev": true
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "dev": true
-    },
-    "fork-stream": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
-      "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
-      "dev": true
-    },
-    "form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "dev": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "fragment-cache": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
-      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
-      "dev": true,
-      "requires": {
-        "map-cache": "^0.2.2"
-      }
-    },
-    "fs": {
-      "version": "0.0.1-security",
-      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
-      "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=",
-      "dev": true
-    },
-    "fs-mkdirp-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
-      "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.11",
-        "through2": "^2.0.3"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
-      "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "nan": "^2.12.1",
-        "node-pre-gyp": "^0.12.0"
-      },
-      "dependencies": {
-        "abbrev": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ansi-regex": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "aproba": {
-          "version": "1.2.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "are-we-there-yet": {
-          "version": "1.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "delegates": "^1.0.0",
-            "readable-stream": "^2.0.6"
-          }
-        },
-        "balanced-match": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "brace-expansion": {
-          "version": "1.1.11",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "chownr": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "code-point-at": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "concat-map": {
-          "version": "0.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "console-control-strings": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "core-util-is": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "debug": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "deep-extend": {
-          "version": "0.6.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "delegates": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "detect-libc": {
-          "version": "1.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "fs-minipass": {
-          "version": "1.2.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "fs.realpath": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "gauge": {
-          "version": "2.7.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "aproba": "^1.0.3",
-            "console-control-strings": "^1.0.0",
-            "has-unicode": "^2.0.0",
-            "object-assign": "^4.1.0",
-            "signal-exit": "^3.0.0",
-            "string-width": "^1.0.1",
-            "strip-ansi": "^3.0.1",
-            "wide-align": "^1.1.0"
-          }
-        },
-        "glob": {
-          "version": "7.1.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "has-unicode": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
-        "ignore-walk": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimatch": "^3.0.4"
-          }
-        },
-        "inflight": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "once": "^1.3.0",
-            "wrappy": "1"
-          }
-        },
-        "inherits": {
-          "version": "2.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "ini": {
-          "version": "1.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minimatch": {
-          "version": "3.0.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "minimist": {
-          "version": "0.0.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "minipass": {
-          "version": "2.3.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.0"
-          }
-        },
-        "minizlib": {
-          "version": "1.2.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minipass": "^2.2.1"
-          }
-        },
-        "mkdirp": {
-          "version": "0.5.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "minimist": "0.0.8"
-          }
-        },
-        "ms": {
-          "version": "2.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "needle": {
-          "version": "2.3.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "debug": "^4.1.0",
-            "iconv-lite": "^0.4.4",
-            "sax": "^1.2.4"
-          }
-        },
-        "node-pre-gyp": {
-          "version": "0.12.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "detect-libc": "^1.0.2",
-            "mkdirp": "^0.5.1",
-            "needle": "^2.2.1",
-            "nopt": "^4.0.1",
-            "npm-packlist": "^1.1.6",
-            "npmlog": "^4.0.2",
-            "rc": "^1.2.7",
-            "rimraf": "^2.6.1",
-            "semver": "^5.3.0",
-            "tar": "^4"
-          }
-        },
-        "nopt": {
-          "version": "4.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "abbrev": "1",
-            "osenv": "^0.1.4"
-          }
-        },
-        "npm-bundled": {
-          "version": "1.0.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "npm-packlist": {
-          "version": "1.4.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ignore-walk": "^3.0.1",
-            "npm-bundled": "^1.0.1"
-          }
-        },
-        "npmlog": {
-          "version": "4.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "are-we-there-yet": "~1.1.2",
-            "console-control-strings": "~1.1.0",
-            "gauge": "~2.7.3",
-            "set-blocking": "~2.0.0"
-          }
-        },
-        "number-is-nan": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "once": {
-          "version": "1.4.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "wrappy": "1"
-          }
-        },
-        "os-homedir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "os-tmpdir": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "osenv": {
-          "version": "0.1.5",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "os-homedir": "^1.0.0",
-            "os-tmpdir": "^1.0.0"
-          }
-        },
-        "path-is-absolute": {
-          "version": "1.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "process-nextick-args": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "rc": {
-          "version": "1.2.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "deep-extend": "^0.6.0",
-            "ini": "~1.3.0",
-            "minimist": "^1.2.0",
-            "strip-json-comments": "~2.0.1"
-          },
-          "dependencies": {
-            "minimist": {
-              "version": "1.2.0",
-              "bundled": true,
-              "dev": true,
-              "optional": true
-            }
-          }
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "rimraf": {
-          "version": "2.6.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
-        "safe-buffer": {
-          "version": "5.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "safer-buffer": {
-          "version": "2.1.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "sax": {
-          "version": "1.2.4",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "semver": {
-          "version": "5.7.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "set-blocking": {
-          "version": "2.0.0",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "signal-exit": {
-          "version": "3.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "string-width": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "code-point-at": "^1.0.0",
-            "is-fullwidth-code-point": "^1.0.0",
-            "strip-ansi": "^3.0.0"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-regex": "^2.0.0"
-          }
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "tar": {
-          "version": "4.4.8",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chownr": "^1.1.1",
-            "fs-minipass": "^1.2.5",
-            "minipass": "^2.3.4",
-            "minizlib": "^1.1.1",
-            "mkdirp": "^0.5.0",
-            "safe-buffer": "^5.1.2",
-            "yallist": "^3.0.2"
-          }
-        },
-        "util-deprecate": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "wide-align": {
-          "version": "1.1.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "string-width": "^1.0.2 || 2"
-          }
-        },
-        "wrappy": {
-          "version": "1.0.2",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        },
-        "yallist": {
-          "version": "3.0.3",
-          "bundled": true,
-          "dev": true,
-          "optional": true
-        }
-      }
-    },
-    "fstream": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
-      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "inherits": "~2.0.0",
-        "mkdirp": ">=0.5 0",
-        "rimraf": "2"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
-      }
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "functional-red-black-tree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
-      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
-      "dev": true
-    },
-    "gauge": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
-      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.0.3",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.0",
-        "object-assign": "^4.1.0",
-        "signal-exit": "^3.0.0",
-        "string-width": "^1.0.1",
-        "strip-ansi": "^3.0.1",
-        "wide-align": "^1.1.0"
-      }
-    },
-    "gaze": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
-      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
-      "dev": true,
-      "requires": {
-        "globule": "^1.0.0"
-      }
-    },
-    "get-assigned-identifiers": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
-      "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==",
-      "dev": true
-    },
-    "get-caller-file": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
-      "dev": true
-    },
-    "get-func-name": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
-      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
-      "dev": true
-    },
-    "get-stdin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
-      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
-      "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
-      "dev": true,
-      "requires": {
-        "pump": "^3.0.0"
-      },
-      "dependencies": {
-        "pump": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
-          }
-        }
-      }
-    },
-    "get-value": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
-      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
-      "dev": true
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "dev": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz",
-      "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
-      "dev": true,
-      "requires": {
-        "is-glob": "^3.1.0",
-        "path-dirname": "^1.0.0"
-      },
-      "dependencies": {
-        "is-glob": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-          "dev": true,
-          "requires": {
-            "is-extglob": "^2.1.0"
-          }
-        }
-      }
-    },
-    "glob-stream": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
-      "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "glob": "^7.1.1",
-        "glob-parent": "^3.1.0",
-        "is-negated-glob": "^1.0.0",
-        "ordered-read-streams": "^1.0.0",
-        "pumpify": "^1.3.5",
-        "readable-stream": "^2.1.5",
-        "remove-trailing-separator": "^1.0.1",
-        "to-absolute-glob": "^2.0.0",
-        "unique-stream": "^2.0.2"
-      }
-    },
-    "glob-watcher": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz",
-      "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==",
-      "dev": true,
-      "requires": {
-        "anymatch": "^2.0.0",
-        "async-done": "^1.2.0",
-        "chokidar": "^2.0.0",
-        "is-negated-glob": "^1.0.0",
-        "just-debounce": "^1.0.0",
-        "object.defaults": "^1.1.0"
-      }
-    },
-    "global-modules": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-      "dev": true,
-      "requires": {
-        "global-prefix": "^1.0.1",
-        "is-windows": "^1.0.1",
-        "resolve-dir": "^1.0.0"
-      }
-    },
-    "global-prefix": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.2",
-        "homedir-polyfill": "^1.0.1",
-        "ini": "^1.3.4",
-        "is-windows": "^1.0.1",
-        "which": "^1.2.14"
-      }
-    },
-    "globals": {
-      "version": "9.18.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
-      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
-      "dev": true
-    },
-    "globby": {
-      "version": "10.0.1",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz",
-      "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==",
-      "dev": true,
-      "requires": {
-        "@types/glob": "^7.1.1",
-        "array-union": "^2.1.0",
-        "dir-glob": "^3.0.1",
-        "fast-glob": "^3.0.3",
-        "glob": "^7.1.3",
-        "ignore": "^5.1.1",
-        "merge2": "^1.2.3",
-        "slash": "^3.0.0"
-      },
-      "dependencies": {
-        "slash": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-          "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-          "dev": true
-        }
-      }
-    },
-    "globule": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
-      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
-      "dev": true,
-      "requires": {
-        "glob": "~7.1.1",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2"
-      }
-    },
-    "glogg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
-      "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
-      "dev": true,
-      "requires": {
-        "sparkles": "^1.0.0"
-      }
-    },
-    "google-code-prettify": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz",
-      "integrity": "sha1-n0d/Ik2/piNy5e+AOn4VdBBAAIQ=",
-      "optional": true
-    },
-    "graceful-fs": {
-      "version": "4.1.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-      "dev": true
-    },
-    "growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
-      "dev": true
-    },
-    "gulp": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
-      "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
-      "dev": true,
-      "requires": {
-        "glob-watcher": "^5.0.3",
-        "gulp-cli": "^2.2.0",
-        "undertaker": "^1.2.1",
-        "vinyl-fs": "^3.0.0"
-      },
-      "dependencies": {
-        "gulp-cli": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz",
-          "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==",
-          "dev": true,
-          "requires": {
-            "ansi-colors": "^1.0.1",
-            "archy": "^1.0.0",
-            "array-sort": "^1.0.0",
-            "color-support": "^1.1.3",
-            "concat-stream": "^1.6.0",
-            "copy-props": "^2.0.1",
-            "fancy-log": "^1.3.2",
-            "gulplog": "^1.0.0",
-            "interpret": "^1.1.0",
-            "isobject": "^3.0.1",
-            "liftoff": "^3.1.0",
-            "matchdep": "^2.0.0",
-            "mute-stdout": "^1.0.0",
-            "pretty-hrtime": "^1.0.0",
-            "replace-homedir": "^1.0.0",
-            "semver-greatest-satisfied-range": "^1.1.0",
-            "v8flags": "^3.0.1",
-            "yargs": "^7.1.0"
-          }
-        }
-      }
-    },
-    "gulp-babel": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-8.0.0.tgz",
-      "integrity": "sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==",
-      "dev": true,
-      "requires": {
-        "plugin-error": "^1.0.1",
-        "replace-ext": "^1.0.0",
-        "through2": "^2.0.0",
-        "vinyl-sourcemaps-apply": "^0.2.0"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "gulp-clean-css": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.2.0.tgz",
-      "integrity": "sha512-r4zQsSOAK2UYUL/ipkAVCTRg/2CLZ2A+oPVORopBximRksJ6qy3EX1KGrIWT4ZrHxz3Hlobb1yyJtqiut7DNjA==",
-      "dev": true,
-      "requires": {
-        "clean-css": "4.2.1",
-        "plugin-error": "1.0.1",
-        "through2": "3.0.1",
-        "vinyl-sourcemaps-apply": "0.2.1"
-      }
-    },
-    "gulp-concat": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
-      "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
-      "dev": true,
-      "requires": {
-        "concat-with-sourcemaps": "^1.0.0",
-        "through2": "^2.0.0",
-        "vinyl": "^2.0.0"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "dev": true,
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "gulp-eslint": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-6.0.0.tgz",
-      "integrity": "sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig==",
-      "dev": true,
-      "requires": {
-        "eslint": "^6.0.0",
-        "fancy-log": "^1.3.2",
-        "plugin-error": "^1.0.1"
-      }
-    },
-    "gulp-if": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-3.0.0.tgz",
-      "integrity": "sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==",
-      "dev": true,
-      "requires": {
-        "gulp-match": "^1.1.0",
-        "ternary-stream": "^3.0.0",
-        "through2": "^3.0.1"
-      }
-    },
-    "gulp-insert": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/gulp-insert/-/gulp-insert-0.5.0.tgz",
-      "integrity": "sha1-MjE/E+SiPPWsylzl8MCAkjx3hgI=",
-      "dev": true,
-      "requires": {
-        "readable-stream": "^1.0.26-4",
-        "streamqueue": "0.0.6"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "0.0.1",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
-          "dev": true
-        },
-        "readable-stream": {
-          "version": "1.1.14",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-          "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-          "dev": true,
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.1",
-            "isarray": "0.0.1",
-            "string_decoder": "~0.10.x"
-          }
-        },
-        "string_decoder": {
-          "version": "0.10.31",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
-          "dev": true
-        }
-      }
-    },
-    "gulp-match": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz",
-      "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==",
-      "dev": true,
-      "requires": {
-        "minimatch": "^3.0.3"
-      }
-    },
-    "gulp-mocha": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-7.0.2.tgz",
-      "integrity": "sha512-ZXBGN60TXYnFhttr19mfZBOtlHYGx9SvCSc+Kr/m2cMIGloUe176HBPwvPqlakPuQgeTGVRS47NmcdZUereKMQ==",
-      "dev": true,
-      "requires": {
-        "dargs": "^7.0.0",
-        "execa": "^2.0.4",
-        "mocha": "^6.2.0",
-        "plugin-error": "^1.0.1",
-        "supports-color": "^7.0.0",
-        "through2": "^3.0.1"
-      },
-      "dependencies": {
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
... 24402 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org