diff --git a/app/js/controllers/init/sync/SyncController.js b/app/js/controllers/init/sync/SyncController.js
index 10bfba74ed4851ecdc9181d9a97770f08c19da85..1e5271b959f02f11eb93916cb37875660e76a8e2 100644
--- a/app/js/controllers/init/sync/SyncController.js
+++ b/app/js/controllers/init/sync/SyncController.js
@@ -112,7 +112,7 @@ module.exports = ($scope, $http, $state, $timeout, $stateParams, $translate, UIU
         host: sp[0],
         port: sp[1],
         to: $scope.to,
-        chunkLen: Math.max(500, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))
+        chunkLen: Math.max(250, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))
       });
     });
   };
diff --git a/app/js/lib/conf/i18n/en.json b/app/js/lib/conf/i18n/en.json
index 789c763f9512f892f13abeb6abbf69acec9ec21b..92a6fe2d4b7b0c355bc4c32a0fd0bc5c11a23003 100644
--- a/app/js/lib/conf/i18n/en.json
+++ b/app/js/lib/conf/i18n/en.json
@@ -134,7 +134,7 @@
   "home.pulling.state.unkown": "Next sync in few minutes",
   "home.pulling.state.synced": "Synced",
   "home.pulling.state.syncing": "Syncing...",
-  "home.pow.unit": "blocks made by this key",
+  "home.pow.unit": "blocks made by this key (last 2 months)",
   "home.pow.is_mirror": "This node is a mirror",
   "home.pow.is_waiting": "Waiting for better proof conditions",
   "home.tabs.overview": "Overview",
diff --git a/app/views/init/sync/sync.jade b/app/views/init/sync/sync.jade
index 62ed0f88805a48ad0ccfdf78dd84b033558ef700..6566c3ce59a1e739de2649c3c006cae27299c298 100644
--- a/app/views/init/sync/sync.jade
+++ b/app/views/init/sync/sync.jade
@@ -61,14 +61,14 @@ main(class="syncMain")
             .row(ng-show="synchronizing")
               .col.s8.m9
                 .progress
-                  .determinate(style="width: {{ down_percent }}%")
+                  .determinate(style="width: {{ storage_percent }}%")
               .col.s4.m3.left-align
-                span Download... ({{ down_percent }}%)
+                span Milestones... ({{ storage_percent }}%)
               .col.s8.m9
                 .progress
-                  .determinate(style="width: {{ storage_percent }}%")
+                  .determinate(style="width: {{ down_percent }}%")
               .col.s4.m3.left-align
-                span Storage... ({{ storage_percent }}%)
+                span Download... ({{ down_percent }}%)
               .col.s8.m9
                 .progress
                   .determinate(style="width: {{ apply_percent }}%")
@@ -85,4 +85,4 @@ main(class="syncMain")
               .col.s4.m3.left-align
                 span Peers... ({{ peers_percent }}%)
 
-            blockquote.card-panel.left-align(ng-show="sync_failed") {{ 'sync.failed' | translate }}
\ No newline at end of file
+            blockquote.card-panel.left-align(ng-show="sync_failed") {{ 'sync.failed' | translate }}
diff --git a/package.json b/package.json
index 8cadbcde34a782e53c3d6d6c412fa5603600b960..07846b68b77bed8b4056ca8830dab366887d2278 100644
--- a/package.json
+++ b/package.json
@@ -7,8 +7,7 @@
     "b": "brunch build",
     "watch": "brunch watch",
     "start": "cd cesium && npm start",
-    "test": "mocha --growl tests/",
-    "prepublish": "cd node_modules/duniter && npm install"
+    "test": "mocha --growl tests/"
   },
   "repository": {
     "type": "git",
@@ -69,6 +68,6 @@
     "util-deprecate": "1.0.2"
   },
   "peerDependencies": {
-    "duniter": "1.6.x"
+    "duniter": "1.7.x"
   }
 }
diff --git a/public/app.js b/public/app.js
index cb9719c1be385c65eb8191b8b907b0b09f58fd75..781efd73bc10d2fc3c49abe45ee37b97c39dc6e4 100644
--- a/public/app.js
+++ b/public/app.js
@@ -663,7 +663,7 @@ module.exports = function ($scope, $http, $state, $timeout, $stateParams, $trans
                 host: sp[0],
                 port: sp[1],
                 to: $scope.to,
-                chunkLen: Math.max(500, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))
+                chunkLen: Math.max(250, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))
               });
 
             case 16:
@@ -2609,7 +2609,7 @@ module.exports = {
   "home.pulling.state.unkown": "Next sync in few minutes",
   "home.pulling.state.synced": "Synced",
   "home.pulling.state.syncing": "Syncing...",
-  "home.pow.unit": "blocks made by this key",
+  "home.pow.unit": "blocks made by this key (last 2 months)",
   "home.pow.is_mirror": "This node is a mirror",
   "home.pow.is_waiting": "Waiting for better proof conditions",
   "home.tabs.overview": "Overview",
diff --git a/public/app.js.map b/public/app.js.map
index b557c7444dea5e2246f883fda1e5d88500ada9c5..562beb7768aaa76f25aa8749fca328aa7b69b819 100644
--- a/public/app.js.map
+++ b/public/app.js.map
@@ -1 +1 @@
-{"version":3,"sources":["app/js/controllers/AboutController.js","app/js/controllers/IndexController.js","app/js/controllers/init/create/IdentityController.js","app/js/controllers/init/create/ParametersController.js","app/js/controllers/init/create/RootBlockController.js","app/js/controllers/init/sync/SyncController.js","app/js/controllers/main/MainController.js","app/js/controllers/main/graphs/GraphsBlockchainController.js","app/js/controllers/main/graphs/GraphsController.js","app/js/controllers/main/home/HomeController.js","app/js/controllers/main/home/tabs/HomeConnectionsController.js","app/js/controllers/main/home/tabs/HomeNetworkController.js","app/js/controllers/main/home/tabs/OverviewController.js","app/js/controllers/main/settings/SettingsController.js","app/js/controllers/main/settings/tabs/BackupController.js","app/js/controllers/main/settings/tabs/CPUController.js","app/js/controllers/main/settings/tabs/CurrencyController.js","app/js/controllers/main/settings/tabs/DataController.js","app/js/controllers/main/settings/tabs/KeyController.js","app/js/controllers/main/settings/tabs/LogsController.js","app/js/controllers/main/settings/tabs/LogsSettingsController.js","app/js/controllers/main/settings/tabs/ModulesController.js","app/js/controllers/main/settings/tabs/NetworkController.js","app/js/app.config.js","app/js/application.js","app/js/lib/conf/conf.js","app/js/lib/conf/i18n/en.json","app/js/lib/conf/routes.js","app/js/lib/conf/translate.js","app/js/lib/entity/peer.js","app/js/lib/mobileDetector.js","app/js/services/base58.js","app/js/services/datetime.js","app/js/services/graphs.js","app/js/services/importer.js","app/js/services/pubkeyGenerator.js","app/js/services/ui_utils.js","app/js/services/webmin.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA3BA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1DA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1BA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AANA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAzNA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA3MA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AApNA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA9JA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAjKA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAtCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAjZA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAtCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAjCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAnDA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAzFA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AArDA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAvKA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AArFA;AAAA;CCAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlGA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlBA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlQA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAheA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAfA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAnHA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxFA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1BA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlPA;AAAA;CCAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA7DA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AApDA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAvPA;AAAA","file":"public/app.js","sourcesContent":["\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, version, UIUtils) {\n\n  $scope.version = version;\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return UIUtils.translate('help.about_duniter.title');\n\n          case 2:\n            $scope.$parent.title = _context.sent;\n\n          case 3:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, Webmin, summary, UIUtils) {\n\n  UIUtils.changeTitle(summary.version, summary.parameters.currency, summary.conf.prefix);\n\n  $scope.message = 'index.message.loading';\n  co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n    var connected, _summary;\n\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            connected = false;\n            _context.prev = 1;\n            _context.next = 4;\n            return Webmin.summary();\n\n          case 4:\n            _summary = _context.sent;\n\n            if (!_summary.current) {\n              _context.next = 7;\n              break;\n            }\n\n            return _context.abrupt('return', $state.go('main.home.overview'));\n\n          case 7:\n            return _context.abrupt('return', $state.go('configure.choose'));\n\n          case 10:\n            _context.prev = 10;\n            _context.t0 = _context['catch'](1);\n\n            console.error(connected, _context.t0);\n\n            if (connected) {\n              _context.next = 15;\n              break;\n            }\n\n            return _context.abrupt('return', $state.go('error', { err: 'err.connection' }));\n\n          case 15:\n            return _context.abrupt('return', $state.go('error', { err: _context.t0 }));\n\n          case 16:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this, [[1, 10]]);\n  }));\n};\n","\"use strict\";\n\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = function ($scope, $state, PubkeyGenerator) {\n\n  setTimeout(function () {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = function () {\n    var modal = $('#modal1');\n    if (modal.css('display') == 'none') {\n      $('#modal1').openModal();\n    }\n  };\n\n  PubkeyGenerator($scope);\n\n  if (conf.dev_autoconf) {\n    $scope.$parent.conf.idty_uid = 'dev_' + ~~(Math.random() * 2147483647);\n    $scope.$parent.conf.idty_entropy = ~~(Math.random() * 2147483647) + \"\";\n    $scope.$parent.conf.idty_password = ~~(Math.random() * 2147483647) + \"\";\n    $state.go('configure.create.network');\n  }\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, UIUtils) {\n\n  UIUtils.enableInputs();\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = function ($scope, $http, $state, Webmin) {\n\n  $scope.generated = '';\n  $scope.started = false;\n  $scope.message = 'configuration.create_root.need_a_try';\n\n  $scope.start = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var hosts;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.prev = 0;\n              hosts = [];\n\n              if ($scope.$parent.conf.remote_ipv4) {\n                hosts.push([$scope.$parent.conf.remote_ipv4, $scope.$parent.conf.rport].join(':'));\n              }\n              if ($scope.$parent.conf.remote_ipv6) {\n                hosts.push([\"[\" + $scope.$parent.conf.remote_ipv6 + \"]\", $scope.$parent.conf.rport].join(':'));\n              }\n              $scope.host_listening = hosts.join('\\n');\n              $scope.started = true;\n              _context.next = 8;\n              return Webmin.server.sendConf({\n                conf: $scope.$parent.conf\n              });\n\n            case 8:\n              _context.next = 10;\n              return $scope.try();\n\n            case 10:\n              _context.next = 15;\n              break;\n\n            case 12:\n              _context.prev = 12;\n              _context.t0 = _context['catch'](0);\n\n              $scope.message = _context.t0.message;\n\n            case 15:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[0, 12]]);\n    }));\n  };\n\n  $scope.stop = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              $scope.started = false;\n\n            case 1:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  $scope.try = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              _context3.prev = 0;\n              _context3.next = 3;\n              return Webmin.server.previewNext();\n\n            case 3:\n              $scope.block = _context3.sent;\n\n              $scope.generated = $scope.block.raw;\n              $scope.message = '';\n              _context3.next = 11;\n              break;\n\n            case 8:\n              _context3.prev = 8;\n              _context3.t0 = _context3['catch'](0);\n\n              $scope.message = _context3.t0.message;\n\n            case 11:\n            case 'end':\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this, [[0, 8]]);\n    }));\n  };\n\n  $scope.accept = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n              _context4.next = 2;\n              return Webmin.blockchain.block_add({\n                block: $scope.generated\n              });\n\n            case 2:\n              res = _context4.sent;\n\n              if (!(res.number == 0)) {\n                _context4.next = 6;\n                break;\n              }\n\n              _context4.next = 6;\n              return $scope.startServices();\n\n            case 6:\n            case 'end':\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this);\n    }));\n  };\n\n  $scope.startServices = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n      return regeneratorRuntime.wrap(function _callee5$(_context5) {\n        while (1) {\n          switch (_context5.prev = _context5.next) {\n            case 0:\n              _context5.next = 2;\n              return Webmin.server.services.startAll();\n\n            case 2:\n              $state.go('index');\n\n            case 3:\n            case 'end':\n              return _context5.stop();\n          }\n        }\n      }, _callee5, this);\n    }));\n  };\n\n  $scope.cancelAndReset = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n      return regeneratorRuntime.wrap(function _callee6$(_context6) {\n        while (1) {\n          switch (_context6.prev = _context6.next) {\n            case 0:\n              _context6.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              _context6.next = 4;\n              return Webmin.server.resetData();\n\n            case 4:\n              $state.go('index');\n\n            case 5:\n            case 'end':\n              return _context6.stop();\n          }\n        }\n      }, _callee6, this);\n    }));\n  };\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n    return regeneratorRuntime.wrap(function _callee7$(_context7) {\n      while (1) {\n        switch (_context7.prev = _context7.next) {\n          case 0:\n            _context7.prev = 0;\n            _context7.next = 3;\n            return $scope.start();\n\n          case 3:\n            _context7.next = 5;\n            return $scope.try();\n\n          case 5:\n            $scope.started = true;\n            _context7.next = 11;\n            break;\n\n          case 8:\n            _context7.prev = 8;\n            _context7.t0 = _context7['catch'](0);\n\n            $scope.started = false;\n\n          case 11:\n          case 'end':\n            return _context7.stop();\n        }\n      }\n    }, _callee7, this, [[0, 8]]);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, $timeout, $stateParams, $translate, UIUtils, Webmin) {\n\n  var syncWS = Webmin.ws();\n\n  UIUtils.enableInputs();\n  $scope.sync_mode = 'simplified';\n  $scope.simplified_host = '';\n  $scope.synchronizing = false;\n  $scope.sync_failed = false;\n  $scope.host = $stateParams.host || localStorage.getItem('sync_host') || '';\n  $scope.port = parseInt($stateParams.port) || parseInt(localStorage.getItem('sync_port')) || 10901;\n  $scope.to = parseInt($stateParams.to);\n  $scope.wrong_host = false;\n  $scope.remote_current = null;\n\n  $scope.checkNode = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var current, targetHost;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.checked_host = '';\n              $scope.sync_error = '';\n              $scope.sync_message = '';\n              if ($scope.sync_mode == 'simplified') {\n                $scope.host = $scope.simplified_host.split(':')[0];\n                $scope.port = parseInt($scope.simplified_host.split(':')[1]);\n              }\n              $scope.checking = true;\n              _context.prev = 5;\n              _context.next = 8;\n              return Webmin.server.testSync({\n                host: $scope.host,\n                port: $scope.port\n              });\n\n            case 8:\n              current = _context.sent;\n              targetHost = [$scope.host, $scope.port].join(':');\n\n              if (current) {\n                $scope.remote_current = current;\n                $scope.checked_host = targetHost;\n              }\n              UIUtils.toast('sync.ready.node.part1');\n              $timeout(function () {\n                if (!$scope.synchronizing) {\n                  UIUtils.toast('sync.ready.node.part2');\n                }\n              }, 6000);\n              _context.next = 18;\n              break;\n\n            case 15:\n              _context.prev = 15;\n              _context.t0 = _context['catch'](5);\n\n              $scope.sync_error = 'sync.error.unreachable.try.another.node';\n\n            case 18:\n              $scope.checking = false;\n              return _context.abrupt('return', $scope.checked_host ? true : false);\n\n            case 20:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[5, 15]]);\n    }));\n  };\n\n  $scope.startSync = function () {\n    $scope.down_percent = 0;\n    $scope.apply_percent = 0;\n    $scope.storage_percent = 0;\n    $scope.sbx_percent = 0;\n    $scope.peers_percent = 0;\n    $scope.sync_failed = false;\n    $scope.synchronizing = true;\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      var sp, translatedErr;\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              _context2.next = 2;\n              return $translate('sync.started.node');\n\n            case 2:\n              _context2.t0 = _context2.sent;\n              _context2.t1 = _context2.t0 + ' ';\n              _context2.t2 = $scope.checked_host;\n              $scope.sync_message = _context2.t1 + _context2.t2;\n              sp = $scope.checked_host.split(':');\n              _context2.next = 9;\n              return $translate('err.sync.interrupted');\n\n            case 9:\n              translatedErr = _context2.sent;\n\n              syncWS.on(undefined, function (data) {\n                if (data.type == 'sync') {\n                  $scope.down_percent = 100;\n                  $scope.apply_percent = 100;\n                  $scope.storage_percent = 100;\n                  $scope.sbx_percent = 100;\n                  $scope.peers_percent = 100;\n                  $scope.sync_failed = data.value;\n                  var errorMessage = data.msg && (data.msg.message || data.msg);\n                  errorMessage = translatedErr + ' « ' + errorMessage + ' »';\n                  Webmin.server.republishNewSelfPeer().then(function () {\n                    return console.log('Peer republished');\n                  });\n                  if (data.value === true) {\n                    $state.go('index');\n                  } else {\n                    $state.go('error', { err: errorMessage });\n                  }\n                } else {\n                  var changed = true;\n                  if (data.type == 'download' && $scope.down_percent != data.value) {\n                    $scope.down_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'applied' && $scope.apply_percent != data.value) {\n                    $scope.apply_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'saved' && $scope.storage_percent != data.value) {\n                    $scope.storage_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'sandbox' && $scope.sbx_percent != data.value) {\n                    $scope.sbx_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'peersSync' && $scope.peers_percent != data.value) {\n                    $scope.peers_percent = data.value;\n                    changed = true;\n                  }\n                  if (changed) {\n                    $scope.$apply();\n                  }\n                }\n              });\n              _context2.next = 13;\n              return Webmin.server.autoConfNetwork();\n\n            case 13:\n              localStorage.setItem(\"sync_host\", sp[0]);\n              localStorage.setItem(\"sync_port\", sp[1]);\n              Webmin.server.startSync({\n                host: sp[0],\n                port: sp[1],\n                to: $scope.to,\n                chunkLen: Math.max(500, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))\n              });\n\n            case 16:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  // Autostart\n  if ($scope.host && $scope.port && $stateParams.sync) {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      var nodeOK;\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              _context3.next = 2;\n              return $scope.checkNode();\n\n            case 2:\n              nodeOK = _context3.sent;\n\n              if (!nodeOK) {\n                _context3.next = 5;\n                break;\n              }\n\n              return _context3.abrupt('return', $scope.startSync());\n\n            case 5:\n            case 'end':\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n  }\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $state, $http, $timeout, $interval, Webmin, uiModules, summary, UIUtils) {\n\n  $scope.externalMenus = [];\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    var _loop = function _loop() {\n      var moduleName = _step.value;\n\n      var module = window.uiModules[moduleName];\n      if (module) {\n        $scope.externalMenus.push({\n          menuOpen: function menuOpen() {\n            return module.menuOpen(summary);\n          },\n          menuIconClass: module.menuIconClass,\n          menuLabel: module.menuLabel\n        });\n      }\n    };\n\n    for (var _iterator = uiModules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      _loop();\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  $scope.notifications = {\n    help: []\n  };\n\n  Waves.displayEffect();\n\n  var isMobile = require('js/lib/mobileDetector');\n  if (isMobile()) {\n    $(\".button-collapse\").sideNav({\n      menuWidth: 280\n    });\n  }\n\n  UIUtils.changeTitle(summary.version, summary.parameters.currency, summary.conf.prefix);\n\n  var aboutWin = void 0;\n\n  $scope.showAbout = function () {\n    if (aboutWin) {\n      aboutWin.focus();\n    } else {\n      openWindow(window.location.origin + '/#/about', {\n        position: 'center',\n        height: 380,\n        width: 510\n      }, function (subwin) {\n        subwin.window.gui = window.gui;\n        subwin.on('closed', function () {\n          aboutWin = null;\n          mainWindow.focus();\n        });\n        aboutWin = subwin;\n      });\n    }\n  };\n\n  $scope.startServer = function () {\n    $scope.server_stopped = false;\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.services.startAll();\n\n            case 2:\n              $scope.server_started = true;\n\n            case 3:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  $scope.stopServer = function () {\n    $scope.server_started = false;\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              _context2.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              $scope.server_stopped = true;\n\n            case 3:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  $scope.restartServer = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              _context3.next = 2;\n              return $scope.stopServer();\n\n            case 2:\n              _context3.next = 4;\n              return $scope.startServer();\n\n            case 4:\n            case 'end':\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n  };\n\n  function checkUpdates() {\n    var LATEST_RELEASE_URL = 'https://api.github.com/repos/duniter/duniter/releases/latest';\n    co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n      var latest, local_string_version, m, localVersion, localSuffix, isLocalAPreRelease, remoteVersion, localMajor, localMinor, localFix, remoteMajor, remoteMinor, remoteFix, newMajor, newMinor, newFix;\n      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n              _context4.prev = 0;\n              _context4.next = 3;\n              return $http.get(LATEST_RELEASE_URL);\n\n            case 3:\n              latest = _context4.sent;\n              local_string_version = 'v' + summary.version;\n              m = local_string_version.match(/^v([\\d.]+)([ab]?\\d*)/);\n              localVersion = m && m[1] || \"\";\n              localSuffix = m && m[2];\n              isLocalAPreRelease = !!localSuffix;\n              remoteVersion = latest.data.tag_name.substr(1);\n              localMajor = parseInt(localVersion.split('.')[0]);\n              localMinor = parseInt(localVersion.split('.')[1]);\n              localFix = parseInt(localVersion.split('.')[2]);\n              remoteMajor = parseInt(remoteVersion.split('.')[0]);\n              remoteMinor = parseInt(remoteVersion.split('.')[1]);\n              remoteFix = parseInt(remoteVersion.split('.')[2]);\n              newMajor = remoteMajor > localMajor;\n              newMinor = !newMajor && remoteMinor > localMinor;\n              newFix = !newMinor && remoteFix > localFix;\n\n              if (newMajor || newMinor || newFix || localVersion == remoteVersion && isLocalAPreRelease) {\n                if ($scope.notifications.help.filter(function (entry) {\n                  return entry.message == 'help.new_version_available';\n                }).length == 0) {\n                  $scope.notifications.help.push({\n                    icon: 'play_for_work',\n                    message: 'help.new_version_available',\n                    onclick: function onclick() {\n                      return openExternal('https://github.com/duniter/duniter/releases/latest');\n                    }\n                  });\n                }\n              }\n              _context4.next = 25;\n              break;\n\n            case 22:\n              _context4.prev = 22;\n              _context4.t0 = _context4['catch'](0);\n\n              console.error(_context4.t0);\n\n            case 25:\n            case 'end':\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this, [[0, 22]]);\n    }));\n  }\n\n  $interval(checkUpdates, 1000 * 3600);\n  $timeout(checkUpdates, 1000);\n};\n","\"use strict\";\n\nvar BLOCKS_COUNT = 40;\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $state, $timeout, Webmin, UIUtils, Graph) {\n\n  var data = {};\n\n  $scope.loading = true;\n  $scope.blocksCount = $scope.blocksCount || BLOCKS_COUNT;\n\n  $scope.$watch('withTime', function (newValue) {\n    if (newValue) {\n      timeGraph();\n    }\n  });\n\n  $scope.$watch('withSpeed', function (newValue) {\n    if (newValue) {\n      speedGraph();\n    }\n  });\n\n  $scope.$watch('withDifficulty', function (newValue) {\n    if (newValue) {\n      diffGraph();\n    }\n  });\n\n  $scope.updateGraphs = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var summary, parameters, blocks, speeds, accelerations, medianTimeIncrements, actualDurations, BY_HOUR, i, len, block, acc, previousPos, j, availPreviousBlocks, localAvgSpeed, realDuration, graphs, _i, _len;\n\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.summary();\n\n            case 2:\n              summary = _context.sent;\n              _context.next = 5;\n              return Webmin.currency.parameters();\n\n            case 5:\n              parameters = _context.sent;\n              _context.next = 8;\n              return Webmin.blockchain.blocks({\n                count: $scope.blocksCount,\n                from: Math.max(0, summary.current.number - $scope.blocksCount)\n              });\n\n            case 8:\n              blocks = _context.sent;\n              speeds = [], accelerations = [], medianTimeIncrements = [], actualDurations = [];\n              BY_HOUR = 3600;\n\n              for (i = 0, len = blocks.length; i < len; i++) {\n                block = blocks[i];\n                acc = 0;\n                previousPos = Math.max(0, i - parameters.dtDiffEval);\n\n                for (j = previousPos; j < i; j++) {\n                  acc += blocks[j + 1].medianTime - blocks[j].medianTime;\n                }\n                availPreviousBlocks = i - 1 - previousPos;\n                localAvgSpeed = acc / (availPreviousBlocks || 1);\n                realDuration = !isNaN(localAvgSpeed) && localAvgSpeed != 0 ? localAvgSpeed : parameters.avgGenTime;\n\n                actualDurations.push(parseFloat(realDuration.toFixed(2)));\n                speeds.push(parseFloat((BY_HOUR / realDuration).toFixed(2)));\n                accelerations.push(block.time - block.medianTime);\n                medianTimeIncrements.push(block.medianTime - (i ? blocks[i - 1].medianTime : block.medianTime));\n              }\n              data.summary = summary;\n              data.speeds = speeds;\n              data.accelerations = accelerations;\n              data.medianTimeIncrements = medianTimeIncrements;\n              data.actualDurations = actualDurations;\n              data.minSpeeds = speeds.map(function () {\n                return parseFloat((BY_HOUR / Math.ceil(parameters.avgGenTime * Math.sqrt(1.066))).toFixed(2));\n              });\n              data.maxSpeeds = speeds.map(function () {\n                return parseFloat((BY_HOUR / Math.floor(parameters.avgGenTime / Math.sqrt(1.066))).toFixed(2));\n              });\n              data.minDurations = speeds.map(function () {\n                return parseFloat((parameters.avgGenTime / 1.066).toFixed(2));\n              });\n              data.maxDurations = speeds.map(function () {\n                return parseFloat((parameters.avgGenTime * 1.066).toFixed(2));\n              });\n              data.difficulties = blocks.map(function (b) {\n                return b.powMin;\n              });\n\n              graphs = [];\n\n              if ($scope.withTime) graphs.push(timeGraph);\n              if ($scope.withSpeed) graphs.push(speedGraph);\n              if ($scope.withDifficulty) graphs.push(diffGraph);\n              for (_i = 0, _len = graphs.length; _i < _len; _i++) {\n                graphs[_i]();\n              }\n              $scope.loading = false;\n\n            case 28:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  function timeGraph() {\n    if ($scope.withTime) {\n      Graph.timeGraphs('#timeGraph', Math.max(0, data.summary.current.number - $scope.blocksCount + 1), data.accelerations, data.medianTimeIncrements, data.actualDurations, data.minDurations, data.maxDurations);\n    }\n  }\n\n  function speedGraph() {\n    if ($scope.withSpeed) {\n      Graph.speedGraph('#speedGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.speeds, data.minSpeeds, data.maxSpeeds, function (series) {\n        $scope.series = series;\n      });\n    }\n  }\n\n  function diffGraph() {\n    if ($scope.withDifficulty) {\n      Graph.difficultyGraph('#difficultyGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.difficulties);\n    }\n  }\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n    return regeneratorRuntime.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return $scope.updateGraphs();\n\n          case 2:\n            $scope.withTime = true;\n            $scope.withDifficulty = true;\n            $scope.$apply();\n\n          case 5:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'graphs';\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'home';\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, Webmin, heads, info, conf, ws) {\n\n  $scope.discriminateNodes = function (info) {\n    info.connections.level1.concat(info.connections.level2).forEach(function (c) {\n      c.prefered = (conf.preferedNodes || []).indexOf(c.pubkey) !== -1;\n      c.privileged = (conf.privilegedNodes || []).indexOf(c.pubkey) !== -1;\n    });\n    return info;\n  };\n\n  $scope.info = $scope.discriminateNodes(info);\n  $scope.heads = [];\n\n  var headsMap = {};\n\n  $scope.headsIntoMap = function (heads) {\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n\n    try {\n      for (var _iterator = heads[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n        var value = _step.value;\n\n        var sp = value.message.split(':');\n        var api = sp[0];\n        var pubkey = sp[3];\n        var blockstamp = sp[4];\n        var ws2pId = sp[5];\n        var software = sp[6];\n        var softVersion = sp[7];\n        var prefix = sp[8];\n        var uid = value.uid;\n        var freeRooms = \"\";\n        var step = \"\";\n        // Gestion des anciens formats\n        console.log(value.message);\n        if (value.messageV2 && value.messageV2.match(/:2:/)) {\n          // HEAD V2\n          freeRooms = value.freeRooms;\n          step = value.step;\n        } else if (value.message.match(/:1:/)) {\n          // HEAD v1\n        } else {\n          // HEAD v0\n          pubkey = sp[2];\n          blockstamp = sp[3];\n        }\n        var ws2pFullId = pubkey + \"-\" + ws2pId;\n        headsMap[ws2pFullId] = {\n          api: api, blockstamp: blockstamp, uid: uid, ws2pId: ws2pId, software: software, softVersion: softVersion, prefix: prefix, freeRooms: freeRooms, step: step\n        };\n      }\n    } catch (err) {\n      _didIteratorError = true;\n      _iteratorError = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion && _iterator.return) {\n          _iterator.return();\n        }\n      } finally {\n        if (_didIteratorError) {\n          throw _iteratorError;\n        }\n      }\n    }\n\n    $scope.heads = Object.keys(headsMap).map(function (k) {\n      return {\n        pubkey: k,\n        api: headsMap[k].api,\n        uid: headsMap[k].uid,\n        blockstamp: headsMap[k].blockstamp,\n        ws2pId: headsMap[k].ws2pId,\n        software: headsMap[k].software,\n        softVersion: headsMap[k].softVersion,\n        prefix: headsMap[k].prefix,\n        freeRooms: headsMap[k].freeRooms,\n        step: headsMap[k].step\n      };\n    });\n  };\n\n  $scope.headsIntoMap(heads);\n\n  ws.on('ws2p', function (obj) {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              if (obj.value.ws2p === 'heads') {\n                $scope.headsIntoMap(obj.value.added);\n              } else if (obj.value.ws2p === 'connected' || obj.value.ws2p === 'disconnected') {\n                co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n                  return regeneratorRuntime.wrap(function _callee$(_context) {\n                    while (1) {\n                      switch (_context.prev = _context.next) {\n                        case 0:\n                          _context.t0 = $scope;\n                          _context.next = 3;\n                          return Webmin.network.ws2p.info();\n\n                        case 3:\n                          _context.t1 = _context.sent;\n                          $scope.info = _context.t0.discriminateNodes.call(_context.t0, _context.t1);\n\n                        case 5:\n                        case \"end\":\n                          return _context.stop();\n                      }\n                    }\n                  }, _callee, this);\n                }));\n              }\n              $scope.$apply();\n\n            case 2:\n            case \"end\":\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  });\n\n  var co = require('co');\n\n  $scope.update = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      var delayP;\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              $scope.searching = true;\n              delayP = Q.delay(500);\n              _context3.next = 4;\n              return Webmin.network.peers();\n\n            case 4:\n              $scope.peers = _context3.sent.peers;\n              _context3.next = 7;\n              return delayP;\n\n            case 7:\n              $scope.searching = false;\n              $scope.$apply();\n\n            case 9:\n            case \"end\":\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, Webmin, peers) {\n\n  $scope.peers = peers.peers;\n\n  var co = require('co');\n\n  $scope.update = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var delayP;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.searching = true;\n              delayP = Q.delay(500);\n              _context.next = 4;\n              return Webmin.network.peers();\n\n            case 4:\n              $scope.peers = _context.sent.peers;\n              _context.next = 7;\n              return delayP;\n\n            case 7:\n              $scope.searching = false;\n              $scope.$apply();\n\n            case 9:\n            case \"end\":\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, $interval, Webmin, UIUtils, summary, ws) {\n\n  UIUtils.enableTabs();\n  var co = require('co');\n  var moment = require('moment');\n\n  $scope.$parent.isStarted = false;\n  $scope.connected_ws2p_peers = 0;\n\n  $scope.updateInfo = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var info, map, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, level1, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, level2;\n\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.network.ws2p.info();\n\n            case 2:\n              info = _context.sent;\n              map = {};\n              _iteratorNormalCompletion = true;\n              _didIteratorError = false;\n              _iteratorError = undefined;\n              _context.prev = 7;\n\n              for (_iterator = info.connections.level1[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n                level1 = _step.value;\n\n                map[level1.pubkey] = true;\n              }\n              _context.next = 15;\n              break;\n\n            case 11:\n              _context.prev = 11;\n              _context.t0 = _context['catch'](7);\n              _didIteratorError = true;\n              _iteratorError = _context.t0;\n\n            case 15:\n              _context.prev = 15;\n              _context.prev = 16;\n\n              if (!_iteratorNormalCompletion && _iterator.return) {\n                _iterator.return();\n              }\n\n            case 18:\n              _context.prev = 18;\n\n              if (!_didIteratorError) {\n                _context.next = 21;\n                break;\n              }\n\n              throw _iteratorError;\n\n            case 21:\n              return _context.finish(18);\n\n            case 22:\n              return _context.finish(15);\n\n            case 23:\n              _iteratorNormalCompletion2 = true;\n              _didIteratorError2 = false;\n              _iteratorError2 = undefined;\n              _context.prev = 26;\n              for (_iterator2 = info.connections.level2[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n                level2 = _step2.value;\n\n                map[level2.pubkey] = true;\n              }\n              _context.next = 34;\n              break;\n\n            case 30:\n              _context.prev = 30;\n              _context.t1 = _context['catch'](26);\n              _didIteratorError2 = true;\n              _iteratorError2 = _context.t1;\n\n            case 34:\n              _context.prev = 34;\n              _context.prev = 35;\n\n              if (!_iteratorNormalCompletion2 && _iterator2.return) {\n                _iterator2.return();\n              }\n\n            case 37:\n              _context.prev = 37;\n\n              if (!_didIteratorError2) {\n                _context.next = 40;\n                break;\n              }\n\n              throw _iteratorError2;\n\n            case 40:\n              return _context.finish(37);\n\n            case 41:\n              return _context.finish(34);\n\n            case 42:\n              $scope.connected_ws2p_peers = Object.keys(map).length;\n\n            case 43:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[7, 11, 15, 23], [16,, 18, 22], [26, 30, 34, 42], [35,, 37, 41]]);\n    }));\n  };\n\n  bindBlockWS(function () {\n    $scope.loadPowData();\n  });\n  var M = summary.current.monetaryMass || 0;\n  // const nbUDperYear = Math.ceil(365.25 * 3600 * 24 / summary.parameters.dt);\n  // const globalC = Math.round(Math.pow(1 + summary.parameters.c, nbUDperYear) * 100) / 100 - 1;\n  var UD = summary.parameters.ud0;\n  if (summary.lastUDBlock) {\n    var N = summary.current.membersCount;\n    UD = parseInt(Math.round(summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase)));\n  }\n  $scope.current = summary.current;\n  $scope.current_currency = summary.current.currency;\n  $scope.current_number = summary.current.number;\n  $scope.current_membersCount = summary.current.membersCount;\n  $scope.current_medianTime = summary.current.medianTime;\n  $scope.current_powMin = summary.current.powMin;\n  $scope.monetaryMass = parseInt(M / UD) || 0;\n  $scope.server_started = true;\n  $scope.server_stopped = false;\n  $scope.phones = [];\n  $scope.abc = 'abcdef';\n  $scope.newIdentities = 2;\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.lastNearPoW = '';\n  $scope.totalPoW = '...';\n  $scope.sync_state = 'home.pulling.state.unkown';\n  $scope.network_percent = 0;\n  $scope.peer_percent = 0;\n  $scope.has_pulled = false;\n  $scope.is_pulling = false;\n  $scope.last_pulling = 0;\n  var start_block = 0;\n\n  $interval(function () {\n    if ($scope.last_pulling) {\n      $scope.sync_state = $scope.is_pulling ? 'home.pulling.state.syncing' : 'home.pulling.state.synced';\n      $scope.sync_time = moment($scope.last_pulling).fromNow();\n    }\n  }, 1000);\n\n  $scope.loadPowData = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              _context2.next = 2;\n              return Webmin.powSummary();\n\n            case 2:\n              res = _context2.sent;\n\n              $scope.pow_total = res.total;\n              $scope.pow_mirror = res.mirror;\n              $scope.pow_waiting = res.waiting;\n\n            case 6:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  ws.on(undefined, function (data) {\n    if (data.type === 'started') {\n      $scope.server_started = true;\n      $scope.server_stopped = false;\n      bindBlockWS(function () {\n        $scope.loadPowData();\n      });\n      UIUtils.toast('general.server.started');\n      $scope.$apply();\n    }\n    if (data.type === 'already_started') {\n      $scope.server_started = true;\n      $scope.server_stopped = false;\n      bindBlockWS(function () {\n        $scope.loadPowData();\n      });\n      $scope.$apply();\n    }\n    if (data.type === 'stopped') {\n      $scope.server_stopped = true;\n      $scope.server_started = false;\n      UIUtils.toast('general.server.stopped');\n      $scope.$apply();\n    }\n    if (data.type === 'pulling') {\n      $scope.is_pulling = true;\n      $scope.has_pulled = true;\n      var event = data.value;\n      if ($scope.last_pulling && event.type === 'start' || !$scope.last_pulling && event.type !== 'end') {\n        $scope.last_pulling = moment();\n      }\n      if (event.type === 'peer') {\n        $scope.network_percent = parseInt((event.data.number + 1) / event.data.length * 100);\n        $scope.peer_percent = 100;\n        start_block = 0;\n      }\n      if (event.type === 'applying') {\n        if (!start_block) {\n          start_block = event.data.number;\n        }\n        var total = event.data.last - start_block;\n        var doneCount = event.data.number - start_block;\n        $scope.peer_percent = parseInt(doneCount / total * 100);\n      }\n      if (event.type === 'end') {\n        $scope.is_pulling = false;\n        $scope.network_percent = 0;\n        $scope.peer_percent = 0;\n        start_block = 0;\n      }\n    }\n    if (data.type === 'pow') {\n      var pow = data.value;\n      if (pow.found) {\n        $scope.pow_waiting = true;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      } else {\n        $scope.pow_waiting = false;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      }\n    }\n    if (data.type === 'ws2p') {\n      if (data.value.ws2p === 'connected' || data.value.ws2p === 'disconnected') {\n        co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n          return regeneratorRuntime.wrap(function _callee3$(_context3) {\n            while (1) {\n              switch (_context3.prev = _context3.next) {\n                case 0:\n                  _context3.next = 2;\n                  return $scope.updateInfo();\n\n                case 2:\n                  $scope.$apply();\n\n                case 3:\n                case 'end':\n                  return _context3.stop();\n              }\n            }\n          }, _callee3, this);\n        }));\n      }\n    }\n  });\n\n  function bindBlockWS(cb) {\n    Webmin.wsBlock().on(undefined, function (block) {\n      $scope.current_currency = block.currency;\n      $scope.current_number = block.number;\n      $scope.current_membersCount = block.membersCount;\n      $scope.current_medianTime = block.medianTime;\n      $scope.current_powMin = block.powMin;\n      var M = summary.current.monetaryMass || 0;\n      var UD = summary.parameters.ud0;\n      if (summary.lastUDBlock) {\n        var _N = summary.current.membersCount;\n        UD = parseInt(Math.round(summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase)));\n      }\n      $scope.monetaryMass = parseInt(M / UD) || 0;\n      $scope.$apply();\n      cb && cb();\n    });\n  }\n\n  $scope.reconfigure_network = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n      var delay, netinferfaces, conf;\n      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n              $scope.reconfiguring = true;\n              delay = Q.delay(1000);\n              _context4.prev = 2;\n              _context4.next = 5;\n              return Webmin.network.interfaces();\n\n            case 5:\n              netinferfaces = _context4.sent;\n              conf = {};\n\n              conf.local_ipv4 = netinferfaces.auto.local.ipv4 || '';\n              conf.local_ipv6 = netinferfaces.auto.local.ipv6 || '';\n              conf.remote_ipv4 = netinferfaces.auto.remote.ipv4 || '';\n              conf.remote_ipv6 = netinferfaces.auto.remote.ipv6 || '';\n              conf.lport = netinferfaces.auto.local.port || 9330;\n              conf.rport = netinferfaces.auto.remote.port || 9330;\n              conf.upnp = netinferfaces.auto.remote.upnp || false;\n              conf.dns = netinferfaces.auto.remote.dns || '';\n              _context4.next = 17;\n              return Webmin.server.netConf({\n                conf: conf\n              });\n\n            case 17:\n              _context4.next = 19;\n              return delay;\n\n            case 19:\n              $scope.should_reconfigure = false;\n              UIUtils.toast('general.network.reconf_ok');\n              $scope.$apply();\n              _context4.next = 30;\n              break;\n\n            case 24:\n              _context4.prev = 24;\n              _context4.t0 = _context4['catch'](2);\n              _context4.next = 28;\n              return delay;\n\n            case 28:\n              $scope.reconfiguring = false;\n              $scope.$apply();\n\n            case 30:\n            case 'end':\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this, [[2, 24]]);\n    }));\n  };\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n    var reachable;\n    return regeneratorRuntime.wrap(function _callee5$(_context5) {\n      while (1) {\n        switch (_context5.prev = _context5.next) {\n          case 0:\n            _context5.next = 2;\n            return $scope.startServer();\n\n          case 2:\n            _context5.prev = 2;\n\n            $scope.updateInfo();\n            _context5.next = 6;\n            return $scope.loadPowData();\n\n          case 6:\n            _context5.next = 8;\n            return Webmin.isNodePubliclyReachable();\n\n          case 8:\n            reachable = _context5.sent;\n\n            if (!reachable || !reachable.success) {\n              $scope.should_reconfigure = true;\n            }\n            _context5.next = 15;\n            break;\n\n          case 12:\n            _context5.prev = 12;\n            _context5.t0 = _context5['catch'](2);\n\n            console.log(_context5.t0);\n\n          case 15:\n          case 'end':\n            return _context5.stop();\n        }\n      }\n    }, _callee5, this, [[2, 12]]);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, $location, Webmin, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.menu = 'settings';\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.fullReset = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              _context.next = 4;\n              return Webmin.server.resetData();\n\n            case 4:\n              $state.go('index');\n\n            case 5:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, Importer, Webmin) {\n\n  $scope.export_link = Webmin.getExportURL();\n\n  Importer($scope);\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, $timeout, UIUtils, summary, Webmin) {\n\n  $scope.cpuPower = parseInt(summary.conf.cpu * 100);\n\n  $scope.updateCPUpower = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.savingCPU = true;\n              _context.next = 3;\n              return Webmin.server.cpuConf({\n                cpu: parseFloat(($scope.cpuPower / 100).toFixed(2))\n              });\n\n            case 3:\n              UIUtils.toast('settings.cpu.saved');\n              $scope.savingCPU = false;\n\n            case 5:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, conf, UIUtils) {\n\n  $scope.$parent.conf = conf;\n\n  UIUtils.enableInputs();\n  $('input').attr('disabled', 'disabled');\n};\n","\"use strict\";\n\nvar co = require('co');\nvar Peer = require('js/lib/entity/peer');\n\nmodule.exports = function ($scope, $http, $state, Webmin, peers) {\n\n  $scope.peers = peers.map(function (peer) {\n    var p = new Peer(peer);\n    return {\n      name: [p.getURL(), \"(\" + p.pubkey.slice(0, 6) + \")\"].join(' '),\n      host_port: [p.getHost(), p.getPort()].join('|')\n    };\n  });\n\n  $scope.resetNode = function () {\n    $('#modalReset').openModal();\n  };\n\n  $scope.resetNodeAndSync = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var sp;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              _context.next = 4;\n              return Webmin.server.resetData();\n\n            case 4:\n              sp = $scope.remote_host.split('|');\n\n              $state.go('sync', {\n                host: sp[0],\n                port: sp[1],\n                sync: true\n              });\n\n            case 6:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $state, Webmin, summary, PubkeyGenerator) {\n\n  $scope.pubkey = summary.pubkey;\n\n  setTimeout(function () {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.keyConf({\n                conf: $scope.$parent.conf\n              });\n\n            case 2:\n              $scope.$parent.conf.idty_entropy = '';\n              $scope.$parent.conf.idty_password = '';\n              $state.reload();\n              $scope.restartServer();\n\n            case 6:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  PubkeyGenerator($scope);\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, ws, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  var co = require('co');\n  var _ = require('underscore');\n\n  // Default values\n  if (!localStorage.getItem('log_error')) localStorage.setItem('log_error', true);\n  if (!localStorage.getItem('log_warn')) localStorage.setItem('log_warn', true);\n  if (!localStorage.getItem('log_info')) localStorage.setItem('log_info', true);\n\n  $scope.logsSize = parseInt(localStorage.getItem('log_size')) || 100;\n  $scope.logs = _.range(0, $scope.logsSize).map(function () {\n    return \"\";\n  });\n  $scope.logsString = \"\";\n  $scope.follow = true;\n  $scope.levels = {\n    error: localStorage.getItem('log_error') == \"true\",\n    warn: localStorage.getItem('log_warn') == \"true\",\n    info: localStorage.getItem('log_info') == \"true\",\n    debug: localStorage.getItem('log_debug') == \"true\",\n    trace: localStorage.getItem('log_trace') == \"true\"\n  };\n\n  _.keys($scope.levels).map(function (level) {\n    $scope.$watch('levels.' + level, function (newValue) {\n      localStorage.setItem('log_' + level, newValue);\n      $scope.logs.splice(0, $scope.logs.length);\n      ws.send();\n    });\n  });\n\n  $scope.$watch('logsSize', function (newValue) {\n    localStorage.setItem('log_size', newValue);\n    addLogs({ value: [] }, true);\n  });\n\n  ws.on('log', addLogs);\n\n  function addLogs(res, autoDigest) {\n\n    if (!$scope.pause) {\n      var newlogs = _.filter(res.value, function (log) {\n        return $scope.levels[log.level];\n      });\n      // Add at max LOGS_FLOW_SIZE new lines\n      newlogs.splice(0, Math.max(0, newlogs.length - $scope.logsSize));\n      // Add just enough space for incoming logs\n      $scope.logs.splice(0, Math.max(0, $scope.logs.length + newlogs.length - $scope.logsSize));\n      for (var i = 0, len = newlogs.length; i < len; i++) {\n        var log = newlogs[i];\n        $scope.logs.push(log);\n      }\n      if (!autoDigest) {\n        $scope.$apply();\n      }\n    }\n\n    if ($scope.follow) {\n      var elem = document.getElementById('logs');\n      if (elem) {\n        elem.scrollTop = elem.scrollHeight;\n      }\n    }\n  }\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return ws.whenOpened();\n\n          case 2:\n            ws.send();\n\n          case 3:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, Webmin) {\n\n  $scope.generating = false;\n  $scope.error = '';\n\n  $scope.shareLogs = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              if ($scope.generating) {\n                _context.next = 14;\n                break;\n              }\n\n              _context.prev = 1;\n\n              $scope.error = '';\n              $scope.generating = true;\n              _context.next = 6;\n              return Webmin.logsExport(2000);\n\n            case 6:\n              res = _context.sent;\n\n              $scope.link = res.link;\n              _context.next = 13;\n              break;\n\n            case 10:\n              _context.prev = 10;\n              _context.t0 = _context['catch'](1);\n\n              $scope.error = _context.t0 && _context.t0.message || _context.t0 || 'Unknown error';\n\n            case 13:\n              $scope.generating = false;\n\n            case 14:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[1, 10]]);\n    }));\n  };\n};\n","\"use strict\";\n\nvar co = require('co');\nvar _ = require('underscore');\n\nmodule.exports = function ($scope, $http, $state, $interval, $timeout, UIUtils, summary, Webmin, allModules, hasAccess) {\n\n  var interval = void 0;\n  $scope.hasAccess = hasAccess.hasAccess;\n  $scope.module_to_install = '';\n  $scope.installing = false;\n\n  $scope.showWarning = function () {\n    return $scope.warningShown = true;\n  };\n  $scope.hideWarning = function () {\n    return $scope.warningShown = false;\n  };\n\n  $scope.modules = modulesTransform(allModules);\n\n  $scope.switchModule = function (mod) {\n    $scope.modules.map(function (m) {\n      return m.disabled = true;\n    });\n    mod.installing = !mod.installing;\n    Webmin.plugin.removePackage(mod.name);\n    $scope.checkModulesInstallation();\n  };\n\n  $scope.installModule = function () {\n    var pkg = $scope.module_to_install;\n    if (!(pkg.match(/^.+@(~||\\^)?\\d+\\.\\d+\\.\\d+$/) || pkg.match(/^file:\\/\\//) || pkg.match(/^https?:\\/\\/.+\\.(tar\\.gz|tgz)$/) || pkg.match(/^git(\\+ssh|\\+http|\\+https)?:\\/\\/.+\\.git$/))) {\n      UIUtils.toast('settings.modules.wrong_package_source');\n      return;\n    }\n    $scope.modules.map(function (m) {\n      return m.disabled = true;\n    });\n    co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.plugin.addPackage($scope.module_to_install);\n\n            case 2:\n              res = _context.sent;\n\n              if (res.success) {\n                $scope.modules.push({\n                  fullName: $scope.module_to_install,\n                  disabled: true,\n                  installing: true,\n                  installed: true\n                });\n                $scope.installing = true;\n                $scope.checkModulesInstallation();\n              } else {\n                $scope.modules = modulesTransform(allModules);\n                if (res.error === 1) {\n                  UIUtils.toast('settings.modules.already_install');\n                } else if (res.error === 2) {\n                  UIUtils.toast('settings.modules.path_does_not_exist');\n                } else {\n                  UIUtils.toast('settings.modules.unknown_error');\n                }\n              }\n\n            case 4:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  $scope.checkModulesInstallation = function () {\n    interval = $interval(function () {\n      Webmin.plugin.allModules().then(function (modules) {\n        var initialModulesNames = _.pluck(allModules, 'name');\n        var newModulesNames = _.pluck(modules, 'name');\n        var added = _.difference(newModulesNames, initialModulesNames);\n        var removed = _.difference(initialModulesNames, newModulesNames);\n        if (added.length || removed.length) {\n          var _iteratorNormalCompletion = true;\n          var _didIteratorError = false;\n          var _iteratorError = undefined;\n\n          try {\n            for (var _iterator = added[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n              var addedName = _step.value;\n\n              UIUtils.toastRaw('Installed module \\'' + addedName + '\\'');\n            }\n          } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n          } finally {\n            try {\n              if (!_iteratorNormalCompletion && _iterator.return) {\n                _iterator.return();\n              }\n            } finally {\n              if (_didIteratorError) {\n                throw _iteratorError;\n              }\n            }\n          }\n\n          var _iteratorNormalCompletion2 = true;\n          var _didIteratorError2 = false;\n          var _iteratorError2 = undefined;\n\n          try {\n            for (var _iterator2 = removed[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n              var removedName = _step2.value;\n\n              UIUtils.toastRaw('Removed module \\'' + removedName + '\\'');\n            }\n          } catch (err) {\n            _didIteratorError2 = true;\n            _iteratorError2 = err;\n          } finally {\n            try {\n              if (!_iteratorNormalCompletion2 && _iterator2.return) {\n                _iterator2.return();\n              }\n            } finally {\n              if (_didIteratorError2) {\n                throw _iteratorError2;\n              }\n            }\n          }\n\n          allModules = modules;\n          $scope.modules = modulesTransform(modules);\n          $scope.installing = false;\n          $interval.cancel(interval);\n          $scope.notifications.help.push({\n            icon: 'loop',\n            message: 'help.restart_required',\n            onclick: function onclick() {\n              return UIUtils.toast('help.restart_required.message');\n            }\n          });\n        }\n      });\n    }, 1500);\n  };\n\n  function modulesTransform(modules) {\n    return modules.map(function (m) {\n      return {\n        name: m.name,\n        fullName: [m.name, m.version].join('@'),\n        locked: m.locked,\n        disabled: !$scope.hasAccess || m.locked,\n        installing: false,\n        installed: true\n      };\n    });\n  }\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = function ($scope, $http, $state, Webmin, UIUtils, netinterfaces, firstConf) {\n\n  var autoconf = netinterfaces.auto;\n\n  $scope.autoconfig = function () {\n    $scope.$parent.conf.local_ipv4 = autoconf.local.ipv4 || '';\n    $scope.$parent.conf.local_ipv6 = autoconf.local.ipv6 || '';\n    $scope.$parent.conf.remote_ipv4 = autoconf.remote.ipv4 || '';\n    $scope.$parent.conf.remote_ipv6 = autoconf.remote.ipv6 || '';\n    $scope.$parent.conf.lport = autoconf.local.port || $scope.$parent.conf.lport;\n    $scope.$parent.conf.rport = autoconf.remote.port || $scope.$parent.conf.rport;\n    $scope.$parent.conf.upnp = autoconf.remote.upnp || $scope.$parent.conf.upnp;\n    $scope.$parent.conf.dns = autoconf.remote.dns || $scope.$parent.conf.dns;\n\n    if (conf.dev_autoconf && firstConf) {\n      $state.go('configure.create.root');\n    }\n  };\n\n  $scope.local_neti = toArrayOfAddresses(netinterfaces.local);\n  $scope.remote_neti = toArrayOfAddresses(netinterfaces.remote);\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.conf.ws2p = netinterfaces.conf.ws2p;\n  $scope.$parent.conf.proxiesConf = netinterfaces.conf.proxiesConf;\n  $scope.$parent.conf.bma = !netinterfaces.conf.nobma;\n  $scope.$parent.conf.local_ipv4 = netinterfaces.conf.local.ipv4;\n  $scope.$parent.conf.local_ipv6 = netinterfaces.conf.local.ipv6;\n  $scope.$parent.conf.remote_ipv4 = netinterfaces.conf.remote.ipv4;\n  $scope.$parent.conf.remote_ipv6 = netinterfaces.conf.remote.ipv6;\n  $scope.$parent.conf.lport = netinterfaces.conf.local.port;\n  $scope.$parent.conf.rport = netinterfaces.conf.remote.port;\n  $scope.$parent.conf.upnp = netinterfaces.conf.remote.upnp;\n  $scope.$parent.conf.dns = netinterfaces.conf.remote.dns;\n\n  UIUtils.enableInputs();\n\n  if (firstConf) {\n    $scope.$parent.conf.lport = conf.default_port;\n    $scope.$parent.conf.rport = conf.default_port;\n    // Trigger autoconfig\n    $scope.autoconfig();\n  }\n\n  $scope.saveConf = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.$parent.conf.remote_ipv6 = $scope.$parent.conf.local_ipv6;\n              _context.next = 3;\n              return Webmin.server.netConf({\n                conf: $scope.$parent.conf\n              });\n\n            case 3:\n              UIUtils.toast('settings.network.saved');\n\n            case 4:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n\nfunction toArrayOfAddresses(netiScope) {\n  return netiScope.reduce(function (arr, neti) {\n    return arr.concat(neti.addresses.map(function (addr) {\n      return {\n        name: [neti.name, addr.address].join(' '),\n        addr: addr.address,\n        family: addr.family\n      };\n    }));\n  }, []);\n}\n","'use strict';\n\nmodule.exports = function () {\n\n  window.uiModules = {};\n\n  require('./services/webmin')(angular);\n\n  var duniterApp = angular.module('duniterUIApp', ['ui.router', 'homeControllers', 'pascalprecht.translate']);\n\n  duniterApp.config(['$compileProvider', function ($compileProvider) {\n    return $compileProvider.aHrefSanitizationWhitelist(/^\\s*(https?|data):/);\n  }]);\n\n  require('./lib/conf/translate')(duniterApp);\n  require('./lib/conf/routes')(duniterApp);\n  require('js/services/datetime')(duniterApp);\n  require('js/services/ui_utils')(duniterApp);\n  require('js/services/graphs')(duniterApp);\n  require('js/services/pubkeyGenerator')(duniterApp);\n  require('js/services/importer')(duniterApp);\n  require('js/services/base58')(duniterApp);\n\n  window.duniterChildCallback = function (gui) {\n    window.gui = gui;\n  };\n\n  window.onresize = function () {\n    window.onResize && window.onResize(window);\n  };\n\n  window.openWindow = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      var innerHeight = options.height || 375;\n      var innerWidth = options.width || 500;\n      window.open(url, '_blank ', ['top=' + (window.screenTop + (options.top || 200)), 'left=' + (window.screenLeft + (options.left || 200)), 'height=' + (innerHeight + 8), 'width=' + (innerWidth + 16), 'menubar=no', 'status=no'].join(','));\n    }\n  };\n\n  window.openNewTab = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      window.open(url, '_blank ');\n    }\n  };\n\n  window.openModule = function openWindow(path, options, callback) {\n    var url = window.location.origin + '/modules' + path;\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      window.open(url, '_blank ');\n    }\n  };\n\n  window.openExternal = function openExternal(url) {\n    if (window.gui) {\n      window.gui.Shell.openExternal(url);\n    } else {\n      window.open(url, '_blank');\n    }\n  };\n\n  var homeControllers = angular.module('homeControllers', ['duniter.services.webmin', 'ngFileUpload']);\n\n  homeControllers.controller('IndexController', require('./controllers/IndexController'));\n  homeControllers.controller('AboutController', require('./controllers/AboutController'));\n  homeControllers.controller('IdentityController', require('./controllers/init/create/IdentityController'));\n  homeControllers.controller('ParametersController', require('./controllers/init/create/ParametersController'));\n  homeControllers.controller('RootBlockController', require('./controllers/init/create/RootBlockController'));\n  homeControllers.controller('SyncController', require('./controllers/init/sync/SyncController'));\n  homeControllers.controller('MainController', require('./controllers/main/MainController'));\n  homeControllers.controller('HomeController', require('./controllers/main/home/HomeController'));\n  homeControllers.controller('OverviewController', require('./controllers/main/home/tabs/OverviewController'));\n  homeControllers.controller('HomeNetworkController', require('./controllers/main/home/tabs/HomeNetworkController'));\n  homeControllers.controller('HomeConnectionsController', require('./controllers/main/home/tabs/HomeConnectionsController'));\n  homeControllers.controller('LogsController', require('./controllers/main/settings/tabs/LogsController'));\n  homeControllers.controller('LogsSettingsController', require('./controllers/main/settings/tabs/LogsSettingsController'));\n  homeControllers.controller('NetworkController', require('./controllers/main/settings/tabs/NetworkController'));\n  homeControllers.controller('SettingsController', require('./controllers/main/settings/SettingsController'));\n  homeControllers.controller('DataController', require('./controllers/main/settings/tabs/DataController'));\n  homeControllers.controller('BackupController', require('./controllers/main/settings/tabs/BackupController'));\n  homeControllers.controller('CPUController', require('./controllers/main/settings/tabs/CPUController'));\n  homeControllers.controller('CurrencyController', require('./controllers/main/settings/tabs/CurrencyController'));\n  homeControllers.controller('KeyController', require('./controllers/main/settings/tabs/KeyController'));\n  homeControllers.controller('ModulesController', require('./controllers/main/settings/tabs/ModulesController'));\n  homeControllers.controller('GraphsController', require('./controllers/main/graphs/GraphsController'));\n  homeControllers.controller('GraphsBlockchainController', require('./controllers/main/graphs/GraphsBlockchainController'));\n};\n","\"use strict\";\n\nmodule.exports = {\n\n  init: function init() {\n\n    // Hack since Node v5\n    try {\n      window.jade = require('jade' + '/' + 'runtime');\n    } catch (e) {}\n\n    console.log('Configuring Angular app...');\n\n    require('./app.config')();\n\n    console.log('App initialized.');\n  }\n};\n","\"use strict\";\n\nmodule.exports = {\n  server: \"\", // Empty server will use the browser current host\n  port: \"\", // Empty port will use the browser current port\n  default_port: 9220,\n  dev_autoconf: false,\n  api_timeout: 10000 // 10 sec timeout\n};\n","module.exports = {\n  \"top.menu.overview\": \"Home\",\n  \"top.menu.data\": \"Explore\",\n  \"top.menu.settings\": \"Settings\",\n  \"top.menu.wallet\": \"Wallet\",\n  \"general.server.started\": \"Server started\",\n  \"general.server.stopped\": \"Server stopped\",\n  \"general.choose_option\": \"Choose your option\",\n  \"general.network.reconf_ok\": \"Reconfiguration success\",\n  \"global.button.validate\": \"Validate\",\n  \"global.button.start\": \"Start\",\n  \"err.unknown\": \"Unknown error\",\n  \"err.connection\": \"Could not connect to node\",\n  \"err.back_index\": \"Get back to previous screen\",\n  \"err.sync.interrupted\": \"Sync interrupted because the following error occured:\",\n  \"index.message.loading\": \"Loading...\",\n  \"crypto.secret_key\": \"Secret key\",\n  \"index.message.current_block\": \"Current block {{ number }}\",\n  \"configuration.init.choose.title\": \"Initialization\",\n  \"configuration.init.choose.message\": \"Your software has to be initialized. You may either connect to an existing one or restore a backup file.\",\n  \"configuration.init.choose.create\": \"Create a new currency\",\n  \"configuration.init.choose.connect\": \"Connect to an existing currency\",\n  \"configuration.init.choose.import\": \"Import from a backup file\",\n  \"configuration.create_currency.cancel\": \"Cancel & go home\",\n  \"configuration.create_uid.title\": \"Your identity\",\n  \"configuration.create_uid.message\": \"As a first step, you need to define your personal, unique identity.<br/>The following informations will be <strong>definitive</strong> for this currency: please choose them carefully.\",\n  \"configuration.create_uid.uid.tooltip\": \"The name you will be known as.\",\n  \"configuration.create_uid.entropy.tooltip\": \"An entropy source to make your key unique: an e-mail, a phone n°, ...\",\n  \"configuration.create_uid.password.tooltip\": \"A secret password to protect your key.\",\n  \"configuration.create_uid.create_button\": \"Continue\",\n  \"configuration.create_uid.preview_button\": \"Preview pubkey\",\n  \"configuration.create_uid.nrp_algo_choose\": \"NRP algorithm\",\n  \"configuration.create_uid.nrp_algo_choose_1\": \"N = 4096 ; r = 16 ; p = 1\",\n  \"configuration.create_uid.modal_title\": \"Identity confirmation\",\n  \"configuration.create_uid.modal_message\": \"This identity will be definitive for this currency: you will be known by your User ID and will be able to access your account using your Secret Key and Password values.\",\n  \"configuration.create_uid.modal_agree\": \"Agree\",\n  \"configuration.create_uid.modal_disagree\": \"Disagree\",\n  \"configuration.create_uid.modal_preview_title\": \"Preview of pubkey\",\n  \"configuration.create_uid.modal_preview_ok\": \"OK\",\n  \"configuration.ws2p.private\": \"Enable WS2P Private access\",\n  \"configuration.ws2p.private.desc\": \"<b>Strongly recommanded</b>. <i>No configuration required</i>. Private WS2P access allows your node to connect through P2P to other nodes without exposing itself to the Internet. This is the most secure and efficient way to connect your node to the network.\",\n  \"configuration.ws2p.private.connections.title\": \"Connections\",\n  \"configuration.ws2p.private.connections.message\": \"You can limit the number of active private connections.\",\n  \"configuration.ws2p.private.max\": \"Maximum\",\n  \"configuration.proxiesConf.title\": \"Setting up a Proxy\",\n  \"configuration.proxiesConf.proxySocksAddress\": \"Classical socks proxy\",\n  \"configuration.proxiesConf.torMessage\": \"<b>Warning :</b> If you want to use a socks proxy to redirect all outgoing traffic via <b>Tor</b>, you must use the <i>\\\"Tor socks proxy\\\"</i> field :\",\n  \"configuration.proxiesConf.proxyTorAddress\": \"Tor socks proxy\",\n  \"configuration.proxiesConf.clear\": \"clear\",\n  \"configuration.proxiesConf.tor\": \"tor\",\n  \"configuration.proxiesConf.none\": \"none\",\n  \"configuration.proxiesConf.reachingClearEp\": \"How do you want to reach the classic nodes ? (clear endpoints)\",\n  \"configuration.ws2p.public\": \"Enable WS2P Public access\",\n  \"configuration.ws2p.public.desc\": \"<b>Recommanded</b>. Public WS2P access allows your node to be publicly visible to communicate through WS2P. Considering that most of the nodes will communicate through WS2P access, it is important to have a maximum number of nodes with Public WS2P access enabled to have a decentralized network.\",\n  \"configuration.ws2p.public.upnp.title\": \"UPnP\",\n  \"configuration.ws2p.public.upnp.message\": \"Automated configuration. You need to have a box (router) for this to work. Typically true if you use Duniter at home.\",\n  \"configuration.ws2p.public.upnp.value\": \"Enable Public WS2P accss through UPnP\",\n  \"configuration.ws2p.public.manual.title\": \"Manual configuration\",\n  \"configuration.ws2p.public.manual.message\": \"You can also manually configure your node for Public WS2P access.\",\n  \"configuration.ws2p.public.manual.local_ipv4\": \"Private (computer)\",\n  \"configuration.ws2p.public.manual.host\": \"Public (remote host)\",\n  \"configuration.ws2p.public.manual.lport\": \"Private port\",\n  \"configuration.ws2p.public.manual.rport\": \"Public port\",\n  \"configuration.ws2p.public.manual.rpath\": \"WebSocket web path\",\n  \"configuration.ws2p.public.connections.title\": \"Connections\",\n  \"configuration.ws2p.public.connections.message\": \"You can limit the number of active public connections.\",\n  \"configuration.ws2p.public.max\": \"Maximum\",\n  \"configuration.create_network.desc\": \"<b>Deprecated</b>. BMA is the legacy communication interface for Duniter nodes. It is being deprecated. Yet, you can activate it if you know what you are doing.\",\n  \"configuration.create_network.title\": \"Network\",\n  \"configuration.create_network.message\": \"Duniter is a P2P software and needs bidirectionnal access to the network. Please chose carefully the following parameters.\",\n  \"configuration.create_network.none\": \"None\",\n  \"configuration.create_network.ipv4.title\": \"IPv4\",\n  \"configuration.create_network.ipv6.title\": \"IPv6\",\n  \"configuration.create_network.ipv4.message\": \"For compatibilty reasons, you may prefer to use classic IPv4 interfaces. The configuration is more complicated.\",\n  \"configuration.create_network.local_ipv4\": \"Private (computer)\",\n  \"configuration.create_network.remote_ipv4\": \"Public (box/router)\",\n  \"configuration.create_network.local_ipv6\": \"IPv6\",\n  \"configuration.create_network.lport\": \"Local port\",\n  \"configuration.create_network.rport\": \"Remote port\",\n  \"configuration.create_network.port.title\": \"Ports\",\n  \"configuration.create_network.ipv6.message\": \"IPv6 gives your computer a unique, direct address to your node over the Internet. This is the <b>recommended way</b> to connect your node to the network.\",\n  \"configuration.create_network.port.message\": \"Wether you use IPv6 or IPv4, Duniter node will use this port number for connection to the network. If you use IPv6, local and remote port should equal each other.\",\n  \"configuration.create_network.dns.title\": \"Domain name\",\n  \"configuration.create_network.dns\": \"Domain name\",\n  \"configuration.create_network.dns.message\": \"IPv6 (AAAA) and IPv4 (A) DNS records will be used.\",\n  \"configuration.create_network.upnp\": \"Use UPnP\",\n  \"configuration.create_network.bma\": \"Enable BMA access\",\n  \"configuration.create_network.button.validate\": \"Continue\",\n  \"configuration.create_network.button.autoconf\": \"Automatic configuration\",\n  \"configuration.create_parameters.title\": \"Currency\",\n  \"configuration.create_parameters.message\": \"Initial parameters of the currency. It should be carefully chosen, as these parameters never change once the currency is started.\",\n  \"configuration.create_parameters.currency.title\": \"Money units\",\n  \"configuration.create_parameters.currency.message\": \"Give a name to your currency. The 3 following parameters configure the way new money units are created.\",\n  \"configuration.create_parameters.currency\": \"Currency name\",\n  \"configuration.create_parameters.c\": \"c\",\n  \"configuration.create_parameters.dt\": \"UD period\",\n  \"configuration.create_parameters.ud0\": \"UD(0)\",\n  \"configuration.create_parameters.button.validate\": \"Continue\",\n  \"configuration.create_parameters.wot.title\": \"Web of Trust\",\n  \"configuration.create_parameters.wot.message\": \"The following parameters deal with identities and their links gathered in the Web of Trust concept.\",\n  \"configuration.create_parameters.sigStock\": \"Max cert stock\",\n  \"configuration.create_parameters.sigPeriod\": \"Delay between 2 certs\",\n  \"configuration.create_parameters.sigValidity\": \"Cert expiry delay\",\n  \"configuration.create_parameters.msValidity\": \"Membership expiry delay\",\n  \"configuration.create_parameters.sigQty\": \"Min required certs\",\n  \"configuration.create_parameters.sigWindow\": \"Cert time window\",\n  \"configuration.create_parameters.stepMax\": \"Max distance\",\n  \"configuration.create_parameters.xpercent\": \"Percent of distance\",\n  \"configuration.create_parameters.blockchain.title\": \"Blockchain\",\n  \"configuration.create_parameters.blockchain.message\": \"The technical support of money and identities is the blockchain. It also has some parameters driving its behavior.\",\n  \"configuration.create_parameters.medianTimeBlocks\": \"Blocks count\",\n  \"configuration.create_parameters.avgGenTime\": \"Block gen. duration\",\n  \"configuration.create_parameters.dtDiffEval\": \"Blocks count for diff.\",\n  \"configuration.create_parameters.blocksRot\": \"Personal diff. blocks\",\n  \"configuration.create_parameters.percentRot\": \"Personal diff. rotation\",\n  \"configuration.create_root.title\": \"Root block creation\",\n  \"configuration.create_root.message\": \"This is the final step to create the new currency! The root block or <i>genesis</i> will include the first members and define the currency parameters. Once generated and submitted, the blockchain will be started.\",\n  \"configuration.create_root.button.start\": \"Start HTTP\",\n  \"configuration.create_root.button.stop\": \"Stop HTTP\",\n  \"configuration.create_root.button.generate\": \"Give a try\",\n  \"configuration.create_root.need_a_try\": \"You need to generate a first block with the « Give a try » button. Start HTTP server to do so.\",\n  \"configuration.create_root.button.accept_and_send\": \"Accept this block and start currency\",\n  \"configuration.create_root.button.cancel\": \"Cancel creation and go to home screen\",\n  \"configuration.create_root.host_listening\": \"Host listening at:\",\n  \"configuration.create_uid.pubkey_preview\": \"Public key preview\",\n  \"home.ws2p_peers\": \"Connected peers\",\n  \"home.current.number\": \"Current block #\",\n  \"home.current.membersCount\": \"Members count\",\n  \"home.current.medianTime\": \"Median time\",\n  \"home.current.powMin\": \"Common difficulty level\",\n  \"home.current.mmass\": \"Monetary mass\",\n  \"home.pulling.network\": \"Network\",\n  \"home.pulling.peer\": \"Peer\",\n  \"home.pulling.state.unkown\": \"Next sync in few minutes\",\n  \"home.pulling.state.synced\": \"Synced\",\n  \"home.pulling.state.syncing\": \"Syncing...\",\n  \"home.pow.unit\": \"blocks made by this key\",\n  \"home.pow.is_mirror\": \"This node is a mirror\",\n  \"home.pow.is_waiting\": \"Waiting for better proof conditions\",\n  \"home.tabs.overview\": \"Overview\",\n  \"home.tabs.overview.should_reconfigure\": \"Your configuration has changed and your node is no more reachable from the network. You should reconfigure it to have a functional node. If this message appears again, you should manually configure the network settings. Often, selecting only IPv6 interface (disabling IPv4) solves the problem.\",\n  \"home.tabs.network\": \"Peers\",\n  \"home.tabs.network.button.update\": \"Check peers again\",\n  \"home.tabs.connections\": \"Network\",\n  \"home.tabs.connections.title.connections\": \"WS2P Connections\",\n  \"home.tabs.connections.title.network\": \"Network view\",\n  \"home.tabs.connections.legend.title\": \"Legend\",\n  \"home.tabs.connections.legend.prefered\": \"Prefered: nodes that you prefer for outcoming connections\",\n  \"home.tabs.connections.legend.privileged\": \"Privileged: nodes that you privilege the incoming connections (= invitation)\",\n  \"home.tabs.logs\": \"Logs\",\n  \"home.tabs.logs.follow.logs\": \"Follow logs\",\n  \"home.tabs.logs.pause.logs\": \"Pause logs\",\n  \"home.tabs.logs.level.error\": \"Error\",\n  \"home.tabs.logs.level.warn\": \"Warning\",\n  \"home.tabs.logs.level.info\": \"Info\",\n  \"home.tabs.logs.level.debug\": \"Debug\",\n  \"home.tabs.logs.level.trace\": \"Trace\",\n  \"sync.title\": \"Synchronize\",\n  \"sync.message\": \"Your node will be synchronized with an existing currency: just enter technical details about a node to sync with it.\",\n  \"sync.host\": \"Host\",\n  \"sync.port\": \"Port\",\n  \"sync.check\": \"Check node\",\n  \"sync.start\": \"Synchronize with this node\",\n  \"sync.failed\": \"Synchronization failed.\",\n  \"sync.mode.simplified\": \"Simplified mode\",\n  \"sync.mode.manual\": \"Manual mode\",\n  \"sync.simplified.choose\": \"Node to connect to\",\n  \"sync.simplified.default_option\": \"Please select a node to continue\",\n  \"sync.simplified.currency\": \"Currency\",\n  \"sync.simplified.main_mirror\": \"(main mirror)\",\n  \"sync.simplified.other mirror\": \"(other mirror)\",\n  \"sync.ready.node.part1\": \"This node is available!\",\n  \"sync.ready.node.part2\": \"Click on the green button to proceed.\",\n  \"sync.started.node\": \"Synchronization started on node:\",\n  \"sync.error.unreachable.try.another.node\": \"This node is not available. Please select another one.\",\n  \"home.menu.server.stop\": \"Stop server\",\n  \"home.menu.server.start\": \"Start server\",\n  \"home.menu.server.restart\": \"Restart server\",\n  \"home.state\": \"Server:\",\n  \"home.state.started\": \"STARTED\",\n  \"home.state.stopped\": \"STOPPED\",\n  \"settings.tabs.logs\": \"Logs\",\n  \"settings.tabs.data\": \"Data\",\n  \"settings.tabs.backup\": \"Backup\",\n  \"settings.tabs.identity\": \"Crypto\",\n  \"settings.tabs.network\": \"Network\",\n  \"settings.tabs.currency\": \"Currency\",\n  \"settings.tabs.cpu\": \"CPU\",\n  \"settings.tabs.modules\": \"Modules\",\n  \"settings.data.reset.title\": \"Reset this node\",\n  \"settings.data.reset.message\": \"If you desire to reset this node's data and sync it again with the network, please select a node to sync against and validate.\",\n  \"settings.data.reset.warning\": \"This process <strong>will not</strong> reset the node identity and network settings, which will be reused.\",\n  \"settings.data.reset.peer.none_option\": \"Select a node\",\n  \"settings.data.reset.peer.label\": \"Synchronization peer\",\n  \"settings.data.reset.button\": \"Full reset of the node\",\n  \"settings.data.reset_sync.button\": \"Reset data and start sync\",\n  \"settings.logs.title\": \"Logs\",\n  \"settings.logs.consult.message\": \"Your node continually generates information messages in a log file. This information may help you understand what your node <i>is doing</i> or what it <i>has done</i> few times ago.\",\n  \"settings.logs.consult.button\": \"View real-time logs\",\n  \"settings.logs.share.message\": \"You may want to <b>share your logs</b> with other people, sometimes to get help or to add informations in a bug tracker. Clicking on below button will extract the last 2000 lines of your logs and push it on the web, returning you a link to be shared with whoever you want.\",\n  \"settings.logs.share.button\": \"Create a web link to your logs\",\n  \"settings.logs.share.generating\": \"Generating your link...\",\n  \"settings.logs.share.error\": \"An error occurred during the generation of your link:\",\n  \"settings.data.backup.title\": \"Backup\",\n  \"settings.data.backup.message\": \"You can create backups of your node's data and restore them using the buttons below.\",\n  \"settings.data.backup.warning\": \"<b>Export</b> will only backup your node's data, which <i>excludes your secret key and configuration details</i>.<br><b>Import</b> will reset your node's data by applying the backup. Your secret keys and configuration remains untouched.\",\n  \"settings.data.backup.button.export\": \"Create a data backup\",\n  \"settings.data.backup.button.import\": \"Import a data backup\",\n  \"settings.data.backup.importing\": \"Importing data...\",\n  \"settings.data.backup.imported\": \"Import successfull!\",\n  \"settings.network.button.validate\": \"Save and apply network settings\",\n  \"settings.network.saved\": \"Configuration saved and applied successfully\",\n  \"settings.key.title\": \"Public key of this node:\",\n  \"settings.key.button.validate\": \"Save and use this key\",\n  \"settings.key.button.change\": \"Change keyring\",\n  \"settings.key.pubkey.description\": \"This public key is the public part of your keyring, which is composed of a public key and a private key. This public key is shared with all the peers of the network and users of the currency, while your private key is secretely kept and used by this node to process operations on the network.\",\n  \"settings.data.modal_title\": \"Confirm full reset\",\n  \"settings.data.modal_message\": \"This action will completely reset the data of your node and redirect you to initial configuration screen. Do you confirm?\",\n  \"settings.data.modal_disagree\": \"No, cancel this\",\n  \"settings.data.modal_agree\": \"Yes, process the reset\",\n  \"settings.data.reset.experimental\": \"This functionality is still considered experimental. If you encounters strange behaviors, please stop the software and reset manually your node by removing all the files BUT conf.json under ~/.config/duniter/duniter_default, and restart the software.\",\n  \"settings.cpu.title\": \"CPU settings\",\n  \"settings.cpu.message\": \"You can adjust the CPU power dedicated to proof-of-work computation. The higher the value, the faster is your node, the higher the chances you have to compute a block early.\",\n  \"settings.cpu.warning\": \"<b>Up to 8 cores</b> of your machine are dedicated to proof-of-work computation currently. Also, setting CPU to 100% does not mean Duniter will use 100% of each core, but will use as much as possible each of them, as a core is also shared with other programs.\",\n  \"settings.cpu.range\": \"% of CPU power core dedicated to proof-of-work :\",\n  \"settings.cpu.power\": \"Core power:\",\n  \"settings.cpu.saved\": \"CPU settings saved.\",\n  \"settings.modules.title\": \"Modules\",\n  \"settings.modules.message\": \"You can install extensions to your Duniter node to provide new features. These extensions are called <b>Duniter modules</b>.\",\n  \"settings.modules.no_access\": \"This instance does not have enough system rights to install new modules on disk.\",\n  \"settings.modules.install\": \"Install this module\",\n  \"settings.modules.already_install\": \"Module already installed\",\n  \"settings.modules.path_does_not_exist\": \"Path does not lead to a module\",\n  \"settings.modules.wrong_package_source\": \"Package URL has wrong format\",\n  \"settings.modules.warning\": \"Please be <b>VERY CAREFUL</b> when installing a module: you should <b>check that it is not a virus</b>, nor wants to steal your informations. <b>A MODULE HAS A LOT OF POWER</b> and can access/modify any part of your system (including your private key), in the limit of the user's access rights.\",\n  \"settings.modules.warning_light\": \"WARNING! (click to see more)\",\n  \"settings.modules.warning_close\": \"Close this message\",\n  \"settings.modules.on\": \"On\",\n  \"settings.modules.off\": \"Off\",\n  \"settings.modules.installing\": \"Installation...\",\n  \"settings.modules.installing_warn\": \"Please <b>do not close Duniter</b> during this process!\",\n  \"settings.modules.uninstalling\": \"Removal...\",\n  \"graphs.tabs.blockchain\": \"Blockchain\",\n  \"graphs.tabs.currency\": \"Currency\",\n  \"graphs.blockchain.range\": \"Graphs for the last X blocks: (please choose X value)\",\n  \"graphs.blockchain.with.time\": \"Time variations graph\",\n  \"graphs.blockchain.with.speed\": \"Writing speed graph\",\n  \"graphs.blockchain.with.difficulty\": \"Difficulty graph\",\n  \"help.about_duniter\": \"About Duniter\",\n  \"help.about_duniter.title\": \"About\",\n  \"help.about_duniter.subtitle\": \"Duniter Desktop\",\n  \"help.about_duniter.version\": \"Version: \",\n  \"help.about_duniter.forum\": \"Forum\",\n  \"help.about_duniter.chat\": \"Chat\",\n  \"help.new_version_available\": \"New version available\",\n  \"help.restart_required\": \"Restart to apply changes\",\n  \"help.restart_required.message\": \"Please close Duniter and restart it.\"\n}\n;","'use strict';\n\nvar co = require('co');\nvar _ = require('underscore');\n\nmodule.exports = function (app) {\n\n  app.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\n\n    // States\n    $stateProvider.state('index', {\n      url: '/',\n      template: require('views/index'),\n      resolve: {\n        ws: function ws(Webmin) {\n          return Webmin.ws();\n        },\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'IndexController'\n    }).state('about', {\n      url: '/about',\n      template: require('views/about'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        },\n        version: function version(summary) {\n          return summary && 'v' + summary.version || 'unknown version';\n        }\n      },\n      controller: 'AboutController'\n    }).state('configure', {\n      abstract: true,\n      url: '/configure',\n      template: require('views/init/layout'),\n      controller: function controller($scope) {\n        $scope.conf = {\n          currency: 'super_currency',\n          c: 0.007376575,\n          dt: 30.4375 * 24 * 3600,\n          ud0: 100,\n          stepMax: 3,\n          sigDelay: 3600 * 24 * 365 * 5,\n          sigPeriod: 0, // Instant\n          sigStock: 40,\n          sigWindow: 3600 * 24 * 14, // 2 weeks\n          sigValidity: 3600 * 24 * 365,\n          msValidity: 3600 * 24 * 365,\n          sigQty: 0,\n          xpercent: 0.9,\n          percentRot: 0.66,\n          blocksRot: 20,\n          avgGenTime: 16 * 60,\n          dtDiffEval: 10,\n          medianTimeBlocks: 20\n        };\n      }\n    }).state('configure.choose', {\n      url: '/choose',\n      template: require('views/init/choose'),\n      controller: function controller($scope, Importer) {\n        Importer($scope);\n      }\n    }).state('configure.create', {\n      url: '/create',\n      template: '<div class=\"ui-scrollable\" ui-view=\"\"></div>'\n    }).state('configure.create.uid', {\n      url: '/create/uid',\n      template: require('views/init/create/create_uid'),\n      controller: 'IdentityController'\n    }).state('configure.create.network', {\n      url: '/create/network',\n      template: require('views/init/create/create_network'),\n      resolve: {\n        netinterfaces: function netinterfaces(Webmin) {\n          return resolveNetworkAutoConf(Webmin);\n        },\n        firstConf: function firstConf() {\n          return true;\n        }\n      },\n      controller: 'NetworkController'\n    }).state('configure.create.parameters', {\n      url: '/create/parameters',\n      template: require('views/init/create/create_parameters'),\n      controller: 'ParametersController'\n    }).state('configure.create.root', {\n      url: '/create/root',\n      template: require('views/init/create/create_root'),\n      controller: 'RootBlockController'\n    }).state('sync', {\n      url: '/sync?host=&port=&sync=&to=',\n      template: require('views/init/sync/sync'),\n      controller: 'SyncController'\n    }).state('main', {\n      abstract: true,\n      url: '/main',\n      template: require('views/main/main'),\n      resolve: {\n        ws: function ws(Webmin) {\n          return Webmin.ws();\n        },\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        },\n        uiModules: function uiModules(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n            var modules, i, _module, injection, script;\n\n            return regeneratorRuntime.wrap(function _callee$(_context) {\n              while (1) {\n                switch (_context.prev = _context.next) {\n                  case 0:\n                    _context.next = 2;\n                    return Webmin.plugin.uiModules();\n\n                  case 2:\n                    modules = _context.sent;\n                    i = 0;\n\n                  case 4:\n                    if (!(i < modules.length)) {\n                      _context.next = 16;\n                      break;\n                    }\n\n                    _module = modules[i];\n                    _context.next = 8;\n                    return Webmin.plugin.uiGetMenuInjection(_module);\n\n                  case 8:\n                    injection = _context.sent;\n                    script = document.createElement(\"script\");\n\n                    script.type = \"text/javascript\";\n                    script.text = \";\" + injection.menu;\n                    document.body.appendChild(script);\n\n                  case 13:\n                    i++;\n                    _context.next = 4;\n                    break;\n\n                  case 16:\n                    return _context.abrupt('return', modules);\n\n                  case 17:\n                  case 'end':\n                    return _context.stop();\n                }\n              }\n            }, _callee, this);\n          }));\n        }\n      },\n      controller: 'MainController'\n    }).state('main.home', {\n      abstract: true,\n      url: '/home',\n      template: require('views/main/home/home'),\n      controller: 'HomeController'\n    }).state('main.home.overview', {\n      url: '/overview',\n      template: require('views/main/home/tabs/overview'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'OverviewController'\n    }).state('main.home.network', {\n      url: '/network',\n      template: require('views/main/home/tabs/network'),\n      resolve: {\n        peers: function peers(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n            return regeneratorRuntime.wrap(function _callee2$(_context2) {\n              while (1) {\n                switch (_context2.prev = _context2.next) {\n                  case 0:\n                    return _context2.abrupt('return', Webmin.network.peers());\n\n                  case 1:\n                  case 'end':\n                    return _context2.stop();\n                }\n              }\n            }, _callee2, this);\n          }));\n        }\n      },\n      controller: 'HomeNetworkController'\n    }).state('main.home.connections', {\n      url: '/connections',\n      template: require('views/main/home/tabs/connections'),\n      resolve: {\n        conf: function conf(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n            return regeneratorRuntime.wrap(function _callee3$(_context3) {\n              while (1) {\n                switch (_context3.prev = _context3.next) {\n                  case 0:\n                    return _context3.abrupt('return', Webmin.network.ws2p.conf());\n\n                  case 1:\n                  case 'end':\n                    return _context3.stop();\n                }\n              }\n            }, _callee3, this);\n          }));\n        },\n        info: function info(Webmin, conf) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n            return regeneratorRuntime.wrap(function _callee4$(_context4) {\n              while (1) {\n                switch (_context4.prev = _context4.next) {\n                  case 0:\n                    return _context4.abrupt('return', Webmin.network.ws2p.info());\n\n                  case 1:\n                  case 'end':\n                    return _context4.stop();\n                }\n              }\n            }, _callee4, this);\n          }));\n        },\n        heads: function heads(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n            return regeneratorRuntime.wrap(function _callee5$(_context5) {\n              while (1) {\n                switch (_context5.prev = _context5.next) {\n                  case 0:\n                    return _context5.abrupt('return', Webmin.network.ws2p.heads());\n\n                  case 1:\n                  case 'end':\n                    return _context5.stop();\n                }\n              }\n            }, _callee5, this);\n          }));\n        }\n      },\n      controller: 'HomeConnectionsController'\n    }).state('main.settings', {\n      abstract: true,\n      url: '/settings',\n      template: require('views/main/settings/settings'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'SettingsController'\n    }).state('main.settings.data', {\n      url: '/data',\n      template: require('views/main/settings/tabs/data'),\n      resolve: {\n        peers: function peers(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n            var self, res;\n            return regeneratorRuntime.wrap(function _callee6$(_context6) {\n              while (1) {\n                switch (_context6.prev = _context6.next) {\n                  case 0:\n                    _context6.prev = 0;\n                    _context6.next = 3;\n                    return Webmin.network.selfPeer();\n\n                  case 3:\n                    self = _context6.sent;\n                    _context6.next = 6;\n                    return Webmin.network.peers();\n\n                  case 6:\n                    res = _context6.sent;\n                    return _context6.abrupt('return', _.filter(res.peers, function (p) {\n                      return p.pubkey != self.pubkey && p.status == 'UP';\n                    }));\n\n                  case 10:\n                    _context6.prev = 10;\n                    _context6.t0 = _context6['catch'](0);\n\n                    console.error(_context6.t0);\n                    return _context6.abrupt('return', []);\n\n                  case 14:\n                  case 'end':\n                    return _context6.stop();\n                }\n              }\n            }, _callee6, this, [[0, 10]]);\n          }));\n        }\n      },\n      controller: 'DataController'\n    }).state('main.settings.logs', {\n      url: '/logs',\n      template: require('views/main/settings/tabs/logs'),\n      controller: 'LogsSettingsController'\n    }).state('main.settings.backup', {\n      url: '/backup',\n      template: require('views/main/settings/tabs/backup'),\n      controller: 'BackupController'\n    }).state('main.settings.cpu', {\n      url: '/cpu',\n      template: require('views/main/settings/tabs/cpu'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'CPUController'\n    }).state('main.settings.modules', {\n      url: '/modules',\n      template: require('views/main/settings/tabs/modules'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        },\n        hasAccess: function hasAccess(Webmin) {\n          return Webmin.plugin.checkAccess();\n        },\n        allModules: function allModules(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n            var modules;\n            return regeneratorRuntime.wrap(function _callee7$(_context7) {\n              while (1) {\n                switch (_context7.prev = _context7.next) {\n                  case 0:\n                    _context7.next = 2;\n                    return Webmin.plugin.allModules();\n\n                  case 2:\n                    modules = _context7.sent;\n                    return _context7.abrupt('return', modules);\n\n                  case 4:\n                  case 'end':\n                    return _context7.stop();\n                }\n              }\n            }, _callee7, this);\n          }));\n        }\n      },\n      controller: 'ModulesController'\n    }).state('main.settings.crypto', {\n      url: '/crypto',\n      template: require('views/main/settings/tabs/crypto'),\n      controller: 'KeyController'\n    }).state('main.settings.network', {\n      url: '/network',\n      resolve: {\n        netinterfaces: function netinterfaces(Webmin) {\n          return resolveNetworkAutoConf(Webmin);\n        },\n        firstConf: function firstConf() {\n          return false;\n        }\n      },\n      template: require('views/main/settings/tabs/network'),\n      controller: 'NetworkController'\n    }).state('main.settings.currency', {\n      url: '/currency',\n      resolve: {\n        conf: function conf(summary) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {\n            return regeneratorRuntime.wrap(function _callee8$(_context8) {\n              while (1) {\n                switch (_context8.prev = _context8.next) {\n                  case 0:\n                    return _context8.abrupt('return', summary.parameters);\n\n                  case 1:\n                  case 'end':\n                    return _context8.stop();\n                }\n              }\n            }, _callee8, this);\n          }));\n        }\n      },\n      template: require('views/main/settings/tabs/currency'),\n      controller: 'CurrencyController'\n    }).state('main.graphs', {\n      abstract: true,\n      url: '/graphs',\n      template: require('views/main/graphs/graphs'),\n      controller: 'GraphsController'\n    }).state('main.graphs.blockchain', {\n      url: '/blockchain',\n      template: require('views/main/graphs/blockchain'),\n      controller: 'GraphsBlockchainController'\n    }).\n\n    //state('graphs.crypto', {\n    //  url: '/crypto',\n    //  template: require('views/graphs/crypto'),\n    //  controller: 'KeyController'\n    //}).\n    //\n    //state('graphs.network', {\n    //  url: '/network',\n    //  resolve: {\n    //    netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n    //    firstConf: () => false\n    //  },\n    //  template: require('views/graphs/network'),\n    //  controller: 'NetworkController'\n    //}).\n    //\n    //state('graphs.currency', {\n    //  url: '/currency',\n    //  resolve: {\n    //    conf: (bmapi) => co(function *() {\n    //      return bmapi.currency.parameters();\n    //    })\n    //  },\n    //  template: require('views/graphs/currency'),\n    //  controller: 'CurrencyController'\n    //}).\n\n    state('logs', {\n      url: '/logs',\n      template: require('views/logs'),\n      resolve: {\n        ws: function ws(Webmin) {\n          return Webmin.ws();\n        }\n      },\n      controller: 'LogsController'\n    }).state('error', {\n      url: '/error\\?err',\n      template: require('views/error'),\n      controller: function controller($scope, $stateParams) {\n        return $scope.errorMsg = $stateParams.err || 'err.unknown';\n      }\n    });\n\n    // Default route\n    $urlRouterProvider.otherwise('/');\n  }]);\n\n  app.run(function ($rootScope, $state) {\n    $rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {\n      console.error(error);\n      $state.go('error', { err: error.message });\n    });\n  });\n\n  function resolveNetworkAutoConf(Webmin) {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {\n      var netinterfaces;\n      return regeneratorRuntime.wrap(function _callee9$(_context9) {\n        while (1) {\n          switch (_context9.prev = _context9.next) {\n            case 0:\n              _context9.next = 2;\n              return Webmin.network.interfaces();\n\n            case 2:\n              netinterfaces = _context9.sent;\n              return _context9.abrupt('return', netinterfaces || { local: {}, remote: {} });\n\n            case 4:\n            case 'end':\n              return _context9.stop();\n          }\n        }\n      }, _callee9, this);\n    }));\n  }\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.config(['$translateProvider', function ($translateProvider) {\n\n    $translateProvider.translations('en', require('./i18n/en'));\n\n    // Default language\n    $translateProvider.preferredLanguage('en');\n\n    // Other parameters\n    $translateProvider.useSanitizeValueStrategy('');\n  }]);\n};\n","\"use strict\";\n\nmodule.exports = function Peer(json) {\n\n  var that = this;\n\n  var BMA_REGEXP = /^BASIC_MERKLED_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))$/;\n\n  Object.keys(json).forEach(function (key) {\n    that[key] = json[key];\n  });\n\n  that.endpoints = that.endpoints || [];\n  that.statusTS = that.statusTS || 0;\n\n  that.keyID = function () {\n    return that.pubkey && that.pubkey.length > 10 ? that.pubkey.substring(0, 10) : \"Unknown\";\n  };\n\n  that.copyValues = function (to) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"statusTS\", \"block\", \"signature\"].forEach(function (key) {\n      to[key] = obj[key];\n    });\n  };\n\n  that.copyValuesFrom = function (from) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n      obj[key] = from[key];\n    });\n  };\n\n  that.json = function () {\n    var obj = that;\n    var json = {};\n    [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n      json[key] = obj[key];\n    });\n    json.raw = that.getRaw();\n    json.pubkey = that.pubkey;\n    return json;\n  };\n\n  that.getBMA = function () {\n    var bma = null;\n    that.endpoints.forEach(function (ep) {\n      var matches = !bma && ep.match(BMA_REGEXP);\n      if (matches) {\n        bma = {\n          \"dns\": matches[2] || '',\n          \"ipv4\": matches[4] || '',\n          \"ipv6\": matches[6] || '',\n          \"port\": matches[8] || 9101\n        };\n      }\n    });\n    return bma || {};\n  };\n\n  that.getDns = function () {\n    var bma = that.getBMA();\n    return bma.dns ? bma.dns : null;\n  };\n\n  that.getIPv4 = function () {\n    var bma = that.getBMA();\n    return bma.ipv4 ? bma.ipv4 : null;\n  };\n\n  that.getIPv6 = function () {\n    var bma = that.getBMA();\n    return bma.ipv6 ? bma.ipv6 : null;\n  };\n\n  that.getPort = function () {\n    var bma = that.getBMA();\n    return bma.port ? bma.port : null;\n  };\n\n  that.getHost = function () {\n    var bma = that.getBMA();\n    var host = that.hasValid4(bma) ? bma.ipv4 : bma.dns ? bma.dns : bma.ipv6 ? '[' + bma.ipv6 + ']' : '';\n    return host;\n  };\n\n  that.getURL = function () {\n    var bma = that.getBMA();\n    var base = '';\n    if (bma.dns) {\n      base = bma.dns;\n    } else if (that.hasValid4(bma)) {\n      base = bma.ipv4;\n    } else if (bma.ipv6) {\n      base = '[' + bma.ipv6 + ']';\n    }\n    if (bma.port) base += ':' + bma.port;\n    return base;\n  };\n\n  that.hasValid4 = function (bma) {\n    return bma.ipv4 && !bma.ipv4.match(/^127.0/) && !bma.ipv4.match(/^192.168/) ? true : false;\n  };\n\n  that.getNamedURL = function () {\n    var bma = that.getBMA();\n    var base = that.hasValid4(bma) ? bma.ipv4 : bma.dns ? bma.dns : bma.ipv6 ? '[' + bma.ipv6 + ']' : '';\n    if (bma.port) base += ':' + bma.port;\n    return base;\n  };\n\n  that.isReachable = function () {\n    return that.getURL() ? true : false;\n  };\n};\n","\"use strict\";\n\nmodule.exports = function mobilecheck() {\n  var check = false;\n  (function (a) {\n    if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;\n  })(navigator.userAgent || navigator.vendor || window.opera);\n  return check;\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  var Base58 = {};\n\n  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n  Base58.alphabetMap = {};\n\n  for (var i = 0; i < Base58.alphabet.length; i++) {\n    Base58.alphabetMap[Base58.alphabet.charAt(i)] = i;\n  }\n\n  Base58.encode = function (buffer) {\n    if (buffer.length === 0) return '';\n\n    var i = void 0,\n        j = void 0,\n        digits = [0];\n    for (i = 0; i < buffer.length; i++) {\n      for (j = 0; j < digits.length; j++) {\n        digits[j] <<= 8;\n      }digits[digits.length - 1] += buffer[i];\n\n      var carry = 0;\n      for (j = digits.length - 1; j >= 0; j--) {\n        digits[j] += carry;\n        carry = digits[j] / 58 | 0;\n        digits[j] %= 58;\n      }\n\n      while (carry) {\n        digits.unshift(carry);\n        carry = digits[0] / 58 | 0;\n        digits[0] %= 58;\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < buffer.length - 1 && buffer[i] == 0; i++) {\n      digits.unshift(0);\n    }return digits.map(function (digit) {\n      return Base58.alphabet[digit];\n    }).join('');\n  };\n\n  Base58.decode = function (string) {\n    if (string.length === 0) return new Uint8Array();\n\n    var input = string.split('').map(function (c) {\n      return Base58.alphabetMap[c];\n    });\n\n    var i = void 0,\n        j = void 0,\n        bytes = [0];\n    for (i = 0; i < input.length; i++) {\n      for (j = 0; j < bytes.length; j++) {\n        bytes[j] *= 58;\n      }bytes[bytes.length - 1] += input[i];\n\n      var carry = 0;\n      for (j = bytes.length - 1; j >= 0; j--) {\n        bytes[j] += carry;\n        carry = bytes[j] >> 8;\n        bytes[j] &= 0xff;\n      }\n\n      while (carry) {\n        bytes.unshift(carry);\n        carry = bytes[0] >> 8;\n        bytes[0] &= 0xff;\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < input.length - 1 && input[i] == 0; i++) {\n      bytes.unshift(0);\n    }return new Uint8Array(bytes);\n  };\n\n  app.factory('Base58', function () {\n    return {\n      encode: Base58.encode,\n      decode: Base58.decode\n    };\n  });\n};\n","'use strict';\n\nvar _ = require('underscore');\nvar conf = require('../lib/conf/conf');\nvar moment = require('moment');\n\nmodule.exports = function (app) {\n\n  app.filter('mt_date', function () {\n    return function (input) {\n      if (input == null) {\n        return \"\";\n      }\n      return moment(input * 1000).format('YYYY MM DD');\n    };\n  });\n\n  app.filter('mt_time', function () {\n    return function (input) {\n      if (input == null) {\n        return \"\";\n      }\n      return moment(input * 1000).format('HH:mm:ss');\n    };\n  });\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('Graph', function () {\n    return {\n\n      speedGraph: function speedGraphs(id, offset, speeds, minSpeeds, maxSpeeds, getSeries) {\n        var xValuex = [];\n        for (var i = 0, len = speeds.length; i < len; i++) {\n          xValuex.push(i + offset);\n        }\n        $(id).highcharts({\n          chart: {\n            type: \"area\",\n            zoomType: 'x',\n            events: {\n              load: function load() {\n                getSeries(this.series);\n              }\n            }\n          },\n          title: {\n            text: 'Blocks writing speed'\n          },\n          subtitle: {\n            text: document.ontouchstart === undefined ? 'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'\n          },\n          xAxis: {\n            //categories: xValuex,\n            minRange: 3, // 10 blocks,\n            labels: {\n              formatter: function formatter() {\n                return this.value + offset;\n              }\n            }\n          },\n          yAxis: {\n            //type: 'logarithmic',\n            minorTickInterval: 1,\n            title: {\n              text: 'Blocks per hour (logarithmic scale)'\n            },\n            floor: 0,\n            min: 0\n          },\n          colors: ['#ff0000', '#7cb5ec', '#000000'],\n          legend: {\n            enabled: true\n          },\n          tooltip: {\n            shared: true,\n            crosshairs: true,\n            formatter: blockFormatter(offset)\n          },\n          plotOptions: {\n            area: {\n              fillColor: {\n                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n                stops: [[0, Highcharts.getOptions().colors[0]], [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]]\n              },\n              marker: {\n                radius: 2\n              },\n              lineWidth: 1,\n              states: {\n                hover: {\n                  lineWidth: 1\n                }\n              },\n              threshold: null\n            }\n          },\n\n          series: [{\n            type: 'line',\n            name: \"Upper limit\",\n            data: maxSpeeds\n          }, {\n            type: 'area',\n            name: \"Actual speed\",\n            data: speeds\n          }, {\n            type: 'line',\n            name: \"Lower limit\",\n            data: minSpeeds\n          }]\n        });\n      },\n\n      difficultyGraph: function difficultyGraph(id, offset, difficulties) {\n        $(id).highcharts({\n          chart: {\n            type: \"area\",\n            zoomType: 'x'\n          },\n          title: {\n            text: 'Proof-of-Work difficulty by block'\n          },\n          subtitle: {\n            text: document.ontouchstart === undefined ? 'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'\n          },\n          xAxis: {\n            minRange: 10, // 10 blocks,\n            labels: {\n              formatter: function formatter() {\n                return this.value + offset;\n              }\n            }\n          },\n          yAxis: {\n            title: {\n              text: 'Number of zeros'\n            },\n            floor: 0,\n            min: 0\n          },\n          legend: {\n            enabled: true\n          },\n          tooltip: {\n            shared: true,\n            crosshairs: true,\n            formatter: blockFormatter(offset)\n          },\n          plotOptions: {\n            area: {\n              fillColor: {\n                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n                stops: [[0, Highcharts.getOptions().colors[0]], [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]]\n              },\n              marker: {\n                radius: 2\n              },\n              lineWidth: 1,\n              states: {\n                hover: {\n                  lineWidth: 1\n                }\n              },\n              threshold: null\n            }\n          },\n\n          series: [{\n            name: 'PoW difficulty',\n            data: difficulties\n          }]\n        });\n      },\n\n      timeGraphs: function timeGraphs(id, offset, timeAccelerations, medianTimeIncrements, speeds, minSpeeds, maxSpeeds) {\n        var timesInc = [];\n        medianTimeIncrements.forEach(function (inc) {\n          timesInc.push(inc == 0 ? 1 : inc);\n        });\n        $(id).highcharts({\n          chart: {\n            // type: \"area\",\n            zoomType: 'x'\n          },\n          title: {\n            text: 'Blockchain time variations'\n          },\n          subtitle: {\n            text: document.ontouchstart === undefined ? 'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'\n          },\n          xAxis: {\n            minRange: 10, // 10 blocks,\n            labels: {\n              formatter: function formatter() {\n                return this.value + offset;\n              }\n            }\n          },\n          yAxis: {\n            //type: 'logarithmic',\n            minorTickInterval: 1,\n            title: {\n              text: 'Number of seconds (logarithmic scale)'\n            }\n          },\n          legend: {\n            enabled: true\n          },\n          tooltip: {\n            shared: true,\n            crosshairs: true,\n            formatter: blockFormatter(offset)\n          },\n          plotOptions: {\n            area: {\n              fillColor: {\n                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n                stops: [[0, Highcharts.getOptions().colors[0]], [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]]\n              },\n              marker: {\n                radius: 2\n              },\n              lineWidth: 1,\n              states: {\n                hover: {\n                  lineWidth: 1\n                }\n              },\n              threshold: null\n            }\n          },\n\n          series: [{\n            name: 'Time acceleration',\n            data: timeAccelerations\n          }, {\n            name: \"Median Time variation\",\n            data: timesInc\n          }, {\n            name: \"Too high duration\",\n            data: maxSpeeds\n          }, {\n            name: \"Actual duration\",\n            data: speeds\n          }, {\n            name: \"Too low duration\",\n            data: minSpeeds\n          }]\n        });\n      }\n    };\n  });\n};\n\nfunction blockFormatter(offset) {\n  return function () {\n    var html = '<span style=\"font-size: 10px\">' + (this.x + offset) + '</span><br/>';\n    for (var i = 0, len = this.points.length; i < len; i++) {\n      var point = this.points[i];\n      var series = point.series;\n      html += '<span style=\"color:' + series.color + '\">\\u25CF</span>' + series.name + ': <b>' + point.y + '</b><br/>';\n    }\n    return html;\n  };\n}\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('Importer', function ($http, $state, $timeout, UIUtils, Upload, Webmin) {\n\n    return function ($scope) {\n\n      $scope.uploadFiles = function (file, errFiles) {\n        $scope.f = file;\n        $scope.errFile = errFiles && errFiles[0];\n        if (file) {\n          UIUtils.toast('settings.data.backup.importing');\n          file.upload = Upload.upload({\n            url: Webmin.getImportURL(),\n            data: { importData: file }\n          });\n\n          file.upload.then(function (response) {\n            $timeout(function () {\n              UIUtils.toast('settings.data.backup.imported');\n              $state.go('main.home.overview');\n              file.result = response.data;\n            });\n          }, function (response) {\n            if (response.status > 0) $scope.errorMsg = response.status + ': ' + response.data;\n          }, function (evt) {\n            file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));\n          });\n        }\n      };\n    };\n  });\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('PubkeyGenerator', function ($timeout, Webmin) {\n\n    var co = require('co');\n\n    return function ($scope) {\n\n      var concat = \"\";\n      $scope.pubkey_preview = \"\";\n      var timeout = preview();\n\n      function preview() {\n        return $timeout(function () {\n          if ($scope.$parent) {\n            var salt = $scope.$parent.conf.idty_entropy;\n            var pass = $scope.$parent.conf.idty_password;\n            var newConcat = [salt, pass].join('');\n            if (salt && pass && newConcat != concat) {\n              concat = newConcat;\n              $scope.previewPubkey(concat);\n              timeout = preview();\n            } else {\n              timeout = preview();\n            }\n          }\n        }, 100);\n      }\n\n      $scope.previewPubkey = function () {\n        return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n          var data;\n          return regeneratorRuntime.wrap(function _callee$(_context) {\n            while (1) {\n              switch (_context.prev = _context.next) {\n                case 0:\n                  _context.next = 2;\n                  return Webmin.key.preview({\n                    conf: $scope.$parent.conf\n                  });\n\n                case 2:\n                  data = _context.sent;\n\n                  $scope.pubkey_preview = data.pubkey;\n\n                case 4:\n                case 'end':\n                  return _context.stop();\n              }\n            }\n          }, _callee, this);\n        })).catch(function () {\n          return null;\n        });\n      };\n    };\n  });\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('UIUtils', function ($q, $translate, $state, $location) {\n    return {\n\n      translate: function translate(msg) {\n        return $q.when($translate(msg));\n      },\n\n      toastRaw: function toastRaw(msg) {\n        return Materialize.toast(msg, 4000);\n      },\n\n      toast: function toast(msg) {\n        return $q.when($translate(msg)).then(function (translated) {\n          return Materialize.toast(translated, 4000);\n        });\n      },\n\n      enableInputs: function enableInputs() {\n        return $('i.prefix, label[value!=\"\"]').addClass('active');\n      },\n\n      enableTabs: function enableTabs() {\n        var jTabs = $('ul.tabs');\n        jTabs.tabs();\n        $('ul.tabs a').click(function (e) {\n          var href = $(e.currentTarget).attr('href');\n          var state = href.slice(1);\n          $state.go(state);\n        });\n\n        var currentID = $location.path().replace(/\\//g, '.').replace(/\\./, '');\n\n        jTabs.tabs('select_tab', currentID);\n      },\n\n      changeTitle: function changeTitle(version, currency, prefix) {\n        var printCurrency = \"\";\n        if (typeof currency != \"undefined\" && currency != null) {\n          printCurrency = currency;\n          if (currency == \"g1\" || currency == \"g1-test\") {\n            printCurrency = currency = 'ğ' + currency.slice(1);\n          }\n        }\n        return document.title = typeof prefix != \"undefined\" && prefix != 1 ? 'Duniter ' + version + ' : ' + printCurrency + '-' + prefix : 'Duniter ' + version + ' : ' + printCurrency;\n      }\n    };\n  });\n};\n","'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar co = require('co');\nvar _ = require('underscore');\nvar conf = require('../lib/conf/conf');\n\nmodule.exports = function (angular) {\n\n  angular.module('duniter.services.webmin', ['ngResource']).factory('Webmin', function ($http, $q) {\n\n    function httpProtocol() {\n      return window.location.protocol + '//';\n    }\n\n    function wsProtocol() {\n      return window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n    }\n\n    function Webmin(server) {\n\n      function getResource(uri, protocol) {\n        return function (params) {\n          return $q.when(httpGet(uri, params, protocol));\n        };\n      }\n\n      function httpGet(uri, params, protocol) {\n        return Q.Promise(function (resolve, reject) {\n          var config = {\n            timeout: conf.api_timeout\n          },\n              suffix = '',\n              pkeys = [],\n              queryParams = null;\n          if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) == 'object') {\n            pkeys = _.keys(params);\n            queryParams = {};\n          }\n          pkeys.forEach(function (pkey) {\n            var prevURI = uri;\n            uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n            if (prevURI == uri) {\n              queryParams[pkey] = params[pkey];\n            }\n          });\n          config.params = queryParams;\n          $http.get((protocol || httpProtocol()) + server + uri + suffix, config).success(function (data, status, headers, config) {\n            resolve(data);\n          }).error(function (data, status, headers, config) {\n            console.log(data);\n            reject(data);\n          });\n        });\n      }\n\n      function postResource(uri) {\n        return function (data, params) {\n          return $q.when(Q.Promise(function (resolve, reject) {\n            var config = {\n              timeout: 4000\n            },\n                suffix = '',\n                pkeys = [],\n                queryParams = null;\n            if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) == 'object') {\n              pkeys = _.keys(params);\n              queryParams = {};\n            }\n            pkeys.forEach(function (pkey) {\n              var prevURI = uri;\n              uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n              if (prevURI == uri) {\n                queryParams[pkey] = params[pkey];\n              }\n            });\n            config.params = queryParams;\n            $http.post(httpProtocol() + server + uri + suffix, data, config).success(function (data, status, headers, config) {\n              resolve(data);\n            }).error(function (data, status, headers, config) {\n              reject(data);\n            });\n          }));\n        };\n      }\n\n      var wsMap = {};\n\n      function _ws(uri) {\n        var sock = wsMap[uri] || new WebSocket(uri);\n        wsMap[uri] = sock;\n        sock.onclose = function (e) {\n          console.log('close');\n          console.log(e);\n        };\n        sock.onerror = function (e) {\n          console.log('onerror');\n          console.log(e);\n        };\n        var opened = false,\n            openedCallback = void 0;\n        sock.onopen = function () {\n          opened = true;\n          openedCallback && openedCallback();\n        };\n        var listener = void 0,\n            messageType = void 0;\n        sock.onmessage = function (e) {\n          var res = JSON.parse(e.data);\n          if (res.type == 'log') {\n            for (var i = 0, len = res.value.length; i < len; i++) {\n              var log = res.value[i];\n              // console[log.level](log.msg);\n            }\n          }\n          if (listener && (messageType === undefined || res.type === messageType)) {\n            listener(res);\n          }\n        };\n        return {\n          on: function on(type, callback) {\n            messageType = type;\n            listener = callback;\n          },\n          whenOpened: function whenOpened() {\n            return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n              return regeneratorRuntime.wrap(function _callee$(_context) {\n                while (1) {\n                  switch (_context.prev = _context.next) {\n                    case 0:\n                      if (!opened) {\n                        _context.next = 4;\n                        break;\n                      }\n\n                      return _context.abrupt('return', true);\n\n                    case 4:\n                      _context.next = 6;\n                      return Q.Promise(function (resolve) {\n                        openedCallback = resolve;\n                      });\n\n                    case 6:\n                    case 'end':\n                      return _context.stop();\n                  }\n                }\n              }, _callee, this);\n            }));\n          },\n          send: function send(msg) {\n            return sock.send(msg);\n          }\n        };\n      }\n\n      return {\n        getExportURL: function getExportURL() {\n          return httpProtocol() + server + '/webmin/data/duniter_export';\n        },\n        getImportURL: function getImportURL() {\n          return httpProtocol() + server + '/webmin/data/duniter_import';\n        },\n        isNodePubliclyReachable: getResource('/webmin/server/reachable'),\n        ws: function ws() {\n          return _ws(wsProtocol() + server + '/webmin/ws');\n        },\n        wsBlock: function wsBlock() {\n          return _ws(wsProtocol() + server + '/webmin/ws_block');\n        },\n        wsPeer: function wsPeer() {\n          return _ws(wsProtocol() + server + '/webmin/ws_peer');\n        },\n        summary: getResource('/webmin/summary'),\n        powSummary: getResource('/webmin/summary/pow'),\n        logsExport: function logsExport(nbLines) {\n          return getResource('/webmin/logs/export/' + nbLines)();\n        },\n        blockchain: {\n          blocks: function blocks(opts) {\n            return getResource('/webmin/blockchain/blocks/' + opts.count + '/' + opts.from)();\n          },\n          block_add: postResource('/webmin/blockchain/add')\n        },\n        server: {\n          http: {\n            start: getResource('/webmin/server/http/start'),\n            stop: getResource('/webmin/server/http/stop'),\n            openUPnP: getResource('/webmin/server/http/upnp/open'),\n            regularUPnP: getResource('/webmin/server/http/upnp/regular')\n          },\n          services: {\n            startAll: getResource('/webmin/server/services/start_all'),\n            stopAll: getResource('/webmin/server/services/stop_all')\n          },\n          sendConf: postResource('/webmin/server/send_conf'),\n          netConf: postResource('/webmin/server/net_conf'),\n          keyConf: postResource('/webmin/server/key_conf'),\n          cpuConf: postResource('/webmin/server/cpu_conf'),\n          testSync: postResource('/webmin/server/test_sync'),\n          startSync: postResource('/webmin/server/start_sync'),\n          previewNext: getResource('/webmin/server/preview_next'),\n          autoConfNetwork: getResource('/webmin/server/auto_conf_network'),\n          resetData: getResource('/webmin/server/reset/data'),\n          republishNewSelfPeer: getResource('/webmin/server/republish_selfpeer')\n        },\n        key: {\n          preview: postResource('/webmin/key/preview')\n        },\n        network: {\n          interfaces: getResource('/webmin/network/interfaces'),\n          selfPeer: getResource('/webmin/network/self'),\n          peers: getResource('/webmin/network/peers'),\n          ws2p: {\n            info: getResource('/webmin/network/ws2p/info'),\n            heads: getResource('/webmin/network/ws2p/heads'),\n            conf: getResource('/webmin/network/ws2p/conf')\n          }\n        },\n        currency: {\n          parameters: getResource('/webmin/currency/parameters')\n        },\n        plugin: {\n          allModules: getResource('/webmin/plug/modules'),\n          uiModules: getResource('/webmin/plug/ui_modules'),\n          uiGetMenuInjection: function uiGetMenuInjection(moduleName) {\n            return getResource('/webmin/plug/ui_modules/inject/' + moduleName)();\n          },\n          checkAccess: getResource('/webmin/plug/check_access'),\n          addPackage: function addPackage(pkg) {\n            return postResource('/webmin/plug/add/')({ pkg: pkg });\n          },\n          removePackage: function removePackage(pkg) {\n            return postResource('/webmin/plug/rem/')({ pkg: pkg });\n          }\n        }\n      };\n    }\n    var server = window.location.hostname;\n    var port = window.location.port;\n    var service = Webmin([server, port].join(':'));\n    service.instance = Webmin;\n    return service;\n  });\n};\n"]}
\ No newline at end of file
+{"version":3,"sources":["app/js/controllers/AboutController.js","app/js/controllers/IndexController.js","app/js/controllers/init/create/IdentityController.js","app/js/controllers/init/create/ParametersController.js","app/js/controllers/init/create/RootBlockController.js","app/js/controllers/init/sync/SyncController.js","app/js/controllers/main/MainController.js","app/js/controllers/main/graphs/GraphsBlockchainController.js","app/js/controllers/main/graphs/GraphsController.js","app/js/controllers/main/home/HomeController.js","app/js/controllers/main/home/tabs/HomeConnectionsController.js","app/js/controllers/main/home/tabs/HomeNetworkController.js","app/js/controllers/main/home/tabs/OverviewController.js","app/js/controllers/main/settings/SettingsController.js","app/js/controllers/main/settings/tabs/BackupController.js","app/js/controllers/main/settings/tabs/CPUController.js","app/js/controllers/main/settings/tabs/CurrencyController.js","app/js/controllers/main/settings/tabs/DataController.js","app/js/controllers/main/settings/tabs/KeyController.js","app/js/controllers/main/settings/tabs/LogsController.js","app/js/controllers/main/settings/tabs/LogsSettingsController.js","app/js/controllers/main/settings/tabs/ModulesController.js","app/js/controllers/main/settings/tabs/NetworkController.js","app/js/app.config.js","app/js/application.js","app/js/lib/conf/conf.js","app/js/lib/conf/i18n/en.json","app/js/lib/conf/routes.js","app/js/lib/conf/translate.js","app/js/lib/entity/peer.js","app/js/lib/mobileDetector.js","app/js/services/base58.js","app/js/services/datetime.js","app/js/services/graphs.js","app/js/services/importer.js","app/js/services/pubkeyGenerator.js","app/js/services/ui_utils.js","app/js/services/webmin.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA3BA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1DA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1BA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AANA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAzNA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA3MA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AApNA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA9JA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAjKA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAtCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAjZA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAtCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAjCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAnDA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAzFA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AArDA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAvKA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AArFA;AAAA;CCAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlGA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlBA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlQA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAheA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAfA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAnHA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AATA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxFA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA1BA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlPA;AAAA;CCAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlCA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA7DA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AApDA;AAAA;ACAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAvPA;AAAA","file":"public/app.js","sourcesContent":["\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, version, UIUtils) {\n\n  $scope.version = version;\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return UIUtils.translate('help.about_duniter.title');\n\n          case 2:\n            $scope.$parent.title = _context.sent;\n\n          case 3:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, Webmin, summary, UIUtils) {\n\n  UIUtils.changeTitle(summary.version, summary.parameters.currency, summary.conf.prefix);\n\n  $scope.message = 'index.message.loading';\n  co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n    var connected, _summary;\n\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            connected = false;\n            _context.prev = 1;\n            _context.next = 4;\n            return Webmin.summary();\n\n          case 4:\n            _summary = _context.sent;\n\n            if (!_summary.current) {\n              _context.next = 7;\n              break;\n            }\n\n            return _context.abrupt('return', $state.go('main.home.overview'));\n\n          case 7:\n            return _context.abrupt('return', $state.go('configure.choose'));\n\n          case 10:\n            _context.prev = 10;\n            _context.t0 = _context['catch'](1);\n\n            console.error(connected, _context.t0);\n\n            if (connected) {\n              _context.next = 15;\n              break;\n            }\n\n            return _context.abrupt('return', $state.go('error', { err: 'err.connection' }));\n\n          case 15:\n            return _context.abrupt('return', $state.go('error', { err: _context.t0 }));\n\n          case 16:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this, [[1, 10]]);\n  }));\n};\n","\"use strict\";\n\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = function ($scope, $state, PubkeyGenerator) {\n\n  setTimeout(function () {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = function () {\n    var modal = $('#modal1');\n    if (modal.css('display') == 'none') {\n      $('#modal1').openModal();\n    }\n  };\n\n  PubkeyGenerator($scope);\n\n  if (conf.dev_autoconf) {\n    $scope.$parent.conf.idty_uid = 'dev_' + ~~(Math.random() * 2147483647);\n    $scope.$parent.conf.idty_entropy = ~~(Math.random() * 2147483647) + \"\";\n    $scope.$parent.conf.idty_password = ~~(Math.random() * 2147483647) + \"\";\n    $state.go('configure.create.network');\n  }\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, UIUtils) {\n\n  UIUtils.enableInputs();\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = function ($scope, $http, $state, Webmin) {\n\n  $scope.generated = '';\n  $scope.started = false;\n  $scope.message = 'configuration.create_root.need_a_try';\n\n  $scope.start = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var hosts;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.prev = 0;\n              hosts = [];\n\n              if ($scope.$parent.conf.remote_ipv4) {\n                hosts.push([$scope.$parent.conf.remote_ipv4, $scope.$parent.conf.rport].join(':'));\n              }\n              if ($scope.$parent.conf.remote_ipv6) {\n                hosts.push([\"[\" + $scope.$parent.conf.remote_ipv6 + \"]\", $scope.$parent.conf.rport].join(':'));\n              }\n              $scope.host_listening = hosts.join('\\n');\n              $scope.started = true;\n              _context.next = 8;\n              return Webmin.server.sendConf({\n                conf: $scope.$parent.conf\n              });\n\n            case 8:\n              _context.next = 10;\n              return $scope.try();\n\n            case 10:\n              _context.next = 15;\n              break;\n\n            case 12:\n              _context.prev = 12;\n              _context.t0 = _context['catch'](0);\n\n              $scope.message = _context.t0.message;\n\n            case 15:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[0, 12]]);\n    }));\n  };\n\n  $scope.stop = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              $scope.started = false;\n\n            case 1:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  $scope.try = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              _context3.prev = 0;\n              _context3.next = 3;\n              return Webmin.server.previewNext();\n\n            case 3:\n              $scope.block = _context3.sent;\n\n              $scope.generated = $scope.block.raw;\n              $scope.message = '';\n              _context3.next = 11;\n              break;\n\n            case 8:\n              _context3.prev = 8;\n              _context3.t0 = _context3['catch'](0);\n\n              $scope.message = _context3.t0.message;\n\n            case 11:\n            case 'end':\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this, [[0, 8]]);\n    }));\n  };\n\n  $scope.accept = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n              _context4.next = 2;\n              return Webmin.blockchain.block_add({\n                block: $scope.generated\n              });\n\n            case 2:\n              res = _context4.sent;\n\n              if (!(res.number == 0)) {\n                _context4.next = 6;\n                break;\n              }\n\n              _context4.next = 6;\n              return $scope.startServices();\n\n            case 6:\n            case 'end':\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this);\n    }));\n  };\n\n  $scope.startServices = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n      return regeneratorRuntime.wrap(function _callee5$(_context5) {\n        while (1) {\n          switch (_context5.prev = _context5.next) {\n            case 0:\n              _context5.next = 2;\n              return Webmin.server.services.startAll();\n\n            case 2:\n              $state.go('index');\n\n            case 3:\n            case 'end':\n              return _context5.stop();\n          }\n        }\n      }, _callee5, this);\n    }));\n  };\n\n  $scope.cancelAndReset = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n      return regeneratorRuntime.wrap(function _callee6$(_context6) {\n        while (1) {\n          switch (_context6.prev = _context6.next) {\n            case 0:\n              _context6.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              _context6.next = 4;\n              return Webmin.server.resetData();\n\n            case 4:\n              $state.go('index');\n\n            case 5:\n            case 'end':\n              return _context6.stop();\n          }\n        }\n      }, _callee6, this);\n    }));\n  };\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n    return regeneratorRuntime.wrap(function _callee7$(_context7) {\n      while (1) {\n        switch (_context7.prev = _context7.next) {\n          case 0:\n            _context7.prev = 0;\n            _context7.next = 3;\n            return $scope.start();\n\n          case 3:\n            _context7.next = 5;\n            return $scope.try();\n\n          case 5:\n            $scope.started = true;\n            _context7.next = 11;\n            break;\n\n          case 8:\n            _context7.prev = 8;\n            _context7.t0 = _context7['catch'](0);\n\n            $scope.started = false;\n\n          case 11:\n          case 'end':\n            return _context7.stop();\n        }\n      }\n    }, _callee7, this, [[0, 8]]);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, $timeout, $stateParams, $translate, UIUtils, Webmin) {\n\n  var syncWS = Webmin.ws();\n\n  UIUtils.enableInputs();\n  $scope.sync_mode = 'simplified';\n  $scope.simplified_host = '';\n  $scope.synchronizing = false;\n  $scope.sync_failed = false;\n  $scope.host = $stateParams.host || localStorage.getItem('sync_host') || '';\n  $scope.port = parseInt($stateParams.port) || parseInt(localStorage.getItem('sync_port')) || 10901;\n  $scope.to = parseInt($stateParams.to);\n  $scope.wrong_host = false;\n  $scope.remote_current = null;\n\n  $scope.checkNode = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var current, targetHost;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.checked_host = '';\n              $scope.sync_error = '';\n              $scope.sync_message = '';\n              if ($scope.sync_mode == 'simplified') {\n                $scope.host = $scope.simplified_host.split(':')[0];\n                $scope.port = parseInt($scope.simplified_host.split(':')[1]);\n              }\n              $scope.checking = true;\n              _context.prev = 5;\n              _context.next = 8;\n              return Webmin.server.testSync({\n                host: $scope.host,\n                port: $scope.port\n              });\n\n            case 8:\n              current = _context.sent;\n              targetHost = [$scope.host, $scope.port].join(':');\n\n              if (current) {\n                $scope.remote_current = current;\n                $scope.checked_host = targetHost;\n              }\n              UIUtils.toast('sync.ready.node.part1');\n              $timeout(function () {\n                if (!$scope.synchronizing) {\n                  UIUtils.toast('sync.ready.node.part2');\n                }\n              }, 6000);\n              _context.next = 18;\n              break;\n\n            case 15:\n              _context.prev = 15;\n              _context.t0 = _context['catch'](5);\n\n              $scope.sync_error = 'sync.error.unreachable.try.another.node';\n\n            case 18:\n              $scope.checking = false;\n              return _context.abrupt('return', $scope.checked_host ? true : false);\n\n            case 20:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[5, 15]]);\n    }));\n  };\n\n  $scope.startSync = function () {\n    $scope.down_percent = 0;\n    $scope.apply_percent = 0;\n    $scope.storage_percent = 0;\n    $scope.sbx_percent = 0;\n    $scope.peers_percent = 0;\n    $scope.sync_failed = false;\n    $scope.synchronizing = true;\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      var sp, translatedErr;\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              _context2.next = 2;\n              return $translate('sync.started.node');\n\n            case 2:\n              _context2.t0 = _context2.sent;\n              _context2.t1 = _context2.t0 + ' ';\n              _context2.t2 = $scope.checked_host;\n              $scope.sync_message = _context2.t1 + _context2.t2;\n              sp = $scope.checked_host.split(':');\n              _context2.next = 9;\n              return $translate('err.sync.interrupted');\n\n            case 9:\n              translatedErr = _context2.sent;\n\n              syncWS.on(undefined, function (data) {\n                if (data.type == 'sync') {\n                  $scope.down_percent = 100;\n                  $scope.apply_percent = 100;\n                  $scope.storage_percent = 100;\n                  $scope.sbx_percent = 100;\n                  $scope.peers_percent = 100;\n                  $scope.sync_failed = data.value;\n                  var errorMessage = data.msg && (data.msg.message || data.msg);\n                  errorMessage = translatedErr + ' « ' + errorMessage + ' »';\n                  Webmin.server.republishNewSelfPeer().then(function () {\n                    return console.log('Peer republished');\n                  });\n                  if (data.value === true) {\n                    $state.go('index');\n                  } else {\n                    $state.go('error', { err: errorMessage });\n                  }\n                } else {\n                  var changed = true;\n                  if (data.type == 'download' && $scope.down_percent != data.value) {\n                    $scope.down_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'applied' && $scope.apply_percent != data.value) {\n                    $scope.apply_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'saved' && $scope.storage_percent != data.value) {\n                    $scope.storage_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'sandbox' && $scope.sbx_percent != data.value) {\n                    $scope.sbx_percent = data.value;\n                    changed = true;\n                  }\n                  if (data.type == 'peersSync' && $scope.peers_percent != data.value) {\n                    $scope.peers_percent = data.value;\n                    changed = true;\n                  }\n                  if (changed) {\n                    $scope.$apply();\n                  }\n                }\n              });\n              _context2.next = 13;\n              return Webmin.server.autoConfNetwork();\n\n            case 13:\n              localStorage.setItem(\"sync_host\", sp[0]);\n              localStorage.setItem(\"sync_port\", sp[1]);\n              Webmin.server.startSync({\n                host: sp[0],\n                port: sp[1],\n                to: $scope.to,\n                chunkLen: Math.max(250, Math.min(25, $scope.remote_current ? $scope.remote_current.number / 100 : 0))\n              });\n\n            case 16:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  // Autostart\n  if ($scope.host && $scope.port && $stateParams.sync) {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      var nodeOK;\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              _context3.next = 2;\n              return $scope.checkNode();\n\n            case 2:\n              nodeOK = _context3.sent;\n\n              if (!nodeOK) {\n                _context3.next = 5;\n                break;\n              }\n\n              return _context3.abrupt('return', $scope.startSync());\n\n            case 5:\n            case 'end':\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n  }\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $state, $http, $timeout, $interval, Webmin, uiModules, summary, UIUtils) {\n\n  $scope.externalMenus = [];\n\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    var _loop = function _loop() {\n      var moduleName = _step.value;\n\n      var module = window.uiModules[moduleName];\n      if (module) {\n        $scope.externalMenus.push({\n          menuOpen: function menuOpen() {\n            return module.menuOpen(summary);\n          },\n          menuIconClass: module.menuIconClass,\n          menuLabel: module.menuLabel\n        });\n      }\n    };\n\n    for (var _iterator = uiModules[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      _loop();\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n\n  $scope.notifications = {\n    help: []\n  };\n\n  Waves.displayEffect();\n\n  var isMobile = require('js/lib/mobileDetector');\n  if (isMobile()) {\n    $(\".button-collapse\").sideNav({\n      menuWidth: 280\n    });\n  }\n\n  UIUtils.changeTitle(summary.version, summary.parameters.currency, summary.conf.prefix);\n\n  var aboutWin = void 0;\n\n  $scope.showAbout = function () {\n    if (aboutWin) {\n      aboutWin.focus();\n    } else {\n      openWindow(window.location.origin + '/#/about', {\n        position: 'center',\n        height: 380,\n        width: 510\n      }, function (subwin) {\n        subwin.window.gui = window.gui;\n        subwin.on('closed', function () {\n          aboutWin = null;\n          mainWindow.focus();\n        });\n        aboutWin = subwin;\n      });\n    }\n  };\n\n  $scope.startServer = function () {\n    $scope.server_stopped = false;\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.services.startAll();\n\n            case 2:\n              $scope.server_started = true;\n\n            case 3:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  $scope.stopServer = function () {\n    $scope.server_started = false;\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              _context2.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              $scope.server_stopped = true;\n\n            case 3:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  $scope.restartServer = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              _context3.next = 2;\n              return $scope.stopServer();\n\n            case 2:\n              _context3.next = 4;\n              return $scope.startServer();\n\n            case 4:\n            case 'end':\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n  };\n\n  function checkUpdates() {\n    var LATEST_RELEASE_URL = 'https://api.github.com/repos/duniter/duniter/releases/latest';\n    co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n      var latest, local_string_version, m, localVersion, localSuffix, isLocalAPreRelease, remoteVersion, localMajor, localMinor, localFix, remoteMajor, remoteMinor, remoteFix, newMajor, newMinor, newFix;\n      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n              _context4.prev = 0;\n              _context4.next = 3;\n              return $http.get(LATEST_RELEASE_URL);\n\n            case 3:\n              latest = _context4.sent;\n              local_string_version = 'v' + summary.version;\n              m = local_string_version.match(/^v([\\d.]+)([ab]?\\d*)/);\n              localVersion = m && m[1] || \"\";\n              localSuffix = m && m[2];\n              isLocalAPreRelease = !!localSuffix;\n              remoteVersion = latest.data.tag_name.substr(1);\n              localMajor = parseInt(localVersion.split('.')[0]);\n              localMinor = parseInt(localVersion.split('.')[1]);\n              localFix = parseInt(localVersion.split('.')[2]);\n              remoteMajor = parseInt(remoteVersion.split('.')[0]);\n              remoteMinor = parseInt(remoteVersion.split('.')[1]);\n              remoteFix = parseInt(remoteVersion.split('.')[2]);\n              newMajor = remoteMajor > localMajor;\n              newMinor = !newMajor && remoteMinor > localMinor;\n              newFix = !newMinor && remoteFix > localFix;\n\n              if (newMajor || newMinor || newFix || localVersion == remoteVersion && isLocalAPreRelease) {\n                if ($scope.notifications.help.filter(function (entry) {\n                  return entry.message == 'help.new_version_available';\n                }).length == 0) {\n                  $scope.notifications.help.push({\n                    icon: 'play_for_work',\n                    message: 'help.new_version_available',\n                    onclick: function onclick() {\n                      return openExternal('https://github.com/duniter/duniter/releases/latest');\n                    }\n                  });\n                }\n              }\n              _context4.next = 25;\n              break;\n\n            case 22:\n              _context4.prev = 22;\n              _context4.t0 = _context4['catch'](0);\n\n              console.error(_context4.t0);\n\n            case 25:\n            case 'end':\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this, [[0, 22]]);\n    }));\n  }\n\n  $interval(checkUpdates, 1000 * 3600);\n  $timeout(checkUpdates, 1000);\n};\n","\"use strict\";\n\nvar BLOCKS_COUNT = 40;\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $state, $timeout, Webmin, UIUtils, Graph) {\n\n  var data = {};\n\n  $scope.loading = true;\n  $scope.blocksCount = $scope.blocksCount || BLOCKS_COUNT;\n\n  $scope.$watch('withTime', function (newValue) {\n    if (newValue) {\n      timeGraph();\n    }\n  });\n\n  $scope.$watch('withSpeed', function (newValue) {\n    if (newValue) {\n      speedGraph();\n    }\n  });\n\n  $scope.$watch('withDifficulty', function (newValue) {\n    if (newValue) {\n      diffGraph();\n    }\n  });\n\n  $scope.updateGraphs = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var summary, parameters, blocks, speeds, accelerations, medianTimeIncrements, actualDurations, BY_HOUR, i, len, block, acc, previousPos, j, availPreviousBlocks, localAvgSpeed, realDuration, graphs, _i, _len;\n\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.summary();\n\n            case 2:\n              summary = _context.sent;\n              _context.next = 5;\n              return Webmin.currency.parameters();\n\n            case 5:\n              parameters = _context.sent;\n              _context.next = 8;\n              return Webmin.blockchain.blocks({\n                count: $scope.blocksCount,\n                from: Math.max(0, summary.current.number - $scope.blocksCount)\n              });\n\n            case 8:\n              blocks = _context.sent;\n              speeds = [], accelerations = [], medianTimeIncrements = [], actualDurations = [];\n              BY_HOUR = 3600;\n\n              for (i = 0, len = blocks.length; i < len; i++) {\n                block = blocks[i];\n                acc = 0;\n                previousPos = Math.max(0, i - parameters.dtDiffEval);\n\n                for (j = previousPos; j < i; j++) {\n                  acc += blocks[j + 1].medianTime - blocks[j].medianTime;\n                }\n                availPreviousBlocks = i - 1 - previousPos;\n                localAvgSpeed = acc / (availPreviousBlocks || 1);\n                realDuration = !isNaN(localAvgSpeed) && localAvgSpeed != 0 ? localAvgSpeed : parameters.avgGenTime;\n\n                actualDurations.push(parseFloat(realDuration.toFixed(2)));\n                speeds.push(parseFloat((BY_HOUR / realDuration).toFixed(2)));\n                accelerations.push(block.time - block.medianTime);\n                medianTimeIncrements.push(block.medianTime - (i ? blocks[i - 1].medianTime : block.medianTime));\n              }\n              data.summary = summary;\n              data.speeds = speeds;\n              data.accelerations = accelerations;\n              data.medianTimeIncrements = medianTimeIncrements;\n              data.actualDurations = actualDurations;\n              data.minSpeeds = speeds.map(function () {\n                return parseFloat((BY_HOUR / Math.ceil(parameters.avgGenTime * Math.sqrt(1.066))).toFixed(2));\n              });\n              data.maxSpeeds = speeds.map(function () {\n                return parseFloat((BY_HOUR / Math.floor(parameters.avgGenTime / Math.sqrt(1.066))).toFixed(2));\n              });\n              data.minDurations = speeds.map(function () {\n                return parseFloat((parameters.avgGenTime / 1.066).toFixed(2));\n              });\n              data.maxDurations = speeds.map(function () {\n                return parseFloat((parameters.avgGenTime * 1.066).toFixed(2));\n              });\n              data.difficulties = blocks.map(function (b) {\n                return b.powMin;\n              });\n\n              graphs = [];\n\n              if ($scope.withTime) graphs.push(timeGraph);\n              if ($scope.withSpeed) graphs.push(speedGraph);\n              if ($scope.withDifficulty) graphs.push(diffGraph);\n              for (_i = 0, _len = graphs.length; _i < _len; _i++) {\n                graphs[_i]();\n              }\n              $scope.loading = false;\n\n            case 28:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  function timeGraph() {\n    if ($scope.withTime) {\n      Graph.timeGraphs('#timeGraph', Math.max(0, data.summary.current.number - $scope.blocksCount + 1), data.accelerations, data.medianTimeIncrements, data.actualDurations, data.minDurations, data.maxDurations);\n    }\n  }\n\n  function speedGraph() {\n    if ($scope.withSpeed) {\n      Graph.speedGraph('#speedGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.speeds, data.minSpeeds, data.maxSpeeds, function (series) {\n        $scope.series = series;\n      });\n    }\n  }\n\n  function diffGraph() {\n    if ($scope.withDifficulty) {\n      Graph.difficultyGraph('#difficultyGraph', Math.max(0, data.summary.current.number - $scope.blocksCount), data.difficulties);\n    }\n  }\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n    return regeneratorRuntime.wrap(function _callee2$(_context2) {\n      while (1) {\n        switch (_context2.prev = _context2.next) {\n          case 0:\n            _context2.next = 2;\n            return $scope.updateGraphs();\n\n          case 2:\n            $scope.withTime = true;\n            $scope.withDifficulty = true;\n            $scope.$apply();\n\n          case 5:\n          case 'end':\n            return _context2.stop();\n        }\n      }\n    }, _callee2, this);\n  }));\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'graphs';\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.menu = 'home';\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, Webmin, heads, info, conf, ws) {\n\n  $scope.discriminateNodes = function (info) {\n    info.connections.level1.concat(info.connections.level2).forEach(function (c) {\n      c.prefered = (conf.preferedNodes || []).indexOf(c.pubkey) !== -1;\n      c.privileged = (conf.privilegedNodes || []).indexOf(c.pubkey) !== -1;\n    });\n    return info;\n  };\n\n  $scope.info = $scope.discriminateNodes(info);\n  $scope.heads = [];\n\n  var headsMap = {};\n\n  $scope.headsIntoMap = function (heads) {\n    var _iteratorNormalCompletion = true;\n    var _didIteratorError = false;\n    var _iteratorError = undefined;\n\n    try {\n      for (var _iterator = heads[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n        var value = _step.value;\n\n        var sp = value.message.split(':');\n        var api = sp[0];\n        var pubkey = sp[3];\n        var blockstamp = sp[4];\n        var ws2pId = sp[5];\n        var software = sp[6];\n        var softVersion = sp[7];\n        var prefix = sp[8];\n        var uid = value.uid;\n        var freeRooms = \"\";\n        var step = \"\";\n        // Gestion des anciens formats\n        console.log(value.message);\n        if (value.messageV2 && value.messageV2.match(/:2:/)) {\n          // HEAD V2\n          freeRooms = value.freeRooms;\n          step = value.step;\n        } else if (value.message.match(/:1:/)) {\n          // HEAD v1\n        } else {\n          // HEAD v0\n          pubkey = sp[2];\n          blockstamp = sp[3];\n        }\n        var ws2pFullId = pubkey + \"-\" + ws2pId;\n        headsMap[ws2pFullId] = {\n          api: api, blockstamp: blockstamp, uid: uid, ws2pId: ws2pId, software: software, softVersion: softVersion, prefix: prefix, freeRooms: freeRooms, step: step\n        };\n      }\n    } catch (err) {\n      _didIteratorError = true;\n      _iteratorError = err;\n    } finally {\n      try {\n        if (!_iteratorNormalCompletion && _iterator.return) {\n          _iterator.return();\n        }\n      } finally {\n        if (_didIteratorError) {\n          throw _iteratorError;\n        }\n      }\n    }\n\n    $scope.heads = Object.keys(headsMap).map(function (k) {\n      return {\n        pubkey: k,\n        api: headsMap[k].api,\n        uid: headsMap[k].uid,\n        blockstamp: headsMap[k].blockstamp,\n        ws2pId: headsMap[k].ws2pId,\n        software: headsMap[k].software,\n        softVersion: headsMap[k].softVersion,\n        prefix: headsMap[k].prefix,\n        freeRooms: headsMap[k].freeRooms,\n        step: headsMap[k].step\n      };\n    });\n  };\n\n  $scope.headsIntoMap(heads);\n\n  ws.on('ws2p', function (obj) {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              if (obj.value.ws2p === 'heads') {\n                $scope.headsIntoMap(obj.value.added);\n              } else if (obj.value.ws2p === 'connected' || obj.value.ws2p === 'disconnected') {\n                co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n                  return regeneratorRuntime.wrap(function _callee$(_context) {\n                    while (1) {\n                      switch (_context.prev = _context.next) {\n                        case 0:\n                          _context.t0 = $scope;\n                          _context.next = 3;\n                          return Webmin.network.ws2p.info();\n\n                        case 3:\n                          _context.t1 = _context.sent;\n                          $scope.info = _context.t0.discriminateNodes.call(_context.t0, _context.t1);\n\n                        case 5:\n                        case \"end\":\n                          return _context.stop();\n                      }\n                    }\n                  }, _callee, this);\n                }));\n              }\n              $scope.$apply();\n\n            case 2:\n            case \"end\":\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  });\n\n  var co = require('co');\n\n  $scope.update = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n      var delayP;\n      return regeneratorRuntime.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              $scope.searching = true;\n              delayP = Q.delay(500);\n              _context3.next = 4;\n              return Webmin.network.peers();\n\n            case 4:\n              $scope.peers = _context3.sent.peers;\n              _context3.next = 7;\n              return delayP;\n\n            case 7:\n              $scope.searching = false;\n              $scope.$apply();\n\n            case 9:\n            case \"end\":\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, Webmin, peers) {\n\n  $scope.peers = peers.peers;\n\n  var co = require('co');\n\n  $scope.update = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var delayP;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.searching = true;\n              delayP = Q.delay(500);\n              _context.next = 4;\n              return Webmin.network.peers();\n\n            case 4:\n              $scope.peers = _context.sent.peers;\n              _context.next = 7;\n              return delayP;\n\n            case 7:\n              $scope.searching = false;\n              $scope.$apply();\n\n            case 9:\n            case \"end\":\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, $interval, Webmin, UIUtils, summary, ws) {\n\n  UIUtils.enableTabs();\n  var co = require('co');\n  var moment = require('moment');\n\n  $scope.$parent.isStarted = false;\n  $scope.connected_ws2p_peers = 0;\n\n  $scope.updateInfo = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var info, map, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, level1, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, level2;\n\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.network.ws2p.info();\n\n            case 2:\n              info = _context.sent;\n              map = {};\n              _iteratorNormalCompletion = true;\n              _didIteratorError = false;\n              _iteratorError = undefined;\n              _context.prev = 7;\n\n              for (_iterator = info.connections.level1[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n                level1 = _step.value;\n\n                map[level1.pubkey] = true;\n              }\n              _context.next = 15;\n              break;\n\n            case 11:\n              _context.prev = 11;\n              _context.t0 = _context['catch'](7);\n              _didIteratorError = true;\n              _iteratorError = _context.t0;\n\n            case 15:\n              _context.prev = 15;\n              _context.prev = 16;\n\n              if (!_iteratorNormalCompletion && _iterator.return) {\n                _iterator.return();\n              }\n\n            case 18:\n              _context.prev = 18;\n\n              if (!_didIteratorError) {\n                _context.next = 21;\n                break;\n              }\n\n              throw _iteratorError;\n\n            case 21:\n              return _context.finish(18);\n\n            case 22:\n              return _context.finish(15);\n\n            case 23:\n              _iteratorNormalCompletion2 = true;\n              _didIteratorError2 = false;\n              _iteratorError2 = undefined;\n              _context.prev = 26;\n              for (_iterator2 = info.connections.level2[Symbol.iterator](); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n                level2 = _step2.value;\n\n                map[level2.pubkey] = true;\n              }\n              _context.next = 34;\n              break;\n\n            case 30:\n              _context.prev = 30;\n              _context.t1 = _context['catch'](26);\n              _didIteratorError2 = true;\n              _iteratorError2 = _context.t1;\n\n            case 34:\n              _context.prev = 34;\n              _context.prev = 35;\n\n              if (!_iteratorNormalCompletion2 && _iterator2.return) {\n                _iterator2.return();\n              }\n\n            case 37:\n              _context.prev = 37;\n\n              if (!_didIteratorError2) {\n                _context.next = 40;\n                break;\n              }\n\n              throw _iteratorError2;\n\n            case 40:\n              return _context.finish(37);\n\n            case 41:\n              return _context.finish(34);\n\n            case 42:\n              $scope.connected_ws2p_peers = Object.keys(map).length;\n\n            case 43:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[7, 11, 15, 23], [16,, 18, 22], [26, 30, 34, 42], [35,, 37, 41]]);\n    }));\n  };\n\n  bindBlockWS(function () {\n    $scope.loadPowData();\n  });\n  var M = summary.current.monetaryMass || 0;\n  // const nbUDperYear = Math.ceil(365.25 * 3600 * 24 / summary.parameters.dt);\n  // const globalC = Math.round(Math.pow(1 + summary.parameters.c, nbUDperYear) * 100) / 100 - 1;\n  var UD = summary.parameters.ud0;\n  if (summary.lastUDBlock) {\n    var N = summary.current.membersCount;\n    UD = parseInt(Math.round(summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase)));\n  }\n  $scope.current = summary.current;\n  $scope.current_currency = summary.current.currency;\n  $scope.current_number = summary.current.number;\n  $scope.current_membersCount = summary.current.membersCount;\n  $scope.current_medianTime = summary.current.medianTime;\n  $scope.current_powMin = summary.current.powMin;\n  $scope.monetaryMass = parseInt(M / UD) || 0;\n  $scope.server_started = true;\n  $scope.server_stopped = false;\n  $scope.phones = [];\n  $scope.abc = 'abcdef';\n  $scope.newIdentities = 2;\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.lastNearPoW = '';\n  $scope.totalPoW = '...';\n  $scope.sync_state = 'home.pulling.state.unkown';\n  $scope.network_percent = 0;\n  $scope.peer_percent = 0;\n  $scope.has_pulled = false;\n  $scope.is_pulling = false;\n  $scope.last_pulling = 0;\n  var start_block = 0;\n\n  $interval(function () {\n    if ($scope.last_pulling) {\n      $scope.sync_state = $scope.is_pulling ? 'home.pulling.state.syncing' : 'home.pulling.state.synced';\n      $scope.sync_time = moment($scope.last_pulling).fromNow();\n    }\n  }, 1000);\n\n  $scope.loadPowData = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              _context2.next = 2;\n              return Webmin.powSummary();\n\n            case 2:\n              res = _context2.sent;\n\n              $scope.pow_total = res.total;\n              $scope.pow_mirror = res.mirror;\n              $scope.pow_waiting = res.waiting;\n\n            case 6:\n            case 'end':\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n  };\n\n  ws.on(undefined, function (data) {\n    if (data.type === 'started') {\n      $scope.server_started = true;\n      $scope.server_stopped = false;\n      bindBlockWS(function () {\n        $scope.loadPowData();\n      });\n      UIUtils.toast('general.server.started');\n      $scope.$apply();\n    }\n    if (data.type === 'already_started') {\n      $scope.server_started = true;\n      $scope.server_stopped = false;\n      bindBlockWS(function () {\n        $scope.loadPowData();\n      });\n      $scope.$apply();\n    }\n    if (data.type === 'stopped') {\n      $scope.server_stopped = true;\n      $scope.server_started = false;\n      UIUtils.toast('general.server.stopped');\n      $scope.$apply();\n    }\n    if (data.type === 'pulling') {\n      $scope.is_pulling = true;\n      $scope.has_pulled = true;\n      var event = data.value;\n      if ($scope.last_pulling && event.type === 'start' || !$scope.last_pulling && event.type !== 'end') {\n        $scope.last_pulling = moment();\n      }\n      if (event.type === 'peer') {\n        $scope.network_percent = parseInt((event.data.number + 1) / event.data.length * 100);\n        $scope.peer_percent = 100;\n        start_block = 0;\n      }\n      if (event.type === 'applying') {\n        if (!start_block) {\n          start_block = event.data.number;\n        }\n        var total = event.data.last - start_block;\n        var doneCount = event.data.number - start_block;\n        $scope.peer_percent = parseInt(doneCount / total * 100);\n      }\n      if (event.type === 'end') {\n        $scope.is_pulling = false;\n        $scope.network_percent = 0;\n        $scope.peer_percent = 0;\n        start_block = 0;\n      }\n    }\n    if (data.type === 'pow') {\n      var pow = data.value;\n      if (pow.found) {\n        $scope.pow_waiting = true;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      } else {\n        $scope.pow_waiting = false;\n        $scope.lastNearPoW = '#' + pow.hash;\n        $scope.$apply();\n      }\n    }\n    if (data.type === 'ws2p') {\n      if (data.value.ws2p === 'connected' || data.value.ws2p === 'disconnected') {\n        co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n          return regeneratorRuntime.wrap(function _callee3$(_context3) {\n            while (1) {\n              switch (_context3.prev = _context3.next) {\n                case 0:\n                  _context3.next = 2;\n                  return $scope.updateInfo();\n\n                case 2:\n                  $scope.$apply();\n\n                case 3:\n                case 'end':\n                  return _context3.stop();\n              }\n            }\n          }, _callee3, this);\n        }));\n      }\n    }\n  });\n\n  function bindBlockWS(cb) {\n    Webmin.wsBlock().on(undefined, function (block) {\n      $scope.current_currency = block.currency;\n      $scope.current_number = block.number;\n      $scope.current_membersCount = block.membersCount;\n      $scope.current_medianTime = block.medianTime;\n      $scope.current_powMin = block.powMin;\n      var M = summary.current.monetaryMass || 0;\n      var UD = summary.parameters.ud0;\n      if (summary.lastUDBlock) {\n        var _N = summary.current.membersCount;\n        UD = parseInt(Math.round(summary.lastUDBlock.dividend * Math.pow(10, summary.lastUDBlock.unitbase)));\n      }\n      $scope.monetaryMass = parseInt(M / UD) || 0;\n      $scope.$apply();\n      cb && cb();\n    });\n  }\n\n  $scope.reconfigure_network = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n      var delay, netinferfaces, conf;\n      return regeneratorRuntime.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n              $scope.reconfiguring = true;\n              delay = Q.delay(1000);\n              _context4.prev = 2;\n              _context4.next = 5;\n              return Webmin.network.interfaces();\n\n            case 5:\n              netinferfaces = _context4.sent;\n              conf = {};\n\n              conf.local_ipv4 = netinferfaces.auto.local.ipv4 || '';\n              conf.local_ipv6 = netinferfaces.auto.local.ipv6 || '';\n              conf.remote_ipv4 = netinferfaces.auto.remote.ipv4 || '';\n              conf.remote_ipv6 = netinferfaces.auto.remote.ipv6 || '';\n              conf.lport = netinferfaces.auto.local.port || 9330;\n              conf.rport = netinferfaces.auto.remote.port || 9330;\n              conf.upnp = netinferfaces.auto.remote.upnp || false;\n              conf.dns = netinferfaces.auto.remote.dns || '';\n              _context4.next = 17;\n              return Webmin.server.netConf({\n                conf: conf\n              });\n\n            case 17:\n              _context4.next = 19;\n              return delay;\n\n            case 19:\n              $scope.should_reconfigure = false;\n              UIUtils.toast('general.network.reconf_ok');\n              $scope.$apply();\n              _context4.next = 30;\n              break;\n\n            case 24:\n              _context4.prev = 24;\n              _context4.t0 = _context4['catch'](2);\n              _context4.next = 28;\n              return delay;\n\n            case 28:\n              $scope.reconfiguring = false;\n              $scope.$apply();\n\n            case 30:\n            case 'end':\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this, [[2, 24]]);\n    }));\n  };\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n    var reachable;\n    return regeneratorRuntime.wrap(function _callee5$(_context5) {\n      while (1) {\n        switch (_context5.prev = _context5.next) {\n          case 0:\n            _context5.next = 2;\n            return $scope.startServer();\n\n          case 2:\n            _context5.prev = 2;\n\n            $scope.updateInfo();\n            _context5.next = 6;\n            return $scope.loadPowData();\n\n          case 6:\n            _context5.next = 8;\n            return Webmin.isNodePubliclyReachable();\n\n          case 8:\n            reachable = _context5.sent;\n\n            if (!reachable || !reachable.success) {\n              $scope.should_reconfigure = true;\n            }\n            _context5.next = 15;\n            break;\n\n          case 12:\n            _context5.prev = 12;\n            _context5.t0 = _context5['catch'](2);\n\n            console.log(_context5.t0);\n\n          case 15:\n          case 'end':\n            return _context5.stop();\n        }\n      }\n    }, _callee5, this, [[2, 12]]);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, $location, Webmin, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.menu = 'settings';\n\n  $(\".dropdown-button\").dropdown({ constrainwidth: false });\n\n  $scope.fullReset = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              _context.next = 4;\n              return Webmin.server.resetData();\n\n            case 4:\n              $state.go('index');\n\n            case 5:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, Importer, Webmin) {\n\n  $scope.export_link = Webmin.getExportURL();\n\n  Importer($scope);\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $http, $state, $timeout, UIUtils, summary, Webmin) {\n\n  $scope.cpuPower = parseInt(summary.conf.cpu * 100);\n\n  $scope.updateCPUpower = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.savingCPU = true;\n              _context.next = 3;\n              return Webmin.server.cpuConf({\n                cpu: parseFloat(($scope.cpuPower / 100).toFixed(2))\n              });\n\n            case 3:\n              UIUtils.toast('settings.cpu.saved');\n              $scope.savingCPU = false;\n\n            case 5:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, conf, UIUtils) {\n\n  $scope.$parent.conf = conf;\n\n  UIUtils.enableInputs();\n  $('input').attr('disabled', 'disabled');\n};\n","\"use strict\";\n\nvar co = require('co');\nvar Peer = require('js/lib/entity/peer');\n\nmodule.exports = function ($scope, $http, $state, Webmin, peers) {\n\n  $scope.peers = peers.map(function (peer) {\n    var p = new Peer(peer);\n    return {\n      name: [p.getURL(), \"(\" + p.pubkey.slice(0, 6) + \")\"].join(' '),\n      host_port: [p.getHost(), p.getPort()].join('|')\n    };\n  });\n\n  $scope.resetNode = function () {\n    $('#modalReset').openModal();\n  };\n\n  $scope.resetNodeAndSync = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var sp;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.services.stopAll();\n\n            case 2:\n              _context.next = 4;\n              return Webmin.server.resetData();\n\n            case 4:\n              sp = $scope.remote_host.split('|');\n\n              $state.go('sync', {\n                host: sp[0],\n                port: sp[1],\n                sync: true\n              });\n\n            case 6:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, $state, Webmin, summary, PubkeyGenerator) {\n\n  $scope.pubkey = summary.pubkey;\n\n  setTimeout(function () {\n    $('select').material_select();\n  }, 500);\n\n  $scope.accept = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.server.keyConf({\n                conf: $scope.$parent.conf\n              });\n\n            case 2:\n              $scope.$parent.conf.idty_entropy = '';\n              $scope.$parent.conf.idty_password = '';\n              $state.reload();\n              $scope.restartServer();\n\n            case 6:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  PubkeyGenerator($scope);\n};\n","\"use strict\";\n\nmodule.exports = function ($scope, ws, UIUtils) {\n\n  UIUtils.enableTabs();\n\n  var co = require('co');\n  var _ = require('underscore');\n\n  // Default values\n  if (!localStorage.getItem('log_error')) localStorage.setItem('log_error', true);\n  if (!localStorage.getItem('log_warn')) localStorage.setItem('log_warn', true);\n  if (!localStorage.getItem('log_info')) localStorage.setItem('log_info', true);\n\n  $scope.logsSize = parseInt(localStorage.getItem('log_size')) || 100;\n  $scope.logs = _.range(0, $scope.logsSize).map(function () {\n    return \"\";\n  });\n  $scope.logsString = \"\";\n  $scope.follow = true;\n  $scope.levels = {\n    error: localStorage.getItem('log_error') == \"true\",\n    warn: localStorage.getItem('log_warn') == \"true\",\n    info: localStorage.getItem('log_info') == \"true\",\n    debug: localStorage.getItem('log_debug') == \"true\",\n    trace: localStorage.getItem('log_trace') == \"true\"\n  };\n\n  _.keys($scope.levels).map(function (level) {\n    $scope.$watch('levels.' + level, function (newValue) {\n      localStorage.setItem('log_' + level, newValue);\n      $scope.logs.splice(0, $scope.logs.length);\n      ws.send();\n    });\n  });\n\n  $scope.$watch('logsSize', function (newValue) {\n    localStorage.setItem('log_size', newValue);\n    addLogs({ value: [] }, true);\n  });\n\n  ws.on('log', addLogs);\n\n  function addLogs(res, autoDigest) {\n\n    if (!$scope.pause) {\n      var newlogs = _.filter(res.value, function (log) {\n        return $scope.levels[log.level];\n      });\n      // Add at max LOGS_FLOW_SIZE new lines\n      newlogs.splice(0, Math.max(0, newlogs.length - $scope.logsSize));\n      // Add just enough space for incoming logs\n      $scope.logs.splice(0, Math.max(0, $scope.logs.length + newlogs.length - $scope.logsSize));\n      for (var i = 0, len = newlogs.length; i < len; i++) {\n        var log = newlogs[i];\n        $scope.logs.push(log);\n      }\n      if (!autoDigest) {\n        $scope.$apply();\n      }\n    }\n\n    if ($scope.follow) {\n      var elem = document.getElementById('logs');\n      if (elem) {\n        elem.scrollTop = elem.scrollHeight;\n      }\n    }\n  }\n\n  return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n    return regeneratorRuntime.wrap(function _callee$(_context) {\n      while (1) {\n        switch (_context.prev = _context.next) {\n          case 0:\n            _context.next = 2;\n            return ws.whenOpened();\n\n          case 2:\n            ws.send();\n\n          case 3:\n          case 'end':\n            return _context.stop();\n        }\n      }\n    }, _callee, this);\n  }));\n};\n","\"use strict\";\n\nvar co = require('co');\n\nmodule.exports = function ($scope, Webmin) {\n\n  $scope.generating = false;\n  $scope.error = '';\n\n  $scope.shareLogs = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              if ($scope.generating) {\n                _context.next = 14;\n                break;\n              }\n\n              _context.prev = 1;\n\n              $scope.error = '';\n              $scope.generating = true;\n              _context.next = 6;\n              return Webmin.logsExport(2000);\n\n            case 6:\n              res = _context.sent;\n\n              $scope.link = res.link;\n              _context.next = 13;\n              break;\n\n            case 10:\n              _context.prev = 10;\n              _context.t0 = _context['catch'](1);\n\n              $scope.error = _context.t0 && _context.t0.message || _context.t0 || 'Unknown error';\n\n            case 13:\n              $scope.generating = false;\n\n            case 14:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this, [[1, 10]]);\n    }));\n  };\n};\n","\"use strict\";\n\nvar co = require('co');\nvar _ = require('underscore');\n\nmodule.exports = function ($scope, $http, $state, $interval, $timeout, UIUtils, summary, Webmin, allModules, hasAccess) {\n\n  var interval = void 0;\n  $scope.hasAccess = hasAccess.hasAccess;\n  $scope.module_to_install = '';\n  $scope.installing = false;\n\n  $scope.showWarning = function () {\n    return $scope.warningShown = true;\n  };\n  $scope.hideWarning = function () {\n    return $scope.warningShown = false;\n  };\n\n  $scope.modules = modulesTransform(allModules);\n\n  $scope.switchModule = function (mod) {\n    $scope.modules.map(function (m) {\n      return m.disabled = true;\n    });\n    mod.installing = !mod.installing;\n    Webmin.plugin.removePackage(mod.name);\n    $scope.checkModulesInstallation();\n  };\n\n  $scope.installModule = function () {\n    var pkg = $scope.module_to_install;\n    if (!(pkg.match(/^.+@(~||\\^)?\\d+\\.\\d+\\.\\d+$/) || pkg.match(/^file:\\/\\//) || pkg.match(/^https?:\\/\\/.+\\.(tar\\.gz|tgz)$/) || pkg.match(/^git(\\+ssh|\\+http|\\+https)?:\\/\\/.+\\.git$/))) {\n      UIUtils.toast('settings.modules.wrong_package_source');\n      return;\n    }\n    $scope.modules.map(function (m) {\n      return m.disabled = true;\n    });\n    co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      var res;\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              _context.next = 2;\n              return Webmin.plugin.addPackage($scope.module_to_install);\n\n            case 2:\n              res = _context.sent;\n\n              if (res.success) {\n                $scope.modules.push({\n                  fullName: $scope.module_to_install,\n                  disabled: true,\n                  installing: true,\n                  installed: true\n                });\n                $scope.installing = true;\n                $scope.checkModulesInstallation();\n              } else {\n                $scope.modules = modulesTransform(allModules);\n                if (res.error === 1) {\n                  UIUtils.toast('settings.modules.already_install');\n                } else if (res.error === 2) {\n                  UIUtils.toast('settings.modules.path_does_not_exist');\n                } else {\n                  UIUtils.toast('settings.modules.unknown_error');\n                }\n              }\n\n            case 4:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n\n  $scope.checkModulesInstallation = function () {\n    interval = $interval(function () {\n      Webmin.plugin.allModules().then(function (modules) {\n        var initialModulesNames = _.pluck(allModules, 'name');\n        var newModulesNames = _.pluck(modules, 'name');\n        var added = _.difference(newModulesNames, initialModulesNames);\n        var removed = _.difference(initialModulesNames, newModulesNames);\n        if (added.length || removed.length) {\n          var _iteratorNormalCompletion = true;\n          var _didIteratorError = false;\n          var _iteratorError = undefined;\n\n          try {\n            for (var _iterator = added[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n              var addedName = _step.value;\n\n              UIUtils.toastRaw('Installed module \\'' + addedName + '\\'');\n            }\n          } catch (err) {\n            _didIteratorError = true;\n            _iteratorError = err;\n          } finally {\n            try {\n              if (!_iteratorNormalCompletion && _iterator.return) {\n                _iterator.return();\n              }\n            } finally {\n              if (_didIteratorError) {\n                throw _iteratorError;\n              }\n            }\n          }\n\n          var _iteratorNormalCompletion2 = true;\n          var _didIteratorError2 = false;\n          var _iteratorError2 = undefined;\n\n          try {\n            for (var _iterator2 = removed[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n              var removedName = _step2.value;\n\n              UIUtils.toastRaw('Removed module \\'' + removedName + '\\'');\n            }\n          } catch (err) {\n            _didIteratorError2 = true;\n            _iteratorError2 = err;\n          } finally {\n            try {\n              if (!_iteratorNormalCompletion2 && _iterator2.return) {\n                _iterator2.return();\n              }\n            } finally {\n              if (_didIteratorError2) {\n                throw _iteratorError2;\n              }\n            }\n          }\n\n          allModules = modules;\n          $scope.modules = modulesTransform(modules);\n          $scope.installing = false;\n          $interval.cancel(interval);\n          $scope.notifications.help.push({\n            icon: 'loop',\n            message: 'help.restart_required',\n            onclick: function onclick() {\n              return UIUtils.toast('help.restart_required.message');\n            }\n          });\n        }\n      });\n    }, 1500);\n  };\n\n  function modulesTransform(modules) {\n    return modules.map(function (m) {\n      return {\n        name: m.name,\n        fullName: [m.name, m.version].join('@'),\n        locked: m.locked,\n        disabled: !$scope.hasAccess || m.locked,\n        installing: false,\n        installed: true\n      };\n    });\n  }\n};\n","\"use strict\";\n\nvar co = require('co');\nvar conf = require('js/lib/conf/conf');\n\nmodule.exports = function ($scope, $http, $state, Webmin, UIUtils, netinterfaces, firstConf) {\n\n  var autoconf = netinterfaces.auto;\n\n  $scope.autoconfig = function () {\n    $scope.$parent.conf.local_ipv4 = autoconf.local.ipv4 || '';\n    $scope.$parent.conf.local_ipv6 = autoconf.local.ipv6 || '';\n    $scope.$parent.conf.remote_ipv4 = autoconf.remote.ipv4 || '';\n    $scope.$parent.conf.remote_ipv6 = autoconf.remote.ipv6 || '';\n    $scope.$parent.conf.lport = autoconf.local.port || $scope.$parent.conf.lport;\n    $scope.$parent.conf.rport = autoconf.remote.port || $scope.$parent.conf.rport;\n    $scope.$parent.conf.upnp = autoconf.remote.upnp || $scope.$parent.conf.upnp;\n    $scope.$parent.conf.dns = autoconf.remote.dns || $scope.$parent.conf.dns;\n\n    if (conf.dev_autoconf && firstConf) {\n      $state.go('configure.create.root');\n    }\n  };\n\n  $scope.local_neti = toArrayOfAddresses(netinterfaces.local);\n  $scope.remote_neti = toArrayOfAddresses(netinterfaces.remote);\n\n  $scope.$parent.conf = $scope.$parent.conf || {};\n  $scope.$parent.conf.ws2p = netinterfaces.conf.ws2p;\n  $scope.$parent.conf.proxiesConf = netinterfaces.conf.proxiesConf;\n  $scope.$parent.conf.bma = !netinterfaces.conf.nobma;\n  $scope.$parent.conf.local_ipv4 = netinterfaces.conf.local.ipv4;\n  $scope.$parent.conf.local_ipv6 = netinterfaces.conf.local.ipv6;\n  $scope.$parent.conf.remote_ipv4 = netinterfaces.conf.remote.ipv4;\n  $scope.$parent.conf.remote_ipv6 = netinterfaces.conf.remote.ipv6;\n  $scope.$parent.conf.lport = netinterfaces.conf.local.port;\n  $scope.$parent.conf.rport = netinterfaces.conf.remote.port;\n  $scope.$parent.conf.upnp = netinterfaces.conf.remote.upnp;\n  $scope.$parent.conf.dns = netinterfaces.conf.remote.dns;\n\n  UIUtils.enableInputs();\n\n  if (firstConf) {\n    $scope.$parent.conf.lport = conf.default_port;\n    $scope.$parent.conf.rport = conf.default_port;\n    // Trigger autoconfig\n    $scope.autoconfig();\n  }\n\n  $scope.saveConf = function () {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n      return regeneratorRuntime.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              $scope.$parent.conf.remote_ipv6 = $scope.$parent.conf.local_ipv6;\n              _context.next = 3;\n              return Webmin.server.netConf({\n                conf: $scope.$parent.conf\n              });\n\n            case 3:\n              UIUtils.toast('settings.network.saved');\n\n            case 4:\n            case 'end':\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n  };\n};\n\nfunction toArrayOfAddresses(netiScope) {\n  return netiScope.reduce(function (arr, neti) {\n    return arr.concat(neti.addresses.map(function (addr) {\n      return {\n        name: [neti.name, addr.address].join(' '),\n        addr: addr.address,\n        family: addr.family\n      };\n    }));\n  }, []);\n}\n","'use strict';\n\nmodule.exports = function () {\n\n  window.uiModules = {};\n\n  require('./services/webmin')(angular);\n\n  var duniterApp = angular.module('duniterUIApp', ['ui.router', 'homeControllers', 'pascalprecht.translate']);\n\n  duniterApp.config(['$compileProvider', function ($compileProvider) {\n    return $compileProvider.aHrefSanitizationWhitelist(/^\\s*(https?|data):/);\n  }]);\n\n  require('./lib/conf/translate')(duniterApp);\n  require('./lib/conf/routes')(duniterApp);\n  require('js/services/datetime')(duniterApp);\n  require('js/services/ui_utils')(duniterApp);\n  require('js/services/graphs')(duniterApp);\n  require('js/services/pubkeyGenerator')(duniterApp);\n  require('js/services/importer')(duniterApp);\n  require('js/services/base58')(duniterApp);\n\n  window.duniterChildCallback = function (gui) {\n    window.gui = gui;\n  };\n\n  window.onresize = function () {\n    window.onResize && window.onResize(window);\n  };\n\n  window.openWindow = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      var innerHeight = options.height || 375;\n      var innerWidth = options.width || 500;\n      window.open(url, '_blank ', ['top=' + (window.screenTop + (options.top || 200)), 'left=' + (window.screenLeft + (options.left || 200)), 'height=' + (innerHeight + 8), 'width=' + (innerWidth + 16), 'menubar=no', 'status=no'].join(','));\n    }\n  };\n\n  window.openNewTab = function openWindow(url, options, callback) {\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      window.open(url, '_blank ');\n    }\n  };\n\n  window.openModule = function openWindow(path, options, callback) {\n    var url = window.location.origin + '/modules' + path;\n    if (window.gui) {\n      // Duniter Desktop\n      window.gui.Window.open(url, options, callback);\n    } else {\n      // Browser\n      window.open(url, '_blank ');\n    }\n  };\n\n  window.openExternal = function openExternal(url) {\n    if (window.gui) {\n      window.gui.Shell.openExternal(url);\n    } else {\n      window.open(url, '_blank');\n    }\n  };\n\n  var homeControllers = angular.module('homeControllers', ['duniter.services.webmin', 'ngFileUpload']);\n\n  homeControllers.controller('IndexController', require('./controllers/IndexController'));\n  homeControllers.controller('AboutController', require('./controllers/AboutController'));\n  homeControllers.controller('IdentityController', require('./controllers/init/create/IdentityController'));\n  homeControllers.controller('ParametersController', require('./controllers/init/create/ParametersController'));\n  homeControllers.controller('RootBlockController', require('./controllers/init/create/RootBlockController'));\n  homeControllers.controller('SyncController', require('./controllers/init/sync/SyncController'));\n  homeControllers.controller('MainController', require('./controllers/main/MainController'));\n  homeControllers.controller('HomeController', require('./controllers/main/home/HomeController'));\n  homeControllers.controller('OverviewController', require('./controllers/main/home/tabs/OverviewController'));\n  homeControllers.controller('HomeNetworkController', require('./controllers/main/home/tabs/HomeNetworkController'));\n  homeControllers.controller('HomeConnectionsController', require('./controllers/main/home/tabs/HomeConnectionsController'));\n  homeControllers.controller('LogsController', require('./controllers/main/settings/tabs/LogsController'));\n  homeControllers.controller('LogsSettingsController', require('./controllers/main/settings/tabs/LogsSettingsController'));\n  homeControllers.controller('NetworkController', require('./controllers/main/settings/tabs/NetworkController'));\n  homeControllers.controller('SettingsController', require('./controllers/main/settings/SettingsController'));\n  homeControllers.controller('DataController', require('./controllers/main/settings/tabs/DataController'));\n  homeControllers.controller('BackupController', require('./controllers/main/settings/tabs/BackupController'));\n  homeControllers.controller('CPUController', require('./controllers/main/settings/tabs/CPUController'));\n  homeControllers.controller('CurrencyController', require('./controllers/main/settings/tabs/CurrencyController'));\n  homeControllers.controller('KeyController', require('./controllers/main/settings/tabs/KeyController'));\n  homeControllers.controller('ModulesController', require('./controllers/main/settings/tabs/ModulesController'));\n  homeControllers.controller('GraphsController', require('./controllers/main/graphs/GraphsController'));\n  homeControllers.controller('GraphsBlockchainController', require('./controllers/main/graphs/GraphsBlockchainController'));\n};\n","\"use strict\";\n\nmodule.exports = {\n\n  init: function init() {\n\n    // Hack since Node v5\n    try {\n      window.jade = require('jade' + '/' + 'runtime');\n    } catch (e) {}\n\n    console.log('Configuring Angular app...');\n\n    require('./app.config')();\n\n    console.log('App initialized.');\n  }\n};\n","\"use strict\";\n\nmodule.exports = {\n  server: \"\", // Empty server will use the browser current host\n  port: \"\", // Empty port will use the browser current port\n  default_port: 9220,\n  dev_autoconf: false,\n  api_timeout: 10000 // 10 sec timeout\n};\n","module.exports = {\n  \"top.menu.overview\": \"Home\",\n  \"top.menu.data\": \"Explore\",\n  \"top.menu.settings\": \"Settings\",\n  \"top.menu.wallet\": \"Wallet\",\n  \"general.server.started\": \"Server started\",\n  \"general.server.stopped\": \"Server stopped\",\n  \"general.choose_option\": \"Choose your option\",\n  \"general.network.reconf_ok\": \"Reconfiguration success\",\n  \"global.button.validate\": \"Validate\",\n  \"global.button.start\": \"Start\",\n  \"err.unknown\": \"Unknown error\",\n  \"err.connection\": \"Could not connect to node\",\n  \"err.back_index\": \"Get back to previous screen\",\n  \"err.sync.interrupted\": \"Sync interrupted because the following error occured:\",\n  \"index.message.loading\": \"Loading...\",\n  \"crypto.secret_key\": \"Secret key\",\n  \"index.message.current_block\": \"Current block {{ number }}\",\n  \"configuration.init.choose.title\": \"Initialization\",\n  \"configuration.init.choose.message\": \"Your software has to be initialized. You may either connect to an existing one or restore a backup file.\",\n  \"configuration.init.choose.create\": \"Create a new currency\",\n  \"configuration.init.choose.connect\": \"Connect to an existing currency\",\n  \"configuration.init.choose.import\": \"Import from a backup file\",\n  \"configuration.create_currency.cancel\": \"Cancel & go home\",\n  \"configuration.create_uid.title\": \"Your identity\",\n  \"configuration.create_uid.message\": \"As a first step, you need to define your personal, unique identity.<br/>The following informations will be <strong>definitive</strong> for this currency: please choose them carefully.\",\n  \"configuration.create_uid.uid.tooltip\": \"The name you will be known as.\",\n  \"configuration.create_uid.entropy.tooltip\": \"An entropy source to make your key unique: an e-mail, a phone n°, ...\",\n  \"configuration.create_uid.password.tooltip\": \"A secret password to protect your key.\",\n  \"configuration.create_uid.create_button\": \"Continue\",\n  \"configuration.create_uid.preview_button\": \"Preview pubkey\",\n  \"configuration.create_uid.nrp_algo_choose\": \"NRP algorithm\",\n  \"configuration.create_uid.nrp_algo_choose_1\": \"N = 4096 ; r = 16 ; p = 1\",\n  \"configuration.create_uid.modal_title\": \"Identity confirmation\",\n  \"configuration.create_uid.modal_message\": \"This identity will be definitive for this currency: you will be known by your User ID and will be able to access your account using your Secret Key and Password values.\",\n  \"configuration.create_uid.modal_agree\": \"Agree\",\n  \"configuration.create_uid.modal_disagree\": \"Disagree\",\n  \"configuration.create_uid.modal_preview_title\": \"Preview of pubkey\",\n  \"configuration.create_uid.modal_preview_ok\": \"OK\",\n  \"configuration.ws2p.private\": \"Enable WS2P Private access\",\n  \"configuration.ws2p.private.desc\": \"<b>Strongly recommanded</b>. <i>No configuration required</i>. Private WS2P access allows your node to connect through P2P to other nodes without exposing itself to the Internet. This is the most secure and efficient way to connect your node to the network.\",\n  \"configuration.ws2p.private.connections.title\": \"Connections\",\n  \"configuration.ws2p.private.connections.message\": \"You can limit the number of active private connections.\",\n  \"configuration.ws2p.private.max\": \"Maximum\",\n  \"configuration.proxiesConf.title\": \"Setting up a Proxy\",\n  \"configuration.proxiesConf.proxySocksAddress\": \"Classical socks proxy\",\n  \"configuration.proxiesConf.torMessage\": \"<b>Warning :</b> If you want to use a socks proxy to redirect all outgoing traffic via <b>Tor</b>, you must use the <i>\\\"Tor socks proxy\\\"</i> field :\",\n  \"configuration.proxiesConf.proxyTorAddress\": \"Tor socks proxy\",\n  \"configuration.proxiesConf.clear\": \"clear\",\n  \"configuration.proxiesConf.tor\": \"tor\",\n  \"configuration.proxiesConf.none\": \"none\",\n  \"configuration.proxiesConf.reachingClearEp\": \"How do you want to reach the classic nodes ? (clear endpoints)\",\n  \"configuration.ws2p.public\": \"Enable WS2P Public access\",\n  \"configuration.ws2p.public.desc\": \"<b>Recommanded</b>. Public WS2P access allows your node to be publicly visible to communicate through WS2P. Considering that most of the nodes will communicate through WS2P access, it is important to have a maximum number of nodes with Public WS2P access enabled to have a decentralized network.\",\n  \"configuration.ws2p.public.upnp.title\": \"UPnP\",\n  \"configuration.ws2p.public.upnp.message\": \"Automated configuration. You need to have a box (router) for this to work. Typically true if you use Duniter at home.\",\n  \"configuration.ws2p.public.upnp.value\": \"Enable Public WS2P accss through UPnP\",\n  \"configuration.ws2p.public.manual.title\": \"Manual configuration\",\n  \"configuration.ws2p.public.manual.message\": \"You can also manually configure your node for Public WS2P access.\",\n  \"configuration.ws2p.public.manual.local_ipv4\": \"Private (computer)\",\n  \"configuration.ws2p.public.manual.host\": \"Public (remote host)\",\n  \"configuration.ws2p.public.manual.lport\": \"Private port\",\n  \"configuration.ws2p.public.manual.rport\": \"Public port\",\n  \"configuration.ws2p.public.manual.rpath\": \"WebSocket web path\",\n  \"configuration.ws2p.public.connections.title\": \"Connections\",\n  \"configuration.ws2p.public.connections.message\": \"You can limit the number of active public connections.\",\n  \"configuration.ws2p.public.max\": \"Maximum\",\n  \"configuration.create_network.desc\": \"<b>Deprecated</b>. BMA is the legacy communication interface for Duniter nodes. It is being deprecated. Yet, you can activate it if you know what you are doing.\",\n  \"configuration.create_network.title\": \"Network\",\n  \"configuration.create_network.message\": \"Duniter is a P2P software and needs bidirectionnal access to the network. Please chose carefully the following parameters.\",\n  \"configuration.create_network.none\": \"None\",\n  \"configuration.create_network.ipv4.title\": \"IPv4\",\n  \"configuration.create_network.ipv6.title\": \"IPv6\",\n  \"configuration.create_network.ipv4.message\": \"For compatibilty reasons, you may prefer to use classic IPv4 interfaces. The configuration is more complicated.\",\n  \"configuration.create_network.local_ipv4\": \"Private (computer)\",\n  \"configuration.create_network.remote_ipv4\": \"Public (box/router)\",\n  \"configuration.create_network.local_ipv6\": \"IPv6\",\n  \"configuration.create_network.lport\": \"Local port\",\n  \"configuration.create_network.rport\": \"Remote port\",\n  \"configuration.create_network.port.title\": \"Ports\",\n  \"configuration.create_network.ipv6.message\": \"IPv6 gives your computer a unique, direct address to your node over the Internet. This is the <b>recommended way</b> to connect your node to the network.\",\n  \"configuration.create_network.port.message\": \"Wether you use IPv6 or IPv4, Duniter node will use this port number for connection to the network. If you use IPv6, local and remote port should equal each other.\",\n  \"configuration.create_network.dns.title\": \"Domain name\",\n  \"configuration.create_network.dns\": \"Domain name\",\n  \"configuration.create_network.dns.message\": \"IPv6 (AAAA) and IPv4 (A) DNS records will be used.\",\n  \"configuration.create_network.upnp\": \"Use UPnP\",\n  \"configuration.create_network.bma\": \"Enable BMA access\",\n  \"configuration.create_network.button.validate\": \"Continue\",\n  \"configuration.create_network.button.autoconf\": \"Automatic configuration\",\n  \"configuration.create_parameters.title\": \"Currency\",\n  \"configuration.create_parameters.message\": \"Initial parameters of the currency. It should be carefully chosen, as these parameters never change once the currency is started.\",\n  \"configuration.create_parameters.currency.title\": \"Money units\",\n  \"configuration.create_parameters.currency.message\": \"Give a name to your currency. The 3 following parameters configure the way new money units are created.\",\n  \"configuration.create_parameters.currency\": \"Currency name\",\n  \"configuration.create_parameters.c\": \"c\",\n  \"configuration.create_parameters.dt\": \"UD period\",\n  \"configuration.create_parameters.ud0\": \"UD(0)\",\n  \"configuration.create_parameters.button.validate\": \"Continue\",\n  \"configuration.create_parameters.wot.title\": \"Web of Trust\",\n  \"configuration.create_parameters.wot.message\": \"The following parameters deal with identities and their links gathered in the Web of Trust concept.\",\n  \"configuration.create_parameters.sigStock\": \"Max cert stock\",\n  \"configuration.create_parameters.sigPeriod\": \"Delay between 2 certs\",\n  \"configuration.create_parameters.sigValidity\": \"Cert expiry delay\",\n  \"configuration.create_parameters.msValidity\": \"Membership expiry delay\",\n  \"configuration.create_parameters.sigQty\": \"Min required certs\",\n  \"configuration.create_parameters.sigWindow\": \"Cert time window\",\n  \"configuration.create_parameters.stepMax\": \"Max distance\",\n  \"configuration.create_parameters.xpercent\": \"Percent of distance\",\n  \"configuration.create_parameters.blockchain.title\": \"Blockchain\",\n  \"configuration.create_parameters.blockchain.message\": \"The technical support of money and identities is the blockchain. It also has some parameters driving its behavior.\",\n  \"configuration.create_parameters.medianTimeBlocks\": \"Blocks count\",\n  \"configuration.create_parameters.avgGenTime\": \"Block gen. duration\",\n  \"configuration.create_parameters.dtDiffEval\": \"Blocks count for diff.\",\n  \"configuration.create_parameters.blocksRot\": \"Personal diff. blocks\",\n  \"configuration.create_parameters.percentRot\": \"Personal diff. rotation\",\n  \"configuration.create_root.title\": \"Root block creation\",\n  \"configuration.create_root.message\": \"This is the final step to create the new currency! The root block or <i>genesis</i> will include the first members and define the currency parameters. Once generated and submitted, the blockchain will be started.\",\n  \"configuration.create_root.button.start\": \"Start HTTP\",\n  \"configuration.create_root.button.stop\": \"Stop HTTP\",\n  \"configuration.create_root.button.generate\": \"Give a try\",\n  \"configuration.create_root.need_a_try\": \"You need to generate a first block with the « Give a try » button. Start HTTP server to do so.\",\n  \"configuration.create_root.button.accept_and_send\": \"Accept this block and start currency\",\n  \"configuration.create_root.button.cancel\": \"Cancel creation and go to home screen\",\n  \"configuration.create_root.host_listening\": \"Host listening at:\",\n  \"configuration.create_uid.pubkey_preview\": \"Public key preview\",\n  \"home.ws2p_peers\": \"Connected peers\",\n  \"home.current.number\": \"Current block #\",\n  \"home.current.membersCount\": \"Members count\",\n  \"home.current.medianTime\": \"Median time\",\n  \"home.current.powMin\": \"Common difficulty level\",\n  \"home.current.mmass\": \"Monetary mass\",\n  \"home.pulling.network\": \"Network\",\n  \"home.pulling.peer\": \"Peer\",\n  \"home.pulling.state.unkown\": \"Next sync in few minutes\",\n  \"home.pulling.state.synced\": \"Synced\",\n  \"home.pulling.state.syncing\": \"Syncing...\",\n  \"home.pow.unit\": \"blocks made by this key (last 2 months)\",\n  \"home.pow.is_mirror\": \"This node is a mirror\",\n  \"home.pow.is_waiting\": \"Waiting for better proof conditions\",\n  \"home.tabs.overview\": \"Overview\",\n  \"home.tabs.overview.should_reconfigure\": \"Your configuration has changed and your node is no more reachable from the network. You should reconfigure it to have a functional node. If this message appears again, you should manually configure the network settings. Often, selecting only IPv6 interface (disabling IPv4) solves the problem.\",\n  \"home.tabs.network\": \"Peers\",\n  \"home.tabs.network.button.update\": \"Check peers again\",\n  \"home.tabs.connections\": \"Network\",\n  \"home.tabs.connections.title.connections\": \"WS2P Connections\",\n  \"home.tabs.connections.title.network\": \"Network view\",\n  \"home.tabs.connections.legend.title\": \"Legend\",\n  \"home.tabs.connections.legend.prefered\": \"Prefered: nodes that you prefer for outcoming connections\",\n  \"home.tabs.connections.legend.privileged\": \"Privileged: nodes that you privilege the incoming connections (= invitation)\",\n  \"home.tabs.logs\": \"Logs\",\n  \"home.tabs.logs.follow.logs\": \"Follow logs\",\n  \"home.tabs.logs.pause.logs\": \"Pause logs\",\n  \"home.tabs.logs.level.error\": \"Error\",\n  \"home.tabs.logs.level.warn\": \"Warning\",\n  \"home.tabs.logs.level.info\": \"Info\",\n  \"home.tabs.logs.level.debug\": \"Debug\",\n  \"home.tabs.logs.level.trace\": \"Trace\",\n  \"sync.title\": \"Synchronize\",\n  \"sync.message\": \"Your node will be synchronized with an existing currency: just enter technical details about a node to sync with it.\",\n  \"sync.host\": \"Host\",\n  \"sync.port\": \"Port\",\n  \"sync.check\": \"Check node\",\n  \"sync.start\": \"Synchronize with this node\",\n  \"sync.failed\": \"Synchronization failed.\",\n  \"sync.mode.simplified\": \"Simplified mode\",\n  \"sync.mode.manual\": \"Manual mode\",\n  \"sync.simplified.choose\": \"Node to connect to\",\n  \"sync.simplified.default_option\": \"Please select a node to continue\",\n  \"sync.simplified.currency\": \"Currency\",\n  \"sync.simplified.main_mirror\": \"(main mirror)\",\n  \"sync.simplified.other mirror\": \"(other mirror)\",\n  \"sync.ready.node.part1\": \"This node is available!\",\n  \"sync.ready.node.part2\": \"Click on the green button to proceed.\",\n  \"sync.started.node\": \"Synchronization started on node:\",\n  \"sync.error.unreachable.try.another.node\": \"This node is not available. Please select another one.\",\n  \"home.menu.server.stop\": \"Stop server\",\n  \"home.menu.server.start\": \"Start server\",\n  \"home.menu.server.restart\": \"Restart server\",\n  \"home.state\": \"Server:\",\n  \"home.state.started\": \"STARTED\",\n  \"home.state.stopped\": \"STOPPED\",\n  \"settings.tabs.logs\": \"Logs\",\n  \"settings.tabs.data\": \"Data\",\n  \"settings.tabs.backup\": \"Backup\",\n  \"settings.tabs.identity\": \"Crypto\",\n  \"settings.tabs.network\": \"Network\",\n  \"settings.tabs.currency\": \"Currency\",\n  \"settings.tabs.cpu\": \"CPU\",\n  \"settings.tabs.modules\": \"Modules\",\n  \"settings.data.reset.title\": \"Reset this node\",\n  \"settings.data.reset.message\": \"If you desire to reset this node's data and sync it again with the network, please select a node to sync against and validate.\",\n  \"settings.data.reset.warning\": \"This process <strong>will not</strong> reset the node identity and network settings, which will be reused.\",\n  \"settings.data.reset.peer.none_option\": \"Select a node\",\n  \"settings.data.reset.peer.label\": \"Synchronization peer\",\n  \"settings.data.reset.button\": \"Full reset of the node\",\n  \"settings.data.reset_sync.button\": \"Reset data and start sync\",\n  \"settings.logs.title\": \"Logs\",\n  \"settings.logs.consult.message\": \"Your node continually generates information messages in a log file. This information may help you understand what your node <i>is doing</i> or what it <i>has done</i> few times ago.\",\n  \"settings.logs.consult.button\": \"View real-time logs\",\n  \"settings.logs.share.message\": \"You may want to <b>share your logs</b> with other people, sometimes to get help or to add informations in a bug tracker. Clicking on below button will extract the last 2000 lines of your logs and push it on the web, returning you a link to be shared with whoever you want.\",\n  \"settings.logs.share.button\": \"Create a web link to your logs\",\n  \"settings.logs.share.generating\": \"Generating your link...\",\n  \"settings.logs.share.error\": \"An error occurred during the generation of your link:\",\n  \"settings.data.backup.title\": \"Backup\",\n  \"settings.data.backup.message\": \"You can create backups of your node's data and restore them using the buttons below.\",\n  \"settings.data.backup.warning\": \"<b>Export</b> will only backup your node's data, which <i>excludes your secret key and configuration details</i>.<br><b>Import</b> will reset your node's data by applying the backup. Your secret keys and configuration remains untouched.\",\n  \"settings.data.backup.button.export\": \"Create a data backup\",\n  \"settings.data.backup.button.import\": \"Import a data backup\",\n  \"settings.data.backup.importing\": \"Importing data...\",\n  \"settings.data.backup.imported\": \"Import successfull!\",\n  \"settings.network.button.validate\": \"Save and apply network settings\",\n  \"settings.network.saved\": \"Configuration saved and applied successfully\",\n  \"settings.key.title\": \"Public key of this node:\",\n  \"settings.key.button.validate\": \"Save and use this key\",\n  \"settings.key.button.change\": \"Change keyring\",\n  \"settings.key.pubkey.description\": \"This public key is the public part of your keyring, which is composed of a public key and a private key. This public key is shared with all the peers of the network and users of the currency, while your private key is secretely kept and used by this node to process operations on the network.\",\n  \"settings.data.modal_title\": \"Confirm full reset\",\n  \"settings.data.modal_message\": \"This action will completely reset the data of your node and redirect you to initial configuration screen. Do you confirm?\",\n  \"settings.data.modal_disagree\": \"No, cancel this\",\n  \"settings.data.modal_agree\": \"Yes, process the reset\",\n  \"settings.data.reset.experimental\": \"This functionality is still considered experimental. If you encounters strange behaviors, please stop the software and reset manually your node by removing all the files BUT conf.json under ~/.config/duniter/duniter_default, and restart the software.\",\n  \"settings.cpu.title\": \"CPU settings\",\n  \"settings.cpu.message\": \"You can adjust the CPU power dedicated to proof-of-work computation. The higher the value, the faster is your node, the higher the chances you have to compute a block early.\",\n  \"settings.cpu.warning\": \"<b>Up to 8 cores</b> of your machine are dedicated to proof-of-work computation currently. Also, setting CPU to 100% does not mean Duniter will use 100% of each core, but will use as much as possible each of them, as a core is also shared with other programs.\",\n  \"settings.cpu.range\": \"% of CPU power core dedicated to proof-of-work :\",\n  \"settings.cpu.power\": \"Core power:\",\n  \"settings.cpu.saved\": \"CPU settings saved.\",\n  \"settings.modules.title\": \"Modules\",\n  \"settings.modules.message\": \"You can install extensions to your Duniter node to provide new features. These extensions are called <b>Duniter modules</b>.\",\n  \"settings.modules.no_access\": \"This instance does not have enough system rights to install new modules on disk.\",\n  \"settings.modules.install\": \"Install this module\",\n  \"settings.modules.already_install\": \"Module already installed\",\n  \"settings.modules.path_does_not_exist\": \"Path does not lead to a module\",\n  \"settings.modules.wrong_package_source\": \"Package URL has wrong format\",\n  \"settings.modules.warning\": \"Please be <b>VERY CAREFUL</b> when installing a module: you should <b>check that it is not a virus</b>, nor wants to steal your informations. <b>A MODULE HAS A LOT OF POWER</b> and can access/modify any part of your system (including your private key), in the limit of the user's access rights.\",\n  \"settings.modules.warning_light\": \"WARNING! (click to see more)\",\n  \"settings.modules.warning_close\": \"Close this message\",\n  \"settings.modules.on\": \"On\",\n  \"settings.modules.off\": \"Off\",\n  \"settings.modules.installing\": \"Installation...\",\n  \"settings.modules.installing_warn\": \"Please <b>do not close Duniter</b> during this process!\",\n  \"settings.modules.uninstalling\": \"Removal...\",\n  \"graphs.tabs.blockchain\": \"Blockchain\",\n  \"graphs.tabs.currency\": \"Currency\",\n  \"graphs.blockchain.range\": \"Graphs for the last X blocks: (please choose X value)\",\n  \"graphs.blockchain.with.time\": \"Time variations graph\",\n  \"graphs.blockchain.with.speed\": \"Writing speed graph\",\n  \"graphs.blockchain.with.difficulty\": \"Difficulty graph\",\n  \"help.about_duniter\": \"About Duniter\",\n  \"help.about_duniter.title\": \"About\",\n  \"help.about_duniter.subtitle\": \"Duniter Desktop\",\n  \"help.about_duniter.version\": \"Version: \",\n  \"help.about_duniter.forum\": \"Forum\",\n  \"help.about_duniter.chat\": \"Chat\",\n  \"help.new_version_available\": \"New version available\",\n  \"help.restart_required\": \"Restart to apply changes\",\n  \"help.restart_required.message\": \"Please close Duniter and restart it.\"\n}\n;","'use strict';\n\nvar co = require('co');\nvar _ = require('underscore');\n\nmodule.exports = function (app) {\n\n  app.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {\n\n    // States\n    $stateProvider.state('index', {\n      url: '/',\n      template: require('views/index'),\n      resolve: {\n        ws: function ws(Webmin) {\n          return Webmin.ws();\n        },\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'IndexController'\n    }).state('about', {\n      url: '/about',\n      template: require('views/about'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        },\n        version: function version(summary) {\n          return summary && 'v' + summary.version || 'unknown version';\n        }\n      },\n      controller: 'AboutController'\n    }).state('configure', {\n      abstract: true,\n      url: '/configure',\n      template: require('views/init/layout'),\n      controller: function controller($scope) {\n        $scope.conf = {\n          currency: 'super_currency',\n          c: 0.007376575,\n          dt: 30.4375 * 24 * 3600,\n          ud0: 100,\n          stepMax: 3,\n          sigDelay: 3600 * 24 * 365 * 5,\n          sigPeriod: 0, // Instant\n          sigStock: 40,\n          sigWindow: 3600 * 24 * 14, // 2 weeks\n          sigValidity: 3600 * 24 * 365,\n          msValidity: 3600 * 24 * 365,\n          sigQty: 0,\n          xpercent: 0.9,\n          percentRot: 0.66,\n          blocksRot: 20,\n          avgGenTime: 16 * 60,\n          dtDiffEval: 10,\n          medianTimeBlocks: 20\n        };\n      }\n    }).state('configure.choose', {\n      url: '/choose',\n      template: require('views/init/choose'),\n      controller: function controller($scope, Importer) {\n        Importer($scope);\n      }\n    }).state('configure.create', {\n      url: '/create',\n      template: '<div class=\"ui-scrollable\" ui-view=\"\"></div>'\n    }).state('configure.create.uid', {\n      url: '/create/uid',\n      template: require('views/init/create/create_uid'),\n      controller: 'IdentityController'\n    }).state('configure.create.network', {\n      url: '/create/network',\n      template: require('views/init/create/create_network'),\n      resolve: {\n        netinterfaces: function netinterfaces(Webmin) {\n          return resolveNetworkAutoConf(Webmin);\n        },\n        firstConf: function firstConf() {\n          return true;\n        }\n      },\n      controller: 'NetworkController'\n    }).state('configure.create.parameters', {\n      url: '/create/parameters',\n      template: require('views/init/create/create_parameters'),\n      controller: 'ParametersController'\n    }).state('configure.create.root', {\n      url: '/create/root',\n      template: require('views/init/create/create_root'),\n      controller: 'RootBlockController'\n    }).state('sync', {\n      url: '/sync?host=&port=&sync=&to=',\n      template: require('views/init/sync/sync'),\n      controller: 'SyncController'\n    }).state('main', {\n      abstract: true,\n      url: '/main',\n      template: require('views/main/main'),\n      resolve: {\n        ws: function ws(Webmin) {\n          return Webmin.ws();\n        },\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        },\n        uiModules: function uiModules(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n            var modules, i, _module, injection, script;\n\n            return regeneratorRuntime.wrap(function _callee$(_context) {\n              while (1) {\n                switch (_context.prev = _context.next) {\n                  case 0:\n                    _context.next = 2;\n                    return Webmin.plugin.uiModules();\n\n                  case 2:\n                    modules = _context.sent;\n                    i = 0;\n\n                  case 4:\n                    if (!(i < modules.length)) {\n                      _context.next = 16;\n                      break;\n                    }\n\n                    _module = modules[i];\n                    _context.next = 8;\n                    return Webmin.plugin.uiGetMenuInjection(_module);\n\n                  case 8:\n                    injection = _context.sent;\n                    script = document.createElement(\"script\");\n\n                    script.type = \"text/javascript\";\n                    script.text = \";\" + injection.menu;\n                    document.body.appendChild(script);\n\n                  case 13:\n                    i++;\n                    _context.next = 4;\n                    break;\n\n                  case 16:\n                    return _context.abrupt('return', modules);\n\n                  case 17:\n                  case 'end':\n                    return _context.stop();\n                }\n              }\n            }, _callee, this);\n          }));\n        }\n      },\n      controller: 'MainController'\n    }).state('main.home', {\n      abstract: true,\n      url: '/home',\n      template: require('views/main/home/home'),\n      controller: 'HomeController'\n    }).state('main.home.overview', {\n      url: '/overview',\n      template: require('views/main/home/tabs/overview'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'OverviewController'\n    }).state('main.home.network', {\n      url: '/network',\n      template: require('views/main/home/tabs/network'),\n      resolve: {\n        peers: function peers(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n            return regeneratorRuntime.wrap(function _callee2$(_context2) {\n              while (1) {\n                switch (_context2.prev = _context2.next) {\n                  case 0:\n                    return _context2.abrupt('return', Webmin.network.peers());\n\n                  case 1:\n                  case 'end':\n                    return _context2.stop();\n                }\n              }\n            }, _callee2, this);\n          }));\n        }\n      },\n      controller: 'HomeNetworkController'\n    }).state('main.home.connections', {\n      url: '/connections',\n      template: require('views/main/home/tabs/connections'),\n      resolve: {\n        conf: function conf(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {\n            return regeneratorRuntime.wrap(function _callee3$(_context3) {\n              while (1) {\n                switch (_context3.prev = _context3.next) {\n                  case 0:\n                    return _context3.abrupt('return', Webmin.network.ws2p.conf());\n\n                  case 1:\n                  case 'end':\n                    return _context3.stop();\n                }\n              }\n            }, _callee3, this);\n          }));\n        },\n        info: function info(Webmin, conf) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {\n            return regeneratorRuntime.wrap(function _callee4$(_context4) {\n              while (1) {\n                switch (_context4.prev = _context4.next) {\n                  case 0:\n                    return _context4.abrupt('return', Webmin.network.ws2p.info());\n\n                  case 1:\n                  case 'end':\n                    return _context4.stop();\n                }\n              }\n            }, _callee4, this);\n          }));\n        },\n        heads: function heads(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {\n            return regeneratorRuntime.wrap(function _callee5$(_context5) {\n              while (1) {\n                switch (_context5.prev = _context5.next) {\n                  case 0:\n                    return _context5.abrupt('return', Webmin.network.ws2p.heads());\n\n                  case 1:\n                  case 'end':\n                    return _context5.stop();\n                }\n              }\n            }, _callee5, this);\n          }));\n        }\n      },\n      controller: 'HomeConnectionsController'\n    }).state('main.settings', {\n      abstract: true,\n      url: '/settings',\n      template: require('views/main/settings/settings'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'SettingsController'\n    }).state('main.settings.data', {\n      url: '/data',\n      template: require('views/main/settings/tabs/data'),\n      resolve: {\n        peers: function peers(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {\n            var self, res;\n            return regeneratorRuntime.wrap(function _callee6$(_context6) {\n              while (1) {\n                switch (_context6.prev = _context6.next) {\n                  case 0:\n                    _context6.prev = 0;\n                    _context6.next = 3;\n                    return Webmin.network.selfPeer();\n\n                  case 3:\n                    self = _context6.sent;\n                    _context6.next = 6;\n                    return Webmin.network.peers();\n\n                  case 6:\n                    res = _context6.sent;\n                    return _context6.abrupt('return', _.filter(res.peers, function (p) {\n                      return p.pubkey != self.pubkey && p.status == 'UP';\n                    }));\n\n                  case 10:\n                    _context6.prev = 10;\n                    _context6.t0 = _context6['catch'](0);\n\n                    console.error(_context6.t0);\n                    return _context6.abrupt('return', []);\n\n                  case 14:\n                  case 'end':\n                    return _context6.stop();\n                }\n              }\n            }, _callee6, this, [[0, 10]]);\n          }));\n        }\n      },\n      controller: 'DataController'\n    }).state('main.settings.logs', {\n      url: '/logs',\n      template: require('views/main/settings/tabs/logs'),\n      controller: 'LogsSettingsController'\n    }).state('main.settings.backup', {\n      url: '/backup',\n      template: require('views/main/settings/tabs/backup'),\n      controller: 'BackupController'\n    }).state('main.settings.cpu', {\n      url: '/cpu',\n      template: require('views/main/settings/tabs/cpu'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        }\n      },\n      controller: 'CPUController'\n    }).state('main.settings.modules', {\n      url: '/modules',\n      template: require('views/main/settings/tabs/modules'),\n      resolve: {\n        summary: function summary(Webmin) {\n          return Webmin.summary();\n        },\n        hasAccess: function hasAccess(Webmin) {\n          return Webmin.plugin.checkAccess();\n        },\n        allModules: function allModules(Webmin) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() {\n            var modules;\n            return regeneratorRuntime.wrap(function _callee7$(_context7) {\n              while (1) {\n                switch (_context7.prev = _context7.next) {\n                  case 0:\n                    _context7.next = 2;\n                    return Webmin.plugin.allModules();\n\n                  case 2:\n                    modules = _context7.sent;\n                    return _context7.abrupt('return', modules);\n\n                  case 4:\n                  case 'end':\n                    return _context7.stop();\n                }\n              }\n            }, _callee7, this);\n          }));\n        }\n      },\n      controller: 'ModulesController'\n    }).state('main.settings.crypto', {\n      url: '/crypto',\n      template: require('views/main/settings/tabs/crypto'),\n      controller: 'KeyController'\n    }).state('main.settings.network', {\n      url: '/network',\n      resolve: {\n        netinterfaces: function netinterfaces(Webmin) {\n          return resolveNetworkAutoConf(Webmin);\n        },\n        firstConf: function firstConf() {\n          return false;\n        }\n      },\n      template: require('views/main/settings/tabs/network'),\n      controller: 'NetworkController'\n    }).state('main.settings.currency', {\n      url: '/currency',\n      resolve: {\n        conf: function conf(summary) {\n          return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() {\n            return regeneratorRuntime.wrap(function _callee8$(_context8) {\n              while (1) {\n                switch (_context8.prev = _context8.next) {\n                  case 0:\n                    return _context8.abrupt('return', summary.parameters);\n\n                  case 1:\n                  case 'end':\n                    return _context8.stop();\n                }\n              }\n            }, _callee8, this);\n          }));\n        }\n      },\n      template: require('views/main/settings/tabs/currency'),\n      controller: 'CurrencyController'\n    }).state('main.graphs', {\n      abstract: true,\n      url: '/graphs',\n      template: require('views/main/graphs/graphs'),\n      controller: 'GraphsController'\n    }).state('main.graphs.blockchain', {\n      url: '/blockchain',\n      template: require('views/main/graphs/blockchain'),\n      controller: 'GraphsBlockchainController'\n    }).\n\n    //state('graphs.crypto', {\n    //  url: '/crypto',\n    //  template: require('views/graphs/crypto'),\n    //  controller: 'KeyController'\n    //}).\n    //\n    //state('graphs.network', {\n    //  url: '/network',\n    //  resolve: {\n    //    netinterfaces: (Webmin) => resolveNetworkAutoConf(Webmin),\n    //    firstConf: () => false\n    //  },\n    //  template: require('views/graphs/network'),\n    //  controller: 'NetworkController'\n    //}).\n    //\n    //state('graphs.currency', {\n    //  url: '/currency',\n    //  resolve: {\n    //    conf: (bmapi) => co(function *() {\n    //      return bmapi.currency.parameters();\n    //    })\n    //  },\n    //  template: require('views/graphs/currency'),\n    //  controller: 'CurrencyController'\n    //}).\n\n    state('logs', {\n      url: '/logs',\n      template: require('views/logs'),\n      resolve: {\n        ws: function ws(Webmin) {\n          return Webmin.ws();\n        }\n      },\n      controller: 'LogsController'\n    }).state('error', {\n      url: '/error\\?err',\n      template: require('views/error'),\n      controller: function controller($scope, $stateParams) {\n        return $scope.errorMsg = $stateParams.err || 'err.unknown';\n      }\n    });\n\n    // Default route\n    $urlRouterProvider.otherwise('/');\n  }]);\n\n  app.run(function ($rootScope, $state) {\n    $rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {\n      console.error(error);\n      $state.go('error', { err: error.message });\n    });\n  });\n\n  function resolveNetworkAutoConf(Webmin) {\n    return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee9() {\n      var netinterfaces;\n      return regeneratorRuntime.wrap(function _callee9$(_context9) {\n        while (1) {\n          switch (_context9.prev = _context9.next) {\n            case 0:\n              _context9.next = 2;\n              return Webmin.network.interfaces();\n\n            case 2:\n              netinterfaces = _context9.sent;\n              return _context9.abrupt('return', netinterfaces || { local: {}, remote: {} });\n\n            case 4:\n            case 'end':\n              return _context9.stop();\n          }\n        }\n      }, _callee9, this);\n    }));\n  }\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.config(['$translateProvider', function ($translateProvider) {\n\n    $translateProvider.translations('en', require('./i18n/en'));\n\n    // Default language\n    $translateProvider.preferredLanguage('en');\n\n    // Other parameters\n    $translateProvider.useSanitizeValueStrategy('');\n  }]);\n};\n","\"use strict\";\n\nmodule.exports = function Peer(json) {\n\n  var that = this;\n\n  var BMA_REGEXP = /^BASIC_MERKLED_API( ([a-z_][a-z0-9-_.]*))?( ([0-9.]+))?( ([0-9a-f:]+))?( ([0-9]+))$/;\n\n  Object.keys(json).forEach(function (key) {\n    that[key] = json[key];\n  });\n\n  that.endpoints = that.endpoints || [];\n  that.statusTS = that.statusTS || 0;\n\n  that.keyID = function () {\n    return that.pubkey && that.pubkey.length > 10 ? that.pubkey.substring(0, 10) : \"Unknown\";\n  };\n\n  that.copyValues = function (to) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"hash\", \"status\", \"statusTS\", \"block\", \"signature\"].forEach(function (key) {\n      to[key] = obj[key];\n    });\n  };\n\n  that.copyValuesFrom = function (from) {\n    var obj = that;\n    [\"version\", \"currency\", \"pub\", \"endpoints\", \"block\", \"signature\"].forEach(function (key) {\n      obj[key] = from[key];\n    });\n  };\n\n  that.json = function () {\n    var obj = that;\n    var json = {};\n    [\"version\", \"currency\", \"endpoints\", \"status\", \"block\", \"signature\"].forEach(function (key) {\n      json[key] = obj[key];\n    });\n    json.raw = that.getRaw();\n    json.pubkey = that.pubkey;\n    return json;\n  };\n\n  that.getBMA = function () {\n    var bma = null;\n    that.endpoints.forEach(function (ep) {\n      var matches = !bma && ep.match(BMA_REGEXP);\n      if (matches) {\n        bma = {\n          \"dns\": matches[2] || '',\n          \"ipv4\": matches[4] || '',\n          \"ipv6\": matches[6] || '',\n          \"port\": matches[8] || 9101\n        };\n      }\n    });\n    return bma || {};\n  };\n\n  that.getDns = function () {\n    var bma = that.getBMA();\n    return bma.dns ? bma.dns : null;\n  };\n\n  that.getIPv4 = function () {\n    var bma = that.getBMA();\n    return bma.ipv4 ? bma.ipv4 : null;\n  };\n\n  that.getIPv6 = function () {\n    var bma = that.getBMA();\n    return bma.ipv6 ? bma.ipv6 : null;\n  };\n\n  that.getPort = function () {\n    var bma = that.getBMA();\n    return bma.port ? bma.port : null;\n  };\n\n  that.getHost = function () {\n    var bma = that.getBMA();\n    var host = that.hasValid4(bma) ? bma.ipv4 : bma.dns ? bma.dns : bma.ipv6 ? '[' + bma.ipv6 + ']' : '';\n    return host;\n  };\n\n  that.getURL = function () {\n    var bma = that.getBMA();\n    var base = '';\n    if (bma.dns) {\n      base = bma.dns;\n    } else if (that.hasValid4(bma)) {\n      base = bma.ipv4;\n    } else if (bma.ipv6) {\n      base = '[' + bma.ipv6 + ']';\n    }\n    if (bma.port) base += ':' + bma.port;\n    return base;\n  };\n\n  that.hasValid4 = function (bma) {\n    return bma.ipv4 && !bma.ipv4.match(/^127.0/) && !bma.ipv4.match(/^192.168/) ? true : false;\n  };\n\n  that.getNamedURL = function () {\n    var bma = that.getBMA();\n    var base = that.hasValid4(bma) ? bma.ipv4 : bma.dns ? bma.dns : bma.ipv6 ? '[' + bma.ipv6 + ']' : '';\n    if (bma.port) base += ':' + bma.port;\n    return base;\n  };\n\n  that.isReachable = function () {\n    return that.getURL() ? true : false;\n  };\n};\n","\"use strict\";\n\nmodule.exports = function mobilecheck() {\n  var check = false;\n  (function (a) {\n    if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;\n  })(navigator.userAgent || navigator.vendor || window.opera);\n  return check;\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  var Base58 = {};\n\n  Base58.alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n  Base58.alphabetMap = {};\n\n  for (var i = 0; i < Base58.alphabet.length; i++) {\n    Base58.alphabetMap[Base58.alphabet.charAt(i)] = i;\n  }\n\n  Base58.encode = function (buffer) {\n    if (buffer.length === 0) return '';\n\n    var i = void 0,\n        j = void 0,\n        digits = [0];\n    for (i = 0; i < buffer.length; i++) {\n      for (j = 0; j < digits.length; j++) {\n        digits[j] <<= 8;\n      }digits[digits.length - 1] += buffer[i];\n\n      var carry = 0;\n      for (j = digits.length - 1; j >= 0; j--) {\n        digits[j] += carry;\n        carry = digits[j] / 58 | 0;\n        digits[j] %= 58;\n      }\n\n      while (carry) {\n        digits.unshift(carry);\n        carry = digits[0] / 58 | 0;\n        digits[0] %= 58;\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < buffer.length - 1 && buffer[i] == 0; i++) {\n      digits.unshift(0);\n    }return digits.map(function (digit) {\n      return Base58.alphabet[digit];\n    }).join('');\n  };\n\n  Base58.decode = function (string) {\n    if (string.length === 0) return new Uint8Array();\n\n    var input = string.split('').map(function (c) {\n      return Base58.alphabetMap[c];\n    });\n\n    var i = void 0,\n        j = void 0,\n        bytes = [0];\n    for (i = 0; i < input.length; i++) {\n      for (j = 0; j < bytes.length; j++) {\n        bytes[j] *= 58;\n      }bytes[bytes.length - 1] += input[i];\n\n      var carry = 0;\n      for (j = bytes.length - 1; j >= 0; j--) {\n        bytes[j] += carry;\n        carry = bytes[j] >> 8;\n        bytes[j] &= 0xff;\n      }\n\n      while (carry) {\n        bytes.unshift(carry);\n        carry = bytes[0] >> 8;\n        bytes[0] &= 0xff;\n      }\n    }\n\n    // deal with leading zeros\n    for (i = 0; i < input.length - 1 && input[i] == 0; i++) {\n      bytes.unshift(0);\n    }return new Uint8Array(bytes);\n  };\n\n  app.factory('Base58', function () {\n    return {\n      encode: Base58.encode,\n      decode: Base58.decode\n    };\n  });\n};\n","'use strict';\n\nvar _ = require('underscore');\nvar conf = require('../lib/conf/conf');\nvar moment = require('moment');\n\nmodule.exports = function (app) {\n\n  app.filter('mt_date', function () {\n    return function (input) {\n      if (input == null) {\n        return \"\";\n      }\n      return moment(input * 1000).format('YYYY MM DD');\n    };\n  });\n\n  app.filter('mt_time', function () {\n    return function (input) {\n      if (input == null) {\n        return \"\";\n      }\n      return moment(input * 1000).format('HH:mm:ss');\n    };\n  });\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('Graph', function () {\n    return {\n\n      speedGraph: function speedGraphs(id, offset, speeds, minSpeeds, maxSpeeds, getSeries) {\n        var xValuex = [];\n        for (var i = 0, len = speeds.length; i < len; i++) {\n          xValuex.push(i + offset);\n        }\n        $(id).highcharts({\n          chart: {\n            type: \"area\",\n            zoomType: 'x',\n            events: {\n              load: function load() {\n                getSeries(this.series);\n              }\n            }\n          },\n          title: {\n            text: 'Blocks writing speed'\n          },\n          subtitle: {\n            text: document.ontouchstart === undefined ? 'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'\n          },\n          xAxis: {\n            //categories: xValuex,\n            minRange: 3, // 10 blocks,\n            labels: {\n              formatter: function formatter() {\n                return this.value + offset;\n              }\n            }\n          },\n          yAxis: {\n            //type: 'logarithmic',\n            minorTickInterval: 1,\n            title: {\n              text: 'Blocks per hour (logarithmic scale)'\n            },\n            floor: 0,\n            min: 0\n          },\n          colors: ['#ff0000', '#7cb5ec', '#000000'],\n          legend: {\n            enabled: true\n          },\n          tooltip: {\n            shared: true,\n            crosshairs: true,\n            formatter: blockFormatter(offset)\n          },\n          plotOptions: {\n            area: {\n              fillColor: {\n                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n                stops: [[0, Highcharts.getOptions().colors[0]], [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]]\n              },\n              marker: {\n                radius: 2\n              },\n              lineWidth: 1,\n              states: {\n                hover: {\n                  lineWidth: 1\n                }\n              },\n              threshold: null\n            }\n          },\n\n          series: [{\n            type: 'line',\n            name: \"Upper limit\",\n            data: maxSpeeds\n          }, {\n            type: 'area',\n            name: \"Actual speed\",\n            data: speeds\n          }, {\n            type: 'line',\n            name: \"Lower limit\",\n            data: minSpeeds\n          }]\n        });\n      },\n\n      difficultyGraph: function difficultyGraph(id, offset, difficulties) {\n        $(id).highcharts({\n          chart: {\n            type: \"area\",\n            zoomType: 'x'\n          },\n          title: {\n            text: 'Proof-of-Work difficulty by block'\n          },\n          subtitle: {\n            text: document.ontouchstart === undefined ? 'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'\n          },\n          xAxis: {\n            minRange: 10, // 10 blocks,\n            labels: {\n              formatter: function formatter() {\n                return this.value + offset;\n              }\n            }\n          },\n          yAxis: {\n            title: {\n              text: 'Number of zeros'\n            },\n            floor: 0,\n            min: 0\n          },\n          legend: {\n            enabled: true\n          },\n          tooltip: {\n            shared: true,\n            crosshairs: true,\n            formatter: blockFormatter(offset)\n          },\n          plotOptions: {\n            area: {\n              fillColor: {\n                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n                stops: [[0, Highcharts.getOptions().colors[0]], [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]]\n              },\n              marker: {\n                radius: 2\n              },\n              lineWidth: 1,\n              states: {\n                hover: {\n                  lineWidth: 1\n                }\n              },\n              threshold: null\n            }\n          },\n\n          series: [{\n            name: 'PoW difficulty',\n            data: difficulties\n          }]\n        });\n      },\n\n      timeGraphs: function timeGraphs(id, offset, timeAccelerations, medianTimeIncrements, speeds, minSpeeds, maxSpeeds) {\n        var timesInc = [];\n        medianTimeIncrements.forEach(function (inc) {\n          timesInc.push(inc == 0 ? 1 : inc);\n        });\n        $(id).highcharts({\n          chart: {\n            // type: \"area\",\n            zoomType: 'x'\n          },\n          title: {\n            text: 'Blockchain time variations'\n          },\n          subtitle: {\n            text: document.ontouchstart === undefined ? 'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'\n          },\n          xAxis: {\n            minRange: 10, // 10 blocks,\n            labels: {\n              formatter: function formatter() {\n                return this.value + offset;\n              }\n            }\n          },\n          yAxis: {\n            //type: 'logarithmic',\n            minorTickInterval: 1,\n            title: {\n              text: 'Number of seconds (logarithmic scale)'\n            }\n          },\n          legend: {\n            enabled: true\n          },\n          tooltip: {\n            shared: true,\n            crosshairs: true,\n            formatter: blockFormatter(offset)\n          },\n          plotOptions: {\n            area: {\n              fillColor: {\n                linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },\n                stops: [[0, Highcharts.getOptions().colors[0]], [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]]\n              },\n              marker: {\n                radius: 2\n              },\n              lineWidth: 1,\n              states: {\n                hover: {\n                  lineWidth: 1\n                }\n              },\n              threshold: null\n            }\n          },\n\n          series: [{\n            name: 'Time acceleration',\n            data: timeAccelerations\n          }, {\n            name: \"Median Time variation\",\n            data: timesInc\n          }, {\n            name: \"Too high duration\",\n            data: maxSpeeds\n          }, {\n            name: \"Actual duration\",\n            data: speeds\n          }, {\n            name: \"Too low duration\",\n            data: minSpeeds\n          }]\n        });\n      }\n    };\n  });\n};\n\nfunction blockFormatter(offset) {\n  return function () {\n    var html = '<span style=\"font-size: 10px\">' + (this.x + offset) + '</span><br/>';\n    for (var i = 0, len = this.points.length; i < len; i++) {\n      var point = this.points[i];\n      var series = point.series;\n      html += '<span style=\"color:' + series.color + '\">\\u25CF</span>' + series.name + ': <b>' + point.y + '</b><br/>';\n    }\n    return html;\n  };\n}\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('Importer', function ($http, $state, $timeout, UIUtils, Upload, Webmin) {\n\n    return function ($scope) {\n\n      $scope.uploadFiles = function (file, errFiles) {\n        $scope.f = file;\n        $scope.errFile = errFiles && errFiles[0];\n        if (file) {\n          UIUtils.toast('settings.data.backup.importing');\n          file.upload = Upload.upload({\n            url: Webmin.getImportURL(),\n            data: { importData: file }\n          });\n\n          file.upload.then(function (response) {\n            $timeout(function () {\n              UIUtils.toast('settings.data.backup.imported');\n              $state.go('main.home.overview');\n              file.result = response.data;\n            });\n          }, function (response) {\n            if (response.status > 0) $scope.errorMsg = response.status + ': ' + response.data;\n          }, function (evt) {\n            file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));\n          });\n        }\n      };\n    };\n  });\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('PubkeyGenerator', function ($timeout, Webmin) {\n\n    var co = require('co');\n\n    return function ($scope) {\n\n      var concat = \"\";\n      $scope.pubkey_preview = \"\";\n      var timeout = preview();\n\n      function preview() {\n        return $timeout(function () {\n          if ($scope.$parent) {\n            var salt = $scope.$parent.conf.idty_entropy;\n            var pass = $scope.$parent.conf.idty_password;\n            var newConcat = [salt, pass].join('');\n            if (salt && pass && newConcat != concat) {\n              concat = newConcat;\n              $scope.previewPubkey(concat);\n              timeout = preview();\n            } else {\n              timeout = preview();\n            }\n          }\n        }, 100);\n      }\n\n      $scope.previewPubkey = function () {\n        return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n          var data;\n          return regeneratorRuntime.wrap(function _callee$(_context) {\n            while (1) {\n              switch (_context.prev = _context.next) {\n                case 0:\n                  _context.next = 2;\n                  return Webmin.key.preview({\n                    conf: $scope.$parent.conf\n                  });\n\n                case 2:\n                  data = _context.sent;\n\n                  $scope.pubkey_preview = data.pubkey;\n\n                case 4:\n                case 'end':\n                  return _context.stop();\n              }\n            }\n          }, _callee, this);\n        })).catch(function () {\n          return null;\n        });\n      };\n    };\n  });\n};\n","'use strict';\n\nmodule.exports = function (app) {\n\n  app.factory('UIUtils', function ($q, $translate, $state, $location) {\n    return {\n\n      translate: function translate(msg) {\n        return $q.when($translate(msg));\n      },\n\n      toastRaw: function toastRaw(msg) {\n        return Materialize.toast(msg, 4000);\n      },\n\n      toast: function toast(msg) {\n        return $q.when($translate(msg)).then(function (translated) {\n          return Materialize.toast(translated, 4000);\n        });\n      },\n\n      enableInputs: function enableInputs() {\n        return $('i.prefix, label[value!=\"\"]').addClass('active');\n      },\n\n      enableTabs: function enableTabs() {\n        var jTabs = $('ul.tabs');\n        jTabs.tabs();\n        $('ul.tabs a').click(function (e) {\n          var href = $(e.currentTarget).attr('href');\n          var state = href.slice(1);\n          $state.go(state);\n        });\n\n        var currentID = $location.path().replace(/\\//g, '.').replace(/\\./, '');\n\n        jTabs.tabs('select_tab', currentID);\n      },\n\n      changeTitle: function changeTitle(version, currency, prefix) {\n        var printCurrency = \"\";\n        if (typeof currency != \"undefined\" && currency != null) {\n          printCurrency = currency;\n          if (currency == \"g1\" || currency == \"g1-test\") {\n            printCurrency = currency = 'ğ' + currency.slice(1);\n          }\n        }\n        return document.title = typeof prefix != \"undefined\" && prefix != 1 ? 'Duniter ' + version + ' : ' + printCurrency + '-' + prefix : 'Duniter ' + version + ' : ' + printCurrency;\n      }\n    };\n  });\n};\n","'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar co = require('co');\nvar _ = require('underscore');\nvar conf = require('../lib/conf/conf');\n\nmodule.exports = function (angular) {\n\n  angular.module('duniter.services.webmin', ['ngResource']).factory('Webmin', function ($http, $q) {\n\n    function httpProtocol() {\n      return window.location.protocol + '//';\n    }\n\n    function wsProtocol() {\n      return window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n    }\n\n    function Webmin(server) {\n\n      function getResource(uri, protocol) {\n        return function (params) {\n          return $q.when(httpGet(uri, params, protocol));\n        };\n      }\n\n      function httpGet(uri, params, protocol) {\n        return Q.Promise(function (resolve, reject) {\n          var config = {\n            timeout: conf.api_timeout\n          },\n              suffix = '',\n              pkeys = [],\n              queryParams = null;\n          if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) == 'object') {\n            pkeys = _.keys(params);\n            queryParams = {};\n          }\n          pkeys.forEach(function (pkey) {\n            var prevURI = uri;\n            uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n            if (prevURI == uri) {\n              queryParams[pkey] = params[pkey];\n            }\n          });\n          config.params = queryParams;\n          $http.get((protocol || httpProtocol()) + server + uri + suffix, config).success(function (data, status, headers, config) {\n            resolve(data);\n          }).error(function (data, status, headers, config) {\n            console.log(data);\n            reject(data);\n          });\n        });\n      }\n\n      function postResource(uri) {\n        return function (data, params) {\n          return $q.when(Q.Promise(function (resolve, reject) {\n            var config = {\n              timeout: 4000\n            },\n                suffix = '',\n                pkeys = [],\n                queryParams = null;\n            if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) == 'object') {\n              pkeys = _.keys(params);\n              queryParams = {};\n            }\n            pkeys.forEach(function (pkey) {\n              var prevURI = uri;\n              uri = uri.replace(new RegExp(':' + pkey), params[pkey]);\n              if (prevURI == uri) {\n                queryParams[pkey] = params[pkey];\n              }\n            });\n            config.params = queryParams;\n            $http.post(httpProtocol() + server + uri + suffix, data, config).success(function (data, status, headers, config) {\n              resolve(data);\n            }).error(function (data, status, headers, config) {\n              reject(data);\n            });\n          }));\n        };\n      }\n\n      var wsMap = {};\n\n      function _ws(uri) {\n        var sock = wsMap[uri] || new WebSocket(uri);\n        wsMap[uri] = sock;\n        sock.onclose = function (e) {\n          console.log('close');\n          console.log(e);\n        };\n        sock.onerror = function (e) {\n          console.log('onerror');\n          console.log(e);\n        };\n        var opened = false,\n            openedCallback = void 0;\n        sock.onopen = function () {\n          opened = true;\n          openedCallback && openedCallback();\n        };\n        var listener = void 0,\n            messageType = void 0;\n        sock.onmessage = function (e) {\n          var res = JSON.parse(e.data);\n          if (res.type == 'log') {\n            for (var i = 0, len = res.value.length; i < len; i++) {\n              var log = res.value[i];\n              // console[log.level](log.msg);\n            }\n          }\n          if (listener && (messageType === undefined || res.type === messageType)) {\n            listener(res);\n          }\n        };\n        return {\n          on: function on(type, callback) {\n            messageType = type;\n            listener = callback;\n          },\n          whenOpened: function whenOpened() {\n            return co( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n              return regeneratorRuntime.wrap(function _callee$(_context) {\n                while (1) {\n                  switch (_context.prev = _context.next) {\n                    case 0:\n                      if (!opened) {\n                        _context.next = 4;\n                        break;\n                      }\n\n                      return _context.abrupt('return', true);\n\n                    case 4:\n                      _context.next = 6;\n                      return Q.Promise(function (resolve) {\n                        openedCallback = resolve;\n                      });\n\n                    case 6:\n                    case 'end':\n                      return _context.stop();\n                  }\n                }\n              }, _callee, this);\n            }));\n          },\n          send: function send(msg) {\n            return sock.send(msg);\n          }\n        };\n      }\n\n      return {\n        getExportURL: function getExportURL() {\n          return httpProtocol() + server + '/webmin/data/duniter_export';\n        },\n        getImportURL: function getImportURL() {\n          return httpProtocol() + server + '/webmin/data/duniter_import';\n        },\n        isNodePubliclyReachable: getResource('/webmin/server/reachable'),\n        ws: function ws() {\n          return _ws(wsProtocol() + server + '/webmin/ws');\n        },\n        wsBlock: function wsBlock() {\n          return _ws(wsProtocol() + server + '/webmin/ws_block');\n        },\n        wsPeer: function wsPeer() {\n          return _ws(wsProtocol() + server + '/webmin/ws_peer');\n        },\n        summary: getResource('/webmin/summary'),\n        powSummary: getResource('/webmin/summary/pow'),\n        logsExport: function logsExport(nbLines) {\n          return getResource('/webmin/logs/export/' + nbLines)();\n        },\n        blockchain: {\n          blocks: function blocks(opts) {\n            return getResource('/webmin/blockchain/blocks/' + opts.count + '/' + opts.from)();\n          },\n          block_add: postResource('/webmin/blockchain/add')\n        },\n        server: {\n          http: {\n            start: getResource('/webmin/server/http/start'),\n            stop: getResource('/webmin/server/http/stop'),\n            openUPnP: getResource('/webmin/server/http/upnp/open'),\n            regularUPnP: getResource('/webmin/server/http/upnp/regular')\n          },\n          services: {\n            startAll: getResource('/webmin/server/services/start_all'),\n            stopAll: getResource('/webmin/server/services/stop_all')\n          },\n          sendConf: postResource('/webmin/server/send_conf'),\n          netConf: postResource('/webmin/server/net_conf'),\n          keyConf: postResource('/webmin/server/key_conf'),\n          cpuConf: postResource('/webmin/server/cpu_conf'),\n          testSync: postResource('/webmin/server/test_sync'),\n          startSync: postResource('/webmin/server/start_sync'),\n          previewNext: getResource('/webmin/server/preview_next'),\n          autoConfNetwork: getResource('/webmin/server/auto_conf_network'),\n          resetData: getResource('/webmin/server/reset/data'),\n          republishNewSelfPeer: getResource('/webmin/server/republish_selfpeer')\n        },\n        key: {\n          preview: postResource('/webmin/key/preview')\n        },\n        network: {\n          interfaces: getResource('/webmin/network/interfaces'),\n          selfPeer: getResource('/webmin/network/self'),\n          peers: getResource('/webmin/network/peers'),\n          ws2p: {\n            info: getResource('/webmin/network/ws2p/info'),\n            heads: getResource('/webmin/network/ws2p/heads'),\n            conf: getResource('/webmin/network/ws2p/conf')\n          }\n        },\n        currency: {\n          parameters: getResource('/webmin/currency/parameters')\n        },\n        plugin: {\n          allModules: getResource('/webmin/plug/modules'),\n          uiModules: getResource('/webmin/plug/ui_modules'),\n          uiGetMenuInjection: function uiGetMenuInjection(moduleName) {\n            return getResource('/webmin/plug/ui_modules/inject/' + moduleName)();\n          },\n          checkAccess: getResource('/webmin/plug/check_access'),\n          addPackage: function addPackage(pkg) {\n            return postResource('/webmin/plug/add/')({ pkg: pkg });\n          },\n          removePackage: function removePackage(pkg) {\n            return postResource('/webmin/plug/rem/')({ pkg: pkg });\n          }\n        }\n      };\n    }\n    var server = window.location.hostname;\n    var port = window.location.port;\n    var service = Webmin([server, port].join(':'));\n    service.instance = Webmin;\n    return service;\n  });\n};\n"]}
\ No newline at end of file
diff --git a/public/templates.js b/public/templates.js
index 52e1b500d0ba295feb230a6475f90ed16877da4a..1602a445bd56088b2c205551af90862f06f757d8 100644
--- a/public/templates.js
+++ b/public/templates.js
@@ -438,7 +438,7 @@ var buf = [];
 var jade_mixins = {};
 var jade_interp;
 
-buf.push("<main class=\"syncMain\"><div class=\"container\"><div class=\"row\"><div class=\"s12 center\"><div class=\"card\"><div class=\"card-content\"><i class=\"fa fa-cloud-download fa-5x\"></i><h1 translate=\"sync.title\" class=\"card-title\"></h1><p translate=\"sync.message\"></p></div><div class=\"card-action\"><form class=\"row\"><div class=\"input-field col s12 m3\"><p><input type=\"radio\" name=\"groupeMode\" value=\"simplified\" id=\"radio1\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio1\">{{ 'sync.mode.simplified' | translate }}</label></p><p><input type=\"radio\" name=\"groupeMode\" value=\"manual\" id=\"radio2\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio2\">{{ 'sync.mode.manual' | translate }}</label></p></div><div class=\"input-field col s12 m6\"><div ng-show=\"sync_mode == 'simplified'\" class=\"input-field col s12\"><select ng-model=\"simplified_host\" ng-change=\"checkNode()\" ng-disabled=\"synchronizing\" class=\"browser-default\"><option value=\"\" disabled=\"disabled\" selected=\"selected\">{{ 'sync.simplified.default_option' | translate }}</option><optgroup label=\"{{ 'sync.simplified.currency' | translate }} « Ğune »\"><option value=\"g1.duniter.org:443\">https://g1.duniter.org {{ 'sync.simplified.main_mirror' | translate }}</option><option value=\"g1.duniter.org:80\">http://g1.duniter.org {{ 'sync.simplified.other mirror' | translate }}</option></optgroup><optgroup label=\"{{ 'sync.simplified.currency' | translate }} « Ğune-TEST »\"><option value=\"g1-test.duniter.org:443\">https://g1-test.duniter.org {{ 'sync.simplified.main_mirror' | translate }}</option><option value=\"g1-test.duniter.org:80\">http://g1-test.duniter.org {{ 'sync.simplified.other mirror' | translate }}</option></optgroup></select><label>{{ 'sync.simplified.choose' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s8\"><i class=\"prefix material-icons\">language</i><input id=\"host\" type=\"text\" ng-model=\"host\"/><label for=\"host\">{{ 'sync.host' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s4\"><i class=\"prefix fa fa-plug\"></i><input id=\"port\" type=\"number\" ng-model=\"port\"/><label for=\"port\">{{ 'sync.port' | translate }}</label></div></div><div class=\"col s12 m3\"><div ng-if=\"checking\" class=\"preloader-wrapper active small\"><div class=\"spinner-layer spinner-blue-only\"><div class=\"circle-clipper left\"><div class=\"circle\"></div></div></div></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field\"><button ng-show=\"!checking\" ng-disabled=\"synchronizing || (sync_mode != 'simplified' &amp;&amp; !(host &amp;&amp; port))\" ng-click=\"checkNode()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-wifi\"></i><span translate=\"sync.check\"></span></button></div></div></form><div class=\"row\"><div class=\"col s12\"><blockquote ng-show=\"sync_error\" class=\"card-panel left-align\">{{ sync_error | translate }}</blockquote><blockquote ng-show=\"sync_message\" class=\"info card-panel left-align\">{{ sync_message }}</blockquote></div></div><div class=\"row\"><button ng-disabled=\"!checked_host || synchronizing\" ng-click=\"startSync()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-cloud-download\"></i><span translate=\"sync.start\"></span></button></div><div ng-show=\"synchronizing\" class=\"row\"><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ down_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Download... ({{ down_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ storage_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Storage... ({{ storage_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ apply_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Apply... ({{ apply_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ sbx_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Sandbox... ({{ sbx_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ peers_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Peers... ({{ peers_percent }}%)</span></div></div><blockquote ng-show=\"sync_failed\" class=\"card-panel left-align\">{{ 'sync.failed' | translate }}</blockquote></div></div></div></div></div></main>");;return buf.join("");
+buf.push("<main class=\"syncMain\"><div class=\"container\"><div class=\"row\"><div class=\"s12 center\"><div class=\"card\"><div class=\"card-content\"><i class=\"fa fa-cloud-download fa-5x\"></i><h1 translate=\"sync.title\" class=\"card-title\"></h1><p translate=\"sync.message\"></p></div><div class=\"card-action\"><form class=\"row\"><div class=\"input-field col s12 m3\"><p><input type=\"radio\" name=\"groupeMode\" value=\"simplified\" id=\"radio1\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio1\">{{ 'sync.mode.simplified' | translate }}</label></p><p><input type=\"radio\" name=\"groupeMode\" value=\"manual\" id=\"radio2\" ng-model=\"sync_mode\" ng-disabled=\"synchronizing\"/><label for=\"radio2\">{{ 'sync.mode.manual' | translate }}</label></p></div><div class=\"input-field col s12 m6\"><div ng-show=\"sync_mode == 'simplified'\" class=\"input-field col s12\"><select ng-model=\"simplified_host\" ng-change=\"checkNode()\" ng-disabled=\"synchronizing\" class=\"browser-default\"><option value=\"\" disabled=\"disabled\" selected=\"selected\">{{ 'sync.simplified.default_option' | translate }}</option><optgroup label=\"{{ 'sync.simplified.currency' | translate }} « Ğune »\"><option value=\"g1.duniter.org:443\">https://g1.duniter.org {{ 'sync.simplified.main_mirror' | translate }}</option><option value=\"g1.duniter.org:80\">http://g1.duniter.org {{ 'sync.simplified.other mirror' | translate }}</option></optgroup><optgroup label=\"{{ 'sync.simplified.currency' | translate }} « Ğune-TEST »\"><option value=\"g1-test.duniter.org:443\">https://g1-test.duniter.org {{ 'sync.simplified.main_mirror' | translate }}</option><option value=\"g1-test.duniter.org:80\">http://g1-test.duniter.org {{ 'sync.simplified.other mirror' | translate }}</option></optgroup></select><label>{{ 'sync.simplified.choose' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s8\"><i class=\"prefix material-icons\">language</i><input id=\"host\" type=\"text\" ng-model=\"host\"/><label for=\"host\">{{ 'sync.host' | translate }}</label></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field col s4\"><i class=\"prefix fa fa-plug\"></i><input id=\"port\" type=\"number\" ng-model=\"port\"/><label for=\"port\">{{ 'sync.port' | translate }}</label></div></div><div class=\"col s12 m3\"><div ng-if=\"checking\" class=\"preloader-wrapper active small\"><div class=\"spinner-layer spinner-blue-only\"><div class=\"circle-clipper left\"><div class=\"circle\"></div></div></div></div><div ng-show=\"sync_mode != 'simplified'\" class=\"input-field\"><button ng-show=\"!checking\" ng-disabled=\"synchronizing || (sync_mode != 'simplified' &amp;&amp; !(host &amp;&amp; port))\" ng-click=\"checkNode()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-wifi\"></i><span translate=\"sync.check\"></span></button></div></div></form><div class=\"row\"><div class=\"col s12\"><blockquote ng-show=\"sync_error\" class=\"card-panel left-align\">{{ sync_error | translate }}</blockquote><blockquote ng-show=\"sync_message\" class=\"info card-panel left-align\">{{ sync_message }}</blockquote></div></div><div class=\"row\"><button ng-disabled=\"!checked_host || synchronizing\" ng-click=\"startSync()\" class=\"btn-large waves-effect waves-light\"><i class=\"left fa fa-cloud-download\"></i><span translate=\"sync.start\"></span></button></div><div ng-show=\"synchronizing\" class=\"row\"><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ storage_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Milestones... ({{ storage_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ down_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Download... ({{ down_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ apply_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Apply... ({{ apply_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ sbx_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Sandbox... ({{ sbx_percent }}%)</span></div><div class=\"col s8 m9\"><div class=\"progress\"><div style=\"width: {{ peers_percent }}%\" class=\"determinate\"></div></div></div><div class=\"col s4 m3 left-align\"><span>Peers... ({{ peers_percent }}%)</span></div></div><blockquote ng-show=\"sync_failed\" class=\"card-panel left-align\">{{ 'sync.failed' | translate }}</blockquote></div></div></div></div></div></main>");;return buf.join("");
 };
 if (typeof define === 'function' && define.amd) {
   define([], function() {
diff --git a/yarn.lock b/yarn.lock
index 0c8ecf51fba551837464e3cc923a3338d5c0ebd9..7e0a013b3224d6157463cfd3d811c253dd0ec01f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,19 +2,23 @@
 # yarn lockfile v1
 
 
+"@types/abstract-leveldown@*":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.1.tgz#3c7750d0186b954c7f2d2f6acc8c3c7ba0c3412e"
+
 "@types/events@*":
   version "1.2.0"
-  resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
+  resolved "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
 
 "@types/fs-extra@5.0.1":
   version "5.0.1"
-  resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.1.tgz#cd856fbbdd6af2c11f26f8928fd8644c9e9616c9"
+  resolved "http://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.1.tgz#cd856fbbdd6af2c11f26f8928fd8644c9e9616c9"
   dependencies:
     "@types/node" "*"
 
 "@types/glob@*":
-  version "5.0.35"
-  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
   dependencies:
     "@types/events" "*"
     "@types/minimatch" "*"
@@ -28,21 +32,42 @@
   version "9.12.2"
   resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.2.tgz#6ee7cd395effe5ec80b515d3ff1699068cd0cd1d"
 
+"@types/leveldown@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/@types/leveldown/-/leveldown-4.0.0.tgz#3725cd6593f723435c5d72215369ef969a2fcce5"
+  dependencies:
+    "@types/abstract-leveldown" "*"
+    "@types/node" "*"
+
+"@types/levelup@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-3.1.0.tgz#e04f6a8eaf707f88d7c6e043a9067dda431f4538"
+  dependencies:
+    "@types/abstract-leveldown" "*"
+    "@types/events" "*"
+    "@types/node" "*"
+
 "@types/lodash@4.14.104":
   version "4.14.104"
-  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80"
+  resolved "http://registry.npmjs.org/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80"
 
 "@types/marked@0.3.0":
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.3.0.tgz#583c223dd33385a1dda01aaf77b0cd0411c4b524"
 
+"@types/memdown@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@types/memdown/-/memdown-3.0.0.tgz#2d909cb507afd341e3132d77dafa213347e47455"
+  dependencies:
+    "@types/abstract-leveldown" "*"
+
 "@types/minimatch@*", "@types/minimatch@3.0.3":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
 
 "@types/node@*":
-  version "10.7.1"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.7.1.tgz#b704d7c259aa40ee052eec678758a68d07132a2e"
+  version "10.12.0"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235"
 
 "@types/shelljs@0.7.8":
   version "0.7.8"
@@ -70,6 +95,12 @@ abbrev@1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
 
+abstract-leveldown@~5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-5.0.0.tgz#f7128e1f86ccabf7d2893077ce5d06d798e386c6"
+  dependencies:
+    xtend "~4.0.0"
+
 accept-encoding@~0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/accept-encoding/-/accept-encoding-0.1.0.tgz#5dd88b8df71f1dc2e5cc6b9565ecce1e399a333e"
@@ -83,25 +114,25 @@ accepts@~1.3.3, accepts@~1.3.5:
 
 acorn-globals@^1.0.3:
   version "1.0.9"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf"
+  resolved "http://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf"
   dependencies:
     acorn "^2.1.0"
 
 acorn@^1.0.1:
   version "1.2.2"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014"
+  resolved "http://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014"
 
 acorn@^2.1.0:
   version "2.7.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7"
+  resolved "http://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7"
 
 acorn@^5.2.1:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+  version "5.7.3"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
 
 adm-zip@0.4.7:
   version "0.4.7"
-  resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
+  resolved "http://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1"
 
 agent-base@^4.1.0:
   version "4.2.1"
@@ -273,10 +304,18 @@ arr-diff@^2.0.0:
   dependencies:
     arr-flatten "^1.0.1"
 
-arr-flatten@^1.0.1:
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
 
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
 array-find-index@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
@@ -289,6 +328,10 @@ array-unique@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
 
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
 asap@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/asap/-/asap-1.0.0.tgz#b2a45da5fdfa20b0496fc3768cc27c12fa916a7d"
@@ -321,6 +364,10 @@ assert@~1.3.0:
   dependencies:
     util "0.10.3"
 
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
 async-each@^1.0.0, async-each@~1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -339,11 +386,7 @@ async@2.2.0:
   dependencies:
     lodash "^4.14.0"
 
-async@^1.4.0:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
-
-async@^2.0.0, async@^2.1.5:
+async@^2.0.0, async@^2.1.5, async@^2.5.0:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
   dependencies:
@@ -351,16 +394,20 @@ async@^2.0.0, async@^2.1.5:
 
 async@~0.2.6:
   version "0.2.10"
-  resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
+  resolved "http://registry.npmjs.org/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
 
 async@~1.0.0:
   version "1.0.0"
-  resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
+  resolved "http://registry.npmjs.org/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
 
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
 
+atob@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+
 auto-reload-brunch@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/auto-reload-brunch/-/auto-reload-brunch-2.0.0.tgz#1f217a2075fe467c302848eb8b7f641e82ad1ef5"
@@ -381,7 +428,7 @@ aws4@^1.2.1, aws4@^1.8.0:
 
 babel-brunch@6.0.1:
   version "6.0.1"
-  resolved "https://registry.yarnpkg.com/babel-brunch/-/babel-brunch-6.0.1.tgz#fc0546aa5e2e89f7ab9d8358e06506dae1958193"
+  resolved "http://registry.npmjs.org/babel-brunch/-/babel-brunch-6.0.1.tgz#fc0546aa5e2e89f7ab9d8358e06506dae1958193"
   dependencies:
     anymatch "^1.0.0"
     babel-core "^6.0.0"
@@ -564,47 +611,47 @@ babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants
 
 babel-plugin-syntax-async-functions@^6.8.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
 
 babel-plugin-syntax-async-generators@^6.5.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
 
 babel-plugin-syntax-class-constructor-call@^6.18.0:
   version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
 
 babel-plugin-syntax-class-properties@^6.8.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
 
 babel-plugin-syntax-decorators@^6.13.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
 
 babel-plugin-syntax-do-expressions@^6.8.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d"
 
 babel-plugin-syntax-dynamic-import@^6.18.0:
   version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
 
 babel-plugin-syntax-exponentiation-operator@^6.8.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
 
 babel-plugin-syntax-export-extensions@^6.8.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
 
 babel-plugin-syntax-function-bind@^6.8.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46"
 
 babel-plugin-syntax-object-rest-spread@^6.8.0:
   version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+  resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
 
 babel-plugin-syntax-trailing-function-commas@^6.22.0:
   version "6.22.0"
@@ -872,7 +919,7 @@ babel-plugin-transform-strict-mode@^6.24.1:
 
 babel-polyfill@6.3.14:
   version "6.3.14"
-  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.3.14.tgz#1872298ede5b9f7b02ec7807bd3dd301c189c440"
+  resolved "http://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.3.14.tgz#1872298ede5b9f7b02ec7807bd3dd301c189c440"
   dependencies:
     babel-regenerator-runtime "^6.3.13"
     babel-runtime "^5.0.0"
@@ -880,7 +927,7 @@ babel-polyfill@6.3.14:
 
 babel-preset-es2015@6.5.0:
   version "6.5.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.5.0.tgz#a36dbebf7b40041bb22f8080db52846cde6c1037"
+  resolved "http://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.5.0.tgz#a36dbebf7b40041bb22f8080db52846cde6c1037"
   dependencies:
     babel-plugin-check-es2015-constants "^6.3.13"
     babel-plugin-transform-es2015-arrow-functions "^6.3.13"
@@ -934,7 +981,7 @@ babel-preset-es2015@^6.0.0:
 
 babel-preset-stage-0@6.0.15:
   version "6.0.15"
-  resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.0.15.tgz#f5c03627242cc45656d66568aa309bed32ef905f"
+  resolved "http://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.0.15.tgz#f5c03627242cc45656d66568aa309bed32ef905f"
   dependencies:
     babel-plugin-transform-do-expressions "^6.0.14"
     babel-plugin-transform-function-bind "^6.0.14"
@@ -969,7 +1016,7 @@ babel-preset-stage-3@^6.24.1:
 
 babel-regenerator-runtime@^6.3.13:
   version "6.5.0"
-  resolved "https://registry.yarnpkg.com/babel-regenerator-runtime/-/babel-regenerator-runtime-6.5.0.tgz#0e41cd1c9f80442466f015c749fff8ba98f8e110"
+  resolved "http://registry.npmjs.org/babel-regenerator-runtime/-/babel-regenerator-runtime-6.5.0.tgz#0e41cd1c9f80442466f015c749fff8ba98f8e110"
 
 babel-register@^6.26.0:
   version "6.26.0"
@@ -985,7 +1032,7 @@ babel-register@^6.26.0:
 
 babel-runtime@^5.0.0:
   version "5.8.38"
-  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19"
+  resolved "http://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz#1c0b02eb63312f5f087ff20450827b425c9d4c19"
   dependencies:
     core-js "^1.0.0"
 
@@ -1047,9 +1094,21 @@ base64-js@^1.0.2:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
 
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  dependencies:
+    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"
+
 basic-auth@~1.1.0:
   version "1.1.0"
-  resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884"
+  resolved "http://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884"
 
 bcrypt-pbkdf@^1.0.0:
   version "1.0.2"
@@ -1064,8 +1123,8 @@ best-encoding@^0.1.1:
     accept-encoding "~0.1.0"
 
 binary-extensions@^1.0.0:
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
 
 "binary@>= 0.3.0 < 1", binary@~0.3.0:
   version "0.3.0"
@@ -1078,16 +1137,20 @@ bindings@1.2.1, bindings@1.2.x, bindings@~1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
 
+bindings@~1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
+
 bl@^1.0.0:
   version "1.2.2"
-  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
+  resolved "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
   dependencies:
     readable-stream "^2.3.5"
     safe-buffer "^5.1.1"
 
 bl@~0.7.0:
   version "0.7.0"
-  resolved "https://registry.yarnpkg.com/bl/-/bl-0.7.0.tgz#3fb0670602ac2878eb770dc2039f1836be62ae5b"
+  resolved "http://registry.npmjs.org/bl/-/bl-0.7.0.tgz#3fb0670602ac2878eb770dc2039f1836be62ae5b"
   dependencies:
     readable-stream "~1.0.2"
 
@@ -1098,8 +1161,8 @@ block-stream@*:
     inherits "~2.0.0"
 
 bluebird@^3.5.0:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a"
 
 bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   version "4.11.8"
@@ -1120,20 +1183,20 @@ body-parser@1.17.1:
     raw-body "~2.2.0"
     type-is "~1.6.14"
 
-body-parser@1.18.2:
-  version "1.18.2"
-  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+body-parser@1.18.3:
+  version "1.18.3"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
   dependencies:
     bytes "3.0.0"
     content-type "~1.0.4"
     debug "2.6.9"
-    depd "~1.1.1"
-    http-errors "~1.6.2"
-    iconv-lite "0.4.19"
+    depd "~1.1.2"
+    http-errors "~1.6.3"
+    iconv-lite "0.4.23"
     on-finished "~2.3.0"
-    qs "6.5.1"
-    raw-body "2.3.2"
-    type-is "~1.6.15"
+    qs "6.5.2"
+    raw-body "2.3.3"
+    type-is "~1.6.16"
 
 boom@2.x.x:
   version "2.10.1"
@@ -1170,6 +1233,21 @@ braces@^1.8.2:
     preserve "^0.2.0"
     repeat-element "^1.1.2"
 
+braces@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  dependencies:
+    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"
+
 brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@@ -1182,7 +1260,7 @@ browser-resolve@^1.11.1:
 
 browserify-aes@^1.0.0, browserify-aes@^1.0.4:
   version "1.2.0"
-  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
   dependencies:
     buffer-xor "^1.0.3"
     cipher-base "^1.0.0"
@@ -1210,7 +1288,7 @@ browserify-des@^1.0.0:
 
 browserify-rsa@^4.0.0:
   version "4.0.1"
-  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
   dependencies:
     bn.js "^4.1.0"
     randombytes "^2.0.1"
@@ -1269,7 +1347,7 @@ buffer-alloc-unsafe@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
 
-buffer-alloc@^1.1.0:
+buffer-alloc@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
   dependencies:
@@ -1293,15 +1371,15 @@ buffer-xor@^1.0.3:
   resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
 
 buffer@^5.1.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.0.tgz#53cf98241100099e9eeae20ee6d51d21b16e541e"
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6"
   dependencies:
     base64-js "^1.0.2"
     ieee754 "^1.1.4"
 
 buffer@~4.3.0:
   version "4.3.1"
-  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.3.1.tgz#0e65fd01cc3e9154d152f6b3c934b5b8a1b6733c"
+  resolved "http://registry.npmjs.org/buffer/-/buffer-4.3.1.tgz#0e65fd01cc3e9154d152f6b3c934b5b8a1b6733c"
   dependencies:
     base64-js "^1.0.2"
     ieee754 "^1.1.4"
@@ -1341,9 +1419,23 @@ bytes@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
 
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  dependencies:
+    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"
+
 camelcase-keys@^2.0.0:
   version "2.1.0"
-  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  resolved "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
   dependencies:
     camelcase "^2.0.0"
     map-obj "^1.0.0"
@@ -1390,7 +1482,7 @@ chainsaw@~0.1.0:
 
 chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
   version "1.1.3"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
   dependencies:
     ansi-styles "^2.2.1"
     escape-string-regexp "^1.0.2"
@@ -1400,7 +1492,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
 
 chalk@~0.4.0:
   version "0.4.0"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
+  resolved "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
   dependencies:
     ansi-styles "~1.0.0"
     has-color "~0.1.0"
@@ -1449,8 +1541,8 @@ chokidar@^1.6:
     fsevents "^1.0.0"
 
 chownr@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
 
 cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
   version "1.0.4"
@@ -1465,6 +1557,15 @@ cjson@0.3.0:
   dependencies:
     jsonlint "1.6.0"
 
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
 clean-css@^3.1.9:
   version "3.4.28"
   resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff"
@@ -1516,6 +1617,17 @@ coffee-script@~1.11:
   version "1.11.1"
   resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.11.1.tgz#bf1c47ad64443a0d95d12df2b147cc0a4daad6e9"
 
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+colorette@^1.0.1:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.0.7.tgz#7adf43c445ee63a541b4a4aef7d13f03df1e0cc0"
+
 colors@0.5.x:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774"
@@ -1528,44 +1640,52 @@ colors@1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
 
-combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5, combined-stream@~1.0.6:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
   dependencies:
     delayed-stream "~1.0.0"
 
 commander@0.6.1:
   version "0.6.1"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06"
+  resolved "http://registry.npmjs.org/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06"
 
 commander@2.3.0:
   version "2.3.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873"
+  resolved "http://registry.npmjs.org/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873"
 
 commander@2.8.x:
   version "2.8.1"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
+  resolved "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
   dependencies:
     graceful-readlink ">= 1.0.0"
 
 commander@2.9.0, commander@~2.9:
   version "2.9.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+  resolved "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
   dependencies:
     graceful-readlink ">= 1.0.0"
 
 commander@^2.0.0:
+  version "2.19.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+
+commander@~2.17.1:
   version "2.17.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
 
 commander@~2.6.0:
   version "2.6.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d"
+  resolved "http://registry.npmjs.org/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d"
 
 commonjs-require-definition@~0.6.2:
   version "0.6.2"
   resolved "https://registry.yarnpkg.com/commonjs-require-definition/-/commonjs-require-definition-0.6.2.tgz#1b66a1babe602605c1ee0a6d86e2e26799ca7cec"
 
+component-emitter@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
 compress-commons@^1.2.0:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f"
@@ -1608,8 +1728,10 @@ content-type@~1.0.2, content-type@~1.0.4:
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
 
 convert-source-map@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
+  dependencies:
+    safe-buffer "~5.1.1"
 
 cookie-signature@1.0.6:
   version "1.0.6"
@@ -1619,9 +1741,13 @@ cookie@0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
 
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
 core-js@^1.0.0, core-js@^1.0.1:
   version "1.2.7"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+  resolved "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
 
 core-js@^2.4.0, core-js@^2.5.0:
   version "2.5.7"
@@ -1660,7 +1786,7 @@ create-ecdh@^4.0.0:
 
 create-hash@^1.1.0, create-hash@^1.1.2:
   version "1.2.0"
-  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
   dependencies:
     cipher-base "^1.0.1"
     inherits "^2.0.1"
@@ -1670,7 +1796,7 @@ create-hash@^1.1.0, create-hash@^1.1.2:
 
 create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
   version "1.1.7"
-  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
   dependencies:
     cipher-base "^1.0.3"
     create-hash "^1.1.0"
@@ -1729,7 +1855,7 @@ css-stringify@1.0.5:
 
 css@~1.0.8:
   version "1.0.8"
-  resolved "https://registry.yarnpkg.com/css/-/css-1.0.8.tgz#9386811ca82bccc9ee7fb5a732b1e2a317c8a3e7"
+  resolved "http://registry.npmjs.org/css/-/css-1.0.8.tgz#9386811ca82bccc9ee7fb5a732b1e2a317c8a3e7"
   dependencies:
     css-parse "1.0.4"
     css-stringify "1.0.5"
@@ -1767,15 +1893,15 @@ ddos@0.1.16:
     hashish ""
     response ""
 
-debug@*, debug@^3.1, debug@~3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+debug@*:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87"
   dependencies:
-    ms "2.0.0"
+    ms "^2.1.1"
 
 debug@2.0.0:
   version "2.0.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.0.0.tgz#89bd9df6732b51256bc6705342bba02ed12131ef"
+  resolved "http://registry.npmjs.org/debug/-/debug-2.0.0.tgz#89bd9df6732b51256bc6705342bba02ed12131ef"
   dependencies:
     ms "0.6.2"
 
@@ -1785,22 +1911,44 @@ debug@2.6.1:
   dependencies:
     ms "0.7.2"
 
-debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9:
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   dependencies:
     ms "2.0.0"
 
+debug@^3.1:
+  version "3.2.6"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+  dependencies:
+    ms "^2.1.1"
+
 debug@~2.2, debug@~2.2.0:
   version "2.2.0"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+  resolved "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
   dependencies:
     ms "0.7.1"
 
+debug@~3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
 decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
 
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  dependencies:
+    mimic-response "^1.0.0"
+
 deep-assign@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-2.0.0.tgz#ebe06b1f07f08dae597620e3dd1622f371a1c572"
@@ -1815,12 +1963,38 @@ deep-extend@~0.4.0:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
 
+deferred-leveldown@~4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-4.0.2.tgz#0b0570087827bf480a23494b398f04c128c19a20"
+  dependencies:
+    abstract-leveldown "~5.0.0"
+    inherits "^2.0.3"
+
 define-properties@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
   dependencies:
     object-keys "^1.0.12"
 
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
 defined@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
@@ -1833,11 +2007,7 @@ delegates@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
 
-depd@1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
-
-depd@~1.1.0, depd@~1.1.1, depd@~1.1.2:
+depd@~1.1.0, depd@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
 
@@ -1886,7 +2056,7 @@ detect-indent@^4.0.0:
   dependencies:
     repeating "^2.0.0"
 
-detect-libc@^1.0.2:
+detect-libc@^1.0.2, detect-libc@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
 
@@ -1910,7 +2080,7 @@ diff@1.4.0:
 
 diffie-hellman@^5.0.0:
   version "5.0.3"
-  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
   dependencies:
     bn.js "^4.1.0"
     miller-rabin "^4.0.0"
@@ -1921,9 +2091,12 @@ domain-browser@~1.1.7:
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
 
 "duniter@git+https://git@git.duniter.org/nodes/typescript/duniter.git#dev":
-  version "1.6.25"
-  resolved "git+https://git@git.duniter.org/nodes/typescript/duniter.git#d42a7f31b23e424ac15b8d0841b7c1b83d45891a"
+  version "1.7.0"
+  resolved "git+https://git@git.duniter.org/nodes/typescript/duniter.git#e713d60df979e1f0b289b0ec2987fd43510213ae"
   dependencies:
+    "@types/leveldown" "^4.0.0"
+    "@types/levelup" "^3.1.0"
+    "@types/memdown" "^3.0.0"
     "@types/ws" "^5.1.2"
     archiver "1.3.0"
     async "2.2.0"
@@ -1943,7 +2116,10 @@ domain-browser@~1.1.7:
     inquirer "3.0.6"
     jison "0.4.17"
     js-yaml "3.8.2"
+    leveldown "^4.0.1"
+    levelup "^3.1.1"
     lokijs "^1.5.3"
+    memdown "^3.0.0"
     merkle "0.5.1"
     moment "2.19.3"
     morgan "1.8.1"
@@ -1969,12 +2145,12 @@ domain-browser@~1.1.7:
     unzip "0.1.11"
     unzip2 "0.2.5"
     winston "2.3.1"
-    wotb "^0.6.4"
+    wotb "^0.6.5"
     ws "1.1.5"
 
 duplexer@~0.1.1:
   version "0.1.1"
-  resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+  resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
 
 ebnf-parser@0.1.10:
   version "0.1.10"
@@ -2007,12 +2183,18 @@ encodeurl@~1.0.1, encodeurl@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
 
-end-of-stream@^1.0.0:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
   dependencies:
     once "^1.4.0"
 
+errno@~0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  dependencies:
+    prr "~1.0.1"
+
 error-ex@^1.2.0:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
@@ -2037,12 +2219,12 @@ es-abstract@^1.6.1:
     is-regex "^1.0.4"
 
 es-to-primitive@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
   dependencies:
-    is-callable "^1.1.1"
+    is-callable "^1.1.4"
     is-date-object "^1.0.1"
-    is-symbol "^1.0.1"
+    is-symbol "^1.0.2"
 
 es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
   version "0.10.46"
@@ -2061,12 +2243,12 @@ es6-iterator@~2.0.1, es6-iterator@~2.0.3:
     es6-symbol "^3.1.1"
 
 es6-promise@^4.0.3:
-  version "4.2.4"
-  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29"
+  version "4.2.5"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
 
 es6-promisify@^5.0.0:
   version "5.0.0"
-  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+  resolved "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
   dependencies:
     es6-promise "^4.0.3"
 
@@ -2158,7 +2340,7 @@ event-stream@3.3.4:
 
 events@~1.1.0:
   version "1.1.1"
-  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+  resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
 
 evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
   version "1.0.3"
@@ -2179,12 +2361,28 @@ expand-brackets@^0.1.4:
   dependencies:
     is-posix-bracket "^0.1.0"
 
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  dependencies:
+    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"
+
 expand-range@^1.8.1:
   version "1.8.2"
   resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
   dependencies:
     fill-range "^2.1.0"
 
+expand-template@^1.0.2:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd"
+
 expand-tilde@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449"
@@ -2193,7 +2391,7 @@ expand-tilde@^1.2.2:
 
 express-fileupload@0.0.5:
   version "0.0.5"
-  resolved "https://registry.yarnpkg.com/express-fileupload/-/express-fileupload-0.0.5.tgz#433a712525afa98b4c93162522e8bf79c68d82e7"
+  resolved "http://registry.npmjs.org/express-fileupload/-/express-fileupload-0.0.5.tgz#433a712525afa98b4c93162522e8bf79c68d82e7"
   dependencies:
     connect-busboy "0.0.2"
     fs-extra "^0.22.1"
@@ -2233,12 +2431,12 @@ express@4.15.2:
     vary "~1.1.0"
 
 express@^4.0.0:
-  version "4.16.3"
-  resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
+  version "4.16.4"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
   dependencies:
     accepts "~1.3.5"
     array-flatten "1.1.1"
-    body-parser "1.18.2"
+    body-parser "1.18.3"
     content-disposition "0.5.2"
     content-type "~1.0.4"
     cookie "0.3.1"
@@ -2255,10 +2453,10 @@ express@^4.0.0:
     on-finished "~2.3.0"
     parseurl "~1.3.2"
     path-to-regexp "0.1.7"
-    proxy-addr "~2.0.3"
-    qs "6.5.1"
+    proxy-addr "~2.0.4"
+    qs "6.5.2"
     range-parser "~1.2.0"
-    safe-buffer "5.1.1"
+    safe-buffer "5.1.2"
     send "0.16.2"
     serve-static "1.13.2"
     setprototypeof "1.1.0"
@@ -2267,13 +2465,26 @@ express@^4.0.0:
     utils-merge "1.0.1"
     vary "~1.1.2"
 
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
 extend@~3.0.0, extend@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
 
 external-editor@^2.0.1:
   version "2.2.0"
-  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+  resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
   dependencies:
     chardet "^0.4.0"
     iconv-lite "^0.4.17"
@@ -2285,6 +2496,19 @@ extglob@^0.3.1:
   dependencies:
     is-extglob "^1.0.0"
 
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  dependencies:
+    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"
+
 extsprintf@1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -2299,7 +2523,11 @@ eyes@0.1.x:
 
 fast-deep-equal@^1.0.0:
   version "1.1.0"
-  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+  resolved "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-future@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/fast-future/-/fast-future-1.0.2.tgz#8435a9aaa02d79248d17d704e76259301d99280a"
 
 fast-json-stable-stringify@^2.0.0:
   version "2.0.0"
@@ -2357,9 +2585,18 @@ fill-range@^2.1.0:
     repeat-element "^1.1.2"
     repeat-string "^1.5.2"
 
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
 finalhandler@1.1.1:
   version "1.1.1"
-  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
+  resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
   dependencies:
     debug "2.6.9"
     encodeurl "~1.0.2"
@@ -2401,7 +2638,7 @@ fn-args@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fn-args/-/fn-args-1.0.0.tgz#974dafa1aeac4ac7c21fa09cc3b80f650106ed32"
 
-for-in@^1.0.1:
+for-in@^1.0.1, for-in@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
 
@@ -2424,17 +2661,23 @@ form-data@~2.1.1:
     mime-types "^2.1.12"
 
 form-data@~2.3.2:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
   dependencies:
     asynckit "^0.4.0"
-    combined-stream "1.0.6"
+    combined-stream "^1.0.6"
     mime-types "^2.1.12"
 
 forwarded@~0.1.0, forwarded@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
 
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  dependencies:
+    map-cache "^0.2.2"
+
 fresh@0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
@@ -2531,6 +2774,10 @@ function-bind@^1.1.0, function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
 
+functional-red-black-tree@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
 gauge@~1.2.5:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93"
@@ -2568,12 +2815,20 @@ get-stdin@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
 
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
   dependencies:
     assert-plus "^1.0.0"
 
+github-from-package@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+
 glob-base@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
@@ -2613,19 +2868,9 @@ glob@7.0.x:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^6.0.4:
-  version "6.0.4"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
-  dependencies:
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "2 || 3"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@~7.1.1:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@~7.1.1:
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
   dependencies:
     fs.realpath "^1.0.0"
     inflight "^1.0.4"
@@ -2662,7 +2907,7 @@ globule@^1.0.0:
     lodash "~4.17.10"
     minimatch "~3.0.2"
 
-graceful-fs@^4.1.0, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6:
+graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6:
   version "4.1.11"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
 
@@ -2689,14 +2934,14 @@ hammerjs@^2.0.4:
   resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1"
 
 handlebars@^4.0.6:
-  version "4.0.11"
-  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+  version "4.0.12"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
   dependencies:
-    async "^1.4.0"
+    async "^2.5.0"
     optimist "^0.6.1"
-    source-map "^0.4.4"
+    source-map "^0.6.1"
   optionalDependencies:
-    uglify-js "^2.6"
+    uglify-js "^3.1.4"
 
 har-schema@^1.0.5:
   version "1.0.5"
@@ -2730,10 +2975,41 @@ has-color@~0.1.0:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
 
+has-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
+
 has-unicode@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
 
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
 has@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@@ -2770,8 +3046,8 @@ hawk@3.1.3, hawk@~3.1.3:
     sntp "1.x.x"
 
 highlight.js@^9.0.0:
-  version "9.12.0"
-  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
+  version "9.13.1"
+  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e"
 
 hmac-drbg@^1.0.0:
   version "1.0.1"
@@ -2806,18 +3082,9 @@ hosted-git-info@~2.1.4:
   version "2.1.5"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b"
 
-http-errors@1.6.2:
-  version "1.6.2"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
-  dependencies:
-    depd "1.1.1"
-    inherits "2.0.3"
-    setprototypeof "1.0.3"
-    statuses ">= 1.3.1 < 2"
-
-http-errors@~1.6.1, http-errors@~1.6.2:
+http-errors@1.6.3, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3:
   version "1.6.3"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+  resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
   dependencies:
     depd "~1.1.2"
     inherits "2.0.3"
@@ -2846,18 +3113,20 @@ https-browserify@~0.0.1:
 
 iconv-lite@0.4.15:
   version "0.4.15"
-  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+  resolved "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
 
-iconv-lite@0.4.19:
-  version "0.4.19"
-  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
-
-iconv-lite@^0.4.17, iconv-lite@^0.4.4:
+iconv-lite@0.4.23:
   version "0.4.23"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+iconv-lite@^0.4.17, iconv-lite@^0.4.4:
+  version "0.4.24"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
 ieee754@^1.1.4:
   version "1.1.12"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
@@ -2868,6 +3137,10 @@ ignore-walk@^3.0.1:
   dependencies:
     minimatch "^3.0.4"
 
+immediate@~3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
+
 in-publish@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
@@ -2957,6 +3230,18 @@ ipaddr.js@1.8.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
 
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  dependencies:
+    kind-of "^6.0.0"
+
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -2973,18 +3258,46 @@ is-buffer@^1.1.5:
 
 is-builtin-module@^1.0.0:
   version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
   dependencies:
     builtin-modules "^1.0.0"
 
-is-callable@^1.1.1, is-callable@^1.1.3:
+is-callable@^1.1.3, is-callable@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
 
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  dependencies:
+    kind-of "^6.0.0"
+
 is-date-object@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
 
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
 is-dotfile@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
@@ -2995,10 +3308,16 @@ is-equal-shallow@^0.1.3:
   dependencies:
     is-primitive "^2.0.0"
 
-is-extendable@^0.1.1:
+is-extendable@^0.1.0, is-extendable@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
 
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  dependencies:
+    is-plain-object "^2.0.4"
+
 is-extglob@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
@@ -3031,13 +3350,25 @@ is-number@^2.1.0:
   dependencies:
     kind-of "^3.0.2"
 
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
 is-number@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
 
 is-obj@^1.0.0:
   version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+  resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
 
 is-posix-bracket@^0.1.0:
   version "0.1.1"
@@ -3061,9 +3392,11 @@ is-regex@^1.0.4:
   dependencies:
     has "^1.0.1"
 
-is-symbol@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+is-symbol@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
+  dependencies:
+    has-symbols "^1.0.0"
 
 is-typedarray@^1.0.0, is-typedarray@~1.0.0:
   version "1.0.0"
@@ -3077,6 +3410,10 @@ is-windows@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c"
 
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
 isarray@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -3095,6 +3432,10 @@ isobject@^2.0.0:
   dependencies:
     isarray "1.0.0"
 
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
 isstream@0.1.x, isstream@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -3160,8 +3501,8 @@ jquery@^2.1.4:
   resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.4.tgz#2c89d6889b5eac522a7eea32c14521559c6cbf02"
 
 js-base64@^2.1.8:
-  version "2.4.8"
-  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033"
+  version "2.4.9"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03"
 
 "js-tokens@^3.0.0 || ^4.0.0":
   version "4.0.0"
@@ -3218,11 +3559,11 @@ json-stringify-safe@~5.0.1:
 
 json5@^0.5.1:
   version "0.5.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+  resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
 
 jsonfile@^2.1.0:
   version "2.4.0"
-  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+  resolved "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
   optionalDependencies:
     graceful-fs "^4.1.6"
 
@@ -3259,13 +3600,23 @@ jstransformer@0.0.2:
     is-promise "^2.0.0"
     promise "^6.0.1"
 
-kind-of@^3.0.2:
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
   dependencies:
     is-buffer "^1.1.5"
 
-kind-of@^6.0.0:
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
 
@@ -3285,13 +3636,46 @@ lcid@^1.0.0:
   dependencies:
     invert-kv "^1.0.0"
 
+level-errors@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.0.tgz#2de5b566b62eef92f99e19be74397fbc512563fa"
+  dependencies:
+    errno "~0.1.1"
+
+level-iterator-stream@~3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-3.0.1.tgz#2c98a4f8820d87cdacab3132506815419077c730"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.3.6"
+    xtend "^4.0.0"
+
+leveldown@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-4.0.1.tgz#7bc3df93c9fa574feb39ce45a0c4073aa948cfef"
+  dependencies:
+    abstract-leveldown "~5.0.0"
+    bindings "~1.3.0"
+    fast-future "~1.0.2"
+    nan "~2.10.0"
+    prebuild-install "^4.0.0"
+
+levelup@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189"
+  dependencies:
+    deferred-leveldown "~4.0.0"
+    level-errors "~2.0.0"
+    level-iterator-stream "~3.0.0"
+    xtend "~4.0.0"
+
 lex-parser@0.1.x, lex-parser@~0.1.3:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/lex-parser/-/lex-parser-0.1.4.tgz#64c4f025f17fd53bfb45763faeb16f015a747550"
 
 load-json-file@^1.0.0:
   version "1.1.0"
-  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
   dependencies:
     graceful-fs "^4.1.2"
     parse-json "^2.2.0"
@@ -3324,19 +3708,19 @@ lodash.padstart@^4.1.0:
   resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b"
 
 lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.10:
-  version "4.17.10"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+  version "4.17.11"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
 
 loggy@^1, loggy@~1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/loggy/-/loggy-1.0.3.tgz#8ef7e13a688b4b997724fe16ca6e9d5d55befd76"
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/loggy/-/loggy-1.0.4.tgz#651ed6cc27d5cf5057501ce6fb4a089f5e41d9a2"
   dependencies:
+    colorette "^1.0.1"
     native-notifier "~0.1.0"
-    turbocolor "^2.2.0"
 
 loggy@~0.3.0:
   version "0.3.5"
-  resolved "https://registry.yarnpkg.com/loggy/-/loggy-0.3.5.tgz#33f12801b1f6063966ea79d9b6a25db8fcbc4107"
+  resolved "http://registry.npmjs.org/loggy/-/loggy-0.3.5.tgz#33f12801b1f6063966ea79d9b6a25db8fcbc4107"
   dependencies:
     ansicolors "~0.3.2"
     growl "~1.8.1"
@@ -3373,23 +3757,37 @@ lru-cache@^4.0.1:
     pseudomap "^1.0.2"
     yallist "^2.1.2"
 
+ltgt@~2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+
 makeerror@1.0.x:
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
   dependencies:
     tmpl "1.0.x"
 
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
 map-obj@^1.0.0, map-obj@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
 
 map-stream@~0.1.0:
   version "0.1.0"
-  resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
+  resolved "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  dependencies:
+    object-visit "^1.0.0"
 
 marked@^0.3.17:
   version "0.3.19"
-  resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
+  resolved "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
 
 "match-stream@>= 0.0.2 < 1", match-stream@~0.0.2:
   version "0.0.2"
@@ -3411,19 +3809,31 @@ math-random@^1.0.1:
   resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
 
 md5.js@^1.3.4:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
   dependencies:
     hash-base "^3.0.0"
     inherits "^2.0.1"
+    safe-buffer "^5.1.2"
 
 media-typer@0.3.0:
   version "0.3.0"
-  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+  resolved "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+memdown@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309"
+  dependencies:
+    abstract-leveldown "~5.0.0"
+    functional-red-black-tree "~1.0.1"
+    immediate "~3.2.3"
+    inherits "~2.0.1"
+    ltgt "~2.2.0"
+    safe-buffer "~5.1.1"
 
 meow@^3.7.0:
   version "3.7.0"
-  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  resolved "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
   dependencies:
     camelcase-keys "^2.0.0"
     decamelize "^1.1.2"
@@ -3441,8 +3851,8 @@ merge-descriptors@1.0.1:
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
 
 merge@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
 
 merkle@0.5.1:
   version "0.5.1"
@@ -3481,6 +3891,24 @@ micromatch@^2.1.5, micromatch@^2.3.7:
     parse-glob "^3.0.4"
     regex-cache "^0.4.2"
 
+micromatch@^3.1.10:
+  version "3.1.10"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
 miller-rabin@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -3488,15 +3916,15 @@ miller-rabin@^4.0.0:
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
-mime-db@~1.35.0:
-  version "1.35.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47"
+mime-db@~1.37.0:
+  version "1.37.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
 
 mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.19, mime-types@~2.1.7:
-  version "2.1.19"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0"
+  version "2.1.21"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
   dependencies:
-    mime-db "~1.35.0"
+    mime-db "~1.37.0"
 
 mime@1.3.4:
   version "1.3.4"
@@ -3522,6 +3950,10 @@ mimic-fn@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
 
+mimic-response@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+
 minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@@ -3537,7 +3969,7 @@ minimatch@0.3:
     lru-cache "2"
     sigmund "~1.0.0"
 
-"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   dependencies:
@@ -3552,52 +3984,59 @@ minimatch@~0.2.11, minimatch@~0.2.14:
 
 minimist@0.0.8:
   version "0.0.8"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
 minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
 minimist@~0.0.1:
   version "0.0.10"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+  resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
 
 minipass@^2.2.1, minipass@^2.3.3:
-  version "2.3.4"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957"
+  version "2.3.5"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
   dependencies:
     safe-buffer "^5.1.2"
     yallist "^3.0.0"
 
 minizlib@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.1.tgz#6734acc045a46e61d596a43bb9d9cd326e19cc42"
   dependencies:
     minipass "^2.2.1"
 
+mixin-deep@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
 mkdirp@0.3.0:
   version "0.3.0"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
+  resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
 
 mkdirp@0.3.x:
   version "0.3.5"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
+  resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
 
 mkdirp@0.5, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5, mkdirp@~0.5.0, mkdirp@~0.5.1:
   version "0.5.1"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   dependencies:
     minimist "0.0.8"
 
 mkdirp@0.5.0:
   version "0.5.0"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
+  resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
   dependencies:
     minimist "0.0.8"
 
 mocha@2.2.5:
   version "2.2.5"
-  resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.2.5.tgz#d3b72a4fe49ec9439353f1ac893dbc430d993140"
+  resolved "http://registry.npmjs.org/mocha/-/mocha-2.2.5.tgz#d3b72a4fe49ec9439353f1ac893dbc430d993140"
   dependencies:
     commander "2.3.0"
     debug "2.0.0"
@@ -3633,20 +4072,24 @@ mout@^1.0.0:
 
 ms@0.6.2:
   version "0.6.2"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c"
+  resolved "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c"
 
 ms@0.7.1:
   version "0.7.1"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+  resolved "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
 
 ms@0.7.2:
   version "0.7.2"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+  resolved "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
 
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 
+ms@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+
 multimeter@0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/multimeter/-/multimeter-0.1.1.tgz#f856c80fc3cf0f1d4ad8eb36ad68735e3ed5b3ea"
@@ -3667,20 +4110,40 @@ naclb@1.3.10:
 
 nan@2.2.0:
   version "2.2.0"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.2.0.tgz#779c07135629503cf6a7b7e6aab33049b3c3853c"
+  resolved "http://registry.npmjs.org/nan/-/nan-2.2.0.tgz#779c07135629503cf6a7b7e6aab33049b3c3853c"
 
-nan@^2.0.5, nan@^2.3.2, nan@^2.3.3, nan@^2.9.2:
+nan@^2.0.5, nan@^2.11.0, nan@^2.3.2, nan@^2.9.2:
+  version "2.11.1"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766"
+
+nan@~2.10.0:
   version "2.10.0"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+  resolved "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
 
 nan@~2.4.0:
   version "2.4.0"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232"
+  resolved "http://registry.npmjs.org/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232"
 
 nan@~2.7.0:
   version "2.7.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
 
+nanomatch@^1.2.9:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
 nat-upnp@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/nat-upnp/-/nat-upnp-1.1.1.tgz#b18365e4faf44652549bb593c69e6b690df22043"
@@ -3697,16 +4160,16 @@ native-notifier@~0.1.0:
     tag-shell "~0.1.0"
 
 natives@^1.1.0:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58"
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb"
 
 ncp@^2.0.0:
   version "2.0.0"
-  resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
+  resolved "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
 
 needle@^2.2.1:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418"
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e"
   dependencies:
     debug "^2.1.2"
     iconv-lite "^0.4.4"
@@ -3730,6 +4193,12 @@ nib@~1.0.0:
   dependencies:
     stylus "0.45.x"
 
+node-abi@^2.2.0:
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.5.tgz#1fd1fb66641bf3c4dcf55a5490ba10c467ead80c"
+  dependencies:
+    semver "^5.4.1"
+
 node-archiver@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/node-archiver/-/node-archiver-0.3.0.tgz#b9f1afe5006d0bdf29260181833a070978bc6947"
@@ -3854,7 +4323,7 @@ node-pre-gyp@~0.6.38:
 
 node-sass@^3.0.0:
   version "3.13.1"
-  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-3.13.1.tgz#7240fbbff2396304b4223527ed3020589c004fc2"
+  resolved "http://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz#7240fbbff2396304b4223527ed3020589c004fc2"
   dependencies:
     async-foreach "^0.1.3"
     chalk "^1.1.1"
@@ -3891,6 +4360,10 @@ nomnom@1.5.2:
     chalk "~0.4.0"
     underscore "~1.6.0"
 
+noop-logger@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
+
 "nopt@2 || 3", nopt@~3.0.1, nopt@~3.0.6:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
@@ -3928,8 +4401,8 @@ npm-bundled@^1.0.1:
   resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
 
 npm-packlist@^1.1.6:
-  version "1.1.11"
-  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+  version "1.1.12"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a"
   dependencies:
     ignore-walk "^3.0.1"
     npm-bundled "^1.0.1"
@@ -3945,7 +4418,7 @@ npm-packlist@^1.1.6:
 
 npmlog@~2.0.0:
   version "2.0.4"
-  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692"
+  resolved "http://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692"
   dependencies:
     ansi "~0.3.1"
     are-we-there-yet "~1.1.2"
@@ -3967,10 +4440,24 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
 object-keys@^1.0.12:
   version "1.0.12"
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
 
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  dependencies:
+    isobject "^3.0.0"
+
 object.omit@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@@ -3978,6 +4465,12 @@ object.omit@^2.0.0:
     for-own "^0.1.4"
     is-extendable "^0.1.1"
 
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  dependencies:
+    isobject "^3.0.1"
+
 on-finished@~2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@@ -3988,7 +4481,7 @@ on-headers@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
 
-once@^1.3.0, once@^1.3.3, once@^1.4.0:
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   dependencies:
@@ -4033,7 +4526,7 @@ os-homedir@^1.0.0, os-homedir@^1.0.1:
 
 os-locale@^1.4.0:
   version "1.4.0"
-  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+  resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
   dependencies:
     lcid "^1.0.0"
 
@@ -4054,7 +4547,7 @@ osenv@0, osenv@^0.1.3, osenv@^0.1.4:
 
 parse-asn1@^5.0.0:
   version "5.1.1"
-  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+  resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
   dependencies:
     asn1.js "^4.0.0"
     browserify-aes "^1.0.0"
@@ -4085,6 +4578,10 @@ parseurl@~1.3.1, parseurl@~1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
 
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
 path-browserify@~0.0.0:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
@@ -4117,13 +4614,13 @@ path-type@^1.0.0:
 
 pause-stream@0.0.11:
   version "0.0.11"
-  resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
+  resolved "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
   dependencies:
     through "~2.3"
 
 pbkdf2@^3.0.3:
-  version "3.0.16"
-  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+  version "3.0.17"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
   dependencies:
     create-hash "^1.1.2"
     create-hmac "^1.1.4"
@@ -4141,7 +4638,7 @@ performance-now@^2.1.0:
 
 pify@^2.0.0:
   version "2.3.0"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  resolved "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
 
 pinkie-promise@^2.0.0:
   version "2.0.1"
@@ -4153,6 +4650,30 @@ pinkie@^2.0.0:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
 
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+prebuild-install@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-4.0.0.tgz#206ce8106ce5efa4b6cf062fc8a0a7d93c17f3a8"
+  dependencies:
+    detect-libc "^1.0.3"
+    expand-template "^1.0.2"
+    github-from-package "0.0.0"
+    minimist "^1.2.0"
+    mkdirp "^0.5.1"
+    node-abi "^2.2.0"
+    noop-logger "^0.1.1"
+    npmlog "^4.0.1"
+    os-homedir "^1.0.1"
+    pump "^2.0.1"
+    rc "^1.1.6"
+    simple-get "^2.7.0"
+    tar-fs "^1.13.0"
+    tunnel-agent "^0.6.0"
+    which-pm-runs "^1.0.0"
+
 preserve@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
@@ -4187,8 +4708,8 @@ progeny@~0.2.1:
     async-each "~0.1.3"
 
 progress@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31"
 
 promise.prototype.finally@^2:
   version "2.0.1"
@@ -4200,13 +4721,13 @@ promise.prototype.finally@^2:
 
 promise@^6.0.0, promise@^6.0.1:
   version "6.1.0"
-  resolved "https://registry.yarnpkg.com/promise/-/promise-6.1.0.tgz#2ce729f6b94b45c26891ad0602c5c90e04c6eef6"
+  resolved "http://registry.npmjs.org/promise/-/promise-6.1.0.tgz#2ce729f6b94b45c26891ad0602c5c90e04c6eef6"
   dependencies:
     asap "~1.0.0"
 
 promise@~2.0:
   version "2.0.0"
-  resolved "https://registry.yarnpkg.com/promise/-/promise-2.0.0.tgz#46648aa9d605af5d2e70c3024bf59436da02b80e"
+  resolved "http://registry.npmjs.org/promise/-/promise-2.0.0.tgz#46648aa9d605af5d2e70c3024bf59436da02b80e"
   dependencies:
     is-promise "~1"
 
@@ -4217,13 +4738,17 @@ proxy-addr@~1.1.3:
     forwarded "~0.1.0"
     ipaddr.js "1.4.0"
 
-proxy-addr@~2.0.3:
+proxy-addr@~2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
   dependencies:
     forwarded "~0.1.2"
     ipaddr.js "1.8.0"
 
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
 pseudomap@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@@ -4233,14 +4758,15 @@ psl@^1.1.24:
   resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
 
 public-encrypt@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
   dependencies:
     bn.js "^4.1.0"
     browserify-rsa "^4.0.0"
     create-hash "^1.1.0"
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
+    safe-buffer "^5.1.2"
 
 "pullstream@>= 0.4.1 < 1", pullstream@~0.4.0:
   version "0.4.1"
@@ -4251,6 +4777,20 @@ public-encrypt@^4.0.0:
     setimmediate ">= 1.0.2 < 2"
     slice-stream ">= 1.0.0 < 2"
 
+pump@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pump@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
 punycode@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
@@ -4291,18 +4831,14 @@ qs@6.4.0, qs@~6.4.0:
   version "6.4.0"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
 
-qs@6.5.1:
-  version "6.5.1"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+qs@6.5.2, qs@~6.5.2:
+  version "6.5.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
 
 qs@^1.2.1:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88"
 
-qs@~6.5.2:
-  version "6.5.2"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
-
 querablep@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/querablep/-/querablep-0.1.0.tgz#b2cd2b3e75fcd45d5dd7ade4c1811ab547849a84"
@@ -4316,8 +4852,8 @@ querystring@0.2.0:
   resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
 
 randomatic@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116"
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
   dependencies:
     is-number "^4.0.0"
     kind-of "^6.0.0"
@@ -4333,13 +4869,13 @@ range-parser@~1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
 
-raw-body@2.3.2:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+raw-body@2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
   dependencies:
     bytes "3.0.0"
-    http-errors "1.6.2"
-    iconv-lite "0.4.19"
+    http-errors "1.6.3"
+    iconv-lite "0.4.23"
     unpipe "1.0.0"
 
 raw-body@~2.2.0:
@@ -4350,7 +4886,7 @@ raw-body@~2.2.0:
     iconv-lite "0.4.15"
     unpipe "1.0.0"
 
-rc@^1.1.7, rc@^1.2.7:
+rc@^1.1.6, rc@^1.1.7, rc@^1.2.7:
   version "1.2.8"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
   dependencies:
@@ -4391,16 +4927,16 @@ read-pkg@^1.0.0:
 
 readable-stream@1.1.x:
   version "1.1.14"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
   dependencies:
     core-util-is "~1.0.0"
     inherits "~2.0.1"
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.3.0, readable-stream@^2.3.5:
+readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6:
   version "2.3.6"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+  resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
   dependencies:
     core-util-is "~1.0.0"
     inherits "~2.0.3"
@@ -4412,7 +4948,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable
 
 readable-stream@~1.0.0, readable-stream@~1.0.2, readable-stream@~1.0.31:
   version "1.0.34"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
   dependencies:
     core-util-is "~1.0.0"
     inherits "~2.0.1"
@@ -4421,7 +4957,7 @@ readable-stream@~1.0.0, readable-stream@~1.0.2, readable-stream@~1.0.31:
 
 readable-stream@~2.0.5:
   version "2.0.6"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+  resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
   dependencies:
     core-util-is "~1.0.0"
     inherits "~2.0.1"
@@ -4432,7 +4968,7 @@ readable-stream@~2.0.5:
 
 readable-stream@~2.1.4:
   version "2.1.5"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
+  resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
   dependencies:
     buffer-shims "^1.0.0"
     core-util-is "~1.0.0"
@@ -4443,13 +4979,12 @@ readable-stream@~2.1.4:
     util-deprecate "~1.0.1"
 
 readdirp@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
   dependencies:
-    graceful-fs "^4.1.2"
-    minimatch "^3.0.2"
+    graceful-fs "^4.1.11"
+    micromatch "^3.1.10"
     readable-stream "^2.0.2"
-    set-immediate-shim "^1.0.1"
 
 rechoir@^0.6.2:
   version "0.6.2"
@@ -4486,6 +5021,13 @@ regex-cache@^0.4.2:
   dependencies:
     is-equal-shallow "^0.1.3"
 
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
 regexpu-core@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
@@ -4496,7 +5038,7 @@ regexpu-core@^2.0.0:
 
 regjsgen@^0.2.0:
   version "0.2.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+  resolved "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
 
 regjsparser@^0.1.4:
   version "0.1.5"
@@ -4512,7 +5054,7 @@ repeat-element@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
 
-repeat-string@^1.5.2:
+repeat-string@^1.5.2, repeat-string@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
 
@@ -4603,6 +5145,10 @@ resolve-dir@^0.1.0:
     expand-tilde "^1.2.2"
     global-modules "^0.2.3"
 
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
 resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
@@ -4629,6 +5175,10 @@ restore-cursor@^2.0.0:
     onetime "^2.0.0"
     signal-exit "^3.0.2"
 
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
 right-align@^0.1.1:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
@@ -4649,7 +5199,7 @@ rimraf@2.6.1:
 
 rimraf@~2.5.0, rimraf@~2.5.1, rimraf@~2.5.4:
   version "2.5.4"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
+  resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04"
   dependencies:
     glob "^7.0.5"
 
@@ -4670,21 +5220,23 @@ rx@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
 
-safe-buffer@5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
-
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
 
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  dependencies:
+    ret "~0.1.10"
+
 "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
 
 sane@~1.0.0:
   version "1.0.4"
-  resolved "https://registry.yarnpkg.com/sane/-/sane-1.0.4.tgz#8ddfa3d52d3cf12171d052c28bce05eff1211881"
+  resolved "http://registry.npmjs.org/sane/-/sane-1.0.4.tgz#8ddfa3d52d3cf12171d052c28bce05eff1211881"
   dependencies:
     exec-sh "^0.2.0"
     fb-watchman "0.0.0"
@@ -4695,7 +5247,7 @@ sane@~1.0.0:
 
 sass-brunch@2.0.0:
   version "2.0.0"
-  resolved "https://registry.yarnpkg.com/sass-brunch/-/sass-brunch-2.0.0.tgz#9426e4f37de1e413b4feb5b6d9d3606158db6bf1"
+  resolved "http://registry.npmjs.org/sass-brunch/-/sass-brunch-2.0.0.tgz#9426e4f37de1e413b4feb5b6d9d3606158db6bf1"
   dependencies:
     node-sass "^3.0.0"
     progeny "~0.5.1"
@@ -4712,7 +5264,7 @@ sass-graph@^2.1.1:
 
 sax@0.5.x:
   version "0.5.8"
-  resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
+  resolved "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
 
 sax@>=0.1.1, sax@^1.2.4:
   version "1.2.4"
@@ -4737,17 +5289,17 @@ seedrandom@^2.4.3:
   version "2.4.4"
   resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba"
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0:
-  version "5.5.1"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
 
 semver@~5.1.0:
   version "5.1.1"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19"
+  resolved "http://registry.npmjs.org/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19"
 
 semver@~5.3.0:
   version "5.3.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+  resolved "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
 
 send@0.15.1:
   version "0.15.1"
@@ -4815,9 +5367,23 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
 
-set-immediate-shim@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+set-value@^0.4.3:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.1"
+    to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
 
 "setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@~1.0.1:
   version "1.0.5"
@@ -4833,7 +5399,7 @@ setprototypeof@1.1.0:
 
 sha.js@^2.4.0, sha.js@^2.4.8:
   version "2.4.11"
-  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
   dependencies:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
@@ -4899,6 +5465,18 @@ signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
+simple-concat@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
+
+simple-get@^2.7.0:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d"
+  dependencies:
+    decompress-response "^3.3.0"
+    once "^1.3.1"
+    simple-concat "^1.0.0"
+
 since-app-start@~0.3:
   version "0.3.3"
   resolved "https://registry.yarnpkg.com/since-app-start/-/since-app-start-0.3.3.tgz#ff96d7ab0a60118283785640396ea861bfe8554c"
@@ -4925,6 +5503,33 @@ smart-buffer@^1.0.13:
   version "1.1.15"
   resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16"
 
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
 sntp@1.x.x:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -4945,19 +5550,33 @@ socks@^1.1.10:
     ip "^1.1.4"
     smart-buffer "^1.0.13"
 
+source-map-resolve@^0.5.0:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+  dependencies:
+    atob "^2.1.1"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
 source-map-support@^0.4.15:
   version "0.4.18"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
   dependencies:
     source-map "^0.5.6"
 
+source-map-url@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
 source-map@0.1.x, source-map@~0.1.33, source-map@~0.1.7:
   version "0.1.43"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
   dependencies:
     amdefine ">=0.0.4"
 
-source-map@0.4.x, source-map@^0.4.2, source-map@^0.4.4:
+source-map@0.4.x, source-map@^0.4.2:
   version "0.4.4"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
   dependencies:
@@ -4967,16 +5586,20 @@ source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5, source-map@~0.5.1:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
 
+source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
 spdx-correct@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
   dependencies:
     spdx-expression-parse "^3.0.0"
     spdx-license-ids "^3.0.0"
 
 spdx-exceptions@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
 
 spdx-expression-parse@^3.0.0:
   version "3.0.0"
@@ -4986,12 +5609,18 @@ spdx-expression-parse@^3.0.0:
     spdx-license-ids "^3.0.0"
 
 spdx-license-ids@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  dependencies:
+    extend-shallow "^3.0.0"
 
 split@0.3:
   version "0.3.3"
-  resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
+  resolved "http://registry.npmjs.org/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
   dependencies:
     through "2"
 
@@ -5007,25 +5636,31 @@ sqlite3@3.1.13:
     node-pre-gyp "~0.6.38"
 
 sshpk@^1.7.0:
-  version "1.14.2"
-  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
+  version "1.15.1"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.1.tgz#b79a089a732e346c6e0714830f36285cd38191a2"
   dependencies:
     asn1 "~0.2.3"
     assert-plus "^1.0.0"
-    dashdash "^1.12.0"
-    getpass "^0.1.1"
-    safer-buffer "^2.0.2"
-  optionalDependencies:
     bcrypt-pbkdf "^1.0.0"
+    dashdash "^1.12.0"
     ecc-jsbn "~0.1.1"
+    getpass "^0.1.1"
     jsbn "~0.1.0"
+    safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
 stack-trace@0.0.x:
   version "0.0.10"
   resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
 
-"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2":
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+"statuses@>= 1.4.0 < 2":
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
 
@@ -5050,13 +5685,13 @@ stream-browserify@~2.0.1:
 
 stream-combiner@~0.0.4:
   version "0.0.4"
-  resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+  resolved "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
   dependencies:
     duplexer "~0.1.1"
 
 stream-http@~2.1.0:
   version "2.1.1"
-  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.1.1.tgz#3b880303babe036d6f6b43127d4dcd6f8893e1db"
+  resolved "http://registry.npmjs.org/stream-http/-/stream-http-2.1.1.tgz#3b880303babe036d6f6b43127d4dcd6f8893e1db"
   dependencies:
     builtin-status-codes "^2.0.0"
     inherits "^2.0.1"
@@ -5102,7 +5737,7 @@ stringstream@~0.0.4:
 
 strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   version "3.0.1"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
   dependencies:
     ansi-regex "^2.0.0"
 
@@ -5114,7 +5749,7 @@ strip-ansi@^4.0.0:
 
 strip-ansi@~0.1.0:
   version "0.1.1"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
+  resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
 
 strip-bom@^2.0.0:
   version "2.0.0"
@@ -5134,7 +5769,7 @@ strip-json-comments@~2.0.1:
 
 stylus-brunch@2.0.0:
   version "2.0.0"
-  resolved "https://registry.yarnpkg.com/stylus-brunch/-/stylus-brunch-2.0.0.tgz#2f8fa410f3e0eeaaca78501dbc96881b1d446f70"
+  resolved "http://registry.npmjs.org/stylus-brunch/-/stylus-brunch-2.0.0.tgz#2f8fa410f3e0eeaaca78501dbc96881b1d446f70"
   dependencies:
     nib "~1.0.0"
     progeny "~0.2.1"
@@ -5174,8 +5809,17 @@ tag-shell@~0.1.0:
   resolved "https://registry.yarnpkg.com/tag-shell/-/tag-shell-0.1.0.tgz#e743816e6a6e805ac3735f4162e016b97a7ddfbd"
 
 tail@^1.2.1:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/tail/-/tail-1.3.0.tgz#0bcb25f6e5a70d3c9e76693aa8a1721b22fb1d2e"
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/tail/-/tail-1.4.0.tgz#884b216220b90804bfe87a4c8174c2efed0e2661"
+
+tar-fs@^1.13.0:
+  version "1.16.3"
+  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509"
+  dependencies:
+    chownr "^1.0.1"
+    mkdirp "^0.5.1"
+    pump "^1.0.0"
+    tar-stream "^1.1.2"
 
 tar-pack@^3.4.0:
   version "3.4.1"
@@ -5216,16 +5860,16 @@ tar-pack@~3.3.0:
     tar "~2.2.1"
     uid-number "~0.0.6"
 
-tar-stream@^1.5.0:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395"
+tar-stream@^1.1.2, tar-stream@^1.5.0:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
   dependencies:
     bl "^1.0.0"
-    buffer-alloc "^1.1.0"
+    buffer-alloc "^1.2.0"
     end-of-stream "^1.0.0"
     fs-constants "^1.0.0"
     readable-stream "^2.3.0"
-    to-buffer "^1.1.0"
+    to-buffer "^1.1.1"
     xtend "^4.0.0"
 
 tar@^2.0.0, tar@^2.2.1, tar@~2.2.0, tar@~2.2.1:
@@ -5250,11 +5894,11 @@ tar@^4:
 
 through@2, through@^2.3.6, through@~2.3, through@~2.3.1:
   version "2.3.8"
-  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
 
 through@2.3.6:
   version "2.3.6"
-  resolved "https://registry.yarnpkg.com/through/-/through-2.3.6.tgz#26681c0f524671021d4e29df7c36bce2d0ecf2e8"
+  resolved "http://registry.npmjs.org/through/-/through-2.3.6.tgz#26681c0f524671021d4e29df7c36bce2d0ecf2e8"
 
 timers-browserify@~1.4.2:
   version "1.4.2"
@@ -5282,7 +5926,7 @@ to-arraybuffer@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
 
-to-buffer@^1.1.0:
+to-buffer@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
 
@@ -5290,6 +5934,28 @@ to-fast-properties@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
 
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
 tough-cookie@~2.3.0:
   version "2.3.4"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
@@ -5328,10 +5994,10 @@ trim-right@^1.0.1:
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
 
 "true-case-path@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62"
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
   dependencies:
-    glob "^6.0.4"
+    glob "^7.1.2"
 
 tty-browserify@~0.0.0:
   version "0.0.1"
@@ -5343,10 +6009,6 @@ tunnel-agent@^0.6.0:
   dependencies:
     safe-buffer "^5.0.1"
 
-turbocolor@^2.2.0:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/turbocolor/-/turbocolor-2.6.1.tgz#1b47dcc0e0e5171f57d954351fb80a5088a8a921"
-
 tweetnacl@0.14.3:
   version "0.14.3"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d"
@@ -5355,14 +6017,14 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.5"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
 
-type-is@~1.6.14, type-is@~1.6.15, type-is@~1.6.16:
+type-is@~1.6.14, type-is@~1.6.16:
   version "1.6.16"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
   dependencies:
     media-typer "0.3.0"
     mime-types "~2.1.18"
 
-typedarray-to-buffer@^3.1.2:
+typedarray-to-buffer@^3.1.5:
   version "3.1.5"
   resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
   dependencies:
@@ -5374,7 +6036,7 @@ typedoc-default-themes@^0.5.0:
 
 typedoc@^0.11.1:
   version "0.11.1"
-  resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.11.1.tgz#9f033887fd2218c769e1045feb88a1efed9f12c9"
+  resolved "http://registry.npmjs.org/typedoc/-/typedoc-0.11.1.tgz#9f033887fd2218c769e1045feb88a1efed9f12c9"
   dependencies:
     "@types/fs-extra" "5.0.1"
     "@types/handlebars" "4.0.36"
@@ -5396,7 +6058,7 @@ typedoc@^0.11.1:
 
 typescript@2.7.2:
   version "2.7.2"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836"
+  resolved "http://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836"
 
 uglify-js-brunch@2.0.1:
   version "2.0.1"
@@ -5404,7 +6066,7 @@ uglify-js-brunch@2.0.1:
   dependencies:
     uglify-js "~2.6.1"
 
-uglify-js@^2.4.19, uglify-js@^2.6:
+uglify-js@^2.4.19:
   version "2.8.29"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
   dependencies:
@@ -5413,16 +6075,23 @@ uglify-js@^2.4.19, uglify-js@^2.6:
   optionalDependencies:
     uglify-to-browserify "~1.0.0"
 
+uglify-js@^3.1.4:
+  version "3.4.9"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
+  dependencies:
+    commander "~2.17.1"
+    source-map "~0.6.1"
+
 uglify-js@~2.2.5:
   version "2.2.5"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.2.5.tgz#a6e02a70d839792b9780488b7b8b184c095c99c7"
+  resolved "http://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz#a6e02a70d839792b9780488b7b8b184c095c99c7"
   dependencies:
     optimist "~0.3.5"
     source-map "~0.1.7"
 
 uglify-js@~2.6.1:
   version "2.6.4"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf"
+  resolved "http://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf"
   dependencies:
     async "~0.2.6"
     source-map "~0.5.1"
@@ -5457,6 +6126,15 @@ underscore@~1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
 
+union-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^0.4.3"
+
 universal-path@^0.1:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/universal-path/-/universal-path-0.1.0.tgz#0fca24c936ea3d2282013d143710c06687ed0677"
@@ -5469,6 +6147,13 @@ unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
 
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
 untildify@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0"
@@ -5497,6 +6182,10 @@ unzip@0.1.11:
     readable-stream "~1.0.31"
     setimmediate ">= 1.0.1 < 2"
 
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
 url2@^0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/url2/-/url2-0.0.0.tgz#4eaabd1d5c3ac90d62ab4485c998422865a04b1a"
@@ -5508,6 +6197,10 @@ url@~0.11.0:
     punycode "1.3.2"
     querystring "0.2.0"
 
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
 utf-8-validate@1.2.x:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-1.2.2.tgz#8bb871a4741e085c70487ca7acdbd7d6d36029eb"
@@ -5587,18 +6280,22 @@ watch@~0.10.0:
   resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
 
 websocket@~1.0.8:
-  version "1.0.26"
-  resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.26.tgz#a03a01299849c35268c83044aa919c6374be8194"
+  version "1.0.28"
+  resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.28.tgz#9e5f6fdc8a3fe01d4422647ef93abdd8d45a78d3"
   dependencies:
     debug "^2.2.0"
-    nan "^2.3.3"
-    typedarray-to-buffer "^3.1.2"
+    nan "^2.11.0"
+    typedarray-to-buffer "^3.1.5"
     yaeti "^0.0.6"
 
 which-module@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
 
+which-pm-runs@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
+
 which@1, which@^1.2.12, which@^1.2.9:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -5641,9 +6338,9 @@ wordwrap@~0.0.2:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
 
-wotb@^0.6.4:
-  version "0.6.4"
-  resolved "https://registry.yarnpkg.com/wotb/-/wotb-0.6.4.tgz#2ff7020031198ebe9d6e115a898b554940aec3e9"
+wotb@^0.6.5:
+  version "0.6.5"
+  resolved "https://registry.yarnpkg.com/wotb/-/wotb-0.6.5.tgz#31ed24d10713546aa1f0faf5caee9c6d665374ec"
   dependencies:
     bindings "1.2.1"
     nan "2.2.0"
@@ -5651,7 +6348,7 @@ wotb@^0.6.4:
 
 wrap-ansi@^2.0.0:
   version "2.1.0"
-  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
   dependencies:
     string-width "^1.0.1"
     strip-ansi "^3.0.1"
@@ -5669,7 +6366,7 @@ ws@1.1.5:
 
 ws@^0.8.0:
   version "0.8.1"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-0.8.1.tgz#6b65273b99193c5f067a4cf5809598f777e3b759"
+  resolved "http://registry.npmjs.org/ws/-/ws-0.8.1.tgz#6b65273b99193c5f067a4cf5809598f777e3b759"
   dependencies:
     options ">=0.0.5"
     ultron "1.0.x"
@@ -5683,7 +6380,7 @@ xml2js@~0.1.14:
   dependencies:
     sax ">=0.1.1"
 
-xtend@^4.0.0:
+xtend@^4.0.0, xtend@~4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
 
@@ -5729,7 +6426,7 @@ yargs@^7.0.0:
 
 yargs@~3.10.0:
   version "3.10.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  resolved "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
   dependencies:
     camelcase "^1.0.2"
     cliui "^2.1.0"