diff --git a/.bowerrc b/.bowerrc
deleted file mode 100644
index e28246d45bad3115dbb5473caa7cd1011f69da58..0000000000000000000000000000000000000000
--- a/.bowerrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "directory": "www/lib"
-}
diff --git a/.gitignore b/.gitignore
index 4618037eb3cd55484287ca8f86383d7f8efb2518..d1453b829bd894e3761bacf4ba7e4bb6aef99306 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,5 @@
 /www/img/loader.gif
 /www/img/search-icon.png
 /www/img/search-icon-mobile.png
+
+.run/*
diff --git a/.run/Cesium.run.xml b/.run/Cesium.run.xml
new file mode 100644
index 0000000000000000000000000000000000000000..68640a859ce076530b5d932f8e54d069529aa1b8
--- /dev/null
+++ b/.run/Cesium.run.xml
@@ -0,0 +1,6 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="Cesium" type="JavascriptDebugType" uri="http://localhost:8100/">
+    <mapping url="http://localhost:8100" local-file="$PROJECT_DIR$/www" />
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 9ccf0ba7490b5210932c6d7788d725ee36f617fb..f6dba3efd9f826c75603298d1712945637019a0b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,90 +1,41 @@
-FROM     ubuntu:18.04
+FROM  node:10-alpine
 LABEL maintainer="benoit [dot] lavenier [at] e-is [dot] pro"
+LABEL version="1.6.3"
+LABEL description="Cesium Wallet for Äž1 libre currency"
+
+ARG CESIUM_VER="1.6.3"
 
 ENV DEBIAN_FRONTEND=noninteractive \
-    ANDROID_HOME=/opt/android-sdk-linux \
-    NODE_VERSION=10.17.0 \
-    NPM_VERSION=6.13.4 \
-    IONIC_VERSION=5.4.13 \
-    CORDOVA_VERSION=9.0.0 \
+    NODE_VERSION=10.20.0 \
+    NPM_VERSION=6.14.4 \
+    YARN_VERSION=1.22.4 \
+    IONIC_CLI_VERSION=6.6.0 \
+    CORDOVA_VERSION=8.1.2 \
     GRADLE_VERSION=4.10.3 \
-    GULP_VERSION=2.2.0 \
-    ANDROID_NDK_VERSION=r19c \
-    ANDROID_SDK_VERSION=r29.0.0
+    GULP_VERSION=3.9.1
 
 # Install basics
-RUN apt-get update &&  \
-    apt-get install -y git wget curl unzip build-essential software-properties-common ruby ruby-dev ruby-ffi gcc make python && \
-    curl --retry 3 -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" && \
-    tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 && \
-    rm "node-v$NODE_VERSION-linux-x64.tar.gz"
-
-# Install global nodeJS dependencies
-RUN npm install -g npm@"$NPM_VERSION" && \
-    npm install -g yarn gulp@"$GULP_VERSION" cordova@"$CORDOVA_VERSION" ionic@"$IONIC_VERSION" && \
-    npm cache clear --force
-
-#RUN npm install -g node-sass@^4.13.0
-
-# Install Java JDK
-RUN apt-get update && \
-    apt-get -y install openjdk-8-jdk-headless
-
-# Install Android prerequisites
-RUN echo ANDROID_HOME="${ANDROID_HOME}" >> /etc/environment && \
-    dpkg --add-architecture i386 && \
-    apt-get update && \
-    apt-get install -y --force-yes expect ant wget zipalign libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 qemu-kvm kmod && \
-    apt-get clean && \
-    apt-get autoclean && \
-    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
-
-# Install Android SDK
-#RUN cd /opt && \
-#    wget --output-document=android-sdk.tgz --quiet http://dl.google.com/android/android-sdk_"$ANDROID_SDK_VERSION"-linux.tgz && \
-#    tar xzf android-sdk.tgz && \
-#    rm -f android-sdk.tgz && \
-#    chown -R root. /opt
-#
-## Install Android NDK
-#RUN cd /opt/ && \
-#  wget --output-document=android-ndk.zip --quiet  https://dl.google.com/android/repository/android-ndk-"$ANDROID_NDK_VERSION"-linux-x86_64.zip && \
-#  unzip android-ndk.zip && \
-#  rm android-ndk.zip && \
-#  chown -R root. /opt
-
-# Install Gradle
-#RUN cd /opt/ && \
-#    wget https://services.gradle.org/distributions/gradle-"$GRADLE_VERSION"-bin.zip && \
-#    mkdir /opt/gradle && \
-#    unzip -d /opt/gradle gradle-"$GRADLE_VERSION"-bin.zip && \
-#    rm -rf gradle-$"GRADLE_VERSION"-bin.zip
-
-# Setup environment
-
-#ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:/opt/tools:/opt/gradle/gradle-"$GRADLE_VERSION"/bin
-
-# Install sdk elements
-#COPY resources/android/build/tools /opt/tools
-#RUN chmod u+x /opt/tools/*.sh
-#RUN ["/opt/tools/android-accept-licenses.sh", "android update sdk --all --no-ui --filter platform-tools,tools,build-tools-29.0.0,android-29,build-tools-26.0.0,android-26,build-tools-25.0.0,android-25,extra-android-support,extra-android-m2repository,extra-google-m2repository"]
-#RUN unzip ${ANDROID_HOME}/temp/*.zip -d ${ANDROID_HOME}
+RUN apk update && \
+        apk add ca-certificates wget curl git && \
+        update-ca-certificates && \
+    apk add --update python make g++
 
+# create group and user cesium
+RUN addgroup -S -g 1111 cesium && \
+	adduser -SD -h /cesium -G cesium -u 1111 cesium
+#RUN mkdir -p /var/lib/cesium /etc/cesium && chown cesium:cesium /var/lib/cesium /etc/cesium
 
-# Install source code
-#RUN git config --global user.email "user.name@domain.com" && \
-#    git config --global user.name "User Name" && \
-RUN git clone https://git.duniter.org/clients/cesium-grp/cesium.git && \
-    cd cesium && \
-    yarn install --ignore-engines
+# Install global dependencies
+RUN yarn global add gulp@"$GULP_VERSION" @ionic/cli@"$IONIC_CLI_VERSION"
 
-# Restore cordova platforms
-RUN cd cesium && \
-    yarn run install-platforms
+# copy source tree
+COPY ./ ./
 
-# TODO: Test First Build so that it will be faster later
-##  ionic cordova build android --prod --no-interactive --release
+# Install project dependencies
+# Workaround need for node-sass (- )see https://github.com/yarnpkg/yarn/issues/4867)
+RUN yarn install --ignore-engines && \
+    yarn remove node-sass && yarn add node-sass
 
-WORKDIR cesium
+WORKDIR /cesium
 EXPOSE 8100 35729
 CMD ["yarn", "run", "start"]
diff --git a/README.md b/README.md
index 0ec18c97052c5310ddb0489ed0f81bf22adf928a..6557a43f8c862d7e3453b4944e7fc5b929a6d6b5 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,25 @@
 
 # Cesium
 
- - [Unhosted webapp](https://unhosted.org) client for any [Duniter](https://duniter.org) crypto-currency.
- - Manage your wallet, certify your friends, and more ! 
- - [Web site](https://cesium.app)
+Cesium is wallet client software for [Duniter](https://duniter.org) crypto-currency, like Äž1.
+Cesium allow you to manage your wallet, certify your friends, and more!
+
+Cesium is an [Unhosted](https://unhosted.org) Progressive Web Application (PWA), using AngularJS and Ionic.
+
+Please visit th Cesium web site: [cesium.app](https://cesium.app)
 
 ## Install
 
+### As a web extension (Firefox, Chrome)
+
+ - Download the [latest extension release](https://github.com/duniter/cesium/releases/latest)
+ 
+ - Drag/drop the file into your browser;
+ 
+ - Confirm the installation.
+ 
+ That's it! A new button is appeared, on the top right corner.
+ 
 ### On desktop computer
 
  - Download the [latest release](https://github.com/duniter/cesium/releases/latest)
@@ -29,83 +42,7 @@
  - iOS
     * Coming soon...;
 
-### As a web site
-
-#### First installation
-
-Cesium can be easily installed on most web server : 
-
- - Download the [latest release](https://github.com/duniter/cesium/releases/latest) (file `cesium-vx.y.z-web.zip`); 
- - Unpack into an empty directory;
- - Configure the web server engine (e.g. apache, nginx):
-    * Add a new virtual host, that use the directory as `web root`. 
-    * Make sure the file `index.html` exist inside this directory.
-
-#### Update to last version
-
-On Linux distributions, an update script can be used to update your Cesium web site:
-
-```
-cd <CESIUM_WEB_ROOT>
-curl -kL https://git.duniter.org/clients/cesium-grp/cesium/raw/master/install.sh | bash
-```
-or:
-
-```
-cd <CESIUM_WEB_ROOT>
-wget -qO- https://git.duniter.org/clients/cesium-grp/cesium/raw/master/install.sh | bash
-```
-
-
-**Note**: You may need root permission to write files. If so just replace `| bash` with `| sudo bash`.
-
-#### Changing default settings 
-
-To change default configuration, on a Cesium web site:
-
-  - Edit the file `config.js` in the web root directory, and change some properties:
-  
-```js
-angular.module("cesium.config", [])
-.constant("csConfig", {
-  "fallbackLanguage": "en",
-  "rememberMe": false,
-  "timeWarningExpireMembership": 5184000,
-  "timeWarningExpire": 7776000,
-  "useLocalStorage": true,
-  "useRelative": true,
-  "decimalCount": 4,
-  "helptip": {
-    "enable": true,
-    "installDocUrl": "https://github.com/duniter/duniter/blob/master/doc/install-a-node.md"
-  },
-  "node": {
-    "host": "g1.duniter.org",
-    "port": "443"
-  },
-	"plugins": {
-		"es": {
-			"enable": "true",
-			"host": "g1.data.duniter.fr",
-			"port": "443"
-		}
-	},
-	"version": "1.3.7",
-	"build": "2019-04-02T08:27:57.915Z"
-});
-```
-
-  - Configure a Duniter node:
- 
-     * set `node.host` and `node.port` to the default node address. 
-   
-  - Configure the optional extension for [Cesium+](https://git.duniter.org/clients/cesium-grp/cesium-plus-pod/)
- 
-     * set `plugins.es.host` and `plugins.es.port` to the default Cesium+ Pod (aka ES) address.
-   
-     * set `plugins.es.enable` with [true|false] to change the default extension state. 
-   
-To learn more about configuration options, see the [detailed documentation](doc/configuration.md).
+
  
 #### Yunohost package
     
diff --git a/app/config.json b/app/config.json
index 271e21a68ac8d4799bfda6cd1c0d5c91fd31fc3f..0c3c148c5c0a16b4ba7b9a8accab42974a29ce11 100644
--- a/app/config.json
+++ b/app/config.json
@@ -1,6 +1,8 @@
 {
   "default": {
     "cacheTimeMs": 300000,
+    "demo": false,
+    "readonly": false,
     "fallbackLanguage": "en",
     "rememberMe": true,
     "showUDHistory": true,
@@ -13,11 +15,11 @@
     "expertMode": false,
     "decimalCount": 2,
     "httpsMode": false,
-    "shareBaseUrl": "https://g1.duniter.fr",
+    "shareBaseUrl": "https://demo.cesium.app/",
     "helptip": {
       "enable": true,
       "installDocUrl": {
-        "fr-FR": "https://duniter.org/fr/wiki/duniter/installer/",
+        "fr-FR": "https://duniter.org/fr/miner-des-blocs/installer/",
         "en": "https://duniter.org/en/wiki/duniter/install/"
       }
     },
@@ -32,7 +34,7 @@
         "fr-FR": "https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-fr.json",
         "en": "https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-en.json"
       },
-      "maxContentLength": 650
+      "maxContentLength": 1300
     },
     "node": {
       "host": "g1.duniter.org",
@@ -44,7 +46,19 @@
         "port": 443
       },
       {
-        "host": "g1.monnaielibreoccitanie.org",
+        "host": "g1.librelois.fr",
+        "port": 443
+      },
+      {
+        "host": "g1.e-is.pro",
+        "port": 443
+      },
+      {
+        "host": "duniter.moul.re",
+        "port": 443
+      },
+      {
+        "host": "g1.presles.fr",
         "port": 443
       },
       {
@@ -52,7 +66,11 @@
         "port": 443
       },
       {
-        "host": "g1.duniter.fr",
+        "host": "duniter.normandie-libre.fr",
+        "port": 443
+      },
+      {
+        "host": "g1.duniter.org",
         "port": 443
       }
     ],
@@ -64,15 +82,19 @@
         "enable": true,
         "askEnable": true,
         "useRemoteStorage": true,
-        "host": "g1.data.duniter.fr",
+        "host": "g1.data.e-is.pro",
         "port": 443,
         "fallbackNodes": [
+          {
+            "host": "g1.data.presles.fr",
+            "port": 443
+          },
           {
             "host": "g1.data.le-sou.org",
             "port": 443
           },
           {
-            "host": "g1.data.duniter.fr",
+            "host": "g1.data.mithril.re",
             "port": 443
           }
         ],
@@ -89,6 +111,8 @@
 
   "default_fr": {
     "cacheTimeMs": 300000,
+    "demo": false,
+    "readonly": false,
     "fallbackLanguage": "fr",
     "rememberMe": true,
     "showUDHistory": true,
@@ -101,11 +125,11 @@
     "expertMode": false,
     "decimalCount": 2,
     "httpsMode": false,
-    "shareBaseUrl": "https://g1.duniter.fr",
+    "shareBaseUrl": "https://demo.cesium.app/",
     "helptip": {
       "enable": true,
       "installDocUrl": {
-        "fr-FR": "https://duniter.org/fr/wiki/duniter/installer/",
+        "fr-FR": "https://duniter.org/fr/miner-des-blocs/installer/",
         "en": "https://duniter.org/en/wiki/duniter/install/"
       }
     },
@@ -120,19 +144,31 @@
         "fr-FR": "https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-fr.json",
         "en": "https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-en.json"
       },
-      "maxContentLength": 650
+      "maxContentLength": 1300
     },
     "node": {
-      "host": "g1.duniter.fr",
+      "host": "g1.duniter.org",
       "port": 443
     },
     "fallbackNodes": [
       {
-        "host": "g1.duniter.fr",
+        "host": "g1.cgeek.fr",
+        "port": 443
+      },
+      {
+        "host": "g1.librelois.fr",
         "port": 443
       },
       {
-        "host": "g1.monnaielibreoccitanie.org",
+        "host": "g1.e-is.pro",
+        "port": 443
+      },
+      {
+        "host": "duniter.moul.re",
+        "port": 443
+      },
+      {
+        "host": "g1.presles.fr",
         "port": 443
       },
       {
@@ -153,15 +189,19 @@
         "enable": true,
         "askEnable": true,
         "useRemoteStorage": true,
-        "host": "g1.data.duniter.fr",
+        "host": "g1.data.e-is.pro",
         "port": 443,
         "fallbackNodes": [
+          {
+            "host": "g1.data.presles.fr",
+            "port": 443
+          },
           {
             "host": "g1.data.le-sou.org",
             "port": 443
           },
           {
-            "host": "g1.data.duniter.fr",
+            "host": "g1.data.mithril.re",
             "port": 443
           }
         ],
@@ -178,6 +218,8 @@
 
   "g1-test": {
     "cacheTimeMs": 300000,
+    "demo": false,
+    "readonly": false,
     "fallbackLanguage": "en",
     "rememberMe": true,
     "timeout": 300000,
@@ -187,16 +229,16 @@
     "useRelative": false,
     "expertMode": true,
     "decimalCount": 2,
-    "shareBaseUrl": "https://g1.duniter.fr",
+    "shareBaseUrl": "https://g1-test.cesium.app",
     "helptip": {
       "enable": false,
       "installDocUrl": {
-        "fr-FR": "https://duniter.org/fr/wiki/duniter/installer/",
-        "en": "https://github.com/duniter/duniter/blob/master/doc/install-a-node.md"
+        "fr-FR": "https://duniter.org/fr/miner-des-blocs/installer/",
+        "en": "https://duniter.org/en/wiki/duniter/install/"
       }
     },
     "node": {
-      "host": "gtest.jytou.fr",
+      "host": "g1-test.duniter.org",
       "port": 443
     },
     "fallbackNodes": [
@@ -209,7 +251,7 @@
         "port": 443
       },
       {
-        "host": "g1-test.duniter.org",
+        "host": "ts.gt.elo.tf",
         "port": 443
       }
     ],
@@ -218,7 +260,7 @@
         "enable": true,
         "askEnable": true,
         "useRemoteStorage": true,
-        "host": "g1-test.data.duniter.fr",
+        "host": "g1-test.data.e-is.pro",
         "port": 443,
         "notifications": {
           "txSent": true,
@@ -233,6 +275,8 @@
 
   "dev": {
     "cacheTimeMs": 300000,
+    "demo": false,
+    "readonly": false,
     "fallbackLanguage": "fr-FR",
     "defaultLanguage": "fr-FR",
     "rememberMe": true,
@@ -283,7 +327,7 @@
             "port": 443
           },
           {
-            "host": "g1.data.duniter.fr",
+            "host": "g1.data.e-is.pro",
             "port": 443
           }
         ],
@@ -298,9 +342,6 @@
       "graph": {
         "enable": true
       },
-      "neo4j": {
-        "enable": true
-      },
       "rml9": {
         "enable": true
       }
@@ -309,6 +350,8 @@
 
   "dev_g1": {
     "cacheTimeMs": 300000,
+    "demo": false,
+    "readonly": false,
     "fallbackLanguage": "en",
     "rememberMe": true,
     "showUDHistory": true,
@@ -347,9 +390,6 @@
       "graph": {
         "enable": true
       },
-      "neo4j": {
-        "enable": true
-      },
       "rml9": {
         "enable": true
       }
diff --git a/bower.json b/bower.json
index e10abd2eb95e30c1eda91a8783ddf1a35a29b06e..7a42c76f9462f6e0fe439d8c560e792434b354c4 100644
--- a/bower.json
+++ b/bower.json
@@ -1,47 +1,48 @@
 {
   "name": "cesium",
-  "private": "true",
+  "private": "false",
   "dependencies": {
     "ionic": "driftyco/ionic-bower#1.3.5",
     "ionic-material": "0.4.2",
-    "angular-messages": "~1.5.11",
+    "angular-messages": "^1.5.11",
     "robotodraft": "1.1.0",
     "angular": "^1.5.11",
-    "angular-moment": "^0.10.3",
+    "angular-moment": "^1.3.0",
     "angular-animate": "^1.5.11",
     "angular-sanitize": "^1.5.11",
-    "angular-resource": "1.5.11",
+    "angular-resource": "^1.5.11",
     "angular-bind-notifier": "^1.1.11",
-    "angular-image-crop": "^2.0.0",
+    "angular-image-crop": "duniter-cesium/angular-image-crop#^2.0.2",
     "angular-ui-router": "^0.2.18",
     "angular-cache": "^4.6.0",
-    "ng-idle": "moribvndvs/ng-idle#^1.3.2",
+    "ng-idle": "HackedByChinese/ng-idle#1.3.2",
     "chart.js": "2.9.3",
     "leaflet.awesome-markers": "2.0.2",
     "leaflet-search": "2.7.2",
-    "angular-leaflet-directive": "^0.10.0",
+    "angular-leaflet-directive": "duniter-cesium/angular-leaflet-directive#^0.10.1",
     "Leaflet.EasyButton": "^2.4.0",
     "leaflet.loading": "Leaflet.loading#^0.1.24",
     "ui-leaflet": "^2.0.0",
     "leaflet.markercluster": "Leaflet.markercluster#0.5.0",
     "Leaflet.FeatureGroup.SubGroup": "0.1.2",
     "ion-digit-keyboard": "skol-pro/ion-digit-keyboard#973b90c2fc",
-    "angular-api": "E-IS/angular-api#0.3.0",
+    "angular-expose-api": "duniter-cesium/angular-expose-api#0.3.1",
     "angular-screenmatch": "^1.0.1",
     "angular-file-saver": "^1.1.3",
     "angular-simple-logger": "^0.1.7",
     "angular-chart.js": "jtblin/angular-chart#1.1.1",
-    "angular-fullscreen": "E-IS/angular-fullscreen#1.0.2",
+    "angular-fullscreen-toggle": "duniter-cesium/angular-fullscreen-toggle#1.0.4",
     "leaflet": "0.7.7",
     "moment": "^2.24.0",
     "numeral": "1.5.6",
-    "underscore": "1.8.3",
+    "underscore": "1.10.2",
     "aes-js": "ricmoo/aes-js#3.1.2",
     "ngCordova": "0.1.27-alpha",
     "js-scrypt": "1.2.0",
     "js-nacl": "1.3.2",
-    "angular-translate": "^2.18.1",
-    "socket.io-client": "^1.4.4"
+    "angular-translate": "^2.18.2",
+    "socket.io": "socketio/socket.io#^1.7.4",
+    "socket.io-client": "^1.7.4"
   },
   "resolutions": {
     "angular": "1.5.11",
@@ -49,13 +50,13 @@
     "angular-sanitize": "^1.5.11",
     "angular-ui-router": "0.2.18",
     "angular-messages": "1.5.11",
-    "angular-api": "0.3.0",
+    "angular-expose-api": "0.3.1",
     "Leaflet.EasyButton": "~1.3.2",
     "leaflet": "0.7.7",
     "leaflet.markercluster": "0.5",
     "Leaflet.FeatureGroup.SubGroup": "0.1.2",
-    "moment": ">=2.8.0 <2.11.0",
-    "numeral": "1.5.3",
+    "moment": ">=2.8.0 <2.24.0",
+    "numeral": "1.5.6",
     "ionic": "1.3.5"
   }
 }
diff --git a/config.xml b/config.xml
index 367566cb0263bf0aefa1a85884060d36a8a827e7..bc90c9dcb97d0bd2f5424a7f570ae7795cf9f31b 100644
--- a/config.xml
+++ b/config.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<widget android-versionCode="105008" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.5.8" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+<widget android-versionCode="106070" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.6.7" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
     <name>Cesium</name>
     <description>
     An simple App for Duniter wallet
@@ -28,8 +28,8 @@
     <preference name="KeyboardResizeMode" value="ionic" />
     <preference name="xwalkVersion" value="19" />
     <preference name="xwalkMultipleApk" value="false" />
-    <preference name="android-minSdkVersion" value="19" />
-    <preference name="android-targetSdkVersion" value="28" />
+    <preference name="android-minSdkVersion" value="16" />
+    <preference name="android-targetSdkVersion" value="29" />
     <preference name="StatusBarOverlaysWebView" value="false" />
     <preference name="StatusBarBackgroundColor" value="#000" />
     <preference name="StatusBarStyle" value="lightcontent" />
@@ -122,22 +122,31 @@
         <icon height="512" src="resources/osx/icon-512.png" width="512" />
         <icon height="1024" src="resources/osx/icon-1024.png" width="1024" />
     </platform>
-    <engine name="android" spec="^6.4.0" />
-    <engine name="ios" spec="git+https://github.com/bpresles/cordova-ios.git#5.1.0" />
-    <plugin name="cordova-plugin-camera" spec="^4.1.0" />
+    <plugin name="cordova-plugin-camera" spec="^4.1.0">
+        <variable name="ANDROID_SUPPORT_V4_VERSION" value="28.+" />
+    </plugin>
+    <plugin name="cordova-plugin-ionic-webview" spec="^4.1.3">
+        <variable name="ANDROID_SUPPORT_ANNOTATIONS_VERSION" value="28.+" />
+    </plugin>
     <plugin name="cordova-plugin-console" spec="^1.1.0" />
     <plugin name="cordova-plugin-device" spec="^2.0.3" />
     <plugin name="cordova-plugin-dialogs" spec="^2.0.2" />
-    <plugin name="cordova-plugin-secure-storage" spec="^3.0.2" />
+    <plugin name="cordova-clipboard" spec="^1.3.0" />
+    <plugin name="cordova-plugin-secure-storage-android10" spec="git+https://github.com/duniter-cesium/cordova-plugin-secure-storage-android10#6.0.4" />
     <plugin name="cordova-plugin-splashscreen" spec="^5.0.3" />
     <plugin name="cordova-plugin-statusbar" spec="^2.4.3" />
+    <plugin name="cordova-plugin-file" spec="^6.0.2" />
     <plugin name="cordova-plugin-vibration" spec="^3.1.1" />
     <plugin name="cordova-plugin-websocket" spec="^0.12.2" />
     <plugin name="cordova-plugin-whitelist" spec="^1.3.4" />
     <plugin name="cordova-plugin-x-toast" spec="^2.7.2" />
     <plugin name="cordova-plugin-ionic-keyboard" spec="^2.2.1" />
-    <plugin name="cordova-plugin-minisodium" spec="https://github.com/E-IS/cordova-plugin-minisodium.git#1.0.1" />
+    <plugin name="cordova-plugin-minisodium" spec="git+https://github.com/duniter-cesium/cordova-plugin-minisodium.git#v1.0.1" />
     <plugin name="phonegap-plugin-barcodescanner" spec="^8.1.0">
         <variable name="CAMERA_USAGE_DESCRIPTION" value="To scan QRCode" />
+        <variable name="ANDROID_SUPPORT_V4_VERSION" value="28.+" />
     </plugin>
+    <engine name="ios" spec="git+https://github.com/duniter-cesium/cordova-ios.git#5.1.0" />
+    <engine name="osx" spec="^5.0.0" />
+    <engine name="android" spec="^8.1.0" />
 </widget>
diff --git a/dist/desktop b/dist/desktop
index 2667bc6efab8ae2393ab57f330c33f7dedf99fe2..856765cd3e552d745144129ffd95c7fd3af51291 160000
--- a/dist/desktop
+++ b/dist/desktop
@@ -1 +1 @@
-Subproject commit 2667bc6efab8ae2393ab57f330c33f7dedf99fe2
+Subproject commit 856765cd3e552d745144129ffd95c7fd3af51291
diff --git a/doc/build_android.md b/doc/build_android.md
index a091842f1c6851dc8dfd4732fab3176197a9b017..da93f238375fdef108467efb1c4c04add58dcd6a 100644
--- a/doc/build_android.md
+++ b/doc/build_android.md
@@ -1,6 +1,6 @@
-# Android Builds
+# Build Cesium for Android
 
-Cesium can be build as Android App.
+Cesium can be build as an Android App.
 
 Cesium use [Ionic Framework v1.7.16](http://ionicframework.com/docs/v1/) with some Apache Cordova plugins.
 
diff --git a/doc/build_desktop.md b/doc/build_desktop.md
new file mode 100644
index 0000000000000000000000000000000000000000..19397982e8852e5931dc00b4f917f86707bcb847
--- /dev/null
+++ b/doc/build_desktop.md
@@ -0,0 +1,7 @@
+# Build Cesium as a Desktop application
+
+Cesium can be build as a standalone desktop application, for Linux (`.deb`), Windows (`.exe`) or MacOSx;
+
+- Clone the [cesium-desktop](https://git.duniter.org/clients/cesium-grp/cesium-desktop) project locally;
+- Follow this project documentation.
+
diff --git a/doc/build_docker.md b/doc/build_docker.md
index 96d1359d4c51e29e03343f18531d69060c0f738b..3b2733a2f75d5191df743296c98ed3cb47e345d7 100644
--- a/doc/build_docker.md
+++ b/doc/build_docker.md
@@ -1,5 +1,7 @@
 # Cesium docker image
 
+> WARNING: This documentation need a review! (not up to date)
+
 ## Build
 
 ```bash
diff --git a/doc/build_ios.md b/doc/build_ios.md
index 1c8c56cc464b1893986435a0e8c921fa72136b55..155d549d0168a642babaf63b31be58e1793ca6a8 100644
--- a/doc/build_ios.md
+++ b/doc/build_ios.md
@@ -1,4 +1,4 @@
-# iOS Builds
+# Build Cesium for iOS
 
 Cesium can be build as desktop application for iOS. .
 
@@ -82,7 +82,7 @@ npm install -g nw-gyp node-pre-gyp
 
 2. Install global dependencies (see [Development Guide](./development_guide.md) for versions to used) :
 ```
-npm install -g yarn gulp cordova@9.0.0 ionic@1.7.16
+npm install -g yarn gulp@3.9.1 cordova @ionic/cli@6.6.0
 ```
 
 3. Install project dependencies :
diff --git a/doc/build_web.md b/doc/build_web.md
new file mode 100644
index 0000000000000000000000000000000000000000..a3b636018e7eca7bc67eb01337e74f8896f7cfed
--- /dev/null
+++ b/doc/build_web.md
@@ -0,0 +1,26 @@
+# Build Cesium as an unhosted web application
+
+Cesium can be build as a simple web application, portable and runnable anywhere.
+
+## Prerequisites
+
+### Install the development environment
+
+Follow all the steps defined in the [Development guide](./development_guide.md).
+
+After that you should be able to start the application using `npm start`or `yarn run start`, and to test it.
+
+## Build the unhosted web application
+
+
+- To create a compressed ZIP artifact, run:
+  ```bash
+     cd cesium
+     gulp webBuild --release
+  ```
+  
+  A ZIP archive will be visible `dist/web/build/cesium-vx.y.z.zip`
+
+## Publishing to a web site 
+
+Uncompress the web archive, then open the `ìndex.html` file in your web browser.
\ No newline at end of file
diff --git a/doc/build_web_extension.md b/doc/build_web_extension.md
new file mode 100644
index 0000000000000000000000000000000000000000..f1f62b6e2f7b9444f6931385f38212892ee9f05b
--- /dev/null
+++ b/doc/build_web_extension.md
@@ -0,0 +1,51 @@
+# Build Cesium as a Web extension
+
+Cesium can be build as Web extension, for Mozilla Firefox extension (`.xpi`) and Chrome/Chromium (`.crx`).
+
+## Prerequisites
+
+### Install the development environment
+
+Follow all the steps defined in the [Development guide](./development_guide.md).
+
+After that you should be able to start the application using `npm start`or `yarn run start`, and to test it.
+
+## Build the web extension
+
+
+- To create a uncompressed extension, use :
+  ```bash
+     cd cesium
+     gulp webExtCompile --release
+  ```
+  
+  The uncompressed web extension will be visible `dist/web/ext`
+  
+- To create a portable and compressed ZIP extension : 
+  ```bash
+     cd cesium
+     gulp webExtBuild --release
+  ```
+  
+  The web extension is visible at `dist/web/build/cesium-vx.y.z-extension.zip`
+
+> Remove the option `--release` to skip creation of minified CSS and JS files (and source maps)
+
+## Publishing to Mozilla Addons 
+
+- Make sure you have `web-ext` installed. If not, run:
+  ```bash
+     npm install -g web-ext
+  ```
+  
+- Sign your extension :
+  ```bash
+  
+    # Define your credentials on addons.mozilla.org (your developer account)
+    export AMO_JWT_ISSUER =   // username
+    export AMO_JWT_SECRET =   // password
+  
+    # Will archive and upload your extension 
+    cd cesium
+    web-ext sign "--api-key=${AMO_JWT_ISSUER}" "--api-secret=${AMO_JWT_SECRET}" "--source-dir=dist/web/ext" "--artifacts-dir=${PROJECT_DIR}/dist/web/build"  --id=${WEB_EXT_ID} --channel=listed
+  ``` 
\ No newline at end of file
diff --git a/doc/changelog/changelog_v1.4.3.md b/doc/changelog/changelog_v1.4.3.md
index a8688648a78acd91f2849b705f2f45d7e9ae4d01..e6458bc51492fdb3bbfaf9fc73bf8bde7cf4d4e5 100644
--- a/doc/changelog/changelog_v1.4.3.md
+++ b/doc/changelog/changelog_v1.4.3.md
@@ -7,7 +7,7 @@
 - [fix] Fix scale change, on the network TX graph - fix #835 - thanks to @jiemme2
 - [fix] Fix ES translation - thanks to @scanlegentil
 - [fix] Fix NL translation - thanks to @RavanH
-- [fix] Fix develepment guide - thanks to @BorisPAING 
+- [fix] Fix development guide - thanks to @BorisPAING 
 
 ## Android
 
diff --git a/doc/changelog/changelog_v1.5.3.md b/doc/changelog/changelog_v1.5.3.md
index daebda39e49bddf03a256669bacd05faa00c1bc9..22aed171615b10890c2c23c8ca4f28c0452e9ea3 100644
--- a/doc/changelog/changelog_v1.5.3.md
+++ b/doc/changelog/changelog_v1.5.3.md
@@ -8,9 +8,8 @@
 - [fix] Home: fix logout button icons, on small device
 - [fix] Menu: badge alignment on small device
 - [fix] Wot identity: better fab compose id (UID is not safe)
-- [fix] Wallet (secondary): fix show certification link (for large screen)
-- [fix] Wallet (secondary): fix show certification link (for large screen)
-- [fix] Transfer: always hide the digitKeyboard when not a device - fix #866
+- [fix] Secondary wallet: allow to see certifications
+- [fix] Transfer: always hide the digitKeyboard when not a mobile device - fix #866
 - [fix] Network: add button to show Cesium+ network (if expert mode and Cesium+ plugin are enable)
 
 ### Cesium+ plugin
diff --git a/doc/changelog/changelog_v1.6.0.md b/doc/changelog/changelog_v1.6.0.md
new file mode 100644
index 0000000000000000000000000000000000000000..53904a37556f57d98c62b7fae2363f606fb558ef
--- /dev/null
+++ b/doc/changelog/changelog_v1.6.0.md
@@ -0,0 +1,25 @@
+# Version v1.6.0
+
+## All platforms
+
+- [enh] Home: Add feed (news)
+- [enh] Menu: new menu layout, and new icon for "My operations"
+- [enh] Navigation: better performance, by adding a network cache (between session if enable in settings)
+
+- [fix] Wallet: Fix freeze on "Loading..."
+- [fix] Fix locale flags (and add a flag for Esperanto)
+
+### Desktoo
+
+- [enh] Upgrade to Chromium 80 (NWjs v0.44.4)
+
+### Android
+
+- [enh] Can toggle QR code into full screen
+- [enh] Show more QRcode (on a identity page, in the transactions history) 
+
+- [fix] Android: revert to minSdkVersion=16
+
+### Firefox and Chrome extension
+
+- [enh] Allow to add Cesium as browser extension 
diff --git a/doc/changelog/changelog_v1.6.2.md b/doc/changelog/changelog_v1.6.2.md
new file mode 100644
index 0000000000000000000000000000000000000000..fa61e29e75726d646581aab1ab7510e7f8030349
--- /dev/null
+++ b/doc/changelog/changelog_v1.6.2.md
@@ -0,0 +1,53 @@
+# Version v1.6.2
+
+## All platforms
+
+- [enh] Improve private message icon, on a identity profile - fix [#900](https://git.duniter.org/clients/cesium-grp/cesium/-/issues/900)
+- [enh] Improve avatar modal, when editing a Cesium+ profile:
+  * allow drag and drop;
+  * add a "previous" button;
+  
+- [fix] Fix some ES translations
+- [fix] API: error 'qrcode not defined' - fix [#903](https://git.duniter.org/clients/cesium-grp/cesium/-/issues/903)
+
+### Desktop
+
+- [enh] Add a splash screen
+
+- [fix] Fix command line option `--debug`
+- [fix] Open popup to select local Duniter node, if detected  
+
+### Android
+
+- [enh] Fix Android 10 compatibility (due to secure storage Cordova plugin) - fix [#908](https://git.duniter.org/clients/cesium-grp/cesium/-/issues/898)
+
+### Firefox and Chrome extension
+
+- [fix] Unable to set avatar and page's pictures - fix [#904](https://git.duniter.org/clients/cesium-grp/cesium/-/issues/904)
+
+## Development environment
+
+### Build from source
+
+Before building Cesium, please launch this commands:
+```bash 
+cd cesium
+
+# Update ionic CLI to latest 
+npm remove ionic
+
+npm i -g @ionic/cli
+
+# Remove JS dependencies
+rm -rf node_modules
+
+# Clean Yarn cache, then install deps
+yarn cache clean && yarn install
+
+# Remove Cordova plugins
+rm -rf plugins
+  
+# Re install Cordova plugins
+cd scripts
+./ionic-update.sh 
+```
\ No newline at end of file
diff --git a/doc/changelog/changelog_v1.6.5.md b/doc/changelog/changelog_v1.6.5.md
new file mode 100644
index 0000000000000000000000000000000000000000..c8ec8a112289104ec99d978bf0d4752e90a6d89b
--- /dev/null
+++ b/doc/changelog/changelog_v1.6.5.md
@@ -0,0 +1,10 @@
+# Version v1.6.5
+
+## All platforms
+
+- [fix] Unable to report abuse, or like, a profile, if not login - fix [#913](https://git.duniter.org/clients/cesium-grp/cesium/-/issues/913) 
+
+## Android
+
+- [fix] Fix startup error, under Android 10 (API 28)  - [#898](https://git.duniter.org/clients/cesium-grp/cesium/-/issues/898)
+- [fix] Fix 'findIndex' error on transaction history, under Android 4.4 (API 19) - fix [#912](https://git.duniter.org/clients/cesium-grp/cesium/-/issues/912)
diff --git a/doc/deploy.md b/doc/deploy.md
deleted file mode 100644
index e2827c334ee8577c7680fd70207a46d5783288be..0000000000000000000000000000000000000000
--- a/doc/deploy.md
+++ /dev/null
@@ -1,55 +0,0 @@
-
-# Deploy Cesium
-
-## Bash script
- 
-This is a bash script example, that you can use to deploy the latest release.
-  
-This script will create or replace a directory name `cesium`, where application will be unpack.
- 
-**Be aware** that the destination directory will be created **where the script is**.
-
-```bash
-#!/bin/bash
-
-READLINK=`which readlink`
-if [ -z "$READLINK"  ]; then
-  message "Required tool 'readlink' is missing. Please install before launch \"$0\" file."
-  exit 1
-fi
-
-# ------------------------------------------------------------------
-# Ensure BASEDIR points to the directory where the soft is installed.
-# ------------------------------------------------------------------
-SCRIPT_LOCATION=$0
-if [ -x "$READLINK" ]; then
-  while [ -L "$SCRIPT_LOCATION" ]; do
-    SCRIPT_LOCATION=`"$READLINK" -e "$SCRIPT_LOCATION"`
-  done
-fi
-
-export BASEDIR=`dirname "$SCRIPT_LOCATION"`
-
-cd $BASEDIR
-
-echo "Installing cesium into '$BASEDIR/cesium'..."
-
-wget -qO- https://git.duniter.org/clients/cesium-grp/cesium/raw/master/install.sh | bash
-
-export VERSION=`sed -rn "s/\s*\"version\": \"([^\"]*)\",\s*/\1/p" cesium/config.js`
-export BUILD=`sed -rn "s/\s*\"build\": \"([^\"]*)\",\s*/\1/p" cesium/config.js`
-echo "Detected version: $VERSION"
-echo "           build: $BUILD"
-
-if [ -e "$BASEDIR/config.js" ]; then
-  echo "Override config file using '$BASEDIR/config.js'"
-  cp -f cesium/config.js cesium/config.js.ori
-  cp -f config.js cesium/
-  
-  # Keep version and build from original config file
-  sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"${VERSION}\"/g" cesium/config.js
-  sed -i "s/\"build\": \"[^\"]*\"/\"build\": \"${BUILD}\"/g" cesium/config.js
-fi
-
-echo "Done !"
-```
\ No newline at end of file
diff --git a/doc/deploy_web.md b/doc/deploy_web.md
new file mode 100644
index 0000000000000000000000000000000000000000..3f4baa2329f82f22cf747d7e9a2c882fddf39279
--- /dev/null
+++ b/doc/deploy_web.md
@@ -0,0 +1,148 @@
+
+# Deploy Cesium on a web server 
+
+> **WARN**: Installing Cesium as a web site is NOT recommended, for security reasons!
+> A DNS attack can redirect to another web site (with modified javascript code) in order to retrieve user credentials (wallet secret key)
+>
+> We recommend the use of the [web extension](build_web_extension.md), or the [desktop application](build_desktop.md);
+>
+> Read [this post](https://forum.monnaie-libre.fr/t/cesium-evolue-aie-ca-va-piquer-mais/10015) for details (French).
+
+## First deployment
+
+1. Download the [latest release](https://github.com/duniter/cesium/releases/latest) (file `cesium-vx.y.z-web.zip`);
+ 
+2. Unpack into an empty directory;
+
+3. Change Cesium default settings, by editing the file `config.js` (see next bottom); 
+
+4. Configure the web server engine (e.g. Apache, nginx):
+  * Add a new `location` (or a new `virtual host`), that use the directory as `web root`. 
+  * Make sure the file `index.html` exist inside this directory.
+ 
+   Please refer to your engine documentation.
+
+5. Restart your web engine.
+
+That's it !
+
+
+## Configure Cesium default settings 
+
+To change default configuration, that Cesium will use:
+
+- Edit the file `config.js` in the web root directory, and change some properties:
+  
+```js
+angular.module("cesium.config", [])
+.constant("csConfig", {
+  "fallbackLanguage": "en",
+  "rememberMe": false,
+  "timeWarningExpireMembership": 5184000,
+  "timeWarningExpire": 7776000,
+  "useLocalStorage": true,
+  "useRelative": true,
+  "decimalCount": 4,
+  "helptip": {
+    "enable": true,
+    "installDocUrl": "https://github.com/duniter/duniter/blob/master/doc/install-a-node.md"
+  },
+  "node": {
+    "host": "g1.duniter.org",
+    "port": "443"
+  },
+	"plugins": {
+		"es": {
+			"enable": "true",
+			"host": "g1.data.duniter.fr",
+			"port": "443"
+		}
+	},
+	"version": "1.3.7",
+	"build": "2019-04-02T08:27:57.915Z"
+});
+```
+
+- Configure a Duniter node:
+  * set `node.host` and `node.port` to the default node address. 
+
+- Configure the optional extension for [Cesium+](https://git.duniter.org/clients/cesium-grp/cesium-plus-pod/)
+
+  * set `plugins.es.host` and `plugins.es.port` to the default Cesium+ Pod (aka ES) address.
+  * set `plugins.es.enable` with [true|false] to change the default extension state. 
+   
+   
+To learn more about configuration options, see the [detailed documentation](configuration.md).
+
+ 
+## Update to the last version
+
+On Linux server, you can use an update script:
+
+```
+cd <CESIUM_WEB_ROOT>
+curl -kL https://git.duniter.org/clients/cesium-grp/cesium/raw/master/install.sh | bash
+```
+or:
+
+```
+cd <CESIUM_WEB_ROOT>
+wget -qO- https://git.duniter.org/clients/cesium-grp/cesium/raw/master/install.sh | bash
+```
+
+> **Note**: You should NOT need root permission. Make sure to NEVER replace `| bash` by `| sudo bash`!
+> For any permission issue during installation, change permission on directory, then retry.
+
+## Another Bash script  
+ 
+This is a bash script example, that you can use to deploy the latest release, in a existing Cesium web site.
+
+This script will create or replace a directory name `cesium`, where application will be unpack.
+ 
+**Be aware** that the destination directory will be created **where the script is**.
+
+```bash
+#!/bin/bash
+
+READLINK=`which readlink`
+if [ -z "$READLINK"  ]; then
+  message "Required tool 'readlink' is missing. Please install before launch \"$0\" file."
+  exit 1
+fi
+
+# ------------------------------------------------------------------
+# Ensure BASEDIR points to the directory where the soft is installed.
+# ------------------------------------------------------------------
+SCRIPT_LOCATION=$0
+if [ -x "$READLINK" ]; then
+  while [ -L "$SCRIPT_LOCATION" ]; do
+    SCRIPT_LOCATION=`"$READLINK" -e "$SCRIPT_LOCATION"`
+  done
+fi
+
+export BASEDIR=`dirname "$SCRIPT_LOCATION"`
+
+cd $BASEDIR
+
+echo "Installing cesium into '$BASEDIR/cesium'..."
+
+# In order to get the latest version, simplify run:
+wget -qO- https://git.duniter.org/clients/cesium-grp/cesium/raw/master/install.sh | bash
+
+export VERSION=`sed -rn "s/\s*\"version\": \"([^\"]*)\",\s*/\1/p" cesium/config.js`
+export BUILD=`sed -rn "s/\s*\"build\": \"([^\"]*)\",\s*/\1/p" cesium/config.js`
+echo "Detected version: $VERSION"
+echo "           build: $BUILD"
+
+if [ -e "$BASEDIR/config.js" ]; then
+  echo "Override config file using '$BASEDIR/config.js'"
+  cp -f cesium/config.js cesium/config.js.ori
+  cp -f config.js cesium/
+  
+  # Keep version and build from original config file
+  sed -i "s/\"version\": \"[^\"]*\"/\"version\": \"${VERSION}\"/g" cesium/config.js
+  sed -i "s/\"build\": \"[^\"]*\"/\"build\": \"${BUILD}\"/g" cesium/config.js
+fi
+
+echo "Done !"
+```
\ No newline at end of file
diff --git a/doc/development_guide.md b/doc/development_guide.md
index 6f53040be77c209bb75ba4b0a0a68a83b3dbab3d..596b3a4faf2f7544fa237bc20936dd548b6316f6 100644
--- a/doc/development_guide.md
+++ b/doc/development_guide.md
@@ -4,76 +4,105 @@
 
 To build Cesium, you will have to: 
  
-  - Installing build tools:
-```
- sudo apt-get install git wget curl unzip build-essential software-properties-common ruby ruby-dev ruby-ffi gcc make
-```
+1. Installing build tools:
+   ```bash
+      sudo apt-get install git wget curl unzip build-essential software-properties-common ruby ruby-dev ruby-ffi gcc make
+   ```
 
-  - Installing [nvm](https://github.com/nvm-sh/nvm)
-```
-  wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash
-```
+2. Installing node.js v10 :
 
-If you are using fish shell, there is a [dedicated plugin](https://github.com/jorgebucaran/fish-nvm).
+  * First, install [nvm](https://github.com/nvm-sh/nvm) (Node Version Manager) :    
+    ```bash
+       wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh | bash
+    ```
 
-> Then reload your terminal, for instance by executing the commande `bash`
+    > Alternatively, if you are using `fish shell`, there is a [dedicated plugin](https://github.com/jorgebucaran/fish-nvm).
 
-  - Configure NodeJS to use a version 10: (**WARNING**: upper version will NOT work !) 
-```
-  nvm install 10
-```
+  * Then, reload your terminal (for instance by executing the command `bash`);
+
+  * Configure nvm to use the expected version: (**WARNING**: upper version will NOT work !) 
+    ```bash
+       nvm install 10
+    ```
       
-  - Installing node.js build tools, as global dependencies:
-```
-   npm install -g yarn gulp cordova ionic
-```
+3. Installing node build tools, as global dependencies:
+   ```bash
+      npm install -g yarn gulp@3.9.1 cordova@8.1.2 @ionic/cli@6.6.0 web-ext
+   ```
    
 ## Get the source code and dependencies
    
-  - Getting source and installing project dependencies:    
-```
-  git clone git@git.duniter.org:clients/cesium-grp/cesium.git
-  cd cesium
-  yarn
-```
-
-  - Installing Cordova plugins (need for platforms specific builds)   
-```
-  ionic state restore
-```
+1. Getting the source code:    
+  ```bash
+     git clone git@git.duniter.org:clients/cesium-grp/cesium.git
+  ```
+  
+2. Install project dependencies:    
+   ```bash
+      cd cesium
+      yarn
+   ```
 
-- This should create a new directory `platforms/android`
+3. Installing Cordova plugins (required to build Android and iOS artifacts): 
+   ```bash
+      export JAVA_HOME=/path/to/jdk-8
+      export PATH=$JAVA_HOME/bin:$PATH
+      ionic cordova prepare
+   ```
 
-> To remind: check that your command line is configured:
-> - You must place yourself in the directory of the application: `cd cesium`
-> - and be configured for NodeJs v6: `nvm use 6` (please check using the command `node --version`)
+   This should create new directories `platforms/android` and `platforms/ios`.
 
+   > As a reminder: check that your command line is configured correctly:
+   > - You must place yourself in the directory of the application: `cd cesium`
+   > - and working with NodeJs **v10**: `nvm use 10` (please check using the command `node --version`)
+    
 
-## Prepare environment, then compile and launch
+## Prepare Cesium default config
 
- - To configure your build environment :
+Configure Cesium default settings :
  
-    * Add your environment config into `app/config.json`
+1. Add your environment config into `app/config.json`
    
-    * Update default configuration, using the command:
-    
-```
-  gulp config --env <your_env_name> 
-```
+2. Update default configuration, using the command:    
+   ```bash
+      gulp config --env <your_env_name> 
+   ```
 
-> This will update the configuration file used by cesium, at `www/js/config.json`.
+  This will update a configuration file `www/js/config.json`.
  
-  - Compiling and running Cesium:
-```
-  npm start
+## Compile and launch
+
+To compile and launch Cesium, run :
+```bash
+  yarn run start
 ```
- 
-> or alternative: `yarn run start` or `ionic serve` 
 
-  - Open a web browser at address: [localhost:8100](http://localhost:8100). The application should be running.
-  
-## Best practices for development
+or alternative: `npm start` or `ionic serve` 
+
+The application should be running at [localhost:8100](http://localhost:8100)!
+
+
+## Build artifacts 
+
+Cesium can be build:
+- [as an unhosted web applicationa](build_web.md);
+- [for Android](build_android.md);
+- [for iOS](build_ios.md);
+- [as a Web extension](build_web_extension.md) for Mozilla Firefox or Chrome/Chomium;
+- [as a Desktop application](build_desktop.md) for Linux (`.deb`), Windows and MacOSx;
+
+You may also [use Docker image](./build_docker.md) to simplify this task;   
+
+
+## Time to code !
+
+### Pull request
+
+For each pull request, please create a issue first.
+
+### Best practices for development
+
+Cesium could be run on phone devices. Please read [performance tips on AgularJS + Ionic ](http://julienrenaux.fr/2015/08/24/ultimate-angularjs-and-ionic-performance-cheat-sheet/)
+before starting to contribute.
 
- Cesium could be run on phone devices. Please read [performance tips on AgularJS + Ionic ](http://julienrenaux.fr/2015/08/24/ultimate-angularjs-and-ionic-performance-cheat-sheet/)
- before starting to contribute.
- Read also [Angular performance for large applicatoins](https://www.airpair.com/angularjs/posts/angularjs-performance-large-applications). 
+Read also [Angular performance for large applicatoins](https://www.airpair.com/angularjs/posts/angularjs-performance-large-applications). 
diff --git a/doc/feed/feed-fr.json b/doc/feed/feed-fr.json
index 1d3119d7f93c0fbcffe372ff7f5671d73d485dfe..49f87cce01eddfab1a95e6f3c5852a56f7c6ac52 100644
--- a/doc/feed/feed-fr.json
+++ b/doc/feed/feed-fr.json
@@ -1,10 +1,10 @@
 {
   "version": "https://jsonfeed.org/version/1",
-  "user_comment": "This feed allows you to read the posts from this site in any feed reader that supports the JSON Feed format. To add this feed to your reader, copy the following URL — https://jsonfeed.org/feed.json — and add it your reader.",
+  "user_comment": "Feed that use the jsonFeed format (see jsonFeed.org for details).",
   "title": "Actualités",
-  "description": "Cesium News",
+  "description": "Actualités de Cesium",
   "home_page_url": "https://forum.monnaie-libre.fr/tag/cesium",
-  "feed_url": "/feed.json",
+  "feed_url": "https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-fr.json",
   "author": {
     "name": "Benoit Lavenier",
     "url": "@BenoitLavenier",
@@ -12,24 +12,16 @@
   },
   "items": [
     {
-      "title": "Fermeture prochaine de Cesium-web",
+      "title": "Cesium évolue ! Aïe, ça va piquer mais…",
       "author": {
-        "name": "Moul",
-        "url": "@moul",
-        "avatar": "https://forum.monnaie-libre.fr/user_avatar/forum.monnaie-libre.fr/moul/45/1246_2.png"
+        "name": "Elois",
+        "url": "@elois",
+        "avatar": "https://forum.monnaie-libre.fr/user_avatar/forum.monnaie-libre.fr/elois/45/185_2.png"
       },
-      "date_published": "2020-02-07T09:42:00+01:00",
-      "id": "https://forum.monnaie-libre.fr/t/fermeture-prochaine-de-cesium-web-1er-mai/9474",
-      "url": "https://forum.monnaie-libre.fr/t/fermeture-prochaine-de-cesium-web-1er-mai/9474",
-      "content_html": "<p>Au <b>1er mai 2020</b>, il ne sera <b>plus possible de vous connecter à Ğ1 via la version web de Cesium</b> (Cesium-web), pour faire des transactions et certifier de nouveaux membres. Cesium-web restera cependant disponible en lecture, pour consulter vos comptes et vos certifications. Cette décision a été prise par les développeurs, en raison de potentielles failles de sécurité, qui pourraient affecter l’évolution de cette monnaie.</p><p>Le présent article a pour objectif : <ul><li>de vous présenter les causes et conséquences de cette décision,</li>\n<li>de détailler les procédures d’installation sur les différentes plateformes.</li></ul></p><p><h4>Pourquoi fermer Cesium-Web ?</h2></p><h5>Rappels concernant la Ğ1</h5><p>La monnaie libre Ğ1 est une monnaie cryptographique, c’est-à-dire qu’elle utilise des procédés de chiffrement pour garantir la légitimité de chaque transaction.</p>\n"
-    },
-    {
-      "title": "Un site officiel simple pour Cesium !",
-      "date_published": "2019-02-21T22:55:00+01:00",
-      "id": "https://cesium.app",
-      "url": "https://cesium.app",
-      "image": "https://cesium.app/i18n/fr_FR/contents/accueil/Cesium-G1-maquette.png",
-      "content_html": "<p><ul><li>Vous aimeriez vous inscrire à la Ğ1 (<i>June</i>), mais vous ne savez pas comment vous y prendre ?</li><li>Vous voulez savoir <b>comment utiliser</b> Cesium depuis votre smartphone ou ordinateur ?</li><li>On vous a dit que Cesium faisait aussi le café (en plus de gérer votre portefeuille en monnaie libre), mais vous n'en êtes pas sûr ? :-)</li></ul></p><p>Tutos, téléchargements, documentation: tout est désormais accessible depuis le <b>site officiel</b> : <a href=\"https://cesium.app\">https://cesium.app</a> !</p>"
+      "date_published": "2020-03-07T19:42:00+01:00",
+      "id": "https://forum.monnaie-libre.fr/t/cesium-evolue-aie-ca-va-piquer-mais/10015",
+      "url": "https://forum.monnaie-libre.fr/t/cesium-evolue-aie-ca-va-piquer-mais/10015",
+      "content_html": "<p>Au <b>1er mai 2020</b>, certains d’entre vous vont devoir changer leurs habitudes :</p>\n<ul>\n<li>pour ceux d’entre vous qui ont <strong>installé</strong> Cesium sur leur appareil : rien ne change</li>\n<li>pour ceux qui n’en sont pas sûrs : vous utilisez probablement la version «&nbsp;<strong>en ligne</strong>&nbsp;» (par exemple <code>g1․duniter․fr</code>), elle sera désactivée le 1er mai 2020. <strong>Relocalisez</strong> la gestion de votre compte en téléchargeant votre propre copie de Cesium dès maintenant :\n<a href=\"https://cesium.app/\">Je télécharge ma copie de Cesium</a> !</li>\n</ul>\n<h4>Besoin d’aide ? On est là pour vous !</h4>\n<p>Vous ne serez pas seul·e :</p>\n<p>La communauté G1 et les développeurs de Cesium sont là pour répondre à vos questions si jamais vous rencontrez un problème dans l’installation ou dans l’usage.</p>\n<p>Trois possibilités s’offrent à vous :</p>\n<ul>\n<li>Rendez-vous aux prochaines rencontres organisées par votre groupe local,</li>\n<li>ou : dites-le-nous sur le forum : <a href=\"https://forum.monnaie-libre.fr/c/tools/13\">Support cesium.app</a>\n</li>\n<li>ou : envoyez un e-mail à <a href=\"mailto:support@cesium.app\">support@cesium.app</a> créée pour l’occasion avec une équipe derrière.</li>\n</ul>\n<p>Pour effectuer votre transition en douceur, Cesium-web reste utilisable jusqu’au 1er mai 2020 .</p>\n<p>Cependant, plus vite vous <a href=\"https://cesium.app\">installez Cesium</a>, plus nous aurons de temps pour vous aider avant la fermeture du site.</p>\n"
     }
   ]
 }
diff --git a/doc/fr/development_tutorial-01.md b/doc/fr/development_tutorial-01.md
index 3b13012fc44f2175adfc26f57585ff133622fd0b..48d957ab0b70df5d710bb82e4cea70bbfd2c5e02 100644
--- a/doc/fr/development_tutorial-01.md
+++ b/doc/fr/development_tutorial-01.md
@@ -127,7 +127,7 @@ cd cesium
 Puis, lancez le téléchargement et l'installation des modules Cesium à l'aide de la commande : 
 
 ```bash
-npm install -g yarn cordova ionic@1.7.16
+npm install -g yarn gulp@3.9.1 cordova@8.1.2 @ionic/cli@6.6.0 web-ext
 ```
 
 Puis pour les dépendances non globales :
diff --git a/doc/fr/development_tutorial-03-android.md b/doc/fr/development_tutorial-03-android.md
index 779fc0243404af2ad18ee5120786f1f8b9cde3a1..84e076ddb40b54664789d20a7e8f41eab5414e65 100644
--- a/doc/fr/development_tutorial-03-android.md
+++ b/doc/fr/development_tutorial-03-android.md
@@ -119,14 +119,14 @@ node --version
 Si vous n'êtes pas sur une v6, utilisez la commande 
 
 ```
-nvm use 6
+nvm use 10
 ```
 
 Vous pouvez maintenant lancer l'instalaltion du projet Cesium pour Android :
 
 
 ```
-ionic state restore
+ionic cordova prepare
 ```
 
 Normalement, cette commande devrait initialiser (entre autre) un répertoire `platforms/android`.
diff --git a/gulpfile.js b/gulpfile.js
index 148740c4958178863f7ec91b68504e888c1049fd..0a557d29d8d446812963df5ed5a8ad559e39e7ed 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -7,7 +7,6 @@ const gulp = require('gulp'),
   rename = require('gulp-rename'),
   ngConstant = require('gulp-ng-constant'),
   fs = require("fs"),
-  argv = require('yargs').argv,
   header = require('gulp-header'),
   footer = require('gulp-footer'),
   removeCode = require('gulp-remove-code'),
@@ -21,16 +20,21 @@ const gulp = require('gulp'),
   useref = require('gulp-useref'),
   filter = require('gulp-filter'),
   uglify = require('gulp-uglify-es').default,
+  sourcemaps = require('gulp-sourcemaps'),
+  lazypipe = require('lazypipe'),
   csso = require('gulp-csso'),
   replace = require('gulp-replace'),
-  rev = require('gulp-rev'),
-  revReplace = require('gulp-rev-replace'),
   clean = require('gulp-clean'),
   htmlmin = require('gulp-htmlmin'),
   jshint = require('gulp-jshint'),
   markdown = require('gulp-markdown'),
+  merge = require('merge2'),
   log = require('fancy-log'),
-  colors = require('ansi-colors');
+  colors = require('ansi-colors'),
+  argv = require('yargs').argv,
+  sriHash = require('gulp-sri-hash'),
+  sort = require('gulp-sort'),
+  jsonlint = require("@prantlf/gulp-jsonlint");
 
 const paths = {
   license_md: ['./www/license/*.md'],
@@ -47,8 +51,6 @@ const paths = {
   ng_annotate_plugin: ['./www/plugins/*/**/*.js', '!./www/plugins/*/js/vendor/*.js']
 };
 
-
-
 function appAndPluginWatch(done) {
 
   log(colors.green('Watching source files...'));
@@ -67,10 +69,9 @@ function appAndPluginWatch(done) {
   gulp.watch(paths.ng_translate_plugin, () => pluginNgTranslate());
   gulp.watch(paths.css_plugin.concat(paths.leafletSass), () => pluginSass());
 
-  done();
+  if (done) done();
 }
 
-
 /**
  * Generate App CSS (using SASS)
  * @returns {*}
@@ -130,6 +131,7 @@ function appNgTemplate() {
   log(colors.green('Building App template file...'));
 
   return gulp.src(paths.templatecache)
+    .pipe(sort())
     .pipe(templateCache({
       standalone: true,
       module:"cesium.templates",
@@ -138,13 +140,13 @@ function appNgTemplate() {
     .pipe(gulp.dest('./www/dist/dist_js/app'));
 }
 
-function appNgAnnotate(changes) {
+function appNgAnnotate(event) {
 
   // If watch, apply only on changes files
-  if (changes && changes.type === 'changed' && changes.path && changes.path.indexOf('/www/js/') !== -1) {
-    let path = changes.path.substring(changes.path.indexOf('/www/js') + 7);
+  if (event && event.type === 'changed' && event.path && event.path.indexOf('/www/js/') !== -1) {
+    let path = event.path.substring(event.path.indexOf('/www/js') + 7);
     path = path.substring(0, path.lastIndexOf('/'));
-    return gulp.src(changes.path)
+    return gulp.src(event.path)
       .pipe(ngAnnotate({single_quotes: true}))
       .pipe(gulp.dest('./www/dist/dist_js/app' + path));
   }
@@ -159,6 +161,9 @@ function appNgTranslate() {
   log(colors.green('Building App translation file...'));
 
   return gulp.src('www/i18n/locale-*.json')
+    .pipe(jsonlint())
+    .pipe(jsonlint.reporter())
+    .pipe(sort())
     .pipe(ngTranslate({standalone:true, module: 'cesium.translations'}))
     .pipe(gulp.dest('www/dist/dist_js/app'));
 }
@@ -166,7 +171,7 @@ function appNgTranslate() {
 function appLicense() {
   log(colors.green('Building License files...'));
 
-  return es.concat(
+  return merge(
     // Copy license into HTML
     gulp.src(paths.license_md)
       .pipe(markdown())
@@ -188,6 +193,7 @@ function pluginNgTemplate() {
   log(colors.green('Building Plugins template file...'));
 
   return gulp.src(paths.templatecache_plugin)
+    .pipe(sort())
     .pipe(templateCache({
       standalone:true,
       module:"cesium.plugins.templates",
@@ -204,7 +210,8 @@ function pluginNgAnnotate(event) {
     path = path.substring(0, path.lastIndexOf('/'));
     return gulp.src(event.path)
       .pipe(ngAnnotate({single_quotes: true}))
-      .pipe(gulp.dest('./www/dist/dist_js/app' + path));
+      .pipe(gulp.dest('./www/dist/dist_js/app' + path))
+      ;
   }
 
   log(colors.green('Building Plugins JS file...'));
@@ -217,27 +224,36 @@ function pluginNgTranslate() {
   log(colors.green('Building Plugins translation file...'));
 
   return gulp.src(paths.ng_translate_plugin)
+    .pipe(jsonlint())
+    .pipe(jsonlint.reporter())
+    .pipe(sort())
     .pipe(ngTranslate({standalone:true, module: 'cesium.plugins.translations'}))
     .pipe(gulp.dest('www/dist/dist_js/plugins'));
 }
 
+function pluginLeafletImages(dest) {
+  dest = dest || './www/img/';
+  // Leaflet images
+  return gulp.src(['scss/leaflet/images/*.*',
+    'www/lib/leaflet/dist/images/*.*',
+    'www/lib/leaflet-search/images/*.*',
+    '!www/lib/leaflet-search/images/back.png',
+    '!www/lib/leaflet-search/images/leaflet-search.jpg',
+    'www/lib/leaflet.awesome-markers/dist/images/*.*'])
+    .pipe(gulp.dest(dest));
+}
+
 function pluginSass() {
   log(colors.green('Building Plugins Sass...'));
 
-  return es.concat(
+  return merge(
 
     // Copy plugins CSS
     gulp.src(paths.css_plugin)
       .pipe(gulp.dest('www/dist/dist_css/plugins')),
 
     // Leaflet images
-    gulp.src(['scss/leaflet/images/*.*',
-      'www/lib/leaflet/dist/images/*.*',
-      'www/lib/leaflet-search/images/*.*',
-      '!www/lib/leaflet-search/images/back.png',
-      '!www/lib/leaflet-search/images/leaflet-search.jpg',
-      'www/lib/leaflet.awesome-markers/dist/images/*.*'])
-      .pipe(gulp.dest('./www/img/')),
+    pluginLeafletImages('./www/img/'),
 
     // Leaflet App style
     gulp.src('./scss/leaflet.app.scss')
@@ -251,7 +267,8 @@ function pluginSass() {
       .pipe(base64({
         baseDir: "./www/css/",
         extensions: ['png', 'gif', /\.jpg#datauri$/i],
-        maxImageSize: 14 * 1024
+        maxImageSize: 14 * 1024,
+        deleteAfterEncoding: false
       }))
       .pipe(gulp.dest('./www/css/'))
       .pipe(cleanCss({
@@ -268,17 +285,16 @@ function pluginSass() {
 
 function webClean() {
   return del([
-    './dist/web/www',
-    './dist/web/ext',
-    './dist/web/build'
+    './dist/web/www'
   ]);
 }
 
 function webCopyFiles() {
   log(colors.green('Preparing dist/web files...'));
+  let htmlminOptions = {removeComments: true, collapseWhitespace: true};
 
   var tmpPath = './dist/web/www';
-  return es.merge(
+  return merge(
     // Copy Js (and remove unused code)
     gulp.src('./www/js/**/*.js')
       .pipe(removeCode({"no-device": true}))
@@ -290,7 +306,7 @@ function webCopyFiles() {
       .pipe(removeCode({"no-device": true}))
       .pipe(removeHtml('.hidden-no-device'))
       .pipe(removeHtml('[remove-if][remove-if="no-device"]'))
-      .pipe(htmlmin())
+      .pipe(htmlmin(htmlminOptions))
       .pipe(gulp.dest(tmpPath + '/templates')),
 
     // Copy index.html (and remove unused code)
@@ -298,15 +314,7 @@ function webCopyFiles() {
       .pipe(removeCode({'no-device': true}))
       .pipe(removeHtml('.hidden-no-device'))
       .pipe(removeHtml('[remove-if][remove-if="no-device"]'))
-      .pipe(htmlmin())
-      .pipe(gulp.dest(tmpPath)),
-
-    // Copy index.html to debug.html (and remove unused code)
-    gulp.src('./www/index.html')
-      .pipe(removeCode({'no-device': true}))
-      .pipe(removeHtml('.hidden-no-device'))
-      .pipe(removeHtml('[remove-if][remove-if="no-device"]'))
-      .pipe(rename("debug.html"))
+      .pipe(htmlmin(/*no options, to keep comments*/))
       .pipe(gulp.dest(tmpPath)),
 
     // Copy API index.html
@@ -317,14 +325,6 @@ function webCopyFiles() {
       .pipe(htmlmin())
       .pipe(gulp.dest(tmpPath + '/api')),
 
-    // Copy API index.html
-    gulp.src('./www/api/index.html')
-      .pipe(removeCode({'no-device': true}))
-      .pipe(removeHtml('.hidden-no-device'))
-      .pipe(removeHtml('[remove-if][remove-if="no-device"]'))
-      .pipe(rename("debug.html"))
-      .pipe(gulp.dest(tmpPath + '/api')),
-
     // Copy fonts
     gulp.src('./www/fonts/**/*.*')
       .pipe(gulp.dest(tmpPath + '/fonts')),
@@ -335,6 +335,9 @@ function webCopyFiles() {
 
     // Copy i18n
     gulp.src('./www/i18n/locale-*.json')
+      .pipe(jsonlint())
+      .pipe(jsonlint.reporter())
+      .pipe(sort())
       .pipe(ngTranslate({standalone:true, module: 'cesium.translations'}))
       .pipe(gulp.dest(tmpPath + '/js')),
 
@@ -346,12 +349,8 @@ function webCopyFiles() {
     gulp.src('./www/manifest.json')
       .pipe(gulp.dest(tmpPath)),
 
-    // Copy feed*.json
-    //gulp.src('./www/feed*.json')
-    //  .pipe(gulp.dest(tmpPath)),
-
-    // Copy lib
-    gulp.src('./www/lib/**/*.*')
+    // Copy lib (JS, CSS and fonts)
+    gulp.src(['./www/lib/**/*.js', './www/lib/**/*.css', './www/lib/**/fonts/**/*.*'])
       .pipe(gulp.dest(tmpPath + '/lib')),
 
     // Copy license into HTML
@@ -372,6 +371,7 @@ function webCopyFiles() {
 function webNgTemplate() {
   var tmpPath = './dist/web/www';
   return gulp.src(tmpPath + '/templates/**/*.html')
+    .pipe(sort())
     .pipe(templateCache({
       standalone:true,
       module:"cesium.templates",
@@ -380,7 +380,7 @@ function webNgTemplate() {
     .pipe(gulp.dest(tmpPath + '/dist/dist_js/app'));
 }
 
-function webNgAnnotate() {
+function webAppNgAnnotate() {
   var tmpPath = './dist/web/www';
   var jsFilter = filter(["**/*.js", "!**/vendor/*"]);
 
@@ -391,8 +391,8 @@ function webNgAnnotate() {
 }
 
 function webPluginCopyFiles() {
-  var tmpPath = './dist/web/www';
-  return es.merge(
+  const tmpPath = './dist/web/www';
+  return merge(
     // Copy Js (and remove unused code)
     gulp.src('./www/plugins/**/*.js')
       .pipe(removeCode({"no-device": true}))
@@ -409,18 +409,30 @@ function webPluginCopyFiles() {
 
     // Transform i18n into JS
     gulp.src(paths.ng_translate_plugin)
+      .pipe(jsonlint())
+      .pipe(jsonlint.reporter())
+      .pipe(sort())
       .pipe(ngTranslate({standalone:true, module: 'cesium.plugins.translations'}))
       .pipe(gulp.dest(tmpPath + '/dist/dist_js/plugins')),
 
-    // Copy CSS
+    // Copy plugin CSS
     gulp.src(paths.css_plugin)
-      .pipe(gulp.dest(tmpPath + '/dist/dist_css/plugins'))
+      .pipe(gulp.dest(tmpPath + '/dist/dist_css/plugins')),
+
+    // Copy Leaflet images
+    pluginLeafletImages(tmpPath + '/img'),
+
+    // Copy Leaflet CSS
+    gulp.src('./www/css/**/leaflet.*')
+      .pipe(gulp.dest(tmpPath + '/css'))
+
   );
 }
 
 function webPluginNgTemplate() {
   var tmpPath = './dist/web/www';
   return gulp.src(tmpPath + '/plugins/**/*.html')
+    .pipe(sort())
     .pipe(templateCache({
       standalone:true,
       module:"cesium.plugins.templates",
@@ -436,171 +448,225 @@ function webPluginNgAnnotate() {
     .pipe(gulp.dest(tmpPath + '/dist/dist_js/plugins'));
 }
 
-function webDebugFile() {
-  log(colors.green('Building debug.html file...'));
-  const tmpPath = './dist/web/www';
-  return gulp.src(tmpPath + '/debug.html')
-    .pipe(useref())             // Concatenate with gulp-useref
-    .pipe(gulp.dest(tmpPath));
-}
+function webUglify(done) {
+  const wwwPath = './dist/web/www';
+  const enableUglify = argv.release || argv.uglify || false;
+  const version = JSON.parse(fs.readFileSync('./package.json', 'utf8')).version;
+
+  if (enableUglify) {
 
-function webUglify() {
-  log(colors.green('Optimizing JS and CSS files...'));
-
-  const wwwPath = './dist/web/www';
-  const jsFilter = filter(["**/*.js", '!**/config.js'], { restore: true });
-  const cssFilter = filter("**/*.css", { restore: true });
-  const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true });
-  const uglifyOptions = {
-    toplevel: true,
-    warnings: true,
-    compress: {
-      global_defs: {
-        "@console.log": "alert"
+    log(colors.green('Minify JS and CSS files...'));
+
+    const indexFilter = filter('**/index.html', {restore: true});
+    const jsFilter = filter(["**/*.js", '!**/config.js'], {restore: true});
+    const cssFilter = filter("**/*.css", {restore: true});
+    const uglifyOptions = {
+      toplevel: true,
+      warnings: true,
+      mangle: {
+        reserved: ['qrcode', 'Base58']
+      },
+      compress: {
+        global_defs: {
+          "@console.log": "alert"
+        },
+        passes: 2
       },
-      passes: 2
-    },
-    output: {
-      beautify: false,
-      preamble: "/* minified */",
-      max_line_len: 120000
-    }
-  };
+      output: {
+        beautify: false,
+        preamble: "/* minified */",
+        max_line_len: 120000
+      }
+    };
+
+    // Process index.html
+    return gulp.src(wwwPath + '/index.html')
+      .pipe(useref({}, lazypipe().pipe(sourcemaps.init, { loadMaps: true })))  // Concatenate with gulp-useref
+
+      // Process JS
+      .pipe(jsFilter)
+      .pipe(uglify(uglifyOptions)) // Minify javascript files
+      .pipe(jsFilter.restore)
+
+      // Process CSS
+      .pipe(cssFilter)
+      .pipe(csso())               // Minify any CSS sources
+      .pipe(cssFilter.restore)
+
+      // Add version to file path
+      .pipe(indexFilter)
+      .pipe(replace(/"(dist_js\/[a-zA-Z0-9]+).js"/g, '"$1.js?v=' + version + '"'))
+      .pipe(replace(/"(dist_css\/[a-zA-Z0-9]+).css"/g, '"$1.css?v=' + version + '"'))
+      .pipe(indexFilter.restore)
+
+      .pipe(sourcemaps.write('maps'))
+
+      .pipe(gulp.dest(wwwPath))
+      .on('end', done);
+  }
 
-  // Process index.html
-  return gulp.src(wwwPath + '/index.html')
-    .pipe(useref())             // Concatenate with gulp-useref
+  if (done) done();
+}
 
-    // Process JS
-    .pipe(jsFilter)
-    .pipe(uglify(uglifyOptions)) // Minify javascript files
-    .pipe(jsFilter.restore)
+function webIntegrity() {
+  const wwwPath = './dist/web/www';
 
-    // Process CSS
-    .pipe(cssFilter)
-    .pipe(csso())               // Minify any CSS sources
-    .pipe(cssFilter.restore)
+  log(colors.green('Add integrity hash to <script src> tag...'));
 
-    // Add revision to filename  (but not index.html and config.js)
-    .pipe(revFilesFilter)
-    .pipe(rev())                // Rename the concatenated files
-    .pipe(revFilesFilter.restore)
+  // Process index.html
+  return gulp.src(wwwPath + '/index.html', {base: wwwPath})
 
-    .pipe(revReplace())         // Substitute in new filenames
+    // Add an integrity hash
+    .pipe(sriHash())
+    .pipe(rename({ extname: '.integrity.html' }))
     .pipe(gulp.dest(wwwPath));
 }
 
-function webApiDebugFile() {
-  log(colors.green('API: Building debug.html...'));
+function webApiUglify() {
+  const tmpPath = './dist/web/www';
+  const version = JSON.parse(fs.readFileSync('./package.json', 'utf8')).version;
 
-  var tmpPath = './dist/web/www';
-  var debugFilter = filter('**/debug.html', { restore: true });
+  const jsFilter = filter(["**/*.js", '!**/config.js'], {restore: true});
+  const cssFilter = filter("**/*.css", {restore: true});
+  const indexFilter = filter('**/index.html', {restore: true});
+
+  // Skip if not required
+  const enableUglify = argv.release || argv.useref || argv.uglify || false;
+  if (enableUglify) {
+    log(colors.green('API: Minify JS and CSS files...'));
+    const uglifyOptions = {
+      toplevel: true,
+      warnings: true,
+      compress: {
+        global_defs: {
+          "@console.log": "alert"
+        },
+        passes: 2
+      },
+      output: {
+        beautify: false,
+        preamble: "/* minified */",
+        max_line_len: 120000
+      }
+    };
 
-  return gulp.src(tmpPath + '/*/debug.html')
-    .pipe(useref())             // Concatenate with gulp-useref
+    // Process api/index.html
+    return gulp.src(tmpPath + '/*/index.html')
 
-    .pipe(debugFilter)
-    .pipe(replace("dist_js", "../dist_js"))
-    .pipe(replace("dist_css", "../dist_css"))
-    .pipe(replace("config.js", "../config.js"))
-    .pipe(debugFilter.restore)
+      .pipe(useref({}, lazypipe().pipe(sourcemaps.init, { loadMaps: true })))  // Concatenate with gulp-useref
 
-    .pipe(gulp.dest(tmpPath));
-}
+      // Process JS
+      .pipe(jsFilter)
+      .pipe(uglify(uglifyOptions)) // Minify any javascript sources
+      .pipe(jsFilter.restore)
 
-function webApiUglify() {
-  log(colors.green('API: Optimizing JS and CSS files...'));
-  const tmpPath = './dist/web/www';
-  const jsFilter = filter(["**/*.js", '!**/config.js'], { restore: true });
-  const cssFilter = filter("**/*.css", { restore: true });
-  const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true });
-  const indexFilter = filter('**/index.html', { restore: true });
-  const uglifyOptions = {
-    toplevel: true,
-    warnings: true,
-    compress: {
-      global_defs: {
-        "@console.log": "alert"
-      },
-      passes: 2
-    },
-    output: {
-      beautify: false,
-      preamble: "/* minified */",
-      max_line_len: 120000
-    }
-  };
-
-  // Process api/index.html
-  return gulp.src(tmpPath + '/*/index.html')
-    .pipe(useref())             // Concatenate with gulp-useref
-
-    // Process JS
-    .pipe(jsFilter)
-    .pipe(uglify(uglifyOptions)) // Minify any javascript sources
-    .pipe(jsFilter.restore)
+      // Process CSS
+      .pipe(cssFilter)
+      .pipe(csso())               // Minify any CSS sources
+      .pipe(cssFilter.restore)
+
+      .pipe(indexFilter)
 
-    // Process CSS
-    .pipe(cssFilter)
-    .pipe(csso())               // Minify any CSS sources
-    .pipe(cssFilter.restore)
+      // Add version to files path
+      .pipe(replace(/"(dist_js\/[a-zA-Z0-9-.]+).js"/g, '"$1.js?v=' + version + '"'))
+      .pipe(replace(/"(dist_css\/[a-zA-Z0-9-.]+).css"/g, '"$1.css?v=' + version + '"'))
 
-    // Add revision to filename  (but not index.html and config.js)
-    .pipe(revFilesFilter)
-    .pipe(rev())                // Rename the concatenated files
-    .pipe(revFilesFilter.restore)
+      .pipe(replace("dist_js", "../dist_js"))
+      .pipe(replace("dist_css", "../dist_css"))
+      .pipe(replace("config.js", "../config.js"))
+      .pipe(indexFilter.restore)
 
-    .pipe(revReplace())         // Substitute in new filenames
+      .pipe(sourcemaps.write('maps'))
 
-    .pipe(indexFilter)
-    .pipe(replace("dist_js", "../dist_js"))
-    .pipe(replace("dist_css", "../dist_css"))
-    .pipe(replace("config.js", "../config.js"))
-    .pipe(indexFilter.restore)
+      .pipe(gulp.dest(tmpPath));
+  }
 
-    .pipe(gulp.dest(tmpPath));
+  else {
+    log(colors.red('API: Minify JS and CSS files. Skip') + colors.grey(' (missing options --release or --uglify)'));
+
+    return gulp.src(tmpPath + '/*/index.html')
+      .pipe(useref())             // Concatenate with gulp-useref
+
+      .pipe(indexFilter)
+      .pipe(replace("dist_js", "../dist_js"))
+      .pipe(replace("dist_css", "../dist_css"))
+      .pipe(replace("config.js", "../config.js"))
+      .pipe(indexFilter.restore)
+
+      .pipe(gulp.dest(tmpPath));
+  }
 }
 
-function webCleanUnusedFiles() {
+function webCleanUnusedFiles(done) {
   log(colors.green('Clean unused files...'));
+  const cleanSources = argv.release || argv.uglify || false;
 
   const wwwPath = './dist/web/www';
 
-  return es.concat(
-    // Clean core JS + CSS
-    gulp.src(wwwPath + '/js/**/*.js', {read: false})
-      .pipe(clean()),
-    gulp.src(wwwPath + '/css/**/*.css', {read: false})
-      .pipe(clean()),
-
-    // Clean plugins JS + CSS
-    gulp.src(wwwPath + '/plugins/**/*.js', {read: false})
-      .pipe(clean()),
-    gulp.src(wwwPath + '/plugins/**/*.css', {read: false})
-      .pipe(clean())
-  );
+  if (cleanSources) {
+    return merge(
+      // Clean core JS + CSS
+      gulp.src(wwwPath + '/js/**/*.js', {read: false})
+        .pipe(clean()),
+      gulp.src(wwwPath + '/css/**/*.css', {read: false})
+        .pipe(clean()),
+
+      // Clean plugins JS + CSS
+      gulp.src(wwwPath + '/plugins/**/*.js', {read: false})
+        .pipe(clean()),
+      gulp.src(wwwPath + '/plugins/**/*.css', {read: false})
+        .pipe(clean()),
+
+      // Unused maps/config.js.map
+      gulp.src(wwwPath + '/maps/config.js.map', {read: false, allowEmpty: true})
+        .pipe(clean())
+    )
+      .on('end', done);
+  }
+
+  if (done) done();
 }
 
 
 function webCleanUnusedDirectories() {
   log(colors.green('Clean unused directories...'));
+  const enableUglify = argv.release || argv.uglify || false;
 
   // Clean dir
   const wwwPath = './dist/web/www';
-  return del.sync([
+
+  let patterns = [
+    wwwPath + '/templates',
+    wwwPath + '/js',
+    wwwPath + '/plugins'
+  ];
+
+  if (enableUglify) {
+    patterns = patterns.concat([
       wwwPath + '/css',
-      wwwPath + '/templates',
-      wwwPath + '/js',
-      wwwPath + '/plugins',
       wwwPath + '/dist',
       wwwPath + '/lib/*',
+      //  Keep IonIcons font
       '!' + wwwPath + '/lib/ionic',
-      '!' + wwwPath + '/lib/robotodraft',
       wwwPath + '/lib/ionic/*',
       '!' + wwwPath + '/lib/ionic/fonts',
+
+      //  Keep RobotoDraft font
+      '!' + wwwPath + '/lib/robotodraft',
       wwwPath + '/lib/robotodraft/*',
       '!' + wwwPath + '/lib/robotodraft/fonts'
     ]);
+  }
+  else {
+    patterns = patterns.concat([
+      wwwPath + '/dist_css',
+      wwwPath + '/dist_js'
+    ]);
+  }
+
+  return gulp.src(patterns, {read: false})
+    //.pipe(debug({title: 'deleting '}))
+    .pipe(clean());
 }
 
 function webZip() {
@@ -620,13 +686,13 @@ function webZip() {
     .pipe(gulp.dest('./dist/web/build'));
 }
 
-function webExtensionClean() {
+function webExtClean() {
   return del([
     './dist/web/ext'
   ]);
 }
 
-function webExtensionCopyFiles() {
+function webExtCopyFiles() {
   const wwwPath = './dist/web/www';
   const resourcesPath = './resources/web-ext';
   log(colors.green('Copy web extension files...'));
@@ -639,45 +705,31 @@ function webExtensionCopyFiles() {
   return gulp.src([
     wwwPath + '/**/*',
 
-    // Remove API
+    // Skip API files
     '!' + wwwPath + '/api',
+    '!' + wwwPath + '/dist_js/*-api.js',
+    '!' + wwwPath + '/dist_css/*-api.css',
+    '!' + wwwPath + '/maps/dist_js/*-api.js.map',
+    '!' + wwwPath + '/maps/dist_css/*-api.css.map',
 
-    // Remove JS debug files
-    wwwPath + '/dist_js/*.*',
-    '!' + wwwPath + '/dist_js/cesium.js',
-    '!' + wwwPath + '/dist_js/vendor.js',
-    '!' + wwwPath + '/dist_js/cesium-api*.js',
-    '!' + wwwPath + '/dist_js/vendor-api*.js',
-
-    // Remove CSS debug files
-    wwwPath + '/dist_css/*.*',
-    '!' + wwwPath + '/dist_css/cesium.css',
-    '!' + wwwPath + '/dist_css/cesium-api*.css',
-
-    // Remove HTML debug files
-    wwwPath + '/api/*',
-    '!' + wwwPath + '/api/debug.html',
-    '!' + wwwPath + '/debug.html',
-
-    // Remove unused files (feed.json) in extension
-    '!' + wwwPath + '/feed*.json',
+    // Skip web manifest
+    '!' + wwwPath + '/manifest.json',
 
     // Add specific resource (and overwrite the default 'manifest.json')
-    '!' + wwwPath + '/manifest.json',
     resourcesPath + '/**/*.*'
-   ])
+  ])
 
-    // Process TXT files: Add the UTF-8 BOM character
-    .pipe(txtFilter)
-    .pipe(header('\ufeff'))
-    .pipe(txtFilter.restore)
+  // Process TXT files: Add the UTF-8 BOM character
+  .pipe(txtFilter)
+  .pipe(header('\ufeff'))
+  .pipe(txtFilter.restore)
 
-    // Replace version in 'manifest.json' file
-    .pipe(manifestFilter)
-    .pipe(replace(/\"version\": \"[^\"]*\"/, '"version": "' + version + '"'))
-    .pipe(manifestFilter.restore)
+  // Replace version in 'manifest.json' file
+  .pipe(manifestFilter)
+  .pipe(replace(/\"version\": \"[^\"]*\"/, '"version": "' + version + '"'))
+  .pipe(manifestFilter.restore)
 
-    .pipe(gulp.dest('./dist/web/ext'));
+  .pipe(gulp.dest('./dist/web/ext'));
 }
 
 function webExtensionZip() {
@@ -692,67 +744,99 @@ function webExtensionZip() {
 
 function webBuildSuccess(done) {
   var version = JSON.parse(fs.readFileSync('./package.json', 'utf8')).version;
-  log(colors.green("Web artifacts created at: 'dist/web/build/cesium-v" + version + "-web.zip' and 'dist/web/build/cesium-v" + version + "-extension.zip'"));
-  done();
+  log(colors.green("Web artifact created at: 'dist/web/build/cesium-v" + version + "-web.zip'"));
+  if (done) done();
+}
+
+function webExtBuildSuccess(done) {
+  var version = JSON.parse(fs.readFileSync('./package.json', 'utf8')).version;
+  log(colors.green("Web extension artifact created at: 'dist/web/build/cesium-v" + version + "-extension.zip'"));
+  if (done) done();
+}
+
+function help() {
+  log(colors.green("Usage: gulp {config|webBuild|webExtBuild} OPTIONS"));
+  log(colors.green(""));
+  log(colors.green("NAME"));
+  log(colors.green(""));
+  log(colors.green("  config --env <config_name>  Configure environment (create file `www/config.js`). "));
+  log(colors.green("  build                       Build from sources (CSS and JS)"));
+  log(colors.green("  webBuild                    Build ZIP artifact"));
+  log(colors.green("  webExtBuild                 Build web extension artifact (browser module)"));
+  log(colors.green(""));
+  log(colors.green("OPTIONS"));
+  log(colors.green(""));
+  log(colors.green("  --release                   Release build (with uglify and sourcemaps)"));
+  log(colors.green("  --uglify                    Build using uglify plugin"));
 }
 
 /* --------------------------------------------------------------------------
-   -- Define gulp public tasks
+   -- Combine task
    --------------------------------------------------------------------------*/
+const translate = gulp.series(appNgTranslate, pluginNgTranslate);
+const template = gulp.series(appNgTemplate, pluginNgTemplate);
+const appAndPluginSass = gulp.series(appSass, pluginSass);
+const app = gulp.series(appSass, appNgTemplate, appNgAnnotate, appNgTranslate);
+const plugin = gulp.series(pluginSass, pluginNgTemplate, pluginNgAnnotate, pluginNgTranslate);
+const build = gulp.series(appLicense, app, plugin);
+
+const webApp = gulp.series(appSass, webCopyFiles, webNgTemplate, webAppNgAnnotate);
+const webPlugin = gulp.series(pluginSass, webPluginCopyFiles, webPluginNgTemplate, webPluginNgAnnotate);
+const webCompile = gulp.series(
+  webClean,
+  webApp,
+  webPlugin,
+  webUglify,
+  webIntegrity,
+  webApiUglify,
+  webCleanUnusedFiles,
+  webCleanUnusedDirectories
+);
+
+// note : Do not call config, to keep same config between web and webExt artifacts
+const webBuild = gulp.series(
+  webClean,
+  webCompile,
+  webZip,
+  webBuildSuccess
+);
+const webExtCompile = gulp.series(
+  webExtClean,
+  webCompile,
+  webExtCopyFiles
+);
+
+// note : Do not call config, to keep same config between web and webExt artifacts
+const webExtBuild = gulp.series(
+  webExtCompile,
+  webExtensionZip,
+  webExtBuildSuccess
+);
 
-gulp.task('appSass', [], appSass);
-gulp.task('appNgTemplate', [], appNgTemplate);
-gulp.task('appNgAnnotate', [], appNgAnnotate);
-gulp.task('appNgTranslate', [], appNgTranslate);
-gulp.task('app', ['appSass', 'appNgTemplate', 'appNgAnnotate', 'appNgTranslate']);
-
-gulp.task('pluginSass', [], pluginSass);
-gulp.task('pluginNgTemplate', [], pluginNgTemplate);
-gulp.task('pluginNgAnnotate', [], pluginNgAnnotate);
-gulp.task('pluginNgTranslate', [], pluginNgTranslate);
-gulp.task('plugin', ['pluginSass', 'pluginNgTemplate', 'pluginNgAnnotate', 'pluginNgTranslate']);
-
-gulp.task('config', [], appConfig);
-gulp.task('license', [], appLicense);
-gulp.task('translate', ['appNgTranslate', 'pluginNgTranslate']);
-gulp.task('template', ['appNgTemplate', 'pluginNgTemplate']);
-gulp.task('annotate', ['appNgAnnotate', 'pluginNgAnnotate']);
-gulp.task('watch', [], appAndPluginWatch);
-
-
-gulp.task('build', [
-  'license',
-  'sass',
-  'app',
-  'plugin'
-]);
-
-gulp.task('ionic:serve:before', ['build', 'watch'], done => done());
-gulp.task('sass', ['license', 'appSass', 'pluginSass'], done => done());
-gulp.task('default', ['config', 'build'], done => done());
-
-gulp.task('webClean', [], webClean);
-gulp.task('webCopyFiles', ['config', 'sass', 'webClean'], webCopyFiles);
-gulp.task('webNgTemplate', ['webCopyFiles'], webNgTemplate);
-gulp.task('webNgAnnotate', ['webNgTemplate'], webNgAnnotate);
-
-gulp.task('webPluginCopyFiles', ['webNgAnnotate'], webPluginCopyFiles);
-gulp.task('webPluginNgTemplate', ['webPluginCopyFiles'], webPluginNgTemplate);
-gulp.task('webPluginNgAnnotate', ['webPluginNgTemplate'],  webPluginNgAnnotate);
-
-gulp.task('webDebugFile', ['webPluginNgAnnotate'], webDebugFile);
-gulp.task('webUglify', ['webDebugFile'], webUglify);
-gulp.task('webApiDebugFile', ['webUglify'], webApiDebugFile);
-gulp.task('webApiUglify', ['webApiDebugFile'], webApiUglify);
-
-gulp.task('webCleanUnusedFiles', ['webApiUglify'], webCleanUnusedFiles);
-gulp.task('webCleanUnusedDirectories', ['webCleanUnusedFiles'], webCleanUnusedDirectories);
-gulp.task('webZip', ['webCleanUnusedDirectories'], webZip);
-
-gulp.task('webExtensionClean', [], webExtensionClean);
-gulp.task('webExtensionCopyFiles', ['webExtensionClean', 'webCleanUnusedDirectories'], webExtensionCopyFiles);
-gulp.task('webExtensionZip', ['webExtensionCopyFiles'], webExtensionZip);
-
-gulp.task('webBuild', ['webZip', 'webExtensionZip'], webBuildSuccess);
-gulp.task('build:web', ['webBuild']); // = webBuild
+/* --------------------------------------------------------------------------
+   -- Define gulp public tasks
+   --------------------------------------------------------------------------*/
 
+exports.help = help;
+exports.config = appConfig;
+exports.license = appLicense;
+exports.sass = appAndPluginSass;
+exports.translate = translate;
+exports.template = template;
+exports.annotate = appNgAnnotate;
+exports.watch = appAndPluginWatch;
+exports.build = build;
+
+exports.webCompile = webCompile;
+exports.webBuild = webBuild;
+exports['build:web'] = exports.webBuild; // Alias
+
+exports.webExtClean = webExtClean;
+exports.webExtCompile = webExtCompile;
+exports.webExtBuild = webExtBuild;
+exports.webExtCopyFiles = webExtCopyFiles;
+exports['build:webExt'] = exports.webBuild; // Alias
+
+exports.default = gulp.series(appConfig, build);
+exports.serveBefore = gulp.series(build, appAndPluginWatch);
+exports['ionic:serve:before'] = exports.serveBefore; // Alias need need by @ionic/cli
diff --git a/hooks/README.md b/hooks/README.md
index d2563eab17fd4c8f0c387e24b8c8cabfe2a02a0e..136c6793ded1f5ad3c7fe93ba12608263dbae27e 100755
--- a/hooks/README.md
+++ b/hooks/README.md
@@ -1,83 +1,3 @@
-<!--
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#  KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
--->
 # Cordova Hooks
 
-This directory may contain scripts used to customize cordova commands. This
-directory used to exist at `.cordova/hooks`, but has now been moved to the
-project root. Any scripts you add to these directories will be executed before
-and after the commands corresponding to the directory name. Useful for
-integrating your own build systems or integrating with version control systems.
-
-__Remember__: Make your scripts executable.
-
-## Hook Directories
-The following subdirectories will be used for hooks:
-
-    after_build/
-    after_compile/
-    after_docs/
-    after_emulate/
-    after_platform_add/
-    after_platform_rm/
-    after_platform_ls/
-    after_plugin_add/
-    after_plugin_ls/
-    after_plugin_rm/
-    after_plugin_search/
-    after_prepare/
-    after_run/
-    after_serve/
-    before_build/
-    before_compile/
-    before_docs/
-    before_emulate/
-    before_platform_add/
-    before_platform_rm/
-    before_platform_ls/
-    before_plugin_add/
-    before_plugin_ls/
-    before_plugin_rm/
-    before_plugin_search/
-    before_prepare/
-    before_run/
-    before_serve/
-    pre_package/ <-- Windows 8 and Windows Phone only.
-
-## Script Interface
-
-All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables:
-
-* CORDOVA_VERSION - The version of the Cordova-CLI.
-* CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios).
-* CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer)
-* CORDOVA_HOOK - Path to the hook that is being executed.
-* CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate)
-
-If a script returns a non-zero exit code, then the parent cordova command will be aborted.
-
-
-## Writing hooks
-
-We highly recommend writting your hooks using Node.js so that they are
-cross-platform. Some good examples are shown here:
-
-[http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/)
-
+Cordova Hooks represent special scripts which could be added by application and plugin developers or even by your own build system  to customize cordova commands. See Hooks Guide for more details:  http://cordova.apache.org/docs/en/edge/guide_appdev_hooks_index.md.html#Hooks%20Guide.
\ No newline at end of file
diff --git a/hooks/after_prepare/020_remove_code.js b/hooks/after_prepare/020_remove_code.js
index c6f738990a15f55c82a606acc7137e34e006ed21..bfc0b0bffab614dd74c9c8bd0a9224e99812f82f 100755
--- a/hooks/after_prepare/020_remove_code.js
+++ b/hooks/after_prepare/020_remove_code.js
@@ -67,7 +67,7 @@ if (rootdir) {
           .pipe(removeHtml('.hidden-xs.hidden-sm'))
           .pipe(removeHtml('.hidden-device'))
           .pipe(removeHtml('[remove-if][remove-if="device"]'))
-          .pipe(htmlmin(/*no options, to build comments*/))
+          .pipe(htmlmin(/*no options, to keep comments*/))
           .pipe(gulp.dest(wwwPath)),
 
         // Remove unused JS code + add ng annotations
diff --git a/hooks/after_prepare/040_useref.js b/hooks/after_prepare/040_useref.js
index aa76925532dd2c62c1f3d731a0f9d2e69a553df9..0b8d93dccdfc086febb8634d25114846721571fb 100755
--- a/hooks/after_prepare/040_useref.js
+++ b/hooks/after_prepare/040_useref.js
@@ -7,8 +7,6 @@ const gulp = require('gulp'),
   filter = require('gulp-filter'),
   uglify = require('gulp-uglify-es').default,
   csso = require('gulp-csso'),
-  rev = require('gulp-rev'),
-  revReplace = require('gulp-rev-replace'),
   log = require('fancy-log'),
   colors = require('ansi-colors');
 
@@ -42,13 +40,15 @@ if (rootdir && !skip) {
 
     let indexPath = path.join(wwwPath, 'index.html');
 
-    const jsFilter = filter(["**/*.js", "!**/vendor/*", '!**/config.js'], { restore: true });
-    const cssFilter = filter("**/*.css", { restore: true });
-    const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true });
+    const jsFilter = filter(['*/lib/**/*.js', '*/js/vendor/**/*.js'], { restore: true });
+    const cssFilter = filter('**/*.css', { restore: true });
     const uglifyOptions = {
       toplevel: true,
       warnings: true,
-      ecma: '2015',
+      ecma: '5',
+      mangle: {
+        reserved: ['qrcode', 'Base58']
+      },
       compress: {
         global_defs: {
           "@console.log": "alert"
@@ -66,16 +66,15 @@ if (rootdir && !skip) {
     es.concat(
       gulp.src(indexPath)
         .pipe(useref())      // Concatenate with gulp-useref
+
         .pipe(jsFilter)
         .pipe(uglify(uglifyOptions)) // Minify any javascript sources
         .pipe(jsFilter.restore)
+
         .pipe(cssFilter)
         .pipe(csso())               // Minify any CSS sources
         .pipe(cssFilter.restore)
-        .pipe(revFilesFilter)
-        .pipe(rev())                // Rename the concatenated files (but not index.html)
-        .pipe(revFilesFilter.restore)
-        .pipe(revReplace())         // Substitute in new filenames
+
         .pipe(gulp.dest(wwwPath))
      );
   }
diff --git a/hooks/after_prepare/060_prepare_android_manifest.js b/hooks/after_prepare/060_prepare_android_manifest.js
index b2c3b7bd1f8e748457574febc5767897bef12bb5..fb6e20a198214d8de118ccfeaa6ca639f2867d7a 100755
--- a/hooks/after_prepare/060_prepare_android_manifest.js
+++ b/hooks/after_prepare/060_prepare_android_manifest.js
@@ -15,7 +15,7 @@ if (rootdir) {
 
     let platform = platforms[x].trim().toLowerCase();
 
-    if(platform == 'android') {
+    if(platform = 'android') {
       let platformPath = path.join(rootdir, 'platforms', platform);
       let androidManifestFile = path.join(platformPath, 'AndroidManifest.xml');
 
@@ -27,11 +27,16 @@ if (rootdir) {
         // Add 'tools' namespace to root tag
         .pipe(replace(/(xmlns:android="http:\/\/schemas.android.com\/apk\/res\/android")\s*>/g, '$1 xmlns:tools="http://schemas.android.com/tools">'))
 
+        // Add <application> (replace 'targetSdkversion' and add tools:overrideLibrary)
+        .pipe(replace(/\s+tools:replace="android:appComponentFactory"/, ''))
+        .pipe(replace(/\s+android:appComponentFactory="[^"]+"/, ''))
+        .pipe(replace(/(\s*<application)\s*/, '$1 tools:replace="android:appComponentFactory" android:appComponentFactory="androidx.core.app.CoreComponentFactory" '))
+
         // remove all <uses-sdk>
         .pipe(replace(/<uses-sdk [^>]+\/>/g, ''))
 
         // add <uses-sdk> (replace 'targetSdkversion' and add tools:overrideLibrary)
-        .pipe(replace(/(<\/manifest>)/, '    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" tools:overrideLibrary="org.kaliumjni.lib" />\n$1'))
+        .pipe(replace(/(<\/manifest>)/, '    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="29" tools:overrideLibrary="org.kaliumjni.lib" />\n$1'))
 
         .pipe(gulp.dest(platformPath));
 
diff --git a/hooks/after_prepare/061_copy_build_extras.js b/hooks/after_prepare/061_copy_build_extras.js
index 695523cdd83dfa485172b8eacc3ab3f27c653288..117a6c8327253d1682835a7fd3923cda58a3b83d 100755
--- a/hooks/after_prepare/061_copy_build_extras.js
+++ b/hooks/after_prepare/061_copy_build_extras.js
@@ -2,7 +2,35 @@
 "use strict";
 const fs = require('fs'),
  glob = require('glob'),
- path = require('path');
+ path = require('path'),
+ log = require('fancy-log'),
+ colors = require('ansi-colors');
+
+function mkdirp(dir) {
+  const parent = path.dirname(dir);
+  if (!fs.existsSync(parent)){
+    mkdirp(parent);
+  }
+  if (!fs.existsSync(dir)){
+    fs.mkdirSync(dir);
+  }
+}
+
+function copyFiles(src_dir, dest_dir) {
+  glob(src_dir + '/**/*.*', null, function(er, files) {
+    files.forEach(function(file) {
+      log(colors.grey(' Copy file ' + file + ' to ' + dest_dir));
+      const dest_file = file.replace(src_dir, dest_dir);
+      mkdirp(path.dirname(dest_file));
+      fs.copyFile(file, dest_file, (err) => {
+        if (err) {
+          log(colors.red(' ERROR: ' + err));
+          throw err;
+        }
+      });
+    });
+  });
+}
 
 // See: https://stackoverflow.com/questions/49162538/running-cordova-build-android-unable-to-find-attribute-androidfontvariation
 
@@ -17,47 +45,34 @@ if (rootdir) {
       const platform = platforms[x].trim().toLowerCase();
 
       if (platform === 'android') {
+        const gradle_dir = rootdir + '/gradle';
         const build_dir = rootdir + '/resources/android/build';
         const android_dir = rootdir + '/platforms/android';
-        const build_files = build_dir + '/**/*.*';
 
-        console.log('-----------------------------------------');
-        if (fs.existsSync(android_dir) && fs.existsSync(build_dir)) {
+        // Copy gradle files
+        if (fs.existsSync(gradle_dir)) {
+          copyFiles(gradle_dir, android_dir + '/gradle')
+        }
 
-          const mkdirp = function(dir) {
-            const parent = path.dirname(dir);
-            if (!fs.existsSync(parent)){
-              mkdirp(parent);
-            }
-            if (!fs.existsSync(dir)){
-              fs.mkdirSync(dir);
-            }
-          };
+        if (fs.existsSync(android_dir) && fs.existsSync(build_dir)) {
 
-          glob(build_files, null, function(er, files) {
-            files.forEach(function(file) {
-              console.log(' Copy ' + file + ' to ' + android_dir);
-              const dest_file = file.replace(build_dir, android_dir);
-              mkdirp(path.dirname(dest_file));
-              fs.createReadStream(file).pipe(fs.createWriteStream(dest_file));
-            });
-          });
+          // Copy resources files
+          copyFiles(build_dir, android_dir);
 
           const gradle_file = build_dir + '/build-extras.gradle';
           if (!fs.existsSync(gradle_file)) {
-            console.log( ' File ' + gradle_file + ' not found. Skipping copy to /platforms/android');
+            log(colors.red(' File ' + gradle_file + 'not found. Skipping copy to ' + android_dir));
           }
 
           const signing_file = build_dir + '/release-signing.properties';
           if (!fs.existsSync(signing_file)) {
-            console.log( ' File ' + signing_file + ' not found. Skipping copy to /platforms/android');
-            console.log( '   WARNING: Release APK files will not be signed !');
+            log(colors.red(' File ' + signing_file + 'not found. Skipping copy to ' + android_dir));
+            log(colors.red('   WARNING: Release APK files will not be signed !'));
           }
 
         } else {
-            console.log( ' Directory ' + build_dir + ' not found. Skipping copy to /platforms/android');
+          log(colors.orange(' Directory ' + build_dir + 'not found. Skipping copy to ' + android_dir));
         }
-        console.log('-----------------------------------------');
       }
     } catch (e) {
       process.stdout.write(e);
diff --git a/hooks/before_prepare/02_jshint.js b/hooks/before_prepare/02_jshint.js
index bb78f76629ee162d366428147ecc61b0a110e8d7..ef7ae48a6d4c37e0764d62d9adc94d2553f9fd6c 100755
--- a/hooks/before_prepare/02_jshint.js
+++ b/hooks/before_prepare/02_jshint.js
@@ -9,75 +9,95 @@ const fs = require('fs'),
  glob = require("glob");
 
 
-// Get folders, from files
-const jsFolders =  glob.sync("www/**/*.js", {nonull: true})
-  // Map to file's folder
-  .map(file => file.substring(0, file.lastIndexOf('/')))
-  // Reduce to a map of folders
-  .reduce((res, folder) => {
-
-    if (folder.indexOf('www/dist/') !== -1 || // Exclude dist js
-      folder.indexOf('/plugins/rml') !== -1 || // Exclude plugin tutorial
-      folder.indexOf('/vendor') // exclude vendor libs
-    ) return res;
-    res[folder] = res[folder] || true;
-    return res;
-  }, {});
-
-// Process each folder with Js file
-Object.keys(jsFolders).forEach(folder => processFiles(folder));
-
 function processFiles(dir) {
-    let errorCount = 0;
-    fs.readdir(dir, function(err, list) {
-        if (err) {
-            log(colors.red('processFiles err: ' + err));
-            return;
-        }
-        async.eachSeries(list, function(file, innercallback) {
-            file = dir + '/' + file;
-            fs.stat(file, function(err, stat) {
-                if(!stat.isDirectory()) {
-                    if(path.extname(file) === ".js") {
-                        lintFile(file, function(hasError) {
-                            if(hasError) {
-                                errorCount++;
-                            }
-                            innercallback();
-                        });
-                    } else {
-                        innercallback();
-                    }
-                } else {
-                    innercallback();
-                }
+  let errorCount = 0;
+  log(colors.grey('Processing folder ' + dir + '...'));
+  fs.readdir(dir, function(err, list) {
+    if (err) {
+      log(colors.red('processFiles err: ' + err));
+      return;
+    }
+    async.eachSeries(list, function(file, innercallback) {
+      file = dir + '/' + file;
+      log(colors.grey('Processing file ./' + file + '...'));
+      fs.stat(file, function(err, stat) {
+        if(!stat.isDirectory()) {
+          if(path.extname(file) === ".js") {
+            lintFile(file, function(hasError) {
+              if(hasError) {
+                errorCount++;
+              }
+              innercallback();
             });
-        }, function(error) {
-            if(errorCount > 0) {
-                process.exit(1);
-            }
-        });
+          } else {
+            innercallback();
+          }
+        } else {
+          innercallback();
+        }
+      });
+    }, function(error) {
+      if(errorCount > 0) {
+        throw error;
+      }
     });
+  });
 }
 
 function lintFile(file, callback) {
-    //log(colors.grey(`Linting ${colors.bold(file)}...`));
-    fs.readFile(file, (err, data) => {
-        if(err) {
-            log(colors.red('Error: ' + err));
-            return;
-        }
-        if(jshint(data.toString())) {
-            callback(false);
-        } else {
-          const out = jshint.data(),
-          errors = out.errors;
-          for(let j = 0; j < errors.length; j++) {
-            log(colors.red(`${colors.bold(file)}:${colors.bold(errors[j].line)} -> ${colors.bold(errors[j].evidence.trim())}`));
-            log(colors.red(` ${errors[j].reason}`));
-          }
-          log('-----------------------------------------');
-          callback(true);
-        }
-    });
+  //log(colors.grey(`Linting ${colors.bold(file)}...`));
+  fs.readFile(file, (err, data) => {
+    if(err) {
+      log(colors.red('Error: ' + err));
+      return;
+    }
+    if(jshint(data.toString())) {
+      callback(false);
+    } else {
+      const out = jshint.data(),
+        errors = out.errors;
+      for(let j = 0; j < errors.length; j++) {
+        log(colors.red(`${colors.bold(file + ':' + errors[j].line + ':0' )} -> ${colors.bold(errors[j].evidence.trim())}`));
+        log(colors.red(` ${errors[j].reason}`));
+      }
+      log('-----------------------------------------');
+      callback(true);
+    }
+  });
+}
+
+function getJSFolder() {
+  // Get folders, from files
+  const jsFolders =  glob.sync("www/**/*.js", {nonull: true})
+    // Map to file's folder
+    .map(file => file.substring(0, file.lastIndexOf('/')))
+    // Reduce to a map of folders
+    .reduce((res, folder) => {
+      if (folder.indexOf('www/dist/') !== -1 || // Exclude dist js
+        folder.indexOf('/plugins/rml') !== -1 || // Exclude plugin tutorial
+        folder.indexOf('www/js/vendor') !== -1 || // exclude vendor libs
+        folder.indexOf('www/lib') !== -1 // exclude www/lib
+      ) {
+        return res;
+      }
+      res[folder] = res[folder] || true;
+      return res;
+    }, {});
+  return Object.keys(jsFolders);
+}
+
+
+// Process each folder with Js file
+const errors = [];
+getJSFolder().forEach(folder => {
+  try {
+    processFiles(folder)
+  } catch(err) {
+    errors.push(err);
+  }
+});
+
+if (errors.length) {
+  log(colors.red(`Some JS files have errors`));
+  process.exit(1);
 }
diff --git a/install.sh b/install.sh
index 0cb4a0cca1a7a9cd9edfd1da76b3ff38c5f1278e..ff3755aae7127f9ae112fa468be4d3a0a428ea15 100755
--- a/install.sh
+++ b/install.sh
@@ -15,7 +15,7 @@ if [ "_$CESIUM_DIR" = "_" ]; then
 fi
 
 latest_version() {
-  echo "v1.5.8" #lastest
+  echo "v1.6.7" #lastest
 }
 
 api_release_url() {
diff --git a/locale-fr-FR.json b/locale-fr-FR.json
deleted file mode 100644
index 1cfff3dd69664a9d9def521305907c777e1b40fe..0000000000000000000000000000000000000000
--- a/locale-fr-FR.json
+++ /dev/null
@@ -1,995 +0,0 @@
-{
-  "COMMON": {
-    "APP_NAME": "Cesium",
-    "APP_VERSION": "v{{version}}",
-    "APP_BUILD": "date : {{build}}",
-    "PUBKEY": "Clé publique",
-    "MEMBER": "Membre",
-    "BLOCK" : "Bloc",
-    "BTN_OK": "OK",
-    "BTN_YES": "Oui",
-    "BTN_NO": "Non",
-    "BTN_SEND": "Envoyer",
-    "BTN_SEND_MONEY": "Faire un virement",
-    "BTN_SEND_MONEY_SHORT": "Virement",
-    "BTN_SAVE": "Enregistrer",
-    "BTN_YES_SAVE": "Oui, Enregistrer",
-    "BTN_YES_CONTINUE": "Oui, Continuer",
-    "BTN_SHOW": "Voir",
-    "BTN_SHOW_PUBKEY": "Afficher la clé publique",
-    "BTN_RELATIVE_UNIT": "Afficher les montants en DU ?",
-    "BTN_BACK": "Retour",
-    "BTN_NEXT": "Suivant",
-    "BTN_IMPORT": "Importer",
-    "BTN_CANCEL": "Annuler",
-    "BTN_CLOSE": "Fermer",
-    "BTN_LATER": "Plus tard",
-    "BTN_LOGIN": "Se connecter",
-    "BTN_LOGOUT": "Déconnexion",
-    "BTN_ADD_ACCOUNT": "Nouveau compte",
-    "BTN_SHARE": "Partager",
-    "BTN_EDIT": "Modifier",
-    "BTN_DELETE": "Supprimer",
-    "BTN_ADD": "Ajouter",
-    "BTN_SEARCH": "Rechercher",
-    "BTN_REFRESH": "Actualiser",
-    "BTN_RETRY": "Recommencer",
-    "BTN_START": "Commencer",
-    "BTN_CONTINUE": "Continuer",
-    "BTN_CREATE": "Créer",
-    "BTN_UNDERSTOOD": "J'ai compris",
-    "BTN_OPTIONS": "Options",
-    "BTN_HELP_TOUR": "Visite guidée",
-    "BTN_HELP_TOUR_SCREEN": "Découvrir cet écran",
-    "BTN_DOWNLOAD": "Télécharger",
-    "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Télécharger le relevé du compte",
-    "BTN_MODIFY": "Modifier",
-    "CHOOSE_FILE": "Déposez votre fichier <br/>ou cliquez pour le sélectionner",
-    "DAYS": "jours",
-    "NO_ACCOUNT_QUESTION": "Pas encore de compte ? Créez-en un gratuitement !",
-    "SEARCH_NO_RESULT": "Aucun résultat trouvé",
-    "LOADING": "Veuillez patienter...",
-    "LOADING_WAIT": "Veuillez patienter...<br/><small>(Attente de disponibilité du noeud)</small>",
-    "SEARCHING": "Recherche en cours...",
-    "FROM": "De",
-    "TO": "À",
-    "COPY": "Copier",
-    "LANGUAGE": "Langue",
-    "UNIVERSAL_DIVIDEND": "Dividende universel",
-    "UD": "DU",
-    "DATE_PATTERN": "DD/MM/YY HH:mm",
-    "DATE_FILE_PATTERN": "YYYY-MM-DD",
-    "DATE_SHORT_PATTERN": "DD/MM/YY",
-    "DATE_MONTH_YEAR_PATTERN": "MM/YYYY",
-    "EMPTY_PARENTHESIS": "(vide)",
-    "UID": "Pseudonyme",
-    "ENABLE": "Activé",
-    "DISABLE": "Désactivé",
-    "RESULTS_LIST": "Résultats",
-    "RESULTS_COUNT": "{{count}} résultats",
-    "EXECUTION_TIME": "exécuté en {{duration|formatDurationMs}}",
-    "SHOW_VALUES": "Afficher les valeurs en clair ?",
-    "POPOVER_ACTIONS_TITLE": "Options",
-    "POPOVER_FILTER_TITLE": "Filtres",
-    "SHOW_MORE": "Afficher plus",
-    "SHOW_MORE_COUNT": "(limite actuelle à {{limit}})",
-    "POPOVER_SHARE": {
-      "TITLE": "Partager",
-      "SHARE_ON_TWITTER": "Partager sur Twitter",
-      "SHARE_ON_FACEBOOK": "Partager sur Facebook",
-      "SHARE_ON_DIASPORA": "Partager sur Diaspora*",
-      "SHARE_ON_GOOGLEPLUS": "Partager sur Google+"
-    },
-    "FILE": {
-      "DATE": "Date :",
-      "TYPE": "Type :",
-      "SIZE": "Taille :",
-      "VALIDATING": "Validation en cours..."
-    }
-  },
-  "SYSTEM": {
-    "PICTURE_CHOOSE_TYPE": "Choisir la source :",
-    "BTN_PICTURE_GALLERY": "Galerie",
-    "BTN_PICTURE_CAMERA": "<b>Caméra</b>"
-  },
-  "MENU": {
-    "HOME": "Accueil",
-    "WOT": "Annuaire",
-    "CURRENCY": "Monnaie",
-    "ACCOUNT": "Mon compte",
-    "WALLETS": "Mes portefeuilles",
-    "TRANSFER": "Virement",
-    "SCAN": "Scanner",
-    "SETTINGS": "Paramètres",
-    "NETWORK": "Réseau",
-    "TRANSACTIONS": "Mes opérations"
-  },
-  "ABOUT": {
-    "TITLE": "À propos",
-    "LICENSE": "Application <b>libre</b> (Licence GNU AGPLv3).",
-    "LATEST_RELEASE": "Il existe une <b>version plus récente</b> de {{'COMMON.APP_NAME'|translate}} (<b>v{{version}}</b>)",
-    "PLEASE_UPDATE": "Veuillez mettre à jour {{'COMMON.APP_NAME'|translate}} (dernière version : <b>v{{version}}</b>)",
-    "CODE": "Code source :",
-    "OFFICIAL_WEB_SITE": "Site web officiel :",
-    "DEVELOPERS": "Développé par :",
-    "FORUM": "Forum :",
-    "PLEASE_REPORT_ISSUE": "N'hésitez pas à nous remonter les anomalies rencontrées",
-    "REPORT_ISSUE": "Remonter un problème",
-    "BTN_OPEN_DEV_WINDOW": "Ouvrir la fenêtre de debuggage"
-  },
-  "HOME": {
-    "TITLE": "Cesium",
-    "WELCOME": "Bienvenue dans l'application Cesium !",
-    "MESSAGE": "Recevez et envoyez de la monnaie libre {{currency|abbreviate}}",
-    "BTN_CURRENCY": "Explorer la monnaie {{name|abbreviate}}",
-    "BTN_ABOUT": "à propos",
-    "BTN_HELP": "Aide en ligne",
-    "REPORT_ISSUE": "anomalie",
-    "NOT_YOUR_ACCOUNT_QUESTION" : "Vous n'êtes pas propriétaire du compte <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b> ?",
-    "BTN_CHANGE_ACCOUNT": "Déconnecter ce compte",
-    "CONNECTION_ERROR": "Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connection Internet, ou changer de nœud <a class=\"positive\" ng-click=\"doQuickFix('settings')\">dans les paramètres</a>."
-  },
-  "SETTINGS": {
-    "TITLE": "Paramètres",
-    "DISPLAY_DIVIDER": "Affichage",
-    "STORAGE_DIVIDER": "Stockage",
-    "NETWORK_SETTINGS": "Réseau",
-    "PEER": "Adresse du nœud Duniter",
-    "PEER_SHORT": "Adresse du nœud",
-    "PEER_CHANGED_TEMPORARY": "Adresse utilisée temporairement",
-    "USE_LOCAL_STORAGE": "Activer le stockage local",
-    "USE_LOCAL_STORAGE_HELP": "Permet de sauvegarder vos paramètres",
-    "WALLETS_SETTINGS": "Mes portefeuilles",
-    "USE_WALLETS_ENCRYPTION": "Sécuriser la liste ?",
-    "USE_WALLETS_ENCRYPTION_HELP": "Permet de sécuriser la liste de vos portefeuilles (par chiffrement), en exigeant une authentification pour y accéder.",
-    "ENABLE_HELPTIP": "Activer les bulles d'aide contextuelles",
-    "ENABLE_UI_EFFECTS": "Activer les effets visuels",
-    "HISTORY_SETTINGS": "Mes opérations",
-    "DISPLAY_UD_HISTORY": "Afficher les dividendes produits ?",
-    "TX_HISTORY_AUTO_REFRESH": "Rafraîchir automatiquement",
-    "TX_HISTORY_AUTO_REFRESH_HELP": "Rafraîchit le solde et les opérations automatiquement, à chaque nouveau bloc du réseau.",
-    "AUTHENTICATION_SETTINGS": "Authentification",
-    "KEEP_AUTH": "Désauthentification automatique",
-    "KEEP_AUTH_SHORT": "Désauthentification",
-    "KEEP_AUTH_HELP": "Définit le moment où l'authentification est nettoyée de la mémoire.",
-    "KEEP_AUTH_OPTION": {
-      "NEVER": "Après chaque opération",
-      "SECONDS": "Après {{value}}s d'inactivité",
-      "MINUTE": "Après {{value}}min d'inactivité",
-      "MINUTES": "Après {{value}}min d'inactivité",
-      "HOUR": "Après {{value}}h d'inactivité",
-      "ALWAYS": "A la fin de la session"
-    },
-    "KEYRING_FILE": "Fichier de trousseau",
-    "KEYRING_FILE_HELP": "Permet de vous <b>connecter</b> automatiquement à chaque lancement<br/>et même de vous <b>authentifier</b> (seulement si \"Expiration de l'authentification\" est configurée \"à la fin de la session\").",
-    "REMEMBER_ME": "Se souvenir de moi ?",
-    "REMEMBER_ME_HELP": "Permet de rester identifié d'une session à l'autre, en conservant localement la clé publique.",
-    "PLUGINS_SETTINGS": "Extensions",
-    "BTN_RESET": "Restaurer les valeurs par défaut",
-    "EXPERT_MODE": "Activer le mode expert",
-    "EXPERT_MODE_HELP": "Permet un affichage plus détaillé.",
-    "BLOCK_VALIDITY_WINDOW": "Délai d'incertitude des blocs",
-    "BLOCK_VALIDITY_WINDOW_SHORT": "Délai d'incertitude",
-    "BLOCK_VALIDITY_WINDOW_HELP": "Délai avant de considérer qu'une information est validée",
-    "BLOCK_VALIDITY_OPTION": {
-      "NONE": "Aucun délai",
-      "N": "{{time | formatDuration}} ({{count}} blocs)"
-    },
-    "POPUP_PEER": {
-      "TITLE": "NÅ“ud Duniter",
-      "HOST": "Adresse",
-      "HOST_HELP": "Adresse : serveur:port",
-      "USE_SSL": "Sécurisé ?",
-      "USE_SSL_HELP": "(Chiffrement SSL)",
-      "BTN_SHOW_LIST": "Liste des noeuds"
-    }
-  },
-  "BLOCKCHAIN": {
-    "HASH": "Hash : {{hash}}",
-    "VIEW": {
-      "HEADER_TITLE": "Bloc #{{number}}-{{hash|formatHash}}",
-      "TITLE_CURRENT": "Bloc courant",
-      "TITLE": "Bloc #{{number|formatInteger}}",
-      "COMPUTED_BY": "Calculé par le noeud de",
-      "SHOW_RAW": "Voir le fichier brut",
-      "TECHNICAL_DIVIDER": "Informations techniques",
-      "VERSION": "Version du format",
-      "HASH": "Hash calculé",
-      "UNIVERSAL_DIVIDEND_HELP": "Monnaie co-produite par chacun des {{membersCount}} membres",
-      "EMPTY": "Aucune donnée dans ce bloc",
-      "POW_MIN": "Difficulté minimale",
-      "POW_MIN_HELP": "Difficulté imposée pour le calcul du hash",
-      "DATA_DIVIDER": "Données",
-      "IDENTITIES_COUNT": "Nouvelles identités",
-      "JOINERS_COUNT": "Nouveaux membres",
-      "ACTIVES_COUNT": "Renouvellements",
-      "ACTIVES_COUNT_HELP": "Membres ayant renouvelé leur adhésion",
-      "LEAVERS_COUNT": "Membres sortants",
-      "LEAVERS_COUNT_HELP": "Membres ne souhaitant plus de certification",
-      "EXCLUDED_COUNT": "Membres exclus",
-      "EXCLUDED_COUNT_HELP": "Anciens membres exclus par non renouvellement ou manque de certifications",
-      "REVOKED_COUNT": "Identités révoquées",
-      "REVOKED_COUNT_HELP": "Ces comptes ne pourront plus être membres",
-      "TX_COUNT": "Transactions",
-      "CERT_COUNT": "Certifications",
-      "TX_TO_HIMSELF": "Opération de change",
-      "TX_OUTPUT_UNLOCK_CONDITIONS": "Conditions de déblocage",
-      "TX_OUTPUT_OPERATOR": {
-        "AND": "et",
-        "OR": "ou"
-      },
-      "TX_OUTPUT_FUNCTION": {
-        "SIG": "<b>Signature</b> de ",
-        "XHX": "<b>Mot de passe</b>, dont SHA256 =",
-        "CSV": "Bloqué pendant",
-        "CLTV": "Bloqué jusqu'à"
-      }
-    },
-    "LOOKUP": {
-      "TITLE": "Blocs",
-      "NO_BLOCK": "Aucun bloc",
-      "LAST_BLOCKS": "Derniers blocs :",
-      "BTN_COMPACT": "Compacter"
-    }
-  },
-  "CURRENCY": {
-    "VIEW": {
-      "TITLE": "Monnaie",
-      "TAB_CURRENCY": "Monnaie",
-      "TAB_WOT": "Toile de confiance",
-      "TAB_NETWORK": "Réseau",
-      "TAB_BLOCKS": "Blocs",
-      "CURRENCY_SHORT_DESCRIPTION": "{{currency|abbreviate}} est une <b>monnaie libre</b>, démarrée {{firstBlockTime|formatFromNow}}. Elle compte actuellement <b>{{N}} membres</b>, qui produisent et perçoivent un <a ng-click=\"showHelpModal('ud')\">Dividende Universel</a> (DU), chaque {{dt|formatPeriod}}.",
-      "NETWORK_RULES_DIVIDER": "Règles du réseau",
-      "CURRENCY_NAME": "Nom de la monnaie",
-      "MEMBERS": "Nombre de membres",
-      "MEMBERS_VARIATION": "Variation depuis le dernier DU",
-      "MONEY_DIVIDER": "Monnaie",
-      "MASS": "Masse monétaire",
-      "SHARE": "Masse par membre",
-      "UD": "Dividende universel",
-      "C_ACTUAL": "Croissance actuelle",
-      "MEDIAN_TIME": "Heure de la blockchain",
-      "POW_MIN": "Niveau minimal de difficulté de calcul",
-      "MONEY_RULES_DIVIDER": "Règles de la monnaie",
-      "C_RULE": "Croissance théorique cible",
-      "UD_RULE": "Calcul du dividende universel",
-      "DT_REEVAL": "Période de revalorisation du DU",
-      "REEVAL_SYMBOL": "reval",
-      "DT_REEVAL_VALUE": "Tous les <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",
-      "UD_REEVAL_TIME0": "Date de la 1ère revalorisation",
-      "SIG_QTY_RULE": "Nombre de certifications requises pour devenir membre",
-      "SIG_STOCK": "Nombre maximal de certifications émises par membre",
-      "SIG_PERIOD": "Délai minimal d'attente entre 2 certifications successives émises par une même personne",
-      "SIG_WINDOW": "Délai limite de prise en compte d'une certification",
-      "SIG_VALIDITY": "Durée de vie d'une certification qui a été prise en compte",
-      "MS_WINDOW": "Délai limite de prise en compte d'une demande d'adhésion comme membre",
-      "MS_VALIDITY": "Durée de vie d'une adhésion qui a été prise en compte",
-      "STEP_MAX": "Distance maximale, par les certifications, entre un nouvel entrant et les membres référents",
-      "WOT_RULES_DIVIDER": "Règles de la toile de confiance",
-      "SENTRIES": "Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent",
-      "SENTRIES_FORMULA": "Nombre de certifications (émises <b>et</b> reçues) pour devenir membre référent (formule)",
-      "XPERCENT":"Pourcentage minimum de membres référents à atteindre pour respecter la règle de distance",
-      "AVG_GEN_TIME": "Temps moyen entre deux blocs",
-      "CURRENT": "actuel",
-      "MATH_CEILING": "PLAFOND",
-      "DISPLAY_ALL_RULES": "Afficher toutes les règles ?",
-      "BTN_SHOW_LICENSE": "Voir la licence",
-      "WOT_DIVIDER": "Toile de confiance"
-    },
-    "LICENSE": {
-      "TITLE": "Licence de la monnaie",
-      "BTN_DOWNLOAD": "Télécharger le fichier",
-      "NO_LICENSE_FILE": "Fichier de licence non trouvé."
-    }
-  },
-  "NETWORK": {
-    "VIEW": {
-      "MEDIAN_TIME": "Heure de la blockchain",
-      "LOADING_PEERS": "Chargement des noeuds...",
-      "NODE_ADDRESS": "Adresse :",
-      "SOFTWARE": "Logiciel",
-      "WARN_PRE_RELEASE": "Pré-version (dernière version stable : <b>{{version}}</b>)",
-      "WARN_NEW_RELEASE": "Version <b>{{version}}</b> disponible",
-      "WS2PID": "Identifiant :",
-      "PRIVATE_ACCESS": "Accès privé",
-      "POW_PREFIX": "Préfixe de preuve de travail :",
-      "ENDPOINTS": {
-        "BMAS": "Interface sécurisée (SSL)",
-        "BMATOR": "Interface réseau TOR",
-        "WS2P": "Interface WS2P",
-        "ES_USER_API": "Noeud de données Cesium+"
-      }
-    },
-    "INFO": {
-      "ONLY_SSL_PEERS": "Les noeuds non SSL ont un affichage dégradé, car Cesium fonctionne en mode HTTPS."
-    }
-  },
-  "PEER": {
-    "PEERS": "NÅ“uds",
-    "SIGNED_ON_BLOCK": "Signé sur le bloc",
-    "MIRROR": "miroir",
-    "MIRRORS": "Miroirs",
-    "MIRROR_PEERS": "NÅ“uds miroirs",
-    "PEER_LIST" : "Liste des nœuds",
-    "MEMBERS" : "Membres",
-    "MEMBER_PEERS" : "NÅ“uds membres",
-    "ALL_PEERS" : "Tous les nœuds",
-    "DIFFICULTY" : "Difficulté",
-    "API" : "API",
-    "CURRENT_BLOCK" : "Bloc #",
-    "POPOVER_FILTER_TITLE": "Filtre",
-    "OFFLINE": "Hors ligne",
-    "OFFLINE_PEERS": "NÅ“uds hors ligne",
-    "BTN_SHOW_PEER": "Voir le nœud",
-    "VIEW": {
-      "TITLE": "NÅ“ud",
-      "OWNER": "Appartient à",
-      "SHOW_RAW_PEERING": "Voir la fiche de pair",
-      "SHOW_RAW_CURRENT_BLOCK": "Voir le dernier bloc (format brut)",
-      "LAST_BLOCKS": "Derniers blocs connus",
-      "KNOWN_PEERS": "NÅ“uds connus :",
-      "GENERAL_DIVIDER": "Informations générales",
-      "ERROR": {
-        "LOADING_TOR_NODE_ERROR": "Récupération des informations du noeud impossible. Le délai d'attente est dépassé.",
-        "LOADING_NODE_ERROR": "Récupération des informations du noeud impossible"
-      }
-    }
-  },
-  "WOT": {
-    "SEARCH_HELP": "Recherche (pseudo ou clé publique)",
-    "SEARCH_INIT_PHASE_WARNING": "Durant la phase de pré-inscription, la recherche des inscriptions en attente <b>peut être longue</b>. Merci de patienter...",
-    "REGISTERED_SINCE": "Inscrit le",
-    "REGISTERED_SINCE_BLOCK": "Inscrit au bloc #",
-    "NO_CERTIFICATION": "Aucune certification validée",
-    "NO_GIVEN_CERTIFICATION": "Aucune certification émise",
-    "NOT_MEMBER_PARENTHESIS": "(non membre)",
-    "IDENTITY_REVOKED_PARENTHESIS": "(identité révoquée)",
-    "MEMBER_PENDING_REVOCATION_PARENTHESIS": "(en cours de révocation)",
-    "EXPIRE_IN": "Expiration",
-    "NOT_WRITTEN_EXPIRE_IN": "Date limite<br/>de traitement",
-    "EXPIRED": "Expiré",
-    "PSEUDO": "Pseudonyme",
-    "SIGNED_ON_BLOCK": "Emise au bloc #{{block}}",
-    "WRITTEN_ON_BLOCK": "Ecrite au bloc #{{block}}",
-    "GENERAL_DIVIDER": "Informations générales",
-    "NOT_MEMBER_ACCOUNT": "Compte simple (non membre)",
-    "NOT_MEMBER_ACCOUNT_HELP": "Il s'agit d'un simple portefeuille, sans demande d'adhésion en attente.",
-    "TECHNICAL_DIVIDER": "Informations techniques",
-    "BTN_CERTIFY": "Certifier",
-    "BTN_YES_CERTIFY": "Oui, certifier",
-    "BTN_SELECT_AND_CERTIFY": "Nouvelle certification",
-    "ACCOUNT_OPERATIONS": "Opérations sur le compte",
-    "VIEW": {
-      "POPOVER_SHARE_TITLE": "Identité {{title}}"
-    },
-    "LOOKUP": {
-      "TITLE": "Toile de confiance",
-      "NEWCOMERS": "Nouveaux membres",
-      "NEWCOMERS_COUNT": "{{count}} membres",
-      "PENDING": "Inscriptions en attente",
-      "PENDING_COUNT": "{{count}} inscriptions en attente",
-      "REGISTERED": "Inscrit {{sigDate | formatFromNow}}",
-      "MEMBER_FROM": "Membre depuis {{memberDate|medianFromNowShort}}",
-      "BTN_NEWCOMERS": "Nouveaux membres",
-      "BTN_PENDING": "Inscriptions en attente",
-      "SHOW_MORE": "Afficher plus",
-      "SHOW_MORE_COUNT": "(limite actuelle à {{limit}})",
-      "NO_PENDING": "Aucune inscription en attente.",
-      "NO_NEWCOMERS": "Aucun membre."
-    },
-    "CONTACTS": {
-      "TITLE": "Contacts"
-    },
-    "MODAL": {
-      "TITLE": "Recherche"
-    },
-    "CERTIFICATIONS": {
-      "TITLE": "{{uid}} - Certifications",
-      "SUMMARY": "Certifications reçues",
-      "LIST": "Détail des certifications reçues",
-      "PENDING_LIST": "Certifications en attente de traitement",
-      "RECEIVED": "Certifications reçues",
-      "RECEIVED_BY": "Certifications reçues par {{uid}}",
-      "ERROR": "Certifications reçues en erreur",
-      "SENTRY_MEMBER": "Membre référent"
-    },
-    "OPERATIONS": {
-      "TITLE": "{{uid}} - Opérations"
-    },
-    "GIVEN_CERTIFICATIONS": {
-      "TITLE": "{{uid}} - Certifications émises",
-      "SUMMARY": "Certifications émises",
-      "LIST": "Détail des certifications émises",
-      "PENDING_LIST": "Certifications en attente de traitement",
-      "SENT": "Certifications émises",
-      "SENT_BY": "Certifications émises par {{uid}}",
-      "ERROR": "Certifications émises en erreur"
-    }
-  },
-  "LOGIN": {
-    "TITLE": "<i class=\"icon ion-log-in\"></i> Connexion",
-    "SCRYPT_FORM_HELP": "Veuillez saisir vos identifiants.<br>Pensez à vérifier que la clé publique est celle de votre compte.",
-    "PUBKEY_FORM_HELP": "Veuillez saisir une clé publique de compte :",
-    "FILE_FORM_HELP": "Choisissez le fichier de trousseau à utiliser :",
-    "SCAN_FORM_HELP": "Scanner le QR code d'un portefeuille.",
-    "SALT": "Identifiant secret",
-    "SALT_HELP": "Identifiant secret",
-    "SHOW_SALT": "Afficher l'identifiant secret ?",
-    "PASSWORD": "Mot de passe",
-    "PASSWORD_HELP": "Mot de passe",
-    "PUBKEY_HELP": "Clé publique ou pseudonyme",
-    "NO_ACCOUNT_QUESTION": "Vous n'avez pas encore de compte ?",
-    "HAVE_ACCOUNT_QUESTION": "Vous avez déjà un compte ?",
-    "CREATE_ACCOUNT": "Créer un compte...",
-    "CREATE_FREE_ACCOUNT": "Créer un compte gratuitement",
-    "FORGOTTEN_ID": "Mot de passe oublié ?",
-    "ASSOCIATED_PUBKEY": "Clé publique du trousseau :",
-    "BTN_METHODS": "Autres méthodes",
-    "BTN_METHODS_DOTS": "Changer de méthode...",
-    "METHOD_POPOVER_TITLE": "Méthodes",
-    "MEMORIZE_AUTH_FILE": "Mémoriser ce trousseau le temps de la session de navigation",
-    "SCRYPT_PARAMETERS": "Paramètres (Scrypt) :",
-    "AUTO_LOGOUT": {
-      "TITLE": "Information",
-      "MESSAGE": "<i class=\"ion-android-time\"></i> Vous avez été <b>déconnecté</b> automatiquement, suite à une inactivité prolongée.",
-      "BTN_RELOGIN": "Me reconnecter",
-      "IDLE_WARNING": "Vous allez être déconnecté... {{countdown}}"
-    },
-    "METHOD": {
-      "SCRYPT_DEFAULT": "Identifiant secret et mot de passe",
-      "SCRYPT_ADVANCED": "Salage avancé",
-      "FILE": "Fichier de trousseau",
-      "PUBKEY": "Clé publique ou pseudonyme",
-      "SCAN": "Scanner un QR code"
-    },
-    "SCRYPT": {
-      "SIMPLE": "Salage léger",
-      "DEFAULT": "Salage standard",
-      "SECURE": "Salage sûr",
-      "HARDEST": "Salage le plus sûr",
-      "EXTREME": "Salage extrême",
-      "USER": "Salage personnalisé",
-      "N": "N (Loop):",
-      "r": "r (RAM):",
-      "p": "p (CPU):"
-    },
-    "FILE": {
-      "HELP": "Format de fichier attendu : <b>.yml</b> ou <b>.dunikey</b> (type PubSec, WIF ou EWIF)."
-    }
-  },
-  "AUTH": {
-    "TITLE": "<i class=\"icon ion-locked\"></i> Authentification",
-    "BTN_AUTH": "S'authentifier",
-    "GENERAL_HELP": "Veuillez vous authentifier :",
-    "EXPECTED_UID_HELP": "Veuillez vous authentifier sur le compte <i class=\"ion-person\"></i> {{uid}} :",
-    "EXPECTED_PUBKEY_HELP": "Veuillez vous authentifier sur le portefeuille <br class=\"visible-xs\"/><i class=\"ion-key\"></i> {{pubkey|formatPubkey}} :",
-    "SCAN_FORM_HELP": "Scanner le QR code de la <b>clef privée</b> du portefeuille."
-  },
-  "ACCOUNT": {
-    "TITLE": "Mon compte",
-    "BALANCE": "Solde",
-    "LAST_TX": "Dernières transactions validées",
-    "BALANCE_ACCOUNT": "Solde du compte",
-    "NO_TX": "Aucune transaction",
-    "SHOW_MORE_TX": "Afficher plus",
-    "SHOW_ALL_TX": "Afficher tout",
-    "TX_FROM_DATE": "(limite actuelle à {{fromTime|medianFromNowShort}})",
-    "PENDING_TX": "Transactions en attente de traitement",
-    "VALIDATING_TX": "Transactions traitées, non validées",
-    "ERROR_TX": "Transactions non executées",
-    "ERROR_TX_SENT": "Transactions envoyées en échec",
-    "PENDING_TX_RECEIVED": "Transactions en attente de réception",
-    "EVENTS": "Evénements",
-    "OUT_DISTANCED": "Vos certifications actuelles proviennent d'un groupe trop isolé de la <a ng-click=\"showHelpModal('wot')\">Toile de Confiance</a> (TdC) : la <a ng-click=\"showHelpModal('distance_rule')\">règle de distance maximale</a> n'est pas respectée.<br/>Vous devez obtenir des certifications provenant d'autres secteurs de la TdC, ou bien attendre que celle-ci se resserre.",
-    "WAITING_MEMBERSHIP": "Demande d'adhésion envoyée. En attente d'acceptation.",
-    "WAITING_CERTIFICATIONS": "Vous devez <b>obtenir {{needCertificationCount}} certification(s)</b> pour devenir membre et produire le <a ng-click=\"showHelpModal('ud')\">Dividende Universel</a>. Votre compte est cependant déjà opérationnel, pour recevoir et effectuer des paiements.",
-    "WAITING_CERTIFICATIONS_HELP": "Pour obtenir vos certifications, sollicitez uniquement des membres <b>qui vous connaissent suffisamment</b>, comme l'exige <a ng-click=\"showLicenseModal()\">la licence de la monnaie</a> que vous avez acceptée.<br/>Si vous ne connaissez pas suffisamment de membres, faites-le savoir sur <a ng-click=\"openLink($event, $root.settings.userForumUrl)\">le forum utilisateur</a>.",
-    "WILL_MISSING_CERTIFICATIONS": "Vous allez bientôt <b>manquer de certifications</b> (au moins {{willNeedCertificationCount}} sont requises)",
-    "WILL_NEED_RENEW_MEMBERSHIP": "Votre adhésion comme membre <b>va expirer {{membershipExpiresIn|formatDurationTo}}</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a> d'ici là.",
-    "NEED_RENEW_MEMBERSHIP": "Vous n'êtes plus membre de la monnaie, car <b>votre adhésion a expiré</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",
-    "NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED": "Vous n'êtes plus membre de la monnaie, <b>pour manque de certifications</b>. Pensez à <a ng-click=\"doQuickFix('renew')\">renouveler votre adhésion</a>.",
-    "NO_WAITING_MEMBERSHIP": "Aucune demande d'adhésion en attente. Si vous souhaitez <b>devenir membre</b>, pensez à <a ng-click=\"doQuickFix('membership')\">envoyer la demande d'adhésion</a>.",
-    "CERTIFICATION_COUNT": "Certifications reçues",
-    "CERTIFICATION_COUNT_SHORT": "Certifications",
-    "SIG_STOCK": "Certifications envoyées",
-    "BTN_RECEIVE_MONEY": "Encaisser",
-    "BTN_SELECT_ALTERNATIVES_IDENTITIES": "Basculer vers une autre identité...",
-    "BTN_FIX_MEMBERSHIP": "Renvoyer la demande d'adhésion...",
-    "BTN_MEMBERSHIP_RENEW": "Renouveler l'adhésion",
-    "BTN_MEMBERSHIP_RENEW_DOTS": "Renouveler l'adhésion...",
-    "BTN_MEMBERSHIP_OUT_DOTS": "Arrêter l'adhésion...",
-    "BTN_SECURITY_DOTS": "Compte et sécurité...",
-    "BTN_SHOW_DETAILS": "Afficher les infos techniques",
-    "LOCKED_OUTPUTS_POPOVER": {
-      "TITLE": "Montant verrouillé",
-      "DESCRIPTION": "Voici les conditions de déverrouillage de ce montant :",
-      "DESCRIPTION_MANY": "Cette transaction est composé de plusieurs parties, dont voici les conditions de déverrouillage :",
-      "LOCKED_AMOUNT": "Conditions pour le montant :"
-    },
-    "NEW": {
-      "TITLE": "Création de compte",
-      "INTRO_WARNING_TIME": "La création d'un compte sur {{name|capitalize}} est très simple. Veuillez néanmoins prendre suffisament de temps pour faire correctement cette formalité (pour ne pas oublier les identifiants, mots de passe, etc.).",
-      "INTRO_WARNING_SECURITY": "Vérifiez que le matériel que vous utilisez actuellement (ordinateur, tablette, téléphone) <b>est sécurisé et digne de confiance</b>.",
-      "INTRO_WARNING_SECURITY_HELP": "Anti-virus à jour, pare-feu activé, session protégée par mot de passe ou code pin, etc.",
-      "INTRO_HELP": "Cliquez sur <b>{{'COMMON.BTN_START'|translate}}</b> pour débuter la création de compte. Vous serez guidé étape par étape.",
-      "REGISTRATION_NODE": "Votre inscription sera enregistrée via le noeud Duniter <b>{{server}}</b>, qui le diffusera ensuite au reste du réseau de la monnaie.",
-      "REGISTRATION_NODE_HELP": "Si vous ne faites pas confiance en ce noeud, veuillez en changer <a ng-click=\"doQuickFix('settings')\">dans les paramètres</a> de Cesium.",
-      "SELECT_ACCOUNT_TYPE": "Choisissez le type de compte à créer :",
-      "MEMBER_ACCOUNT": "Compte membre",
-      "MEMBER_ACCOUNT_TITLE": "Création d'un compte membre",
-      "MEMBER_ACCOUNT_HELP": "Si vous n'êtes pas encore inscrit en tant qu'individu (un seul compte possible par individu). Ce compte permet de co-produire la monnaie, en recevant un <b>dividende universel</b> chaque {{parameters.dt|formatPeriod}}.",
-      "WALLET_ACCOUNT": "Simple portefeuille",
-      "WALLET_ACCOUNT_TITLE": "Création d'un portefeuille",
-      "WALLET_ACCOUNT_HELP": "Pour tous les autres cas, par exemple si vous avez besoin d'un compte supplémentaire.<br/>Aucun dividende universel ne sera créé par ce compte.",
-      "SALT_WARNING": "Choisissez votre identifiant secret.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez le bien</b> : en cas de perte, plus personne ne pourra accéder à votre compte !",
-      "PASSWORD_WARNING": "Choisissez un mot de passe.<br/>Il vous sera demandé à chaque connexion sur ce compte.<br/><br/><b>Retenez bien ce mot de passe</b : en cas de perte, plus personne ne pourra accéder à votre compte !",
-      "PSEUDO_WARNING": "Choisissez un pseudonyme.<br/>Il sert aux autres membres, pour vous identifier plus facilement.<div class='hidden-xs'><br/>Il <b>ne pourra pas être modifié</b>, sans refaire un compte.</div><br/><br/>Il ne doit contenir <b>ni espace, ni de caractère accentué</b>.<div class='hidden-xs'><br/>Exemple : <span class='gray'>SophieDupond, MarcelChemin, etc.</span>",
-      "PSEUDO": "Pseudonyme",
-      "PSEUDO_HELP": "Pseudonyme",
-      "SALT_CONFIRM": "Confirmation",
-      "SALT_CONFIRM_HELP": "Confirmation de l'identifiant secret",
-      "PASSWORD_CONFIRM": "Confirmation",
-      "PASSWORD_CONFIRM_HELP": "Confirmation du mot de passe",
-      "SLIDE_6_TITLE": "Confirmation :",
-      "COMPUTING_PUBKEY": "Calcul en cours...",
-      "LAST_SLIDE_CONGRATULATION": "Vous avez saisi toutes les informations nécessaires : Bravo !<br/>Vous pouvez maintenant <b>envoyer la demande de création</b> de compte.</b><br/><br/>Pour information, la clé publique ci-dessous identifiera votre futur compte.<br/>Elle pourra être communiquée à des tiers pour recevoir leurs paiements.<br/><b>Il n'est pas obligatoire</b> de la noter ici, vous pourrez également le faire plus tard.",
-      "CONFIRMATION_MEMBER_ACCOUNT": "<b class=\"assertive\">Avertissement :</b> l'identifiant secret, le mot de passe et le pseudonyme ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir envoyer cette demande d'inscription ?",
-      "CONFIRMATION_WALLET_ACCOUNT": "<b class=\"assertive\">Avertissement :</b> l'identifiant secret et le mot de passe ne pourront plus être modifiés.<br/><br/><b>Assurez-vous de toujours vous en rappeler !</b><br/><br/><b>Êtes-vous sûr</b> de vouloir continuer avec ces identifiants ?",
-      "CHECKING_PSEUDO": "Vérification...",
-      "PSEUDO_AVAILABLE": "Pseudonyme disponible",
-      "PSEUDO_NOT_AVAILABLE": "Pseudonyme non disponible",
-      "INFO_LICENSE": "Avant de créer un compte membre, <b>veuillez lire et accepter la licence</b> d'usage de la monnaie :",
-      "BTN_ACCEPT": "J'accepte",
-      "BTN_ACCEPT_LICENSE": "J'accepte la licence"
-    },
-    "POPUP_REGISTER": {
-      "TITLE": "Choisissez un pseudonyme",
-      "HELP": "Un pseudonyme est obligatoire pour devenir membre."
-    },
-    "SELECT_IDENTITY_MODAL": {
-      "TITLE": "Sélection de l'identité",
-      "HELP": "Plusieurs <b>identités différentes</b> ont été envoyées, pour la clé publique <span class=\"gray\"><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</span>.<br/>Veuillez sélectionner le dossier à utiliser :"
-    },
-    "SELECT_WALLET_MODAL": {
-      "TITLE": "Sélection du portefeuille"
-    },
-    "WALLET_LIST": {
-      "TITLE": "Mes portefeuilles",
-      "BTN_NEW": "Ajouter un portefeuille",
-      "BTN_DOWNLOAD": "Télécharger la liste",
-      "BTN_IMPORT_FILE_DOTS": "Importer depuis un fichier...",
-      "NO_WALLET": "Aucun portefeuille secondaire",
-      "BTN_DELETE": "Retirer un portefeuille secondaire...",
-      "BTN_RENAME": "Renommer le portefeuille",
-      "EXPORT_FILENAME": "mes_portefeuilles-{{pubkey|formatPubkey}}-{{currency}}.csv",
-      "TOTAL_DOTS": "Total : ",
-      "EDIT_POPOVER": {
-        "TITLE": "Renommer le portefeuille",
-        "HELP": "Renseignez le nouveau nom",
-        "NAME_HELP": "Nom du portefeuille"
-      },
-      "IMPORT_MODAL": {
-        "TITLE": "Importer des portefeuilles",
-        "HELP": "Pour <b>importer des porftefeuilles</b>, veuillez glisser dans la zone ci-dessous le fichier de la liste des portefeuilles, ou bien cliquer dans la zone pour rechercher un fichier.",
-        "WALLET_COUNT": "<b>{{count}}</b> nouveau{{count > 1 ? 'x' : ''}} portefeuille{{count > 1 ? 's' : ''}}",
-        "NO_NEW_WALLET": "Aucun nouveau portefeuille"
-      }
-    },
-    "SECURITY": {
-      "ADD_QUESTION": "Ajouter une question personnalisée",
-      "BTN_CLEAN": "Vider",
-      "BTN_RESET": "Réinitialiser",
-      "DOWNLOAD_REVOKE": "Sauvegarder mon fichier de révocation",
-      "DOWNLOAD_REVOKE_HELP": "Disposer d'un fichier de révocation est important, par exemple en cas de perte de vos identifiants. Il vous permet de <b>sortir ce compte de la toile de confiance</b>, en redevenant ainsi un simple portefeuille.",
-      "GENERATE_KEYFILE": "Générer mon fichier de trousseau...",
-      "GENERATE_KEYFILE_HELP": "Génère un fichier permettant de vous authentifier sans saisir vos identifiants.<br/><b>Attention :</b> ce fichier contiendra votre trousseau de compte (clefs publique et secrète) ; il est donc très important de le mettre en lieu sûr !",
-      "KEYFILE_FILENAME": "trousseau-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey",
-      "MEMBERSHIP_IN": "Transformer en compte membre...",
-      "MEMBERSHIP_IN_HELP": "Permet de <b>transformer</b> un compte simple portefeuille <b>en compte membre</b>, en envoyant une demande d'adhésion. Utile uniquement si vous n'avez pas déjà un autre compte membre.",
-      "SEND_IDENTITY": "Publier son identité...",
-      "SEND_IDENTITY_HELP": "Permet d'associer un pseudonyme à ce compte, mais <b>sans faire de demande d'adhésion</b> pour devenir membre. Cette association n'est généralement pas utile, car la validité de cette association de pseudonyme est limitée dans le temps.",
-      "HELP_LEVEL": "Pour générer un fichier de sauvegarde de vos identifiants, choisissez <strong> au moins {{nb}} questions :</strong>",
-      "LEVEL": "Niveau de sécurité",
-      "LOW_LEVEL": "Faible <span class=\"hidden-xs\">(2 questions minimum)</span>",
-      "MEDIUM_LEVEL": "Moyen <span class=\"hidden-xs\">(4 questions minimum)</span>",
-      "QUESTION_1": "Comment s'appelait votre meilleur ami lorsque vous étiez adolescent ?",
-      "QUESTION_2": "Comment s'appelait votre premier animal de compagnie ?",
-      "QUESTION_3": "Quel est le premier plat que vous avez appris à cuisiner ?",
-      "QUESTION_4": "Quel est le premier film que vous avez vu au cinéma ?",
-      "QUESTION_5": "Où êtes-vous allé la première fois que vous avez pris l'avion ?",
-      "QUESTION_6": "Comment s'appelait votre instituteur préféré à l'école primaire ?",
-      "QUESTION_7": "Quel serait selon vous le métier idéal ?",
-      "QUESTION_8": "Quel est le livre pour enfants que vous préférez ?",
-      "QUESTION_9": "Quel était le modèle de votre premier véhicule ?",
-      "QUESTION_10": "Quel était votre surnom lorsque vous étiez enfant ?",
-      "QUESTION_11": "Quel était votre personnage ou acteur de cinéma préféré lorsque vous étiez étudiant ?",
-      "QUESTION_12": "Quel était votre chanteur ou groupe préféré lorsque vous étiez étudiant ?",
-      "QUESTION_13": "Dans quelle ville vos parents se sont-ils rencontrés ?",
-      "QUESTION_14": "Comment s'appelait votre premier patron ?",
-      "QUESTION_15": "Quel est le nom de la rue où vous avez grandi ?",
-      "QUESTION_16": "Quel est le nom de la première plage où vous vous êtes baigné ?",
-      "QUESTION_17": "Quel est le premier album que vous avez acheté ?",
-      "QUESTION_18": "Quel est le nom de votre équipe de sport préférée ?",
-      "QUESTION_19": "Quel était le métier de votre grand-père ?",
-      "RECOVER_ID": "Retrouver mon mot de passe...",
-      "RECOVER_ID_HELP": "Si vous disposez d'un <b>fichier de sauvegarde de vos identifiants</b>, vous pouvez les retrouver en répondant correctement à vos questions personnelles.",
-      "REVOCATION_WITH_FILE": "Révoquer mon compte membre...",
-      "REVOCATION_WITH_FILE_DESCRIPTION": "Si vous avez <b>définitivement perdus vos identifiants</b> de compte membre (ou que la sécurité du compte est compromise), vous pouvez utiliser <b>le fichier de révocation</b> du compte pour <b>forcer sa sortie définitive de la toile de confiance</b>.",
-      "REVOCATION_WITH_FILE_HELP": "Pour <b>révoquer définitivement</b> un compte membre, veuillez glisser dans la zone ci-dessous votre fichier de révocation, ou bien cliquer dans la zone pour rechercher un fichier.",
-      "REVOCATION_WALLET": "Révoquer immédiatement ce compte",
-      "REVOCATION_WALLET_HELP": "Demander la révocation de votre identité entraîne la <b>sortie de la toile de confiance</b> (définitive pour le pseudonyme et la clé publique associés). Le compte ne pourra plus produire de Dividende Universel.<br/>Vous pourrez toutefois encore vous y connecter, comme à un simple portefeuille.",
-      "REVOCATION_FILENAME": "revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",
-      "SAVE_ID": "Sauvegarder mes identifiants...",
-      "SAVE_ID_HELP": "Création d'un fichier de sauvegarde, pour <b>retrouver votre mot de passe</b> (et l'identifiant secret) <b>en cas de d'oubli</b>. Le fichier est <b>sécurisé</b> (chiffré) à l'aide de questions personnelles.",
-      "STRONG_LEVEL": "Fort <span class=\"hidden-xs \">(6 questions minimum)</span>",
-      "TITLE": "Compte et sécurité",
-      "KEYFILE": {
-        "PUBSEC_FORMAT": "Format PubSec.",
-        "PUBSEC_FORMAT_HELP": "Ce format stocke votre trousseau de manière très simple. Il est compatible notamment avec Cesium, ğannonce et Duniter.<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !",
-        "WIF_FORMAT": "Format WIF (Wallet Import Format) - v1",
-        "WIF_FORMAT_HELP": "Ce format stocke votre trousseau en y intégrant une somme de contrôle pour vérifier l'intégrité du fichier. Il est compatible notamment avec les portefeuilles papier (Duniter paper wallet).<br/><b>Attention :</b>Le fichier <b>n'est pas chiffré</b> (la clef secrète y apparaît en clair) ; veuillez donc le stocker en lieu sûr !",
-        "EWIF_FORMAT": "Format EWIF (Encrypted Wallet Import Format) - v1",
-        "EWIF_FORMAT_HELP": "Ce format stocke votre trousseau <b>de manière chiffrée</b> à partir d'une phrase secrète de votre choix. Il intègre aussi une somme de contrôle pour vérifier l'intégrité du fichier.<br/><b>Attention :</b> Veillez à toujours vous souvenir de votre phrase secrète !",
-        "PASSWORD_POPUP": {
-          "TITLE": "Fichier de trousseau chiffré",
-          "HELP": "Veuillez indiquer la phrase secrète :",
-          "PASSWORD_HELP": "Phrase secrète"
-        },
-        "ERROR": {
-          "BAD_PASSWORD": "Phrase secrète incorrecte",
-          "BAD_CHECKSUM": "Somme de contrôle incorrecte"
-        }
-      }
-    },
-    "FILE_NAME": "{{currency}} - Relevé du compte {{pubkey|formatPubkey}} au {{currentTime|formatDateForFile}}.csv",
-    "HEADERS": {
-      "TIME": "Date",
-      "AMOUNT": "Montant",
-      "COMMENT": "Commentaire"
-    }
-  },
-  "TRANSFER": {
-    "TITLE": "Virement",
-    "SUB_TITLE": "Faire un virement",
-    "SUB_TITLE_ALL": "Vider le compte",
-    "FROM": "De",
-    "TO": "À",
-    "AMOUNT": "Montant",
-    "AMOUNT_HELP": "Montant",
-    "COMMENT": "Commentaire",
-    "COMMENT_HELP": "Commentaire",
-    "BTN_SEND": "Envoyer",
-    "BTN_ADD_COMMENT": "Ajouter un commentaire",
-    "REST": "Reste du compte",
-    "REST_TO": "à",
-    "WARN_COMMENT_IS_PUBLIC": "Veuillez noter que <b>les commentaires sont publics</b> (non chiffrés).",
-    "MODAL": {
-      "TITLE": "Virement"
-    }
-  },
-  "ERROR": {
-    "UNKNOWN_URI_FORMAT": "Format d'URI inconnu",
-    "PUBKEY_INVALID_CHECKSUM": "Clé publique invalide (bad checksum).",
-    "POPUP_TITLE": "Erreur",
-    "UNKNOWN_ERROR": "Erreur inconnue",
-    "CRYPTO_UNKNOWN_ERROR": "Votre navigateur ne semble pas compatible avec les fonctionnalités de cryptographie.",
-    "DOWNLOAD_KEYFILE_FAILED": "Échec de la génération du fichier de trousseau.",
-    "EQUALS_TO_PSEUDO": "Doit être différent du pseudonyme",
-    "EQUALS_TO_SALT": "Doit être différent de l'identifiant secret",
-    "FIELD_REQUIRED": "Champ obligatoire",
-    "FIELD_TOO_SHORT": "Valeur trop courte",
-    "FIELD_TOO_SHORT_WITH_LENGTH": "Valeur trop courte ({{minLength}} caractères min)",
-    "FIELD_TOO_LONG": "Valeur trop longue",
-    "FIELD_TOO_LONG_WITH_LENGTH": "Valeur trop longue ({{maxLength}} caractères max)",
-    "FIELD_MIN": "Valeur minimale : {{min}}",
-    "FIELD_MAX": "Valeur maximale : {{max}}",
-    "FIELD_ACCENT": "Caractères accentués et virgules non autorisés",
-    "FIELD_NOT_NUMBER": "Valeur numérique attendue",
-    "FIELD_NOT_INT": "Valeur entière attendue",
-    "FIELD_NOT_EMAIL": "Adresse email non valide",
-    "PASSWORD_NOT_CONFIRMED": "Ne correspond pas au mot de passe",
-    "SALT_NOT_CONFIRMED": "Ne correspond pas à l'identifiant secret",
-    "SEND_IDENTITY_FAILED": "Échec de l'inscription",
-    "SEND_CERTIFICATION_FAILED": "Échec de la certification",
-    "NEED_MEMBER_ACCOUNT_TO_CERTIFY": "Vous ne pouvez pas effectuer de certification, car votre compte n'est <b>pas membre</b>.",
-    "NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF": "Vous ne pouvez pas effectuer de certification, car votre compte n'est pas encore membre.<br/><br/>Il vous manque encore des certifications, ou bien celles-ci n'ont pas encore été validées.",
-    "NOT_MEMBER_FOR_CERTIFICATION": "Votre compte n'est pas encore membre.",
-    "IDENTITY_TO_CERTIFY_HAS_NO_SELF": "Compte non certifiable. Aucune demande d'adhésion n'a été faite, ou bien elle n'a pas été renouvelée.",
-    "LOGIN_FAILED": "Erreur lors de la connexion.",
-    "LOAD_IDENTITY_FAILED": "Erreur de chargement de l'identité.",
-    "LOAD_REQUIREMENTS_FAILED": "Erreur de chargement des prérequis de l'identité.",
-    "SEND_MEMBERSHIP_IN_FAILED": "Échec de la tentative d'entrée dans la communauté.",
-    "SEND_MEMBERSHIP_OUT_FAILED": "Échec de l'arrêt de l'adhésion.",
-    "REFRESH_WALLET_DATA": "Échec du rafraîchissement du portefeuille.",
-    "GET_CURRENCY_PARAMETER": "Échec de la récupération des règles de la monnaie.",
-    "GET_CURRENCY_FAILED": "Chargement de la monnaie impossible. Veuillez réessayer plus tard.",
-    "SEND_TX_FAILED": "Échec du virement.",
-    "ALL_SOURCES_USED": "Veuillez attendre le calcul du prochain bloc (toutes vos sources de monnaie ont été utilisées).",
-    "NOT_ENOUGH_SOURCES": "Pas assez de change pour envoyer ce montant en une seule transaction.<br/>Montant maximum : {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",
-    "ACCOUNT_CREATION_FAILED": "Échec de la création du compte membre.",
-    "RESTORE_WALLET_DATA_ERROR": "Échec du rechargement des paramètres depuis le stockage local",
-    "LOAD_WALLET_DATA_ERROR": "Échec du chargement des données du portefeuille.",
-    "COPY_CLIPBOARD_FAILED": "Copie de la valeur impossible.",
-    "TAKE_PICTURE_FAILED": "Échec de la récupération de la photo.",
-    "SCAN_FAILED": "Échec du scan de QR-code.",
-    "SCAN_UNKNOWN_FORMAT": "Code non reconnu.",
-    "WOT_LOOKUP_FAILED": "Échec de la recherche.",
-    "LOAD_PEER_DATA_FAILED": "Lecture du nœud Duniter impossible. Veuillez réessayer ultérieurement.",
-    "NEED_LOGIN_FIRST": "Veuillez d'abord vous connecter.",
-    "AMOUNT_REQUIRED": "Le montant est obligatoire.",
-    "AMOUNT_NEGATIVE": "Montant négatif non autorisé.",
-    "NOT_ENOUGH_CREDIT": "Crédit insuffisant.",
-    "INVALID_NODE_SUMMARY": "NÅ“ud injoignable ou adresse invalide.",
-    "INVALID_USER_ID": "Le pseudonyme ne doit contenir ni espace ni caractère spécial ou accentué.",
-    "INVALID_COMMENT": "Le champ 'référence' ne doit pas contenir de caractères accentués.",
-    "INVALID_PUBKEY": "La clé publique n'a pas le format attendu.",
-    "INVALID_PUBKEY_CHECKSUM": "Somme de contrôle invalide.",
-    "IDENTITY_REVOKED": "Cette identité <b>a été révoquée</b>. Elle ne peut plus devenir membre.",
-    "IDENTITY_REVOKED_WITH_TIME": "Cette identité <b>a été révoquée {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Elle ne peut plus devenir membre.",
-    "IDENTITY_PENDING_REVOCATION": "La <b>révocation de cette identité</b> a été demandée et est en attente de traitement. La certification est donc désactivée.",
-    "IDENTITY_INVALID_BLOCK_HASH": "Cette demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé) : cette personne doit renouveler sa demande d'adhésion <b>avant</b> d'être certifiée.",
-    "IDENTITY_EXPIRED": "La publication de cette identité a expiré : cette personne doit effectuer une nouvelle demande d'adhésion <b>avant</b> d'être certifiée.",
-    "IDENTITY_SANDBOX_FULL": "Le nœud Duniter utilisé par Cesium ne peut plus recevoir de nouvelles identités, car sa file d'attente est pleine.<br/><br/>Veuillez réessayer ultérieurement ou changer de nœud (via le menu <b>Paramètres</b>).",
-    "IDENTITY_NOT_FOUND": "Identité non trouvée.",
-    "IDENTITY_TX_FAILED": "Échec du chargement des opérations.",
-    "WOT_PENDING_INVALID_BLOCK_HASH": "Adhésion non valide.",
-    "WALLET_INVALID_BLOCK_HASH": "Votre demande d'adhésion n'est plus valide (car elle référence un bloc que les nœuds du réseau ont annulé).<br/>Vous devez <a ng-click=\"doQuickFix('fixMembership')\">envoyer une nouvelle demande</a> pour résoudre ce problème.",
-    "WALLET_IDENTITY_EXPIRED": "La publication de <b>votre identité a expirée</b>.<br/>Vous devez <a ng-click=\"doQuickFix('fixIdentity')\">publier à nouveau votre identité</a> pour résoudre ce problème.",
-    "WALLET_REVOKED": "Votre identité a été <b>révoquée</b> : ni votre pseudonyme ni votre clef publique ne pourra être utilisé à l'avenir pour un compte membre.",
-    "WALLET_HAS_NO_SELF": "Votre identité doit d'abord avoir été publiée, et ne pas être expirée.",
-    "AUTH_REQUIRED": "Authentification requise.",
-    "AUTH_INVALID_PUBKEY": "La clef attendue est <i class=\"ion-key\"></i> {{pubkey|formatPubkey}}...",
-    "AUTH_INVALID_SCRYPT": "Identifiant ou mot de passe invalide.",
-    "AUTH_INVALID_FILE": "Fichier de trousseau invalide.",
-    "AUTH_FILE_ERROR": "Échec de l'ouverture du fichier de trousseau.",
-    "IDENTITY_ALREADY_CERTIFY": "Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est encore valide (expiration {{expiresIn|formatDurationTo}}).",
-    "IDENTITY_ALREADY_CERTIFY_PENDING": "Vous avez <b>déjà certifié</b> cette identité.<br/><br/>Cette certification est en attente de traitement (date limite de traitement {{expiresIn|formatDurationTo}}).",
-    "UNABLE_TO_CERTIFY_TITLE": "Certification impossible",
-    "LOAD_NEWCOMERS_FAILED": "Échec du chargement des nouveaux membres.",
-    "LOAD_PENDING_FAILED": "Échec du chargement des inscriptions en attente.",
-    "ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION": "Vous devez <b>être membre</b> pour pouvoir effectuer cette action.",
-    "ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION": "Vous devez <b>être membre (ou ancien membre)</b> pour pouvoir effectuer cette action.",
-    "ONLY_SELF_CAN_EXECUTE_THIS_ACTION": "Vous devez avoir <b>publié votre identité</b> pour pouvoir effectuer cette action.",
-    "GET_BLOCK_FAILED": "Échec de la récupération du bloc.",
-    "INVALID_BLOCK_HASH": "Bloc non trouvé (hash différent).",
-    "DOWNLOAD_REVOCATION_FAILED": "Échec du téléchargement du fichier de révocation.",
-    "REVOCATION_FAILED": "Échec de la révocation.",
-    "SALT_OR_PASSWORD_NOT_CONFIRMED": "Identifiant secret ou mot de passe incorrect.",
-    "RECOVER_ID_FAILED": "Échec de la récupération des identifiants",
-    "LOAD_FILE_FAILED" : "Échec du chargement du fichier",
-    "NOT_VALID_REVOCATION_FILE": "Fichier de révocation non valide (mauvais format de fichier)",
-    "NOT_VALID_SAVE_ID_FILE": "Fichier de récupération non valide (mauvais format de fichier)",
-    "NOT_VALID_KEY_FILE": "Fichier de trousseau non valide (format non reconnu)",
-    "EXISTING_ACCOUNT": "Vos identifiants correspondent à un compte déjà existant, dont la <a ng-click=\"showHelpModal('pubkey')\">clef publique</a> est :",
-    "EXISTING_ACCOUNT_REQUEST": "Veuillez modifier vos identifiants afin qu'ils correspondent à un compte non utilisé.",
-    "GET_LICENSE_FILE_FAILED": "Récupération du fichier de licence impossible.",
-    "CHECK_NETWORK_CONNECTION": "Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connection Internet</b>.",
-    "ISSUE_524_TX_FAILED": "Échec du virement.<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>.",
-    "ADD_SECONDARY_WALLET_FAILED": "Échec de l'ajout du portefeuille secondaire.",
-    "UPDATE_WALLET_LIST_FAILED": "Échec du rafraîchissement des portefeuilles secondaires.",
-    "LOAD_WALLET_LIST_FAILED": "Échec du chargement des portefeuilles secondaires.",
-    "SAVE_WALLET_LIST_FAILED": "Échec de la sauvegarde des portefeuilles secondaires.",
-    "COULD_NOT_ADD_MAIN_WALLET": "Ce portefeuille <b>correspond au compte principal</b> avec lequel vous êtes connecté.<br/>Impossible de l'ajouter comme portefeuille secondaire.",
-    "COULD_NOT_ADD_EXISTING_WALLET": "Portefeuille déjà existant dans la liste.",
-    "UNKNOWN_WALLET_ID": "Portefeuille secondaire inconnu.",
-    "RESTORE_WALLET_LIST_FAILED": "Échec de la restauration des portefeuilles secondaires.",
-    "INVALID_FILE_FORMAT": "Format de fichier invalide."
-  },
-  "INFO": {
-    "POPUP_TITLE": "Information",
-    "CERTIFICATION_DONE": "Certification envoyée",
-    "NOT_ENOUGH_CREDIT": "Crédit insuffisant",
-    "TRANSFER_SENT": "Virement envoyé",
-    "COPY_TO_CLIPBOARD_DONE": "Copié dans le presse-papier",
-    "MEMBERSHIP_OUT_SENT": "Résiliation envoyée",
-    "NOT_NEED_MEMBERSHIP": "Vous êtes déjà membre.",
-    "IDENTITY_WILL_MISSING_CERTIFICATIONS": "Cette identité va bientôt manquer de certifications (au moins {{willNeedCertificationCount}}).",
-    "IDENTITY_NEED_MEMBERSHIP": "Cette identité n'a pas envoyée de demande d'adhésion. Elle le devra si elle souhaite devenir membre.",
-    "HAS_ALTERNATIVE_IDENTITIES": "Il existe <b>plusieurs identités</b> rattachées à cette clé publique. <b>Avant toute certification</b>, pensez à <a ng-click=\"doQuickFix('showSelectIdentities')\">consulter les autres identités</a> pour choisir la bonne, ou bien contacter le propriétaire du compte.",
-    "REVOCATION_SENT": "Révocation envoyée",
-    "REVOCATION_SENT_WAITING_PROCESS": "La <b>révocation de cette identité</b> a été demandée et est en attente de traitement.",
-    "FEATURES_NOT_IMPLEMENTED": "Cette fonctionnalité est encore en cours de développement.<br/>Pourquoi ne pas <b>contribuer à Cesium</b>, pour l'obtenir plus rapidement ? ;)",
-    "EMPTY_TX_HISTORY": "Aucune opération à exporter"
-  },
-  "CONFIRM": {
-    "POPUP_TITLE": "<b>Confirmation</b>",
-    "POPUP_WARNING_TITLE": "<b>Avertissement</b>",
-    "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Avertissement de sécurité</b>",
-    "CERTIFY_RULES_TITLE_UID": "Certifier {{uid}}",
-    "CERTIFY_RULES": "<b class=\"assertive\">Ne PAS certifier</b> un compte si vous pensez que :<br/><br/><ul><li>1.) il ne correspond pas à une personne <b>physique et vivante</b>.<li>2.) son propriétaire <b>possède un autre compte</b> déjà certifié.<li>3.) son propriétaire viole (volontairement ou non) la règle 1 ou 2 (par exemple en certifiant des comptes factices ou en double).</ul><br/><b>Êtes-vous sûr</b> de vouloir néanmoins certifier cette identité ?",
-    "FULLSCREEN": "Afficher l'application en plein écran ?",
-    "EXIT_APP": "Fermer l'application ?",
-    "TRANSFER": "<b>Récapitulatif du virement</b> :<br/><br/><ul><li> - De : {{from}}</li><li> - A : <b>{{to}}</b></li><li> - Montant : <b>{{amount}} {{unit}}</b></li><li> - Commentaire : <i>{{comment}}</i></li></ul><br/><b>Êtes-vous sûr de vouloir effectuer ce virement ?</b>",
-    "TRANSFER_ALL": "<b>Récapitulatif du virement</b> :<br/><br/><ul><li> - De : {{from}}</li><li> - A : <b>{{to}}</b></li><li> - Montant : <b>{{amount}} {{unit}}</b></li><li> - Commentaire : <i>{{comment}}</i></li><br/><li> - Reste : <b>{{restAmount}} {{unit}}</b> à <b>{{restTo}}</b></li></ul><br/><b>Êtes-vous sûr de vouloir effectuer ce virement ?</b>",
-    "MEMBERSHIP_OUT": "Cette opération est <b>irréversible</b>.<br/></br/>Êtes-vous sûr de vouloir <b>résilier votre compte membre</b> ?",
-    "MEMBERSHIP_OUT_2": "Cette opération est <b>irreversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>résilier votre adhésion</b> comme membre ?",
-    "LOGIN_UNUSED_WALLET_TITLE": "Erreur de saisie ?",
-    "LOGIN_UNUSED_WALLET": "Le compte connecté semble <b>inactif</b>.<br/><br/>Il s'agit probablement d'une <b>erreur de saisie</b> dans vos identifiants de connexion. Veuillez recommencer, en vérifiant que <b>la clé publique est celle de votre compte</b>.",
-    "FIX_IDENTITY": "Le pseudonyme <b>{{uid}}</b> va être publiée à nouveau, en remplacement de l'ancienne publication qui a expirée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?",
-    "FIX_MEMBERSHIP": "Votre demande d'adhésion comme membre va être renvoyée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?",
-    "MEMBERSHIP": "Votre demande d'adhésion comme membre va être envoyée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?",
-    "RENEW_MEMBERSHIP": "Votre adhésion comme membre va être renouvelée.<br/></br/><b>Êtes-vous sûr</b> de vouloir continuer ?",
-    "REVOKE_IDENTITY": "Vous allez <b>revoquer définitivement cette identité</b>.<br/><br/>La clé publique et le pseudonyme associés <b>ne pourront plus jamais être utilisés</b> (pour un compte membre). <br/></br/><b>Êtes-vous sûr</b> de vouloir révoquer définitivement ce compte ?",
-    "REVOKE_IDENTITY_2": "Cette opération est <b>irreversible</b> !<br/><br/>Êtes-vous vraiment sûr de vouloir <b>révoquer définitivement</b> ce compte ?",
-    "NOT_NEED_RENEW_MEMBERSHIP": "Votre adhésion n'a pas besoin d'être renouvelée (elle n'expirera que dans {{membershipExpiresIn|formatDuration}}).<br/></br/><b>Êtes-vous sûr</b> de vouloir renouveler votre adhésion ?",
-    "SAVE_BEFORE_LEAVE": "Voulez-vous <b>sauvegarder vos modifications</b> avant de quitter la page ?",
-    "SAVE_BEFORE_LEAVE_TITLE": "Modifications non enregistrées",
-    "LOGOUT": "Êtes-vous sûr de vouloir vous déconnecter ?",
-    "USE_FALLBACK_NODE": "Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?",
-    "ISSUE_524_SEND_LOG": "La transaction a été rejetée, à cause d'une anomalie connue (ticket #524) mais <b>non reproduite</b>.<br/><br/>Pour aider les développeurs à corriger cette erreur, <b>acceptez-vous la transmission de vos logs</b> par message ?<br/><small>(aucune donnée confidentielle n'est envoyée)</small>."
-  },
-  "DOWNLOAD": {
-    "POPUP_TITLE": "<b>Fichier de révocation</b>",
-    "POPUP_REVOKE_MESSAGE": "Pour sécuriser votre compte, veuillez télécharger le <b>document de révocation de compte</b>. Il vous permettra le cas échéant d'annuler votre compte (en cas d'un vol de compte, d'un changement d'identifiant, d'un compte créé à tort, etc.).<br/><br/><b>Veuillez le stocker en lieu sûr.</b>"
-  },
-  "HELP": {
-    "TITLE": "Aide en ligne",
-    "JOIN": {
-      "SECTION": "Inscription",
-      "SALT": "L'identifiant secret est très important. Il sert à mélanger le mot de passe, avant qu'il ne serve à calculer la <span class=\"text-italic\">clé publique</span> de votre compte (son numéro) et la clé secrète pour y accéder.<br/><b>Veillez à bien la mémoriser</b>, car aucun moyen n'est actuellement prévu pour la retrouver en cas de perte.<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon identifiant secret doit être suffisamment long (au moins 8 caractères) et le plus original possible.",
-      "PASSWORD": "Le mot de passe est très important. Avec l'identifiant secret, il sert à calculer le numéro (la clé publique) de votre compte, et la clé secrète pour y accéder.<br/><b>Veillez à bien le mémoriser</b>, car aucun moyen n'est prévu de le retrouver en cas de perte (sauf à générer un fichier de sauvegarde).<br/>Par ailleurs, il ne peut pas être modifié sans devoir créer un nouveau compte.<br/><br/>Un bon mot de passe contient (idéalement) au moins 8 caractères, dont au moins une majuscule et un chiffre.",
-      "PSEUDO": "Le pseudonyme est utilisé uniquement dans le cas d'inscription comme <span class=\"text-italic\">membre</span>. Il est toujours associé à un portefeuille (via sa <span class=\"text-italic\">clé publique</span>).<br/>Il est publié sur le réseau, afin que les autres utilisateurs puisse l'identifier, le certifier ou envoyer de la monnaie sur le compte.<br/>Un pseudonyme doit être unique au sein des membres (<u>actuels</u> et anciens)."
-    },
-    "LOGIN": {
-      "SECTION": "Connexion",
-      "PUBKEY": "Clé publique du trousseau",
-      "PUBKEY_DEF": "La clef publique du trousseau est générée à partir des identifiants saisis (n'importe lesquels), sans pour autant qu'ils correspondent à un compte déjà utilisé.<br/><b>Vérifiez attentivement que la clé publique est celle de votre compte</b>. Dans le cas contraire, vous serez connecté à un compte probablement jamais utilisé, le risque de collision avec un compte existant étant infime.<br/><a href=\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\" target=\"_system\">En savoir plus sur la cryptographie</a> par clé publique.",
-      "METHOD": "Méthodes de connexion",
-      "METHOD_DEF": "Plusieurs options sont disponibles pour vous connecter à un portefeuille :<br/> - La connexion <b>par salage (simple ou avancé)</b> mélange votre mot de passe grâce à l'identifiant secret, pour limiter les tentatives de <a href=\"https://fr.wikipedia.org/wiki/Attaque_par_force_brute\" target=\"_system\">piratage par force brute</a> (par exemple à partir de mots connus).<br/> - La connexion <b>par clé publique</b> évite de saisir vos identifiants, qui vous seront demandé seulement le moment venu lors d'une opération sur le compte.<br/> - La connexion <b>par fichier de trousseau</b> va lire les clés (publique et privée) du compte, depuis un fichier, sans besoin de saisir d'identifiants. Plusieurs formats de fichier sont possibles."
-    },
-    "GLOSSARY": {
-      "SECTION": "Glossaire",
-      "PUBKEY_DEF": "Une clé publique identifie un portefeuille de monnaie, qui peut identifier un membre ou correspondre à un portefeuille anonyme. Dans Cesium la clé publique est calculée (par défaut) grâce à l'identifiant secret et au mot de passe.<br/><a href=\"https://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique\" target=\"_system\">En savoir plus sur la cryptographie</a> par clé publique.",
-      "MEMBER": "Membre",
-      "MEMBER_DEF": "Un membre est une personne humaine physique et vivante, désireuse de participer librement à la communauté monétaire. Elle co-produit un dividende universel, suivant une période et un montant tels que définis dans les <span class=\"text-italic\">règles de la monnaie</span>",
-      "CURRENCY_RULES": "Règles de la monnaie",
-      "CURRENCY_RULES_DEF": "Les règles de la monnaie sont définies une fois pour toutes. Elle fixe le fonctionnement de la monnaie : le calcul du dividende universel, le nombre de certifications nécessaire pour être membre, le nombre de certification maximum qu'un membre peut donner, etc. <a href=\"#/app/currency\">Voir les règles actuelles</a>.<br/>La non modification des règles dans le temps est possible par l'utilisation d'une <span class=\"text-italic\">BlockChain</span> qui porte et exécute ces règles, et en vérifie constamment la bonne application.",
-      "BLOCKCHAIN": "Chaîne de blocs (<span class=\"text-italic\">Blockchain</span>)",
-      "BLOCKCHAIN_DEF": "La BlockChain est un système décentralisé, qui, dans le cas de Duniter, sert à porter et exécuter les <span class=\"text-italic\">règles de la monnaie</span>.<br/><a href=\"https://duniter.org/fr/comprendre/\" target=\"_system\">En savoir plus sur Duniter</a> et le fonctionnement de sa blockchain.",
-      "UNIVERSAL_DIVIDEND_DEF": "Le Dividende Universel (DU) est la quantité de monnaie co-créée par chaque membre, suivant la période et le calcul définis dans les <span class=\"text-italic\">règles de la monnaie</span>.<br/>A chaque échéance, les membres recoivent sur leur compte la meme quantité de nouvelle monnaie.<br/><br/>Le DU subit une croissance régulière, pour rester juste entre les membres (actuels et à venir), calculée en fonction de l'espérance de vie moyenne, telle que démontré dans la Thérorie Relative de la Monnaie (TRM).<br/><a href=\"http://trm.creationmonetaire.info\" target=\"_system\">En savoir plus sur la TRM</a> et les monnaies libres.",
-      "WOT": "Toile de Confiance (TdC)",
-      "WOT_DEF": "La Toile de Confiance est constituée de l'ensemble des membres de la monnaie, et des liens de certification qui les relient.",
-      "DISTANCE_RULE": "Règle de distance",
-      "DISTANCE_RULE_DEF": "La règle de distance de la Toile de Confiance définie <b>une distance maximale à respecter</b> entre un postulant et un nombre minimum de membres référents (ou membres centraux). Cette distance est calculée en utilisant les liens de certification."
-    },
-    "TIP": {
-      "MENU_BTN_CURRENCY": "Le menu <b>{{'MENU.CURRENCY'|translate}}</b> permet la consultation des <b>règles de la monnaie</b> et de son état.",
-      "CURRENCY_WOT": "Le <b>nombre de membres</b> montre l'importance de la communauté et permet de <b>suivre son évolution</b>.",
-      "CURRENCY_MASS": "Suivez ici la <b>quantité totale de monnaie</b> existante et sa <b>répartition moyenne</b> par membre.<br/><br/>Ceci permet de juger de l'<b>importance d'un montant</b>, vis à vis de ce que <b>possède les autres</b> sur leur compte (en moyenne).",
-      "CURRENCY_UNIT_RELATIVE": "L'unité utilisée (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifie que les montants en {{currency|capitalize}} ont été divisés par le <b>Dividende Universel</b> (DU).<br/><br/><small>Cette unité relative est <b>pertinente</b>, car stable malgré la quantitié de monnaie qui augmente en permanence.</small>",
-      "CURRENCY_CHANGE_UNIT": "L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants <b>directement en {{currency|capitalize}}</b> (plutôt qu'en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",
-      "CURRENCY_CHANGE_UNIT_TO_RELATIVE": "L'option <b>{{'COMMON.BTN_RELATIVE_UNIT'|translate}}</b> permet de <b>changer d'unité</b>, pour visualiser les montants en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, c'est-à-dire relativement au Dividende Universel (le montant co-produit par chaque membre).",
-      "CURRENCY_RULES": "Les <b>règles</b> de la monnaie fixent son fonctionnement <b>exact et prévisible</b>.<br/><br/>Véritable ADN de la monnaie, elles rendent son code monétaire <b>lisible et transparent</b>.",
-      "MENU_BTN_NETWORK": "Le menu <b>{{'MENU.NETWORK'|translate}}</b> permet la consultation de l'état du réseau.",
-      "NETWORK_BLOCKCHAIN": "Toutes les opérations de la monnaie sont enregistrées dans un grand livre de compte <b>public et infalsifiable</b>, appelé aussi <b>chaine de blocs</b> (<em>BlockChain</em> en anglais).",
-      "NETWORK_PEERS": "Les <b>nœuds</b> visibles ici correspondent aux <b>ordinateurs qui actualisent et contrôlent</b> la chaine de blocs.<br/><br/>Plus il y a de nœuds, plus la monnaie a une gestion <b>décentralisée</b> et digne de confiance.",
-      "NETWORK_PEERS_BLOCK_NUMBER": "Ce <b>numéro</b> (en vert) indique le <b>dernier bloc validé</b> pour ce nœud (dernière page écrite dans le grand livre de comptes).<br/><br/>La couleur verte indique que ce bloc est également validé par <b>la plupart des autres nœuds</b>.",
-      "NETWORK_PEERS_PARTICIPATE": "<b>Chaque membre</b>, équipé d'un ordinateur avec Internet, <b>peut participer en ajoutant un nœud</b>. Il suffit d'<b>installer le logiciel Duniter</b> (libre et gratuit). <a href=\"{{installDocUrl}}\" target=\"_system\">Voir le manuel d'installation &gt;&gt;</a>.",
-      "MENU_BTN_ACCOUNT": "Le menu <b>{{'ACCOUNT.TITLE'|translate}}</b> permet d'accéder à la gestion de votre compte.",
-      "MENU_BTN_ACCOUNT_MEMBER": "Consultez ici l'état de votre compte et les informations sur vos certifications.",
-      "WALLET_CERTIFICATIONS": "Cliquez ici pour consulter le détail de vos certifications (reçues et émises).",
-      "WALLET_RECEIVED_CERTIFICATIONS": "Cliquez ici pour consulter le détail de vos <b>certifications reçues</b>.",
-      "WALLET_GIVEN_CERTIFICATIONS": "Cliquez ici pour consulter le détail de vos <b>certifications émises</b>.",
-      "WALLET_BALANCE": "Le <b>solde</b> de votre compte s'affiche ici.",
-      "WALLET_BALANCE_RELATIVE": "{{'HELP.TIP.WALLET_BALANCE'|translate}}<br/><br/>L'unité utilisée (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) signifie que le montant en {{currency|capitalize}} a été divisé par le <b>Dividende Universel</b> (DU) co-créé par chaque membre.<br/><br/>Actuellement 1 DU vaut {{currentUD|formatInteger}} {{currency|capitalize}}s.",
-      "WALLET_BALANCE_CHANGE_UNIT": "Vous pourrez <b>changer l'unité</b> d'affichage des montants dans les <b><i class=\"icon ion-android-settings\"></i>&nbsp;{{'MENU.SETTINGS'|translate}}</b>.<br/><br/>Par exemple pour visualiser les montants <b>directement en {{currency|capitalize}}</b>, plutôt qu'en unité relative.",
-      "WALLET_PUBKEY": "Voici la clé publique de votre compte. Vous pouvez la communiquer à un tiers afin qu'il identifie plus simplement votre compte.",
-      "WALLET_SEND": "Effectuer un paiement en quelques clics.",
-      "WALLET_SEND_NO_MONEY": "Effectuer un paiement en quelques clics.<br/>(Votre solde ne le permet pas encore)",
-      "WALLET_OPTIONS": "Ce bouton permet l'accès aux <b>actions d'adhésion</b> et de sécurité.<br/><br/>N'oubliez pas d'y jeter un oeil !",
-      "WALLET_RECEIVED_CERTS": "S'affichera ici la liste des personnes qui vous ont certifié.",
-      "WALLET_CERTIFY": "Le bouton <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permet de sélectionner une identité et de la certifier.<br/><br/>Seuls des utilisateurs <b>déjà membres</b> peuvent en certifier d'autres.",
-      "WALLET_CERT_STOCK": "Votre stock de certifications (émises) est limité à <b>{{sigStock}} certifications</b>.<br/><br/>Ce stock se renouvelle avec le temps, au fur et à mesure que les certifications s'invalident.",
-      "MENU_BTN_TX_MEMBER": "Le menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> permet de consulter votre solde, l'historique vos transactions et d'envoyer un paiement.",
-      "MENU_BTN_TX": "Consultez ici <b>l'historique de vos transactions</b> et effectuez de nouvelles opérations.",
-      "MENU_BTN_WOT": "Le menu <b>{{'MENU.WOT'|translate}}</b> permet de rechercher parmi les <b>utilisateurs</b> de la monnaie (membres ou non).",
-      "WOT_SEARCH_TEXT_XS": "Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique).<br/><br/>La recherche se lancera automatiquement.",
-      "WOT_SEARCH_TEXT": "Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique). <br/><br/>Appuyer ensuite sur <b>Entrée</b> pour lancer la recherche.",
-      "WOT_SEARCH_RESULT": "Visualisez la fiche détaillée simplement en <b>cliquant</b> sur une ligne.",
-      "WOT_VIEW_CERTIFICATIONS": "La ligne <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> montre combien de membres ont validé cette identité.<br/><br/>Ces certifications attestent que le compte appartient à <b>une personne humaine vivante</b> n'ayant <b>aucun autre compte membre</b>.",
-      "WOT_VIEW_CERTIFICATIONS_COUNT": "Il faut au moins <b>{{sigQty}} certifications</b> pour devenir membre et recevoir le <b>Dividende Universel</b>.",
-      "WOT_VIEW_CERTIFICATIONS_CLICK": "Un clic ici permet d'ouvrir <b>la liste de toutes les certifications</b> de l'identité (reçues et émises).",
-      "WOT_VIEW_CERTIFY": "Le bouton <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permet d'ajouter votre certification à cette identité.",
-      "CERTIFY_RULES": "<b>Attention :</b> Ne certifiez que des <b>personnes physiques vivantes</b>, ne possédant aucun autre compte membre.<br/><br/>La sécurité de la monnaie dépend de la vigilance de chacun !",
-      "MENU_BTN_SETTINGS": "Les <b>{{'MENU.SETTINGS'|translate}}</b> vous permettront de configurer l'application.",
-      "HEADER_BAR_BTN_PROFILE": "Cliquez ici pour accéder à votre <b>profil utilisateur.</b>",
-      "SETTINGS_CHANGE_UNIT": "Vous pourrez <b>changer d'unité d'affichage</b> des montants en cliquant ci-dessus.<br/><br/>- Désactivez l'option pour un affichage des montants en {{currency|capitalize}}.<br/>- Activez l'option pour un affichage relatif en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (tous les montants seront <b>divisés</b> par le Dividende Universel courant).",
-      "END_LOGIN": "Cette visite guidée est <b>terminée</b> !<br/><br/>Bonne continuation à vous, dans le nouveau monde de l'<b>économie libre</b> !",
-      "END_NOT_LOGIN": "Cette visite guidée est <b>terminée</b> !<br/><br/>Si vous souhaitez rejoindre la monnaie {{currency|capitalize}}, il vous suffira de cliquer sur <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> ci-dessous."
-    }
-  },
-  "API" :{
-    "COMMON": {
-      "LINK_DOC": "Documentation API",
-      "LINK_DOC_HELP": "Documentation pour les développeurs",
-      "LINK_STANDARD_APP": "Version classique",
-      "LINK_STANDARD_APP_HELP": "Ouvrir la version classique de {{'COMMON.APP_NAME'|translate}}",
-      "CONNECTION_ERROR": "Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connection Internet, ou contactez l'administrateur du site</a>."
-    },
-    "HOME": {
-      "TITLE": "Documentation API {{'COMMON.APP_NAME'|translate}}",
-      "MESSAGE": "Bienvenue dans la <b>documentation de l'API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Connectez vos sites web à <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> très simplement !",
-      "MESSAGE_SHORT": "Connectez vos sites à <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> très simplement !",
-      "DOC_HEADER": "Services disponibles :"
-    },
-    "TRANSFER": {
-      "TITLE": "{{'COMMON.APP_NAME'|translate}} - Paiement en ligne",
-      "TITLE_SHORT": "Paiement en ligne",
-      "SUMMARY": "Récapitulatif du paiement :",
-      "AMOUNT": "Montant :",
-      "AMOUNTS_HELP": "Veuillez choisir le montant :",
-      "NAME": "Nom :",
-      "PUBKEY": "Clé publique du destinataire :",
-      "COMMENT": "Référence de l'opération :",
-      "NODE": "Adresse du nœud :",
-      "DEMO": {
-        "SALT": "demo",
-        "PASSWORD": "demo",
-        "PUBKEY": "3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",
-        "HELP": "<b>Mode démonstration</b> : Aucun paiement ne sera réellement envoyé pendant cette simulation.<br/>Veuillez utiliser les identifiants : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",
-        "BAD_CREDENTIALS": "Vérifiez votre saisie.<br/>En mode démonstration, les identifiants sont : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}"
-      },
-      "INFO": {
-        "SUCCESS_REDIRECTING_WITH_NAME": "Paiement envoyé.<br/>Redirection vers <b>{{name}}</b>...",
-        "SUCCESS_REDIRECTING": "Paiement envoyé.<br/>Redirection vers le site du vendeur...",
-        "CANCEL_REDIRECTING_WITH_NAME": "Paiement annulé.<br/>Redirection vers <b>{{name}}</b>...",
-        "CANCEL_REDIRECTING": "Paiement annulé.<br/>Redirection vers le site du vendeur..."
-      },
-      "ERROR": {
-        "TRANSFER_FAILED": "Échec du paiement"
-      }
-    },
-    "DOC": {
-      "DESCRIPTION_DIVIDER": "Description",
-      "URL_DIVIDER": "Adresse d'appel",
-      "PARAMETERS_DIVIDER": "Paramètres",
-      "AVAILABLE_PARAMETERS": "Voici la liste des paramètres possibles :",
-      "DEMO_DIVIDER": "Tester",
-      "DEMO_HELP": "Pour tester ce service, cliquez sur le bouton ci-contre. Le résultat s'affichera en dessous.",
-      "DEMO_RESULT": "Résultat retourné par l'appel :",
-      "DEMO_RESULT_PEER": "Adresse du nœud utilisé :",
-      "DEMO_SUCCEED": "<i class=\"icon ion-checkmark\"></i> Succès !",
-      "DEMO_CANCELLED": "<i class=\"icon ion-close\"></i> Annulé par l'utilisateur",
-      "INTEGRATE_DIVIDER": "Intégrer",
-      "INTEGRATE_CODE": "Code :",
-      "INTEGRATE_RESULT": "Prévisualisation du résultat :",
-      "INTEGRATE_PARAMETERS": "Paramètres",
-      "TRANSFER": {
-        "TITLE": "Paiements",
-        "DESCRIPTION": "Depuis un site (ex: vente en ligne) vous pouvez déléguer le paiement en monnaie libre à Cesium API. Pour cela, il vous suffit de déclencher l'ouverture d'une page sur l'adresse suivante :",
-        "PARAM_PUBKEY": "Clé publique du destinataire",
-        "PARAM_PUBKEY_HELP": "Clé publique du destinataire (obligatoire)",
-        "PARAM_AMOUNT": "Montant",
-        "PARAM_AMOUNT_HELP": "Montant de la transaction (obligatoire). Valeurs multiples autorisées, en utilisant un séparateur (point-virgule, barre verticale ou espace).",
-        "PARAM_COMMENT": "Référence (ou commentaire)",
-        "PARAM_COMMENT_HELP": "Référence ou commentaire. Vous permettra par exemple d'identifier le paiement dans la BlockChain.",
-        "PARAM_NAME": "Nom (du destinataire ou du site web)",
-        "PARAM_NAME_HELP": "Le nom du destinataire, ou du site web appelant. Cela peut être un nom lisible (\"Mon site en ligne\"), ou encore une pseudo-adresse web (\"MonSite.com\").",
-        "PARAM_REDIRECT_URL": "Adresse web de redirection",
-        "PARAM_REDIRECT_URL_HELP": "Adresse web (URL) de redirection, appelé quand le paiement a été envoyé. Peut contenir les chaînes suivantes, qui seront remplacées par les valeurs de la transaction : \"{tx}\", \"{hash}\", \"{comment}\", \"{amount}\", \"{pubkey}\" et \"{node}\".",
-        "PARAM_CANCEL_URL": "Adresse web d'annulation",
-        "PARAM_CANCEL_URL_HELP": "Adresse web (URL) en cas d'annulation du paiement, par l'utilisateur. Peut contenir les chaînes suivantes, qui seront remplacées dynamiquement : \"{comment}\", \"{amount}\" et {pubkey}.",
-        "PARAM_PREFERRED_NODE": "Adresse du nœud préféré",
-        "PARAM_PREFERRED_NODE_HELP": "Adresse (URL) du nœud Duniter à utiliser de préférence (\"g1.domaine.com:443\" ou \"https://g1.domaine.com\").",
-        "EXAMPLES_HELP": "Voici des exemples d'intégration :",
-        "EXAMPLE_BUTTON": "Bouton HTML",
-        "EXAMPLE_BUTTON_DEFAULT_TEXT": "Payer en {{currency|currencySymbol}}",
-        "EXAMPLE_BUTTON_DEFAULT_STYLE": "Style personnalisé",
-        "EXAMPLE_BUTTON_TEXT_HELP": "Texte du bouton",
-        "EXAMPLE_BUTTON_BG_COLOR": "Couleur du fond",
-        "EXAMPLE_BUTTON_BG_COLOR_HELP": "Exemple : #fbc14c, black, lightgrey, rgb(180,180,180)",
-        "EXAMPLE_BUTTON_FONT_COLOR": "Couleur du texte",
-        "EXAMPLE_BUTTON_FONT_COLOR_HELP": "Exemple : black, orange, rgb(180,180,180)",
-        "EXAMPLE_BUTTON_TEXT_ICON": "Icône",
-        "EXAMPLE_BUTTON_TEXT_WIDTH": "Largeur",
-        "EXAMPLE_BUTTON_TEXT_WIDTH_HELP": "Exemple : 200px, 50%",
-        "EXAMPLE_BUTTON_ICON_NONE": "Aucune",
-        "EXAMPLE_BUTTON_ICON_DUNITER": "Logo Duniter",
-        "EXAMPLE_BUTTON_ICON_CESIUM": "Logo Cesium",
-        "EXAMPLE_BUTTON_ICON_G1_COLOR": "Logo Äž1",
-        "EXAMPLE_BUTTON_ICON_G1_BLACK": "Logo Äž1 (noir)"
-      }
-    }
-  }
-}
diff --git a/package.json b/package.json
index bb6e6240f601980252126b81bb54c088b197f0e6..00bd93211a646a6e23154127524911218478011a 100644
--- a/package.json
+++ b/package.json
@@ -1,27 +1,30 @@
 {
   "name": "cesium",
-  "version": "1.5.8",
+  "version": "1.6.7",
   "description": "Cesium Wallet for G1 libre currency",
   "author": "Benoit Lavenier <benoit.lavenier@e-is.pro>",
   "license": "AGPL-3.0",
+  "homepage": "https://cesium.app",
   "repository": {
     "type": "git",
     "url": "git@git.duniter.org:clients/cesium/cesium.git"
   },
   "scripts": {
     "clean": "trash www/dist/** dist/web/* dist/desktop/**/*.deb platforms/android/**/*.apk",
-    "postinstall": "node -e \"try { require('fs').symlinkSync(require('path').resolve('node_modules/@bower_components'), 'www/lib', 'junction') } catch (e) { }\" && rm -f hooks/uglify-config.json hooks/after_prepare/uglify.js",
+    "postinstall": "node -e \"try { require('fs').symlinkSync(require('path').resolve('node_modules/@bower_components'), 'www/lib', 'junction') } catch (e) { }\" && rm -f hooks/uglify-config.json hooks/after_prepare/uglify.js www/lib/moment/meteor/moment.js",
     "install-platforms": "ionic cordova prepare",
     "start": "ionic serve",
+    "start:firefox": "gulp webExtCompile && web-ext run --source-dir ./dist/web/ext/",
     "docker:build": "sudo docker build . -t cesium/release",
     "docker:run": "sudo docker run -ti --rm -p 8100:8100 -p 35729:35729 -v .:/cesium:rw cesium/release",
-    "build:web": "gulp config --env default && gulp build:web --release"
+    "build:web": "gulp config --env default && gulp webBuild --release"
   },
   "keywords": [
     "duniter",
     "cesium",
+    "g1",
     "ionic",
-    "angular",
+    "angularjs",
     "cordova",
     "crypto-currency"
   ],
@@ -31,127 +34,134 @@
     "new": "https://git.duniter.org/clients/cesium-grp/cesium/issues/new"
   },
   "dependencies": {
-    "@bower_components/Leaflet.EasyButton": "CliffCloud/Leaflet.EasyButton#^2.4.0",
-    "@bower_components/Leaflet.FeatureGroup.SubGroup": "VivekKhandre/Leaflet.FeatureGroup.SubGroup#0.1.2",
-    "@bower_components/Leaflet.awesome-markers": "lvoogdt/Leaflet.awesome-markers#2.0.2",
-    "@bower_components/aes-js": "ricmoo/aes-js#3.1.2",
-    "@bower_components/angular": "angular/bower-angular#~1.5.11",
-    "@bower_components/angular-animate": "angular/bower-angular-animate#~1.5.11",
-    "@bower_components/angular-api": "E-IS/angular-api#0.3.0",
-    "@bower_components/angular-bind-notifier": "aeisenberg/angular-bind-notifier#^1.1.11",
-    "@bower_components/angular-cache": "jmdobry/angular-cache#^4.6.0",
+    "@bower_components/Leaflet.EasyButton": "CliffCloud/Leaflet.EasyButton#v2.4.0",
+    "@bower_components/Leaflet.FeatureGroup.SubGroup": "ghybs/Leaflet.FeatureGroup.SubGroup#v0.1.2",
+    "@bower_components/Leaflet.awesome-markers": "lvoogdt/Leaflet.awesome-markers#v2.0.2",
+    "@bower_components/aes-js": "ricmoo/aes-js#v3.1.2",
+    "@bower_components/angular": "angular/bower-angular#v1.5.11",
+    "@bower_components/angular-animate": "angular/bower-angular-animate#v1.5.11",
+    "@bower_components/angular-bind-notifier": "aeisenberg/angular-bind-notifier#v1.1.11",
+    "@bower_components/angular-cache": "jmdobry/angular-cache#4.6.0",
     "@bower_components/angular-chart.js": "jtblin/angular-chart#1.1.1",
-    "@bower_components/angular-file-saver": "alferov/angular-file-saver#^1.1.3",
-    "@bower_components/angular-fullscreen": "E-IS/angular-fullscreen#1.0.2",
-    "@bower_components/angular-image-crop": "andyshora/angular-image-crop#^2.0.0",
-    "@bower_components/angular-leaflet-directive": "E-IS/angular-leaflet-directive#0.10.1",
-    "@bower_components/angular-messages": "angular/bower-angular-messages#~1.5.11",
-    "@bower_components/angular-moment": "urish/angular-moment#^0.10.3",
-    "@bower_components/angular-resource": "angular/bower-angular-resource#~1.5.11",
-    "@bower_components/angular-sanitize": "angular/bower-angular-sanitize#~1.5.11",
-    "@bower_components/angular-screenmatch": "bensurman/angular-screenmatch#^1.0.1",
-    "@bower_components/angular-simple-logger": "nmccready/angular-simple-logger#~0.1.4",
-    "@bower_components/angular-translate": "PascalPrecht/bower-angular-translate#^2.18.1",
-    "@bower_components/angular-ui-router": "angular-ui/angular-ui-router-bower#^0.2.18",
+    "@bower_components/angular-expose-api": "duniter-cesium/angular-expose-api#0.3.1",
+    "@bower_components/angular-file-saver": "alferov/angular-file-saver#1.1.3",
+    "@bower_components/angular-fullscreen-toggle": "duniter-cesium/angular-fullscreen-toggle#1.0.4",
+    "@bower_components/angular-image-crop": "duniter-cesium/angular-image-crop#v2.0.2",
+    "@bower_components/angular-leaflet-directive": "duniter-cesium/angular-leaflet-directive#0.10.1",
+    "@bower_components/angular-messages": "angular/bower-angular-messages#v1.5.11",
+    "@bower_components/angular-moment": "urish/angular-moment#1.3.0",
+    "@bower_components/angular-resource": "angular/bower-angular-resource#v1.5.11",
+    "@bower_components/angular-sanitize": "angular/bower-angular-sanitize#v1.5.11",
+    "@bower_components/angular-screenmatch": "bensurman/angular-screenmatch#v1.0.1",
+    "@bower_components/angular-simple-logger": "nmccready/angular-simple-logger#0.1.7",
+    "@bower_components/angular-translate": "PascalPrecht/bower-angular-translate#2.18.2",
+    "@bower_components/angular-ui-router": "angular-ui/angular-ui-router-bower#0.2.18",
     "@bower_components/blob-polyfill": "bjornstar/blob-polyfill#~1.0.20150320",
-    "@bower_components/chart.js": "chartjs/Chart.js#^2.9.3",
+    "@bower_components/chart.js": "chartjs/Chart.js#v2.9.3",
     "@bower_components/file-saver.js": "Teleborder/FileSaver.js#~1.20150507.2",
     "@bower_components/ion-digit-keyboard": "skol-pro/ion-digit-keyboard#973b90c2fc",
-    "@bower_components/ionic": "driftyco/ionic-bower#1.3.5",
-    "@bower_components/ionic-material": "zachsoft/Ionic-Material#0.4.2",
+    "@bower_components/ionic": "driftyco/ionic-bower#v1.3.5",
+    "@bower_components/ionic-material": "zachsoft/Ionic-Material#v0.4.2",
     "@bower_components/js-nacl": "tonyg/js-nacl#1.3.2",
-    "@bower_components/js-scrypt": "tonyg/js-scrypt#1.2.0",
-    "@bower_components/leaflet": "Leaflet/Leaflet#0.7.7",
-    "@bower_components/leaflet-search": "stefanocudini/leaflet-search#2.7.2",
-    "@bower_components/leaflet.loading": "ebrelsford/Leaflet.loading#^0.1.24",
-    "@bower_components/leaflet.markercluster": "Leaflet/Leaflet.markercluster#0.5.0",
-    "@bower_components/moment": "moment/moment#^2.24.0",
-    "@bower_components/ng-idle": "HackedByChinese/ng-idle#^1.3.2",
-    "@bower_components/ngCordova": "driftyco/ng-cordova#0.1.27-alpha",
-    "@bower_components/numeral": "adamwdraper/Numeral-js#^1.5.6",
-    "@bower_components/qrcode.js": "davidshimjs/qrcodejs#*",
+    "@bower_components/js-scrypt": "tonyg/js-scrypt#v1.2.0",
+    "@bower_components/leaflet": "Leaflet/Leaflet#v0.7.7",
+    "@bower_components/leaflet-search": "stefanocudini/leaflet-search#v2.7.2",
+    "@bower_components/leaflet.loading": "ebrelsford/Leaflet.loading#v0.1.24",
+    "@bower_components/leaflet.markercluster": "Leaflet/Leaflet.markercluster#v0.5.0",
+    "@bower_components/moment": "moment/moment#2.24.0",
+    "@bower_components/ng-idle": "HackedByChinese/ng-idle#1.3.2",
+    "@bower_components/ngCordova": "driftyco/ng-cordova#v0.1.27-alpha",
+    "@bower_components/numeral": "adamwdraper/Numeral-js#1.5.6",
+    "@bower_components/qrcode-generator": "kazuhikoarase/qrcode-generator#js1.4.4",
     "@bower_components/robotodraft": "raibutera/robotodraft#1.1.0",
     "@bower_components/socket.io": "socketio/socket.io#^1.7.4",
     "@bower_components/socket.io-client": "socketio/socket.io-client#^1.7.4",
-    "@bower_components/ui-leaflet": "angular-ui/ui-leaflet#^2.0.0",
-    "@bower_components/underscore": "jashkenas/underscore#^1.8.3",
-    "@bower_components/waves": "fians/Waves#0.6",
-    "cordova": "^9.0.0",
-    "cordova-android": "^6.4.0",
+    "@bower_components/ui-leaflet": "angular-ui/ui-leaflet#v2.0.0",
+    "@bower_components/underscore": "jashkenas/underscore#1.10.2",
+    "cordova": "^8.1.2",
+    "cordova-android": "^8.1.0",
     "cordova-clipboard": "^1.3.0",
-    "cordova-ios": "git+https://github.com/bpresles/cordova-ios.git#5.1.0",
+    "cordova-ios": "git+https://github.com/duniter-cesium/cordova-ios.git#5.1.0",
     "cordova-osx": "^5.0.0",
+    "cordova-plugin-androidx": "^1.0.2",
+    "cordova-plugin-androidx-adapter": "^1.1.0",
     "cordova-plugin-camera": "^4.1.0",
     "cordova-plugin-compat": "^1.2.0",
     "cordova-plugin-console": "^1.1.0",
     "cordova-plugin-device": "^2.0.3",
     "cordova-plugin-dialogs": "^2.0.2",
+    "cordova-plugin-file": "^6.0.2",
     "cordova-plugin-ionic-keyboard": "^2.2.0",
     "cordova-plugin-ionic-webview": "^4.1.3",
-    "cordova-plugin-minisodium": "^1.0.0",
-    "cordova-plugin-secure-storage": "^3.0.2",
+    "cordova-plugin-minisodium": "git+https://github.com/duniter-cesium/cordova-plugin-minisodium#v1.0.1",
+    "cordova-plugin-secure-storage-android10": "git+https://github.com/duniter-cesium/cordova-plugin-secure-storage-android10.git#6.0.4",
     "cordova-plugin-splashscreen": "^5.0.3",
     "cordova-plugin-statusbar": "^2.4.3",
     "cordova-plugin-vibration": "^3.1.1",
     "cordova-plugin-websocket": "^0.12.2",
     "cordova-plugin-whitelist": "^1.3.4",
     "cordova-plugin-x-toast": "^2.7.2",
+    "gulp-sort": "^2.0.0",
     "ionic-plugin-keyboard": "^2.2.1",
-    "phonegap-plugin-barcodescanner": "^8.1.0"
+    "node-sass": "^4.14.0",
+    "phonegap-plugin-barcodescanner": "^8.1.0",
+    "uuid": "3.2.1"
   },
   "devDependencies": {
-    "@ionic/v1-toolkit": "2.0.18",
-    "bower": "^1.8.8",
+    "@ionic/cli": "^6.7.0",
+    "@ionic/v1-toolkit": "^3.2.0",
+    "@prantlf/gulp-jsonlint": "^2.4.0",
     "cordova-uglify": "^0.3.4",
-    "del": "^3.0.0",
+    "del": "^5.1.0",
     "delete-empty": "^0.1.3",
     "event-stream": "3.3.4",
     "glob": "^5.0.15",
     "graceful-fs": "^4.2.3",
-    "gulp": "^3.9.1",
-    "gulp-angular-templatecache": "^2.2.7",
+    "gulp": "4.0.2",
+    "gulp-angular-templatecache": "^3.0.0",
     "gulp-angular-translate": "^0.1.4",
     "gulp-base64": "^0.1.3",
     "gulp-base64-v2": "^1.0.4",
-    "gulp-bump": "^2.1.0",
-    "gulp-clean": "^0.3.2",
-    "gulp-clean-css": "^3.7.0",
+    "gulp-bump": "^3.1.3",
+    "gulp-clean": "^0.4.0",
+    "gulp-clean-css": "^4.3.0",
     "gulp-css-base64": "^1.3.4",
-    "gulp-csso": "^2.0.0",
-    "gulp-filter": "^4.0.0",
+    "gulp-csso": "^4.0.1",
+    "gulp-filter": "^6.0.0",
     "gulp-footer": "^2.0.2",
-    "gulp-header": "^2.0.7",
+    "gulp-header": "^2.0.9",
     "gulp-html-remove": "^0.1.1",
-    "gulp-htmlmin": "^2.0.0",
+    "gulp-htmlmin": "^5.0.1",
     "gulp-jshint": "^2.1.0",
-    "gulp-markdown": "^1.2.0",
-    "gulp-ng-annotate": "^2.0.0",
-    "gulp-ng-constant": "^1.1.0",
-    "gulp-remove-code": "^1.0.2",
-    "gulp-rename": "^1.2.0",
-    "gulp-replace": "^0.5.4",
-    "gulp-rev": "^7.0.0",
-    "gulp-rev-replace": "^0.4.3",
-    "gulp-sass": "^4.0.2",
+    "gulp-markdown": "^5.0.1",
+    "gulp-ng-annotate": "^2.1.0",
+    "gulp-ng-constant": "^1.2.0",
+    "gulp-remove-code": "^3.0.4",
+    "gulp-rename": "^2.0.0",
+    "gulp-replace": "^1.0.0",
+    "gulp-sass": "^4.1.0",
+    "gulp-sourcemaps": "^2.6.5",
+    "gulp-sri-hash": "^2.2.1",
     "gulp-uglify-es": "^2.0.0",
-    "gulp-useref": "^3.1.0",
-    "gulp-zip": "^3.2.0",
-    "ionic": "^5.4.13",
+    "gulp-useref": "^4.0.1",
+    "gulp-zip": "^5.0.1",
     "jshint": "^2.10.3",
+    "lazypipe": "^1.0.2",
     "merge2": "^1.3.0",
     "mv": "^2.1.1",
-    "node-sass": "^4.13.0",
+    "node-sass": "^4.14.0",
     "playup": "^1.1.0",
     "vinyl-fs": "^3.0.3",
-    "yargs": "^5.0.0"
+    "yargs": "^5.0.0",
+    "web-ext": "^4.2.0"
   },
   "peerDependencies": {
+    "leaflet": "Leaflet/Leaflet#v0.7.7",
     "nopt": "4.0.1"
   },
   "cordovaPlugins": [
     "cordova-plugin-whitelist",
     "cordova-plugin-splashscreen",
-    "cordova-plugin-console",
     "ionic-plugin-keyboard",
     "cordova-plugin-device",
     "cordova-plugin-statusbar",
@@ -159,7 +169,7 @@
     "cordova-plugin-websocket",
     "cordova-plugin-vibration",
     "cordova-plugin-dialogs",
-    "cordova-plugin-secure-storage",
+    "cordova-plugin-secure-storage-android10",
     "cordova-plugin-x-toast",
     "cordova-clipboard",
     "cordova-plugin-minisodium",
@@ -171,7 +181,7 @@
     {
       "platform": "ios",
       "version": "5.1.0",
-      "locator": "https://github.com/bpresles/cordova-ios.git#5.1.0"
+      "locator": "https://github.com/duniter-cesium/cordova-ios.git#5.1.0"
     },
     {
       "platform": "android",
@@ -185,11 +195,10 @@
         "CAMERA_USAGE_DESCRIPTION": "Add picture to the user profile",
         "PHOTOLIBRARY_USAGE_DESCRIPTION": "Take a picture for the user profile"
       },
-      "cordova-plugin-console": {},
       "cordova-plugin-device": {},
       "cordova-plugin-dialogs": {},
       "cordova-plugin-minisodium": {},
-      "cordova-plugin-secure-storage": {},
+      "cordova-plugin-secure-storage-android10": {},
       "cordova-plugin-splashscreen": {},
       "cordova-plugin-statusbar": {},
       "cordova-plugin-vibration": {},
@@ -198,21 +207,27 @@
       "cordova-plugin-x-toast": {},
       "cordova-plugin-ionic-keyboard": {},
       "phonegap-plugin-barcodescanner": {
-        "CAMERA_USAGE_DESCRIPTION": "To scan QRCode"
+        "CAMERA_USAGE_DESCRIPTION": "To scan QRCode",
+        "ANDROID_SUPPORT_V4_VERSION": "28.+"
       },
       "ionic-plugin-keyboard": {},
       "cordova-clipboard": {},
       "cordova-plugin-ionic-webview": {
-        "ANDROID_SUPPORT_ANNOTATIONS_VERSION": "27.+"
-      }
+        "ANDROID_SUPPORT_ANNOTATIONS_VERSION": "28.+"
+      },
+      "cordova-plugin-console": {},
+      "cordova-plugin-file": {},
+      "cordova-plugin-androidx": {},
+      "cordova-plugin-androidx-adapter": {}
     },
     "platforms": [
       "ios",
-      "android",
-      "osx"
+      "osx",
+      "android"
     ]
   },
   "engines": {
-    "yarn": ">= 1.0.0"
+    "node": ">= 10.20.0",
+    "yarn": ">= 1.22.0"
   }
-}
\ No newline at end of file
+}
diff --git a/platforms/android b/platforms/android
index 43173695faa4d60229b1a6bc6f1bc11d1c262627..d53e5e63d67f847ea592c0d95dc7278d1225376e 160000
--- a/platforms/android
+++ b/platforms/android
@@ -1 +1 @@
-Subproject commit 43173695faa4d60229b1a6bc6f1bc11d1c262627
+Subproject commit d53e5e63d67f847ea592c0d95dc7278d1225376e
diff --git a/resources/android/Dockerfile b/resources/android/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..4acd3b8446f52844f05673fa0e419e59e83575e8
--- /dev/null
+++ b/resources/android/Dockerfile
@@ -0,0 +1,93 @@
+FROM     ubuntu:18.04
+LABEL maintainer="benoit [dot] lavenier [at] e-is [dot] pro"
+
+ENV DEBIAN_FRONTEND=noninteractive \
+    ANDROID_HOME=/opt/android-sdk-linux \
+    NODE_VERSION=10.20.0 \
+    NPM_VERSION=6.14.4 \
+    YARN_VERSION=1.22.4 \
+    IONIC_CLI_VERSION=6.5.0 \
+    CORDOVA_VERSION=8.1.2 \
+    CORDOVA_RES_VERSION=0.11.0 \
+    NATIVE_RUN_VERSION=1.0.0 \
+    GRADLE_VERSION=4.10.3 \
+    GULP_VERSION=2.2.0 \
+    ANDROID_NDK_VERSION=r19c \
+    ANDROID_SDK_VERSION=r29.0.2
+
+# Install basics
+RUN apt-get update &&  \
+    apt-get install -y git wget curl unzip build-essential software-properties-common ruby ruby-dev ruby-ffi gcc make python && \
+    curl --retry 3 -SLO "http://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" && \
+    tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 && \
+    rm "node-v$NODE_VERSION-linux-x64.tar.gz"
+
+# Install global nodeJS dependencies
+RUN npm install -g npm@"$NPM_VERSION" && \
+    npm install -g yarn@"$YARN_VERSION" gulp@"$GULP_VERSION" cordova@"$CORDOVA_VERSION" cordova-res@"$CORDOVA_RES_VERSION" @ionic/cli@"$IONIC_CLI_VERSION" && \
+    npm cache clear --force
+
+
+# Install Cordova
+RUN npm install -g cordova@"$CORDOVA_VERSION" cordova-res@"$CORDOVA_RES_VERSION" native-run@"$NATIVE_RUN_VERSION" && \
+    npm cache clear --force
+
+# Install Android prerequisites
+RUN echo ANDROID_HOME="${ANDROID_HOME}" >> /etc/environment && \
+    dpkg --add-architecture i386 && \
+    apt-get update && \
+    apt-get -y install openjdk-8-jdk-headless && \
+    apt-get install -y --force-yes expect ant wget zipalign libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 lib32z1 qemu-kvm kmod && \
+    apt-get clean && \
+    apt-get autoclean && \
+    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
+
+# Install Android SDK
+#RUN cd /opt && \
+#    wget --output-document=android-sdk.tgz --quiet http://dl.google.com/android/android-sdk_"$ANDROID_SDK_VERSION"-linux.tgz && \
+#    tar xzf android-sdk.tgz && \
+#    rm -f android-sdk.tgz && \
+#    chown -R root. /opt
+#
+## Install Android NDK
+#RUN cd /opt/ && \
+#  wget --output-document=android-ndk.zip --quiet  https://dl.google.com/android/repository/android-ndk-"$ANDROID_NDK_VERSION"-linux-x86_64.zip && \
+#  unzip android-ndk.zip && \
+#  rm android-ndk.zip && \
+#  chown -R root. /opt
+
+# Install Gradle
+#RUN cd /opt/ && \
+#    wget https://services.gradle.org/distributions/gradle-"$GRADLE_VERSION"-bin.zip && \
+#    mkdir /opt/gradle && \
+#    unzip -d /opt/gradle gradle-"$GRADLE_VERSION"-bin.zip && \
+#    rm -rf gradle-$"GRADLE_VERSION"-bin.zip
+
+# Setup environment
+
+#ENV PATH ${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:/opt/tools:/opt/gradle/gradle-"$GRADLE_VERSION"/bin
+
+# Install sdk elements
+#COPY resources/android/build/tools /opt/tools
+#RUN chmod u+x /opt/tools/*.sh
+#RUN ["/opt/tools/android-accept-licenses.sh", "android update sdk --all --no-ui --filter platform-tools,tools,build-tools-29.0.0,android-29,build-tools-26.0.0,android-26,build-tools-25.0.0,android-25,extra-android-support,extra-android-m2repository,extra-google-m2repository"]
+#RUN unzip ${ANDROID_HOME}/temp/*.zip -d ${ANDROID_HOME}
+
+
+# Install source code
+#RUN git config --global user.email "user.name@domain.com" && \
+#    git config --global user.name "User Name" && \
+RUN git clone https://git.duniter.org/clients/cesium-grp/cesium.git && \
+    cd cesium && \
+    yarn install --ignore-engines
+
+# Restore cordova platforms
+RUN cd cesium && \
+    yarn run install-platforms
+
+# TODO: Test First Build so that it will be faster later
+##  ionic cordova build android --prod --no-interactive --release
+
+WORKDIR cesium
+EXPOSE 8100 35729
+CMD ["yarn", "run", "start"]
diff --git a/resources/android/build/build-extras.gradle b/resources/android/build/build-extras.gradle
index d3275a4912d554bb917c8a433edde180eb32cea8..38129572df5b58ca187c9905a9ce7ea60d5ced72 100644
--- a/resources/android/build/build-extras.gradle
+++ b/resources/android/build/build-extras.gradle
@@ -1,5 +1,21 @@
 configurations.all {
     resolutionStrategy {
-        force 'com.android.support:support-v4:27.1.0'
+      force 'androidx.legacy:legacy-support-v4:1.0.0'
+      force 'androidx.appcompat:appcompat:1.0.0'
     }
 }
+dependencies {
+  implementation(project(path: "CordovaLib")) {
+    exclude group: 'com.android.support', module:'support-v4'
+  }
+}
+
+// Overrides the value of minSdkVersion set in AndroidManifest.xml. Useful when creating multiple APKs based on SDK version
+ext.cdvMinSdkVersion=16
+
+  // Overrides the automatically detected android.compileSdkVersion value
+ext.cdvCompileSdkVersion=29
+
+// Overrides the automatically detected android.buildToolsVersion value
+ext.cdvBuildToolsVersion='29.0.2'
+//ext.cdvBuildToolsVersion = '30.0.0-rc2'
diff --git a/resources/android/build/gradle/wrapper/gradle-wrapper.properties b/resources/android/build/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 4cde7d5f5e5e29fef6e85ef10908e13cb1b43e19..0000000000000000000000000000000000000000
--- a/resources/android/build/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1 +0,0 @@
-distributionUrl=https://services.gradle.org/distributions/gradle-4.1-all.zip
diff --git a/resources/flag/flag-eo.xcf b/resources/flag/flag-eo.xcf
new file mode 100644
index 0000000000000000000000000000000000000000..d520c2a94999dbdac24ad49560f352c8a697161a
Binary files /dev/null and b/resources/flag/flag-eo.xcf differ
diff --git a/resources/flag/flag-es.svg b/resources/flag/flag-es.svg
new file mode 100644
index 0000000000000000000000000000000000000000..576dd67cbc9b17f764c904ec1b9e75880b329ba7
--- /dev/null
+++ b/resources/flag/flag-es.svg
@@ -0,0 +1,544 @@
+<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-es" viewBox="0 0 640 480">
+  <path fill="#AA151B" d="M0 0h640v480H0z"/>
+  <path fill="#F1BF00" d="M0 120h640v240H0z"/>
+  <path fill="#ad1519" d="M127.3 213.3l-.8-.1-1-1-.7-.4-.6-.8s-.7-1.1-.4-2c.3-.9.9-1.2 1.4-1.5a12 12 0 011.5-.5l1-.4 1.3-.3.5-.3c.2 0 .7 0 1-.2l1-.2 1.6.1h4.8c.4 0 1.2.3 1.4.4a35 35 0 002 .7c.5.1 1.6.3 2.2.6.5.3.9.7 1.1 1l.5 1v1.1l-.5.8-.6 1-.8.6s-.5.5-1 .4c-.4 0-4.8-.8-7.6-.8s-7.3.9-7.3.9"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".3" d="M127.3 213.3l-.8-.1-1-1-.7-.4-.6-.8s-.7-1.1-.4-2c.3-.9.9-1.2 1.4-1.5a12 12 0 011.5-.5l1-.4 1.3-.3.5-.3c.2 0 .7 0 1-.2l1-.2 1.6.1h4.8c.4 0 1.2.3 1.4.4a35 35 0 002 .7c.5.1 1.6.3 2.2.6.5.3.9.7 1.1 1l.5 1v1.1l-.5.8-.6 1-.8.6s-.5.5-1 .4c-.4 0-4.8-.8-7.6-.8s-7.3.9-7.3.9z"/>
+  <path fill="#c8b100" d="M133.3 207c0-1.3.6-2.3 1.3-2.3.8 0 1.4 1 1.4 2.4 0 1.3-.6 2.4-1.4 2.4s-1.3-1.1-1.3-2.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M133.3 207c0-1.3.6-2.3 1.3-2.3.8 0 1.4 1 1.4 2.4 0 1.3-.6 2.4-1.4 2.4s-1.3-1.1-1.3-2.5z"/>
+  <path fill="#c8b100" d="M134 207c0-1.2.3-2.1.7-2.1.3 0 .6 1 .6 2.1 0 1.3-.3 2.2-.6 2.2-.4 0-.6-1-.6-2.2"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134 207c0-1.2.3-2.1.7-2.1.3 0 .6 1 .6 2.1 0 1.3-.3 2.2-.6 2.2-.4 0-.6-1-.6-2.2z"/>
+  <path fill="#c8b100" d="M133.8 204.5c0-.4.4-.8.8-.8s1 .4 1 .8c0 .5-.5.9-1 .9s-.8-.4-.8-.9"/>
+  <path fill="#c8b100" d="M135.3 204.2v.6h-1.4v-.6h.5V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M135.3 204.2v.6h-1.4v-.6h.5V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h.4"/>
+  <path fill="#c8b100" d="M135.9 204.2v.6h-2.5v-.6h1V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M135.9 204.2v.6h-2.5v-.6h1V203h-.7v-.6h.7v-.5h.5v.5h.6v.6h-.6v1.2h1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134.9 203.7c.4.1.6.4.6.8 0 .5-.4.9-.8.9s-1-.4-1-.9c0-.4.3-.7.7-.8"/>
+  <path fill="#c8b100" d="M134.7 213.2H130v-1.1l-.3-1.2-.2-1.5c-1.3-1.7-2.5-2.8-2.9-2.5.1-.3.2-.6.5-.7 1.1-.7 3.5 1 5.2 3.6l.5.7h3.8l.4-.7c1.8-2.7 4.1-4.3 5.2-3.6.3.1.4.4.5.7-.4-.3-1.6.8-2.9 2.5l-.2 1.5-.2 1.2-.1 1.1h-4.7"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134.7 213.2H130v-1.1l-.3-1.2-.2-1.5c-1.3-1.7-2.5-2.8-2.9-2.5.1-.3.2-.6.5-.7 1.1-.7 3.5 1 5.2 3.6l.5.7h3.8l.4-.7c1.8-2.7 4.1-4.3 5.2-3.6.3.1.4.4.5.7-.4-.3-1.6.8-2.9 2.5l-.2 1.5-.2 1.2-.1 1.1h-4.7z"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M126.8 206.8c1-.5 3 1.1 4.6 3.6m11-3.6c-.8-.5-2.8 1.1-4.5 3.6"/>
+  <path fill="#c8b100" d="M127.8 215.3l-.5-1a27.3 27.3 0 0114.7 0l-.5.8a5.7 5.7 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.5.8l-.3-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M127.8 215.3l-.5-1a27.3 27.3 0 0114.7 0l-.5.8a5.7 5.7 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.5.8l-.3-.6"/>
+  <path fill="#c8b100" d="M134.6 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4-1.4-.5-4-.8-6.5-.8s-5 .3-6.4.8c-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134.6 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4-1.4-.5-4-.8-6.5-.8s-5 .3-6.4.8c-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6z"/>
+  <path fill="#c8b100" d="M142.1 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.4.6-1.1.7-1.4-.6-1.4-.6-.5.7-1 1c-.5 0-1.2-.4-1.2-.4l-.2.5-.3.1.2.5a27 27 0 017.2-.9c3 0 5.5.4 7.4 1l.2-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M142.1 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.4.6-1.1.7-1.4-.6-1.4-.6-.5.7-1 1c-.5 0-1.2-.4-1.2-.4l-.2.5-.3.1.2.5a27 27 0 017.2-.9c3 0 5.5.4 7.4 1l.2-.6z"/>
+  <path fill="#c8b100" d="M134.7 210.7h.2a1 1 0 000 .4c0 .6.4 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1v-.1l.4-.4.2.5a.9.9 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4l.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6-.2.2-.4.2-.7.2-.6 0-1.2-.3-1.4-.8-.3.3-.7.5-1.1.5a1.6 1.6 0 01-1.2-.6 1.6 1.6 0 01-1 .4 1.6 1.6 0 01-1.3-.6 1.6 1.6 0 01-2.4.2 1.6 1.6 0 01-1.2.6 1.5 1.5 0 01-1.1-.5c-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2l-1-1 .1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 .9.9 0 000-.4v-.5l.4.4a.7.7 0 000 .1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.7 0 1.1-.4 1.1-1a1 1 0 000-.3h.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134.7 210.7h.2a1 1 0 000 .4c0 .6.4 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1v-.1l.4-.4.2.5a.9.9 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4l.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6-.2.2-.4.2-.7.2-.6 0-1.2-.3-1.4-.8-.3.3-.7.5-1.1.5a1.6 1.6 0 01-1.2-.6 1.6 1.6 0 01-1 .4 1.6 1.6 0 01-1.3-.6 1.6 1.6 0 01-2.4.2 1.6 1.6 0 01-1.2.6 1.5 1.5 0 01-1.1-.5c-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2l-1-1 .1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 .9.9 0 000-.4v-.5l.4.4a.7.7 0 000 .1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.7 0 1.1-.4 1.1-1a1 1 0 000-.3h.3z"/>
+  <path fill="#c8b100" d="M134.6 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3a27 27 0 017.5-1c3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27.3 27.3 0 00-7.4-1"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".3" d="M134.6 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3a27 27 0 017.5-1c3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27.3 27.3 0 00-7.4-1z"/>
+  <path fill="#fff" d="M131.8 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.5-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M131.8 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.5-.4z"/>
+  <path fill="#ad1519" d="M134.7 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134.7 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1"/>
+  <path fill="#058e6e" d="M130 214.9h-.7c-.1 0-.3 0-.3-.2a.3.3 0 01.2-.3l.7-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M130 214.9h-.7c-.1 0-.3 0-.3-.2a.3.3 0 01.2-.3l.7-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7"/>
+  <path fill="#ad1519" d="M127.3 215.3l.3-.4h.7l-.4.6-.6-.2"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M127.3 215.3l.3-.4h.7l-.4.6-.6-.2"/>
+  <path fill="#fff" d="M136.6 214.4c0-.3.2-.4.4-.4a.4.4 0 01.5.4.4.4 0 01-.5.4.4.4 0 01-.4-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M136.6 214.4c0-.3.2-.4.4-.4a.4.4 0 01.5.4.4.4 0 01-.5.4.4.4 0 01-.4-.4z"/>
+  <path fill="#058e6e" d="M139.3 214.9h.6a.3.3 0 00.4-.2.3.3 0 00-.3-.3l-.6-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M139.3 214.9h.6a.3.3 0 00.4-.2.3.3 0 00-.3-.3l-.6-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7"/>
+  <path fill="#ad1519" d="M142 215.4l-.3-.5h-.7l.3.6.6-.1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M142 215.4l-.3-.5h-.7l.3.6.6-.1"/>
+  <path fill="#ad1519" d="M134.6 217.1a25 25 0 01-6-.6 25.5 25.5 0 0112.1 0c-1.6.4-3.7.6-6 .6"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".3" d="M134.6 217.1a25 25 0 01-6-.6 25.5 25.5 0 0112.1 0c-1.6.4-3.7.6-6 .6z"/>
+  <path fill="#c8b100" d="M142 212l-.1-.3c-.2 0-.3 0-.4.2 0 .2 0 .4.2.4 0 0 .2 0 .3-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M142 212l-.1-.3c-.2 0-.3 0-.4.2 0 .2 0 .4.2.4 0 0 .2 0 .3-.3z"/>
+  <path fill="#c8b100" d="M137.3 211.2c0-.2 0-.4-.2-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M137.3 211.2c0-.2 0-.4-.2-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3z"/>
+  <path fill="#c8b100" d="M132 211.2l.1-.4c.2 0 .3.1.3.3 0 .2 0 .4-.2.4l-.2-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M132 211.2l.1-.4c.2 0 .3.1.3.3 0 .2 0 .4-.2.4l-.2-.3z"/>
+  <path fill="#c8b100" d="M127.3 212l.1-.3c.2 0 .3 0 .4.2 0 .2 0 .4-.2.4 0 0-.2 0-.3-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M127.3 212l.1-.3c.2 0 .3 0 .4.2 0 .2 0 .4-.2.4 0 0-.2 0-.3-.3z"/>
+  <path fill="#c8b100" d="M134.6 208.5l-.8.5.6 1.3.2.1.2-.1.7-1.3-.9-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134.6 208.5l-.8.5.6 1.3.2.1.2-.1.7-1.3-.9-.5"/>
+  <path fill="#c8b100" d="M132.8 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M132.8 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6"/>
+  <path fill="#c8b100" d="M136.4 210.5l-.3.5-1.3-.4-.2-.2.2-.2 1.3-.3.3.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M136.4 210.5l-.3.5-1.3-.4-.2-.2.2-.2 1.3-.3.3.6"/>
+  <path fill="#c8b100" d="M129.3 209l-.7.7.9 1 .2.1.1-.1.3-1.3-.8-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M129.3 209l-.7.7.9 1 .2.1.1-.1.3-1.3-.8-.3"/>
+  <path fill="#c8b100" d="M128 211.2l.4.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M128 211.2l.4.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6"/>
+  <path fill="#c8b100" d="M131.5 210.5l-.3.6H130l-.2-.2.1-.3 1.2-.6.5.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M131.5 210.5l-.3.6H130l-.2-.2.1-.3 1.2-.6.5.5"/>
+  <path fill="#c8b100" d="M126.6 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M126.6 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4"/>
+  <path fill="#c8b100" d="M129.2 210.9c0-.3.2-.5.5-.5s.5.2.5.5a.5.5 0 01-.5.4.5.5 0 01-.5-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M129.2 210.9c0-.3.2-.5.5-.5s.5.2.5.5a.5.5 0 01-.5.4.5.5 0 01-.5-.4z"/>
+  <path fill="#c8b100" d="M140 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M140 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3"/>
+  <path fill="#c8b100" d="M141.4 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M141.4 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6"/>
+  <path fill="#c8b100" d="M137.8 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M137.8 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5"/>
+  <path fill="#c8b100" d="M142.5 211.4l.1.6 1.3.2.2-.1v-.2l-1-.9-.6.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M142.5 211.4l.1.6 1.3.2.2-.1v-.2l-1-.9-.6.4"/>
+  <path fill="#c8b100" d="M134.2 210.4a.5.5 0 01.4-.4c.3 0 .5.2.5.4a.5.5 0 01-.5.5.5.5 0 01-.4-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M134.2 210.4a.5.5 0 01.4-.4c.3 0 .5.2.5.4a.5.5 0 01-.5.5.5.5 0 01-.4-.5z"/>
+  <path fill="#c8b100" d="M139.1 210.9c0-.3.3-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M139.1 210.9c0-.3.3-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4z"/>
+  <path fill="#c8b100" d="M124.8 212.2l-.6-.7c-.2-.2-.7-.3-.7-.3 0-.1.3-.3.6-.3a.5.5 0 01.4.2v-.2s.3 0 .4.3v1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M124.8 212.2l-.6-.7c-.2-.2-.7-.3-.7-.3 0-.1.3-.3.6-.3a.5.5 0 01.4.2v-.2s.3 0 .4.3v1z"/>
+  <path fill="#c8b100" d="M124.8 212c.1-.2.4-.2.5 0 .2.1.3.3.2.5l-.5-.1c-.2-.1-.3-.4-.2-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M124.8 212c.1-.2.4-.2.5 0 .2.1.3.3.2.5l-.5-.1c-.2-.1-.3-.4-.2-.5z"/>
+  <path fill="#c8b100" d="M144.3 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M144.3 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3z"/>
+  <path fill="#c8b100" d="M144.3 212c0-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M144.3 212c0-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5z"/>
+  <path fill="#c8b100" d="M124 223h21.4v-5.5H124v5.6z"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M124 223h21.4v-5.5H124v5.6z"/>
+  <path fill="#c8b100" d="M126.2 226.8a1 1 0 01.4 0h16.5a1.4 1.4 0 01-1-1.2c0-.6.5-1.1 1-1.3a1.7 1.7 0 01-.4 0h-16a1.4 1.4 0 01-.5 0c.6.2 1 .7 1 1.3a1.3 1.3 0 01-1 1.2"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M126.2 226.8a1 1 0 01.4 0h16.5a1.4 1.4 0 01-1-1.2c0-.6.5-1.1 1-1.3a1.7 1.7 0 01-.4 0h-16a1.4 1.4 0 01-.5 0c.6.2 1 .7 1 1.3a1.3 1.3 0 01-1 1.2z"/>
+  <path fill="#c8b100" d="M126.6 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.5 0-1-.4-1-.8s.5-.8 1-.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M126.6 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.5 0-1-.4-1-.8s.5-.8 1-.8z"/>
+  <path fill="#c8b100" d="M126.6 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.5 0-1-.2-1-.6 0-.3.5-.6 1-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M126.6 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.5 0-1-.2-1-.6 0-.3.5-.6 1-.6z"/>
+  <path fill="#005bbf" d="M149.6 317.4c-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8a8.3 8.3 0 01-3.8.8c-1.5 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8 8.3 8.3 0 01-3.8.8v2.4c1.5 0 2.8-.4 3.8-.9a8.2 8.2 0 013.7-.8c1.4 0 2.7.3 3.7.8s2.2.9 3.7.9a8.4 8.4 0 003.8-.9c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.9 3.7.9v-2.4"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M149.6 317.4c-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8a8.3 8.3 0 01-3.8.8c-1.5 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8 8.3 8.3 0 01-3.8.8v2.4c1.5 0 2.8-.4 3.8-.9a8.2 8.2 0 013.7-.8c1.4 0 2.7.3 3.7.8s2.2.9 3.7.9a8.4 8.4 0 003.8-.9c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.9 3.7.9v-2.4z"/>
+  <path fill="#ccc" d="M149.6 319.8a8 8 0 01-3.7-.9 8.3 8.3 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8s-2.3.9-3.8.9-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8.2 8.2 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.4 3.8-.9a8.1 8.1 0 013.7-.7c1.4 0 2.7.2 3.7.7a8.3 8.3 0 007.5 0 8.5 8.5 0 017.5.1 8.1 8.1 0 003.7.8v-2.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M149.6 319.8a8 8 0 01-3.7-.9 8.3 8.3 0 00-3.8-.8c-1.4 0-2.7.3-3.7.8s-2.3.9-3.8.9-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8.2 8.2 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.4 3.8-.9a8.1 8.1 0 013.7-.7c1.4 0 2.7.2 3.7.7a8.3 8.3 0 007.5 0 8.5 8.5 0 017.5.1 8.1 8.1 0 003.7.8v-2.3"/>
+  <path fill="#005bbf" d="M149.6 322a7 7 0 01-3.7-.8 8.3 8.3 0 00-3.8-.7c-1.4 0-2.7.2-3.7.7-1 .6-2.3.9-3.8.9s-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.3 3.8-.9a10.2 10.2 0 017.4 0 7 7 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.8 3.7.8V322"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M149.6 322a7 7 0 01-3.7-.8 8.3 8.3 0 00-3.8-.7c-1.4 0-2.7.2-3.7.7-1 .6-2.3.9-3.8.9s-2.8-.4-3.7-.9a8.4 8.4 0 00-3.7-.8 8 8 0 00-3.7.8c-1 .5-2.3.9-3.8.9v2.3c1.5 0 2.8-.3 3.8-.9a10.2 10.2 0 017.4 0 7 7 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.5 0 2.8.3 3.8.8s2.2.8 3.7.8V322"/>
+  <path fill="#ccc" d="M149.6 326.7a8 8 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.9 10.2 10.2 0 017.4 0 8 8 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.8-.8 1.4 0 2.7.3 3.7.8s2.3.8 3.7.8v2.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M149.6 326.7a8 8 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.9 10.2 10.2 0 017.4 0 8 8 0 003.7.9 8.4 8.4 0 003.8-.8c1-.5 2.3-.8 3.8-.8 1.4 0 2.7.3 3.7.8s2.3.8 3.7.8v2.3"/>
+  <path fill="#005bbf" d="M149.6 329a8.1 8.1 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.7.3 3.7.7a8.4 8.4 0 007.5 0c1-.4 2.3-.7 3.8-.7 1.4 0 2.7.3 3.7.8s2.2.8 3.7.8v2.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M149.6 329a8.1 8.1 0 01-3.7-.8c-1-.5-2.3-.8-3.7-.8a8.4 8.4 0 00-3.8.8c-1 .5-2.3.8-3.8.8a7 7 0 01-3.7-.9 8.4 8.4 0 00-3.7-.7c-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v-2.3a8.3 8.3 0 003.8-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.7.3 3.7.7a8.4 8.4 0 007.5 0c1-.4 2.3-.7 3.8-.7 1.4 0 2.7.3 3.7.8s2.2.8 3.7.8v2.3z"/>
+  <path fill="#c8b100" d="M126.2 308l.2.5c0 1.5-1.3 2.6-2.7 2.6h22a2.7 2.7 0 01-2.7-2.6v-.5a1.3 1.3 0 01-.3 0h-16a1.4 1.4 0 01-.5 0"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M126.2 308l.2.5c0 1.5-1.3 2.6-2.7 2.6h22a2.7 2.7 0 01-2.7-2.6v-.5a1.3 1.3 0 01-.3 0h-16a1.4 1.4 0 01-.5 0z"/>
+  <path fill="#c8b100" d="M126.6 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.5 0-1-.3-1-.8 0-.4.5-.7 1-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M126.6 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.5 0-1-.3-1-.8 0-.4.5-.7 1-.7z"/>
+  <path fill="#c8b100" d="M123.7 316.7h22V311h-22v5.6z"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M123.7 316.7h22V311h-22v5.6z"/>
+  <path fill="#ad1519" d="M122 286.7c-2.2 1.2-3.7 2.5-3.4 3.2 0 .6.8 1 1.8 1.6 1.5 1.1 2.5 3 1.7 4a5.5 5.5 0 00-.1-8.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M122 286.7c-2.2 1.2-3.7 2.5-3.4 3.2 0 .6.8 1 1.8 1.6 1.5 1.1 2.5 3 1.7 4a5.5 5.5 0 00-.1-8.8z"/>
+  <path fill="#ccc" d="M126.8 305.6h15.6V229h-15.6v76.5z"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M138 229.2v76.3m1.7-76.3v76.3m-12.9 0h15.6v-76.4h-15.6v76.5z"/>
+  <path fill="#ad1519" d="M158.4 257.7a49.6 49.6 0 00-23.3-2c-9.4 1.6-16.5 5.3-15.9 8.4v.2l-3.5-8.2c-.6-3.3 7.2-7.5 17.6-9.2a43 43 0 019.2-.7c6.6 0 12.4.8 15.8 2.1v9.4"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M158.4 257.7a49.6 49.6 0 00-23.3-2c-9.4 1.6-16.5 5.3-15.9 8.4v.2l-3.5-8.2c-.6-3.3 7.2-7.5 17.6-9.2a43 43 0 019.2-.7c6.6 0 12.4.8 15.8 2.1v9.4"/>
+  <path fill="#ad1519" d="M126.8 267.3c-4.3-.3-7.3-1.4-7.6-3.2-.3-1.5 1.2-3 3.8-4.5 1.2.1 2.5.3 3.8.3v7.4"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M126.8 267.3c-4.3-.3-7.3-1.4-7.6-3.2-.3-1.5 1.2-3 3.8-4.5 1.2.1 2.5.3 3.8.3v7.4"/>
+  <path fill="#ad1519" d="M142.5 261.5c2.7.4 4.7 1 5.7 1.9l.1.2c.5 1-1.9 3-5.9 5.4v-7.5"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M142.5 261.5c2.7.4 4.7 1 5.7 1.9l.1.2c.5 1-1.9 3-5.9 5.4v-7.5"/>
+  <path fill="#ad1519" d="M117.1 282c-.4-1.2 3.8-3.6 9.8-5.8l7.8-3.2c8.3-3.7 14.4-7.9 13.6-9.4v-.2c.4.4 1 8 1 8 .8 1.3-4.8 5.5-12.4 9.1-2.5 1.2-7.6 3-10 4-4.4 1.4-8.7 4.3-8.3 5.3l-1.5-7.7"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M117.1 282c-.4-1.2 3.8-3.6 9.8-5.8l7.8-3.2c8.3-3.7 14.4-7.9 13.6-9.4v-.2c.4.4 1 8 1 8 .8 1.3-4.8 5.5-12.4 9.1-2.5 1.2-7.6 3-10 4-4.4 1.4-8.7 4.3-8.3 5.3l-1.5-7.7z"/>
+  <path fill="#c8b100" d="M125.8 254c1.9-.6 3.1-1.5 2.5-3-.4-1-1.4-1-2.8-.6l-2.6 1 2.3 5.8.8-.3.8-.3-1-2.5zm-1.2-2.7l.7-.3c.5-.2 1.2.1 1.4.8.2.5.2 1-.5 1.5a4.4 4.4 0 01-.6.3l-1-2.3m7.3-2.5l-.9.3h-.8l1.3 6.1 4.3-.8-.2-.4v-.4l-2.5.6-1.2-5.3m8.4 5.2c.8-2.2 1.7-4.3 2.7-6.4a5.3 5.3 0 01-1 0 54.8 54.8 0 01-1.8 4.6l-2.4-4.3-1 .1h-1a131.4 131.4 0 013.5 6h1m8.8-4.7l.4-.9a3.4 3.4 0 00-1.7-.6c-1.7-.1-2.7.6-2.8 1.7-.2 2.1 3.2 2 3 3.4 0 .6-.7.9-1.4.8-.8 0-1.4-.5-1.4-1.2h-.3a7.3 7.3 0 01-.4 1.1 4 4 0 001.8.6c1.7.2 3-.5 3.2-1.7.2-2-3.3-2.1-3.1-3.4 0-.5.4-.8 1.3-.7.7 0 1 .4 1.2.9h.2"/>
+  <path fill="#ad1519" d="M277.9 211.6s-.7.8-1.3.9c-.5 0-1.1-.5-1.1-.5s-.5.5-1 .6c-.6.1-1.4-.6-1.4-.6l-1 1c-.6 0-1.1-.3-1.1-.3s-.3.4-.7.6h-.4l-.6-.4-.7-.7-.5-.3-.4-1v-.5c-.1-.6.8-1.4 2.2-1.7a3.9 3.9 0 012 0c.5-.5 1.7-.8 3-.8s2.4.3 3 .7a5.5 5.5 0 012.9-.7c1.3 0 2.5.3 3 .8.5-.2 1.2-.2 2 0 1.4.3 2.3 1 2.2 1.7v.5l-.4 1-.6.3-.6.7-.6.3s-.3.2-.4 0c-.4-.1-.7-.5-.7-.5s-.6.4-1 .2c-.5-.2-1-1-1-1s-.9.8-1.4.7c-.6-.1-1-.6-1-.6s-.7.6-1.2.5c-.5-.1-1.2-.9-1.2-.9"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.9 211.6s-.7.8-1.3.9c-.5 0-1.1-.5-1.1-.5s-.5.5-1 .6c-.6.1-1.4-.6-1.4-.6l-1 1c-.6 0-1.1-.3-1.1-.3s-.3.4-.7.6h-.4l-.6-.4-.7-.7-.5-.3-.4-1v-.5c-.1-.6.8-1.4 2.2-1.7a3.9 3.9 0 012 0c.5-.5 1.7-.8 3-.8s2.4.3 3 .7a5.5 5.5 0 012.9-.7c1.3 0 2.5.3 3 .8.5-.2 1.2-.2 2 0 1.4.3 2.3 1 2.2 1.7v.5l-.4 1-.6.3-.6.7-.6.3s-.3.2-.4 0c-.4-.1-.7-.5-.7-.5s-.6.4-1 .2c-.5-.2-1-1-1-1s-.9.8-1.4.7c-.6-.1-1-.6-1-.6s-.7.6-1.2.5c-.5-.1-1.2-.9-1.2-.9z"/>
+  <path fill="#c8b100" d="M276.5 207.6c0-1 .6-2 1.3-2 .8 0 1.3 1 1.3 2s-.5 1.8-1.3 1.8c-.7 0-1.3-.8-1.3-1.9"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M276.5 207.6c0-1 .6-2 1.3-2 .8 0 1.3 1 1.3 2s-.5 1.8-1.3 1.8c-.7 0-1.3-.8-1.3-1.9z"/>
+  <path fill="#c8b100" d="M277.3 207.6c0-1 .2-1.8.5-1.8.4 0 .7.8.7 1.8s-.3 1.7-.6 1.7c-.4 0-.6-.8-.6-1.8"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.3 207.6c0-1 .2-1.8.5-1.8.4 0 .7.8.7 1.8s-.3 1.7-.6 1.7c-.4 0-.6-.8-.6-1.8z"/>
+  <path fill="#c8b100" d="M271 215.3a4.5 4.5 0 00-.5-1 27.4 27.4 0 0114.8 0l-.6.8a5.2 5.2 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.6.8l-.2-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M271 215.3a4.5 4.5 0 00-.5-1 27.4 27.4 0 0114.8 0l-.6.8a5.2 5.2 0 00-.3.8 22.9 22.9 0 00-6.6-.8c-2.6 0-5.2.3-6.6.8l-.2-.6"/>
+  <path fill="#c8b100" d="M277.8 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4a24.1 24.1 0 00-6.5-.8c-2.5 0-5 .3-6.4.8-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.8 217.7c2.4 0 5-.4 5.9-.6.6-.2 1-.5 1-.8 0-.2-.2-.3-.4-.4a24.1 24.1 0 00-6.5-.8c-2.5 0-5 .3-6.4.8-.2 0-.3.2-.4.3 0 .4.3.7 1 .9 1 .2 3.5.6 5.8.6z"/>
+  <path fill="#fff" d="M283.5 208.4c0-.2.2-.4.4-.4s.5.2.5.4-.2.4-.5.4a.4.4 0 01-.4-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".2" d="M283.5 208.4c0-.2.2-.4.4-.4s.5.2.5.4-.2.4-.5.4a.4.4 0 01-.4-.4zm-.2-1.4a.4.4 0 01.4-.4c.2 0 .4.1.4.4s-.2.4-.4.4a.4.4 0 01-.4-.4zm-1.1-1c0-.2.2-.3.4-.3s.4.1.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.4-.5zm-1.4-.4c0-.2.2-.4.4-.4.3 0 .5.2.5.4s-.2.4-.4.4-.5-.2-.5-.4zm-1.4 0c0-.2.2-.3.5-.3s.4.1.4.4c0 .2-.2.4-.4.4a.4.4 0 01-.5-.4z"/>
+  <path fill="none" stroke="#000" stroke-linecap="round" stroke-width=".3" d="M287.8 211.2l.2-1a2.7 2.7 0 00-2.7-2.8c-.5 0-1 .1-1.3.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M283 209.2l.2-.8c0-1.1-1.1-2-2.5-2-.6 0-1.2.2-1.6.4"/>
+  <path fill="none" stroke="#000" stroke-width=".2" d="M288.2 210c0-.3.2-.5.4-.5s.4.2.4.4c0 .3-.2.4-.4.4s-.4-.1-.4-.4zm-.2-1.6c0-.2.2-.4.4-.4a.4.4 0 01.5.4c0 .2-.2.4-.4.4-.3 0-.5-.2-.5-.4zm-1-1.1a.4.4 0 01.5-.4c.2 0 .4.1.4.4a.4.4 0 01-.4.4.4.4 0 01-.5-.4zm-1.3-.7c0-.2.2-.4.5-.4s.4.2.4.4c0 .3-.2.5-.4.5a.4.4 0 01-.5-.5zm-1.4.1c0-.2.2-.4.5-.4s.4.2.4.4-.2.4-.4.4-.5-.2-.5-.4z"/>
+  <path fill="#c8b100" d="M285.3 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.3.6-1.1.7-1.4-.6-1.4-.6-.4.7-1 1c-.5 0-1.2-.4-1.2-.4l-.1.5-.3.1.1.5a27 27 0 017.3-.9c2.8 0 5.4.4 7.3 1l.2-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M285.3 213.2l-.5-.5s-.6.3-1.3.2c-.6 0-.9-1-.9-1s-.7.7-1.3.7c-.7 0-1-.6-1-.6s-.7.5-1.3.4c-.6 0-1.2-.8-1.2-.8s-.6.8-1.2.8c-.6.1-1-.5-1-.5s-.3.6-1.1.7-1.4-.6-1.4-.6-.4.7-1 1c-.5 0-1.2-.4-1.2-.4l-.1.5-.3.1.1.5a27 27 0 017.3-.9c2.8 0 5.4.4 7.3 1l.2-.6z"/>
+  <path fill="#fff" d="M271.3 208.4c0-.2.2-.4.4-.4s.4.2.4.4a.4.4 0 01-.4.4.4.4 0 01-.4-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".2" d="M271.3 208.4c0-.2.2-.4.4-.4s.4.2.4.4a.4.4 0 01-.4.4.4.4 0 01-.4-.4zm.2-1.4c0-.3.2-.4.4-.4s.5.1.5.4-.2.4-.5.4a.4.4 0 01-.4-.4zm1-1c0-.2.3-.3.5-.3s.5.1.5.4c0 .2-.2.4-.5.4a.4.4 0 01-.4-.5zm1.4-.4c0-.2.2-.4.5-.4s.4.2.4.4-.2.4-.4.4-.5-.2-.5-.4zm1.4 0c0-.2.2-.3.5-.3.2 0 .4.1.4.4 0 .2-.2.4-.4.4a.4.4 0 01-.5-.4z"/>
+  <path fill="none" stroke="#000" stroke-linecap="round" stroke-width=".3" d="M267.8 211.2a2.8 2.8 0 01-.2-1 2.7 2.7 0 012.7-2.8c.5 0 1 .1 1.4.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M272.7 209.2a1.7 1.7 0 01-.3-.8c0-1 1.2-2 2.6-2a3 3 0 011.5.4"/>
+  <path fill="none" stroke="#000" stroke-width=".2" d="M266.6 210c0-.3.2-.5.4-.5.3 0 .4.2.4.4a.4.4 0 01-.4.4c-.2 0-.4-.1-.4-.4zm.1-1.6c0-.2.3-.4.5-.4s.4.2.4.4-.2.4-.4.4-.4-.2-.4-.4zm1-1.1c0-.3.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4.4.4 0 01-.5-.4zm1.3-.7c0-.2.2-.4.5-.4.2 0 .4.2.4.4 0 .3-.2.5-.4.5a.4.4 0 01-.5-.5zm1.4.1c0-.2.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4c-.3 0-.5-.2-.5-.4z"/>
+  <path fill="#c8b100" d="M277.9 210.7h.2a1 1 0 000 .4c0 .6.5 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1a.7.7 0 000-.1l.4-.4.2.5a1 1 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4s.7-.7.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6a1.5 1.5 0 01-.7.2c-.6 0-1.2-.3-1.4-.8a1.5 1.5 0 01-1.1.5c-.5 0-1-.2-1.2-.6a1.5 1.5 0 01-1 .4c-.6 0-1-.2-1.4-.6-.2.4-.7.6-1.2.6-.4 0-.8-.1-1-.4a1.6 1.6 0 01-1.3.6c-.4 0-.8-.2-1.1-.5-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2a4.2 4.2 0 01-1-1l.1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 1 1 0 000-.4v-.5l.4.4v.1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.6 0 1.1-.4 1.1-1a1 1 0 000-.3h.2"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.9 210.7h.2a1 1 0 000 .4c0 .6.5 1 1 1a1 1 0 001-.7l.2-.3v.4c.1.5.6.8 1.1.8.6 0 1-.4 1-1a.7.7 0 000-.1l.4-.4.2.5a1 1 0 00-.1.4 1 1 0 001 1c.4 0 .7-.2.9-.5l.2-.2v.3c0 .3.1.6.4.7 0 0 .4 0 1-.4s.7-.7.7-.7v.4s-.5.8-1 1c-.2.2-.5.4-.8.3-.3 0-.6-.3-.7-.6a1.5 1.5 0 01-.7.2c-.6 0-1.2-.3-1.4-.8a1.5 1.5 0 01-1.1.5c-.5 0-1-.2-1.2-.6a1.5 1.5 0 01-1 .4c-.6 0-1-.2-1.4-.6-.2.4-.7.6-1.2.6-.4 0-.8-.1-1-.4a1.6 1.6 0 01-1.3.6c-.4 0-.8-.2-1.1-.5-.2.5-.8.8-1.4.8-.2 0-.5 0-.7-.2-.1.3-.4.6-.7.6-.3 0-.6 0-.9-.2a4.2 4.2 0 01-1-1l.1-.5.8.7c.5.4.9.4.9.4.3 0 .4-.4.4-.7v-.3l.2.2c.2.3.5.5.9.5a1 1 0 001-1 1 1 0 000-.4v-.5l.4.4v.1c0 .6.5 1 1 1 .6 0 1-.3 1.1-.9v-.3l.2.3c.2.4.6.7 1 .7.6 0 1.1-.4 1.1-1a1 1 0 000-.3h.2z"/>
+  <path fill="#c8b100" d="M277.8 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3c2-.6 4.6-1 7.5-1 3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27 27 0 00-7.4-1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.8 213.3c-2.9 0-5.5.4-7.3 1l-.3-.2.1-.3c2-.6 4.6-1 7.5-1 3 0 5.7.4 7.6 1 0 0 .2.2.1.3l-.3.2a27 27 0 00-7.4-1z"/>
+  <path fill="#fff" d="M275 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4c-.3 0-.5-.2-.5-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M275 214.4c0-.3.2-.4.5-.4a.4.4 0 01.4.4.4.4 0 01-.4.4c-.3 0-.5-.2-.5-.4z"/>
+  <path fill="#ad1519" d="M277.9 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.9 214.5h-1c-.1 0-.3 0-.3-.3l.3-.3h2a.3.3 0 01.2.3.3.3 0 01-.3.3h-1"/>
+  <path fill="#058e6e" d="M273.2 214.9h-.6a.3.3 0 01-.4-.2.3.3 0 01.3-.3l.6-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M273.2 214.9h-.6a.3.3 0 01-.4-.2.3.3 0 01.3-.3l.6-.1.7-.1c.2 0 .3 0 .4.2a.3.3 0 01-.3.4h-.7"/>
+  <path fill="#ad1519" d="M270.5 215.3l.3-.4h.7l-.4.6-.6-.2"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M270.5 215.3l.3-.4h.7l-.4.6-.6-.2"/>
+  <path fill="#fff" d="M279.8 214.4c0-.3.2-.4.4-.4.3 0 .5.1.5.4 0 .2-.2.4-.5.4a.4.4 0 01-.4-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M279.8 214.4c0-.3.2-.4.4-.4.3 0 .5.1.5.4 0 .2-.2.4-.5.4a.4.4 0 01-.4-.4z"/>
+  <path fill="#058e6e" d="M282.5 214.9h.7a.3.3 0 00.3-.2.3.3 0 00-.2-.3l-.7-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M282.5 214.9h.7a.3.3 0 00.3-.2.3.3 0 00-.2-.3l-.7-.1-.7-.1c-.2 0-.3 0-.4.2 0 .2.1.3.3.4h.7"/>
+  <path fill="#ad1519" d="M285.1 215.4l-.2-.5h-.7l.3.6.6-.1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M285.1 215.4l-.2-.5h-.7l.3.6.6-.1"/>
+  <path fill="#ad1519" d="M277.8 217.1a25 25 0 01-6-.6 25.4 25.4 0 016-.7c2.4 0 4.5.3 6.1.7-1.6.4-3.7.6-6 .6"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".3" d="M277.8 217.1a25 25 0 01-6-.6 25.4 25.4 0 016-.7c2.4 0 4.5.3 6.1.7-1.6.4-3.7.6-6 .6z"/>
+  <path fill="#c8b100" d="M285.2 212l-.1-.3c-.2 0-.3 0-.4.2l.1.4c.2 0 .3 0 .4-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M285.2 212l-.1-.3c-.2 0-.3 0-.4.2l.1.4c.2 0 .3 0 .4-.3z"/>
+  <path fill="#c8b100" d="M280.6 211.2c0-.2-.1-.4-.3-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M280.6 211.2c0-.2-.1-.4-.3-.4 0 0-.2.1-.2.3 0 .2 0 .4.2.4l.3-.3z"/>
+  <path fill="#c8b100" d="M275.2 211.2c0-.2 0-.4.2-.4l.3.3-.2.4c-.2 0-.3-.2-.3-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M275.2 211.2c0-.2 0-.4.2-.4l.3.3-.2.4c-.2 0-.3-.2-.3-.3z"/>
+  <path fill="#c8b100" d="M270.5 212l.1-.3c.2 0 .3 0 .4.2l-.1.4c-.2 0-.3 0-.4-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M270.5 212l.1-.3c.2 0 .3 0 .4.2l-.1.4c-.2 0-.3 0-.4-.3z"/>
+  <path fill="#c8b100" d="M277.8 208.5l-.8.5.6 1.3.2.1.3-.1.6-1.3-.9-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.8 208.5l-.8.5.6 1.3.2.1.3-.1.6-1.3-.9-.5"/>
+  <path fill="#c8b100" d="M276 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M276 210.5l.4.5 1.3-.4.1-.2-.1-.2-1.3-.3-.4.6"/>
+  <path fill="#c8b100" d="M279.6 210.5l-.3.5-1.3-.4-.1-.2v-.2l1.4-.3.4.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M279.6 210.5l-.3.5-1.3-.4-.1-.2v-.2l1.4-.3.4.6"/>
+  <path fill="#c8b100" d="M272.5 209l-.7.7.9 1 .2.1.2-.1.2-1.3-.8-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M272.5 209l-.7.7.9 1 .2.1.2-.1.2-1.3-.8-.3"/>
+  <path fill="#c8b100" d="M271.1 211.2l.5.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M271.1 211.2l.5.5 1.2-.6v-.2l-.1-.2-1.3-.1-.3.6"/>
+  <path fill="#c8b100" d="M274.7 210.5l-.3.6h-1.3l-.2-.2.1-.3 1.2-.6.5.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M274.7 210.5l-.3.6h-1.3l-.2-.2.1-.3 1.2-.6.5.5"/>
+  <path fill="#c8b100" d="M269.8 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M269.8 211.4v.6l-1.4.2-.2-.1v-.2l1-.9.6.4"/>
+  <path fill="#c8b100" d="M272.4 210.9c0-.3.2-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M272.4 210.9c0-.3.2-.5.5-.5a.5.5 0 01.5.5.5.5 0 01-.5.4.5.5 0 01-.5-.4z"/>
+  <path fill="#c8b100" d="M283.2 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M283.2 209l.7.7-.9 1-.2.1-.1-.1-.3-1.3.8-.3"/>
+  <path fill="#c8b100" d="M284.6 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M284.6 211.2l-.5.5-1.2-.6v-.2l.1-.2 1.3-.1.3.6"/>
+  <path fill="#c8b100" d="M281 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M281 210.5l.3.6h1.3l.2-.2-.1-.3-1.2-.6-.5.5"/>
+  <path fill="#c8b100" d="M285.7 211.4v.6l1.4.2.2-.1v-.2l-1-.9-.6.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M285.7 211.4v.6l1.4.2.2-.1v-.2l-1-.9-.6.4"/>
+  <path fill="#c8b100" d="M277.4 210.4c0-.2.2-.4.5-.4.2 0 .4.2.4.4 0 .3-.2.5-.4.5a.5.5 0 01-.5-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M277.4 210.4c0-.2.2-.4.5-.4.2 0 .4.2.4.4 0 .3-.2.5-.4.5a.5.5 0 01-.5-.5z"/>
+  <path fill="#c8b100" d="M282.3 210.9c0-.3.3-.5.5-.5.3 0 .5.2.5.5s-.2.4-.5.4a.5.5 0 01-.5-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M282.3 210.9c0-.3.3-.5.5-.5.3 0 .5.2.5.5s-.2.4-.5.4a.5.5 0 01-.5-.4z"/>
+  <path fill="#c8b100" d="M277 205.4c0-.5.4-.8.8-.8s1 .3 1 .8-.5.8-1 .8a.9.9 0 01-.8-.8"/>
+  <path fill="#c8b100" d="M278.5 205.1v.6H277v-.6h.4v-1.3h-.5v-.5h.5v-.6h.6v.6h.6v.6h-.6v1.2h.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M278.5 205.1v.6H277v-.6h.4v-1.3h-.5v-.5h.5v-.6h.6v.6h.6v.6h-.6v1.2h.4z"/>
+  <path fill="#c8b100" d="M279 205.1v.6h-2.4v-.6h1v-1.3h-.7v-.5h.6v-.6h.6v.6h.6v.6h-.6v1.2h1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M278.1 204.6c.4 0 .6.4.6.8 0 .5-.4.8-.9.8a.9.9 0 01-.8-.8c0-.4.2-.7.6-.8"/>
+  <path fill="#c8b100" d="M268 212.2l-.6-.7a2.3 2.3 0 00-.7-.3c0-.1.3-.3.6-.3.2 0 .3 0 .4.2v-.2s.3 0 .4.3v1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M268 212.2l-.6-.7a2.3 2.3 0 00-.7-.3c0-.1.3-.3.6-.3.2 0 .3 0 .4.2v-.2s.3 0 .4.3v1z"/>
+  <path fill="#c8b100" d="M268 212c.1-.2.4-.2.5 0 .2.1.3.3.1.5l-.5-.1c-.1-.1-.2-.4 0-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M268 212c.1-.2.4-.2.5 0 .2.1.3.3.1.5l-.5-.1c-.1-.1-.2-.4 0-.5z"/>
+  <path fill="#c8b100" d="M287.5 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M287.5 212.2l.6-.7c.2-.2.7-.3.7-.3 0-.1-.3-.3-.6-.3a.6.6 0 00-.4.2v-.2s-.3 0-.4.3v.7l.1.3z"/>
+  <path fill="#c8b100" d="M287.5 212c-.1-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M287.5 212c-.1-.2-.3-.2-.5 0-.2.1-.2.3-.1.5l.5-.1c.2-.1.2-.4.1-.5z"/>
+  <path fill="#c8b100" d="M267.2 223h21.4v-5.5h-21.4v5.6z"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M267.2 223h21.4v-5.5h-21.4v5.6z"/>
+  <path fill="#c8b100" d="M286.3 226.8a1 1 0 00-.4 0h-16.5c.6-.2 1-.7 1-1.2 0-.6-.4-1.1-1-1.3h17-.1c-.6.2-1 .7-1 1.3 0 .5.4 1 1 1.2"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M286.3 226.8a1 1 0 00-.4 0h-16.5c.6-.2 1-.7 1-1.2 0-.6-.4-1.1-1-1.3h17-.1c-.6.2-1 .7-1 1.3 0 .5.4 1 1 1.2z"/>
+  <path fill="#c8b100" d="M269.9 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.6 0-1-.4-1-.8s.5-.8 1-.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M269.9 226.8h16c.6 0 1 .3 1 .7 0 .4-.4.8-1 .8h-16c-.6 0-1-.4-1-.8s.5-.8 1-.8z"/>
+  <path fill="#c8b100" d="M269.9 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.6 0-1-.2-1-.6 0-.3.4-.6 1-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M269.9 223h16c.6 0 1 .4 1 .7 0 .4-.4.6-1 .6h-16c-.6 0-1-.2-1-.6 0-.3.4-.6 1-.6z"/>
+  <path fill="#005bbf" d="M263 317.4c1.4 0 2.7-.3 3.7-.8a8.4 8.4 0 013.7-.8c1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.8a8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.8 3.8.8v2.4a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.8c-1.4 0-2.7.3-3.6.8-1 .5-2.3.9-3.8.9a8 8 0 01-3.7-.9 8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.9-3.8.9v-2.4"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M263 317.4c1.4 0 2.7-.3 3.7-.8a8.4 8.4 0 013.7-.8c1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.8a8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.8 3.8.8v2.4a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.8c-1.4 0-2.7.3-3.6.8-1 .5-2.3.9-3.8.9a8 8 0 01-3.7-.9 8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.9-3.8.9v-2.4z"/>
+  <path fill="#ccc" d="M263 319.8c1.4 0 2.7-.4 3.7-.9s2.3-.8 3.7-.8c1.4 0 2.8.3 3.8.8s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8c1.5 0 2.8.3 3.7.8 1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.1 8.1 0 00-3.7-.7c-1.4 0-2.7.2-3.6.7-1 .5-2.3.9-3.8.9a7 7 0 01-3.7-.9c-1-.4-2.3-.7-3.8-.7a8.3 8.3 0 00-3.7.7 8.1 8.1 0 01-3.8.9v-2.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M263 319.8c1.4 0 2.7-.4 3.7-.9s2.3-.8 3.7-.8c1.4 0 2.8.3 3.8.8s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8c1.5 0 2.8.3 3.7.8 1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.1 8.1 0 00-3.7-.7c-1.4 0-2.7.2-3.6.7-1 .5-2.3.9-3.8.9a7 7 0 01-3.7-.9c-1-.4-2.3-.7-3.8-.7a8.3 8.3 0 00-3.7.7 8.1 8.1 0 01-3.8.9v-2.3"/>
+  <path fill="#005bbf" d="M263 322c1.4 0 2.7-.2 3.7-.8 1-.4 2.3-.7 3.7-.7 1.4 0 2.8.2 3.8.7s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .6-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8V322"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M263 322c1.4 0 2.7-.2 3.7-.8 1-.4 2.3-.7 3.7-.7 1.4 0 2.8.2 3.8.7s2.3.9 3.7.9a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.8 8 8 0 013.7.8c1 .5 2.4.9 3.8.9v2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .6-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8V322"/>
+  <path fill="#ccc" d="M263 326.7a8 8 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.9a8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8a8.3 8.3 0 003.8.8v-2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .5-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8v2.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M263 326.7a8 8 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8c1.5 0 2.8-.3 3.8-.9a8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8a8.3 8.3 0 003.8.8v-2.3a8.3 8.3 0 01-3.8-.9 8.2 8.2 0 00-3.7-.7c-1.4 0-2.7.3-3.6.7-1 .5-2.3.9-3.8.9-1.4 0-2.8-.3-3.7-.8a8.4 8.4 0 00-3.8-.8 8.3 8.3 0 00-3.7.8c-1 .5-2.3.8-3.8.8v2.3"/>
+  <path fill="#005bbf" d="M263 329a8.1 8.1 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8 1 .5 2.4.8 3.8.8v-2.3a8.3 8.3 0 01-3.8-.8 8.2 8.2 0 00-3.7-.8 8.4 8.4 0 00-3.6.7 8.2 8.2 0 01-3.8.9c-1.4 0-2.8-.3-3.7-.8-1-.5-2.3-.8-3.8-.8-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v2.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M263 329a8.1 8.1 0 003.7-.8c1-.5 2.3-.8 3.7-.8 1.4 0 2.8.3 3.8.8s2.3.8 3.7.8a8.2 8.2 0 003.8-.9 8.4 8.4 0 013.6-.7c1.5 0 2.8.3 3.7.8 1 .5 2.4.8 3.8.8v-2.3a8.3 8.3 0 01-3.8-.8 8.2 8.2 0 00-3.7-.8 8.4 8.4 0 00-3.6.7 8.2 8.2 0 01-3.8.9c-1.4 0-2.8-.3-3.7-.8-1-.5-2.3-.8-3.8-.8-1.4 0-2.7.3-3.7.8s-2.3.8-3.8.8v2.3z"/>
+  <path fill="#c8b100" d="M286.3 308l-.1.5c0 1.5 1.2 2.6 2.7 2.6h-22c1.5 0 2.7-1.2 2.7-2.6l-.1-.5h16.8"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M286.3 308l-.1.5c0 1.5 1.2 2.6 2.7 2.6h-22c1.5 0 2.7-1.2 2.7-2.6l-.1-.5h16.8z"/>
+  <path fill="#c8b100" d="M269.9 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.6 0-1-.3-1-.8 0-.4.5-.7 1-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M269.9 306.5h16c.6 0 1 .3 1 .8 0 .4-.4.7-1 .7h-16c-.6 0-1-.3-1-.8 0-.4.5-.7 1-.7z"/>
+  <path fill="#c8b100" d="M266.9 316.7h22V311h-22v5.6z"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M266.9 316.7h22V311h-22v5.6z"/>
+  <path fill="#ad1519" d="M290.6 286.7c2.1 1.2 3.6 2.5 3.4 3.2-.1.6-.8 1-1.8 1.6-1.6 1.1-2.5 3-1.8 4a5.5 5.5 0 01.2-8.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M290.6 286.7c2.1 1.2 3.6 2.5 3.4 3.2-.1.6-.8 1-1.8 1.6-1.6 1.1-2.5 3-1.8 4a5.5 5.5 0 01.2-8.8z"/>
+  <path fill="#ccc" d="M270.1 305.6h15.6V229h-15.6v76.5z"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M281.4 229.1v76.3m1.8-76.3v76.3m-13 .2h15.5V229h-15.6v76.5z"/>
+  <path fill="#ad1519" d="M254.2 257.7a49.6 49.6 0 0123.3-2c9.3 1.6 16.4 5.3 15.9 8.4v.2l3.5-8.2c.6-3.3-7.3-7.5-17.6-9.2a53.5 53.5 0 00-9.2-.7c-6.7 0-12.4.8-15.9 2.1v9.4"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M254.2 257.7a49.6 49.6 0 0123.3-2c9.3 1.6 16.4 5.3 15.9 8.4v.2l3.5-8.2c.6-3.3-7.3-7.5-17.6-9.2a53.5 53.5 0 00-9.2-.7c-6.7 0-12.4.8-15.9 2.1v9.4"/>
+  <path fill="#ad1519" d="M285.7 267.3c4.4-.3 7.3-1.4 7.7-3.2.2-1.5-1.2-3-3.8-4.5-1.2.1-2.5.3-3.9.3v7.4"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M285.7 267.3c4.4-.3 7.3-1.4 7.7-3.2.2-1.5-1.2-3-3.8-4.5-1.2.1-2.5.3-3.9.3v7.4"/>
+  <path fill="#ad1519" d="M270 261.5a13 13 0 00-5.7 1.9v.2c-.5 1 1.8 3 5.8 5.4v-7.5"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M270 261.5a13 13 0 00-5.7 1.9v.2c-.5 1 1.8 3 5.8 5.4v-7.5"/>
+  <path fill="#ad1519" d="M295.4 282c.4-1.2-3.8-3.6-9.7-5.8-2.8-1-5-2-7.8-3.2-8.3-3.7-14.4-7.9-13.6-9.4v-.2c-.4.4-1 8-1 8-.8 1.3 4.8 5.5 12.4 9.1 2.4 1.2 7.6 3 10 4 4.3 1.4 8.7 4.3 8.3 5.3l1.4-7.7"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M295.4 282c.4-1.2-3.8-3.6-9.7-5.8-2.8-1-5-2-7.8-3.2-8.3-3.7-14.4-7.9-13.6-9.4v-.2c-.4.4-1 8-1 8-.8 1.3 4.8 5.5 12.4 9.1 2.4 1.2 7.6 3 10 4 4.3 1.4 8.7 4.3 8.3 5.3l1.4-7.7z"/>
+  <path fill="#c8b100" d="M263.9 254.4c.6-2.3 1.4-4.4 2.1-6.6h-.5a5.2 5.2 0 01-.5.1 52.8 52.8 0 01-1.4 4.8c-1-1.4-2-2.7-2.7-4.1l-1 .2h-1a131.3 131.3 0 014 5.7h.5l.5-.1m6-6.6h-1a8 8 0 01-.8 0v6.2h4.2v-.7h-2.6l.1-5.5m6.8 1l2 .3v-.7l-5.8-.5v.8a19.3 19.3 0 012 0l-.4 5.6h1.6l.5-5.4m2.4 6c.3 0 .5 0 .8.2l.8.2.7-2.9.6 1.2.8 2.1 1 .2c.4 0 .7.2 1 .3l-.3-.7c-.4-1-1-1.9-1.3-2.9 1 0 1.9-.3 2.1-1.2.1-.6 0-1-.7-1.5-.4-.3-1.2-.4-1.7-.5l-2.4-.5-1.4 6m3-5.2c.7.2 1.5.3 1.5 1v.5c-.3.9-1 1.2-2 .9l.5-2.4m8 7l-.2 2 .8.5.9.5.5-7a3.4 3.4 0 01-.7-.3l-6.1 3.8.5.3.4.2 1.7-1.2 2.3 1.3zm-1.7-1.5l2-1.4-.2 2.3-1.8-1"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M182.2 192.4c0-1 1-2 2-2s2.2 1 2.2 2c0 1.1-1 2-2.1 2a2 2 0 01-2.1-2z"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".3" d="M205.7 175.4c6.3 0 12 1 15.7 2.4a31.7 31.7 0 0014.6 2.3c2.7 0 6.5.8 10.3 2.4a27.3 27.3 0 017.4 4.7l-1.5 1.4-.4 3.8-4.1 4.7-2 1.8-5 3.9-2.5.2-.7 2.1-31.6-3.7-31.7 3.7-.8-2.1-2.5-.2-4.9-4-2-1.7-4.1-4.7-.5-3.8-1.5-1.4a27.6 27.6 0 017.5-4.7 26 26 0 0110.2-2.4c2 .2 4.2.1 6.6-.2a30 30 0 008-2c3.7-1.5 9-2.5 15.5-2.5z"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M206.2 217.1c-11.8 0-22.4-1.4-29.9-3.6a1.1 1.1 0 01-.8-1.2c0-.5.3-1 .8-1.2a109 109 0 0129.9-3.6c11.7 0 22.3 1.4 29.8 3.6a1.3 1.3 0 010 2.4c-7.5 2.2-18 3.6-29.8 3.6"/>
+  <path fill="#ad1519" d="M206.1 215.6c-10.6 0-20.2-1.2-27.5-3.1 7.3-2 16.9-3 27.5-3.1a115 115 0 0127.6 3c-7.3 2-17 3.2-27.6 3.2"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M206.9 215.7v-6.3m-1.7 6.3v-6.3"/>
+  <path fill="none" stroke="#000" stroke-width=".2" d="M203.6 215.7v-6.3m-1.6 6.3v-6.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M200.6 215.7v-6.3m-2.8 5.9v-5.7m1.3 5.8v-6m-3.8 5.6v-5.2m1.3 5.4v-5.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M192 214.8V210m1 4.7V210m1.2 5v-5m-3.4 4.7v-4.5"/>
+  <path fill="none" stroke="#000" stroke-width=".5" d="M189.7 214.5v-4.2m-1.2 4.1v-4"/>
+  <path fill="none" stroke="#000" stroke-width=".6" d="M186 214v-3m1.3 3.2v-3.5m-2.5 3.1V211"/>
+  <path fill="none" stroke="#000" stroke-width=".7" d="M183.7 213.6v-2.3m-1.3 2v-1.8m-1.2 1.6v-1.3"/>
+  <path fill="none" stroke="#000" stroke-width=".9" d="M179.8 212.8v-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M213.7 215.3v-5.8m-2.9 6v-6.1m-2.1 6.2v-6.3"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M206 207.4a108 108 0 00-30 3.9c.6-.3.5-1-.3-3-1-2.5-2.4-2.4-2.4-2.4 8.3-2.5 20-4 32.8-4a123 123 0 0133 4s-1.5-.1-2.5 2.3c-.8 2-.8 2.8-.2 3-7.5-2.2-18.4-3.7-30.3-3.7"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M206.1 201.9c-12.9 0-24.5 1.5-32.8 4a1 1 0 01-1.3-.6 1 1 0 01.7-1.3 121 121 0 0133.4-4.2c13.2 0 25.2 1.7 33.5 4.2.6.2.9.8.7 1.3-.2.5-.8.8-1.3.6-8.4-2.5-20-4-32.9-4"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".4" d="M206.1 215.6c-10.6 0-20.2-1.2-27.5-3.1 7.3-2 16.9-3 27.5-3.1a115 115 0 0127.6 3c-7.3 2-17 3.2-27.6 3.2z"/>
+  <path fill="#fff" stroke="#000" stroke-width=".4" d="M197 204.8c0-.5.4-1 1-1 .5 0 1 .5 1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".4" d="M206.1 205.6H203a1 1 0 010-2h6.4c.5 0 1 .5 1 1s-.5 1-1 1h-3.2"/>
+  <path fill="#058e6e" stroke="#000" stroke-width=".4" d="M190.3 206.5l-2.3.2c-.6.1-1-.3-1.2-.8a1 1 0 011-1.1l2.2-.3 2.4-.3c.5 0 1 .3 1.1.9.1.5-.3 1-.9 1l-2.3.4"/>
+  <path fill="#fff" stroke="#000" stroke-width=".4" d="M181 206.7c0-.6.5-1 1.1-1 .6 0 1 .4 1 1 0 .5-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".4" d="M174 208.5l1.2-1.6 3.3.4-2.6 2-1.8-.8"/>
+  <path fill="#058e6e" stroke="#000" stroke-width=".4" d="M222 206.5l2.3.2c.5.1 1-.3 1.1-.8a1 1 0 00-.9-1.1l-2.2-.3-2.4-.3a1 1 0 00-1.1.9c-.1.5.3 1 .9 1l2.3.4"/>
+  <path fill="#fff" stroke="#000" stroke-width=".4" d="M213.3 204.8c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1m15.8 1.9c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1 0 .5-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".4" d="M238.2 208.5l-1.1-1.6-3.3.4 2.6 2 1.8-.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M177.3 212.8c7.4-2.1 17.6-3.4 28.8-3.4 11.3 0 21.4 1.3 28.9 3.4"/>
+  <path fill="#c8b100" d="M182.3 183.8l1.4 1 2-3.2a7.4 7.4 0 01-3.6-7.2c.2-4.1 5.2-7.6 11.7-7.6 3.3 0 6.3 1 8.5 2.4 0-.6 0-1.2.2-1.8a17.4 17.4 0 00-8.7-2.1c-7.4 0-13.2 4.1-13.5 9.1a8.9 8.9 0 003 7.6l-1 1.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M182.3 183.8l1.4 1 2-3.2a7.4 7.4 0 01-3.6-7.2c.2-4.1 5.2-7.6 11.7-7.6 3.3 0 6.3 1 8.5 2.4 0-.6 0-1.2.2-1.8a17.4 17.4 0 00-8.7-2.1c-7.4 0-13.2 4.1-13.5 9.1a8.9 8.9 0 003 7.6l-1 1.8"/>
+  <path fill="#c8b100" d="M182.4 183.8a9.3 9.3 0 01-4-7.3c0-3.2 2-6.1 5.3-8a8.5 8.5 0 00-3.4 6.8 8.9 8.9 0 003 6.7l-.9 1.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M182.4 183.8a9.3 9.3 0 01-4-7.3c0-3.2 2-6.1 5.3-8a8.5 8.5 0 00-3.4 6.8 8.9 8.9 0 003 6.7l-.9 1.8"/>
+  <path fill="#c8b100" d="M160.1 187.1a8.8 8.8 0 01-2.3-5.9c0-1.3.3-2.6 1-3.8 2-4.2 8.4-7.2 16-7.2 2 0 4 .2 5.9.6l-1 1.4a25.5 25.5 0 00-4.9-.4c-7 0-12.8 2.7-14.5 6.3a7 7 0 00-.7 3.1 7.3 7.3 0 002.7 5.6l-2.6 4.1-1.3-1 1.7-2.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M160.1 187.1a8.8 8.8 0 01-2.3-5.9c0-1.3.3-2.6 1-3.8 2-4.2 8.4-7.2 16-7.2 2 0 4 .2 5.9.6l-1 1.4a25.5 25.5 0 00-4.9-.4c-7 0-12.8 2.7-14.5 6.3a7 7 0 00-.7 3.1 7.3 7.3 0 002.7 5.6l-2.6 4.1-1.3-1 1.7-2.8z"/>
+  <path fill="#c8b100" d="M162.7 173.3a10.5 10.5 0 00-4 4.1 8.6 8.6 0 00-.9 3.8c0 2.3.9 4.3 2.3 5.9l-1.5 2.5a10.4 10.4 0 01-2.3-6.5c0-4 2.5-7.5 6.4-9.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M162.7 173.3a10.5 10.5 0 00-4 4.1 8.6 8.6 0 00-.9 3.8c0 2.3.9 4.3 2.3 5.9l-1.5 2.5a10.4 10.4 0 01-2.3-6.5c0-4 2.5-7.5 6.4-9.8z"/>
+  <path fill="#c8b100" d="M206 164.4c1.7 0 3.2 1.1 3.5 2.6.3 1.4.4 2.9.4 4.5v1.1c.1 3.3.6 6.3 1.3 8.1l-5.2 5-5.2-5c.7-1.8 1.2-4.8 1.3-8.1v-1.1c0-1.6.2-3.1.4-4.5.3-1.5 1.8-2.6 3.5-2.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M206 164.4c1.7 0 3.2 1.1 3.5 2.6.3 1.4.4 2.9.4 4.5v1.1c.1 3.3.6 6.3 1.3 8.1l-5.2 5-5.2-5c.7-1.8 1.2-4.8 1.3-8.1v-1.1c0-1.6.2-3.1.4-4.5.3-1.5 1.8-2.6 3.5-2.6z"/>
+  <path fill="#c8b100" d="M206 166c1 0 1.7.6 1.8 1.4.2 1.2.4 2.6.4 4.2v1c.1 3.2.6 6 1.2 7.7l-3.4 3.2-3.4-3.2c.7-1.7 1.1-4.5 1.2-7.7v-1a28.1 28.1 0 01.4-4.2 2 2 0 011.8-1.4"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M206 166c1 0 1.7.6 1.8 1.4.2 1.2.4 2.6.4 4.2v1c.1 3.2.6 6 1.2 7.7l-3.4 3.2-3.4-3.2c.7-1.7 1.1-4.5 1.2-7.7v-1a28.1 28.1 0 01.4-4.2 2 2 0 011.8-1.4z"/>
+  <path fill="#c8b100" d="M229.7 183.8l-1.3 1-2-3.2a7.4 7.4 0 003.6-6.3 7 7 0 000-.9c-.2-4.1-5.3-7.6-11.7-7.6a15 15 0 00-8.5 2.4 23 23 0 00-.2-1.8 17.4 17.4 0 018.7-2.1c7.4 0 13.2 4.1 13.4 9.1a8.9 8.9 0 01-3 7.6l1 1.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M229.7 183.8l-1.3 1-2-3.2a7.4 7.4 0 003.6-6.3 7 7 0 000-.9c-.2-4.1-5.3-7.6-11.7-7.6a15 15 0 00-8.5 2.4 23 23 0 00-.2-1.8 17.4 17.4 0 018.7-2.1c7.4 0 13.2 4.1 13.4 9.1a8.9 8.9 0 01-3 7.6l1 1.8"/>
+  <path fill="#c8b100" d="M229.6 183.8a9.1 9.1 0 004.1-7.3c0-3.2-2.1-6.1-5.3-8a8.5 8.5 0 013.4 6.8 8.9 8.9 0 01-3.2 6.7l1 1.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M229.6 183.8a9.1 9.1 0 004.1-7.3c0-3.2-2.1-6.1-5.3-8a8.5 8.5 0 013.4 6.8 8.9 8.9 0 01-3.2 6.7l1 1.8"/>
+  <path fill="#c8b100" d="M252 187.1a8.8 8.8 0 002.2-5.9 8.7 8.7 0 00-.9-3.8c-2-4.2-8.4-7.2-16-7.2a29 29 0 00-6 .6l1 1.4a25.4 25.4 0 015-.4c7 0 12.8 2.7 14.4 6.3.5 1 .7 2 .7 3.1a7.3 7.3 0 01-2.6 5.6l2.5 4.1 1.3-1-1.7-2.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M252 187.1a8.8 8.8 0 002.2-5.9 8.7 8.7 0 00-.9-3.8c-2-4.2-8.4-7.2-16-7.2a29 29 0 00-6 .6l1 1.4a25.4 25.4 0 015-.4c7 0 12.8 2.7 14.4 6.3.5 1 .7 2 .7 3.1a7.3 7.3 0 01-2.6 5.6l2.5 4.1 1.3-1-1.7-2.8z"/>
+  <path fill="#c8b100" d="M249.3 173.3a10.6 10.6 0 014 4.1 8.7 8.7 0 01.9 3.8 8.8 8.8 0 01-2.3 5.9l1.6 2.5a10.4 10.4 0 002.3-6.5c0-4-2.6-7.5-6.5-9.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M249.3 173.3a10.6 10.6 0 014 4.1 8.7 8.7 0 01.9 3.8 8.8 8.8 0 01-2.3 5.9l1.6 2.5a10.4 10.4 0 002.3-6.5c0-4-2.6-7.5-6.5-9.8z"/>
+  <path fill="#fff" d="M204.2 181.4c0-1 .8-1.8 1.8-1.8s1.9.8 1.9 1.8-.9 1.7-1.9 1.7a1.8 1.8 0 01-1.8-1.7"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M204.2 181.4c0-1 .8-1.8 1.8-1.8s1.9.8 1.9 1.8-.9 1.7-1.9 1.7a1.8 1.8 0 01-1.8-1.7z"/>
+  <path fill="#fff" stroke="#000" stroke-width=".4" d="M204.2 178c0-1 .8-1.8 1.8-1.8s1.9.8 1.9 1.8-.9 1.7-1.9 1.7a1.8 1.8 0 01-1.8-1.7m.4-3.7c0-.7.6-1.3 1.4-1.3.8 0 1.5.6 1.5 1.3 0 .8-.7 1.4-1.5 1.4s-1.4-.6-1.4-1.4m.4-3.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1m.2-2.8c0-.5.4-.8.8-.8.5 0 .9.3.9.8 0 .4-.4.8-.9.8a.8.8 0 01-.8-.8"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M206.2 191.8l1.2.2a4.6 4.6 0 004.5 6 4.7 4.7 0 004.4-3c.1 0 .5-1.7.7-1.7.2 0 .1 1.8.2 1.7.3 2.3 2.4 3.8 4.7 3.8a4.6 4.6 0 004.7-5l1.5-1.5.7 2a4 4 0 00-.4 1.9 4.4 4.4 0 004.5 4.2c1.6 0 3-.7 3.8-1.9l.9-1.2v1.5c0 1.5.6 2.8 2 3 0 0 1.7.1 4-1.6 2.1-1.7 3.3-3.1 3.3-3.1l.2 1.7s-1.8 2.8-3.8 4c-1 .6-2.7 1.3-4 1-1.4-.2-2.4-1.3-3-2.6a6.7 6.7 0 01-3.3 1 6.5 6.5 0 01-6.1-3.7 7 7 0 01-10.4-.3 7 7 0 01-4.6 1.8 6.9 6.9 0 01-5.7-3 6.9 6.9 0 01-5.7 3 7 7 0 01-4.7-1.8 7 7 0 01-10.4.3 6.5 6.5 0 01-6 3.7 6.7 6.7 0 01-3.4-1c-.6 1.3-1.5 2.4-3 2.7-1.2.2-2.9-.5-4-1.1-2-1.2-3.8-4-3.8-4l.2-1.7s1.2 1.4 3.4 3.1c2.2 1.8 3.9 1.6 3.9 1.6 1.4-.2 2-1.5 2-3v-1.5l1 1.2a4.6 4.6 0 003.7 2c2.5 0 4.5-2 4.5-4.3a4 4 0 00-.4-2l.8-1.9 1.5 1.5a4.4 4.4 0 000 .6c0 2.4 2 4.4 4.6 4.4 2.4 0 4.4-1.5 4.7-3.8 0 0 0-1.6.2-1.7.2 0 .6 1.7.7 1.6a4.7 4.7 0 004.5 3.1 4.6 4.6 0 004.5-6l1.2-.2"/>
+  <path fill="#fff" stroke="#000" stroke-width=".4" d="M238.6 197.7c.3-.8 0-1.6-.6-1.8-.5-.2-1.2.3-1.5 1.1-.3.8 0 1.6.6 1.8.5.2 1.2-.3 1.5-1.1m-20.5-4c0-.8-.3-1.6-1-1.6-.5-.1-1 .5-1.2 1.4-.1.8.3 1.5.9 1.6.6 0 1.2-.6 1.3-1.4m-23.9 0c0-.8.4-1.6 1-1.6.6-.1 1.1.5 1.2 1.4.1.8-.3 1.5-.9 1.6-.6 0-1.1-.6-1.2-1.4m-20.6 4c-.2-.8 0-1.6.6-1.8.6-.2 1.2.3 1.5 1.1.3.8 0 1.6-.5 1.8-.6.2-1.3-.3-1.6-1.1"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M182.7 184a5.1 5.1 0 012.2 2.9s0-.3.6-.6 1-.3 1-.3l-.1 1.3-.3 2.2a7.4 7.4 0 01-.7 1.6 1.9 1.9 0 00-1.5-.4 1.8 1.8 0 00-1.2.9s-.7-.6-1.2-1.3l-1.1-2-.7-1.1s.5-.2 1.1 0c.6 0 .8.2.8.2a4.9 4.9 0 011-3.4m.4 9.8a1.8 1.8 0 01-.6-1c0-.5 0-.9.3-1.2 0 0-.9-.5-1.8-.7-.7-.2-2-.2-2.3-.2h-1l.2.5c.2.5.5.7.5.7a5 5 0 00-3 2 5.3 5.3 0 003.5 1l-.2.8v.6l1-.4c.3-.1 1.5-.5 2-1 .8-.4 1.5-1.1 1.5-1.1m2.7-.5a1.6 1.6 0 00.2-1.1 1.7 1.7 0 00-.6-1l1.4-1.3a10 10 0 012-.9l1.1-.4v.6a5.7 5.7 0 01-.2.8 5 5 0 013.4 1 5 5 0 01-2.9 2 6.4 6.4 0 00.7 1.2h-1c-.4 0-1.6 0-2.3-.2a11 11 0 01-1.8-.7"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".4" d="M182.2 192.4c0-1 1-2 2-2s2.2 1 2.2 2c0 1.1-1 2-2.1 2a2 2 0 01-2.1-2"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M206.1 180.8a5.7 5.7 0 011.9 3.7s.2-.3.9-.5c.7-.3 1.2-.2 1.2-.2l-.5 1.4-.8 2.4a8.2 8.2 0 01-1 1.7 2.1 2.1 0 00-1.7-.7c-.6 0-1.2.3-1.6.7 0 0-.6-.7-1-1.7l-.8-2.4-.5-1.4 1.2.2c.7.2.9.5.9.5 0-1.4.8-2.8 1.8-3.7"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M204.6 191.8a2 2 0 01-.5-1.2c0-.5.1-1 .4-1.3 0 0-.8-.7-1.8-1-.7-.4-2-.7-2.5-.7l-1.2-.2.2.6.4.9a5.9 5.9 0 00-3.7 1.7c1 .9 2.3 1.6 3.7 1.6l-.4 1-.2.6 1.2-.2c.4-.1 1.8-.4 2.5-.7 1-.4 1.9-1 1.9-1m3 0a1.9 1.9 0 00.1-2.6s.9-.7 1.8-1a8 8 0 012.5-.7l1.2-.3-.1.7-.4.9c1.4 0 2.7.8 3.6 1.7a5.9 5.9 0 01-3.6 1.6 6.9 6.9 0 00.5 1.6l-1.2-.2-2.5-.7c-1-.4-1.8-1-1.8-1m22-8a5.2 5.2 0 00-2.2 3l-.7-.6c-.6-.3-1-.3-1-.3l.2 1.3c0 .3 0 1.3.3 2.2.2 1 .6 1.6.6 1.6a2 2 0 011.5-.4c.6.1 1 .5 1.3.9l1.1-1.3c.6-.8 1-1.7 1.1-2l.7-1.1s-.4-.2-1 0c-.7 0-1 .2-1 .2a4.9 4.9 0 00-1-3.4m-.3 9.8c.3-.3.5-.6.6-1a1.6 1.6 0 00-.2-1.2s.8-.5 1.7-.7c.7-.2 2-.2 2.3-.2h1.1l-.3.5a6.2 6.2 0 01-.4.7 5 5 0 012.9 2 5.3 5.3 0 01-3.5 1l.2.8v.6l-1-.4c-.3-.1-1.4-.5-2-1-.8-.4-1.4-1.1-1.4-1.1m-2.8-.5a1.7 1.7 0 01-.2-1.1c0-.5.3-.8.6-1 0 0-.6-.8-1.4-1.3-.6-.4-1.7-.8-2-.9a171.4 171.4 0 01-1-.4v.6c0 .5.2.8.2.8a5.2 5.2 0 00-3.5 1c.7.9 1.7 1.7 3 2 0 0-.3.2-.5.7l-.3.5h1c.4 0 1.7 0 2.3-.2a11.1 11.1 0 001.8-.7"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".4" d="M226 192.4c0-1 1-2 2-2s2.1 1 2.1 2a2 2 0 01-2 2 2 2 0 01-2.1-2m23.2 4.4c-.4-.5-1.4-.4-2.2.2-.8.7-1 1.6-.5 2.2.5.5 1.5.4 2.3-.3.7-.6 1-1.6.5-2"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M246.3 198l.7-1c.7-.6 1.8-.7 2.3-.2l.1.2s1-2 2.3-2.6c1.3-.7 3.4-.5 3.4-.5a2.8 2.8 0 00-2.9-2.8 3 3 0 00-2.4 1l-.2-1s-1.3.3-1.9 1.8c-.6 1.5 0 3.6 0 3.6s-.3-.9-.7-1.5a8 8 0 00-2.4-1.6l-1.3-.7-.1.5a5 5 0 000 .8 7.9 7.9 0 00-3.7.5 4.7 4.7 0 002.5 2.2l-.8.7a4 4 0 00-.4.5l1.3.2 2.5.2a14.5 14.5 0 001.7-.2m-80.3 0c0-.4-.3-.7-.7-1-.7-.7-1.7-.8-2.2-.3l-.2.3s-1-2-2.3-2.7c-1.2-.7-3.3-.5-3.3-.5a2.8 2.8 0 012.8-2.8c1 0 1.9.4 2.4 1l.2-1s1.3.3 2 1.8c.5 1.5-.1 3.6-.1 3.6s.3-.9.8-1.5a8 8 0 012.4-1.6l1.3-.7v1.3a7.9 7.9 0 013.7.5 4.7 4.7 0 01-2.5 2.2l.8.7.4.5-1.2.2-2.6.2a14.7 14.7 0 01-1.7-.2"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".4" d="M163 196.8c.6-.5 1.6-.4 2.4.3.7.6 1 1.5.4 2-.5.6-1.5.5-2.2-.2-.8-.6-1-1.6-.5-2m41-6.3c0-1.1.9-2 2-2s2.1.9 2.1 2c0 1-1 2-2 2a2 2 0 01-2.1-2"/>
+  <path fill="#005bbf" stroke="#000" stroke-width=".3" d="M201.8 160.6c0-2.2 1.9-4 4.3-4s4.2 1.8 4.2 4-1.9 4-4.3 4a4.1 4.1 0 01-4.2-4"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".3" d="M205 149.3v2.2h-2.4v2.2h2.3v6.3H202l-.2.6c0 .6.1 1.1.3 1.6h7.9c.2-.5.3-1 .3-1.6l-.2-.6h-2.8v-6.3h2.3v-2.2h-2.3v-2.2h-2.4z"/>
+  <path fill="#ccc" d="M206.5 330.6a82 82 0 01-35.5-8.2 22.7 22.7 0 01-12.8-20.4v-32h96.4v32a22.7 22.7 0 01-12.8 20.4 81 81 0 01-35.3 8.2"/>
+  <path fill="none" stroke="#000" stroke-width=".5" d="M206.5 330.6a82 82 0 01-35.5-8.2 22.7 22.7 0 01-12.8-20.4v-32h96.4v32a22.7 22.7 0 01-12.8 20.4 81 81 0 01-35.3 8.2z"/>
+  <path fill="#ccc" d="M206.3 270h48.3v-53.5h-48.3V270z"/>
+  <path fill="none" stroke="#000" stroke-width=".5" d="M206.3 270h48.3v-53.5h-48.3V270z"/>
+  <path fill="#ad1519" d="M206.3 302c0 12.6-10.7 22.9-24 22.9s-24.2-10.3-24.2-23v-32h48.2v32"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".5" d="M168.6 320.9c1.5.8 3.6 2 5.8 2.6l-.1-54.7h-5.7v52z"/>
+  <path fill="#c8b100" stroke="#000" stroke-linejoin="round" stroke-width=".5" d="M158 301.6a24.4 24.4 0 005.5 15v-47.5h-5.4v32.5z"/>
+  <path fill="#c7b500" stroke="#000" stroke-width=".5" d="M179.4 324.7a26.6 26.6 0 005.6 0v-55.9h-5.6v56z"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".5" d="M190 323.5a19 19 0 005.8-2.5v-52.2H190l-.1 54.7z"/>
+  <path fill="#ad1519" d="M158.1 270h48.2v-53.5H158V270z"/>
+  <path fill="none" stroke="#000" stroke-width=".5" d="M158.1 270h48.2v-53.5H158V270z"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".5" d="M201 316c2.4-2 4.6-6.8 5.4-12.2l.1-35H201l.1 47.3z"/>
+  <path fill="none" stroke="#000" stroke-width=".5" d="M206.3 302c0 12.6-10.7 22.9-24 22.9s-24.2-10.3-24.2-23v-32h48.2v32"/>
+  <path fill="#ad1519" d="M254.6 270v32c0 12.6-10.8 22.9-24.1 22.9s-24.2-10.3-24.2-23v-32h48.3"/>
+  <path fill="none" stroke="#000" stroke-width=".5" d="M254.6 270v32c0 12.6-10.8 22.9-24.1 22.9s-24.2-10.3-24.2-23v-32h48.3"/>
+  <path fill="#c8b100" d="M215.1 294.1l.1.5c0 .6-.5 1-1.1 1a1 1 0 01-1.1-1v-.5h-1.5a2.5 2.5 0 001.8 2.9v3.9h1.6V297a2.6 2.6 0 001.7-1.6h4.4v-1.2h-6m21.8 0v1.2h-4a2.5 2.5 0 01-.3.6l4.6 5.2-1.2 1-4.6-5.3-.2.1v8.7h-1.6V297h-.2l-4.8 5.2-1.2-1 4.7-5.3a2.1 2.1 0 01-.2-.4h-4V294h13zm2.6 0v1.2h4.4c.3.8.9 1.4 1.7 1.6v3.9h1.6V297a2.5 2.5 0 001.8-2.4 2 2 0 000-.5h-1.6l.1.5c0 .6-.5 1-1 1-.7 0-1.2-.4-1.2-1a1 1 0 01.1-.5h-5.9m-6.7 22.1a15.6 15.6 0 003.7-1l.8 1.4a17.6 17.6 0 01-4.3 1.2 2.6 2.6 0 01-2.6 2 2.6 2.6 0 01-2.5-2 17.5 17.5 0 01-4.6-1.2l.8-1.4c1.3.5 2.6.9 4 1a2.5 2.5 0 011.5-1.3v-6.7h1.6v6.7c.7.2 1.3.7 1.6 1.4zm-11-2.2l-.8 1.4a16.6 16.6 0 01-3.6-3.1c-.9.2-1.8 0-2.5-.5a2.4 2.4 0 01-.3-3.5l.1-.1a15.3 15.3 0 01-1.3-4.8h1.7a13.1 13.1 0 001 4c.5 0 1 0 1.4.2l4.1-4.5 1.3 1-4.1 4.5c.5.9.5 2-.1 2.8a15.2 15.2 0 003.1 2.6zm-6-4.8c.3-.4 1-.5 1.5 0s.5 1 .1 1.4a1.2 1.2 0 01-1.6.1 1 1 0 010-1.5zm-2.2-4.5l-1.6-.3-.3-4.3 1.7-.6v2.5c0 1 0 1.8.2 2.7zm1.4-5.3l1.7.4v2.2c0-.8.3 2.1.3 2.1l-1.7.6a14 14 0 01-.3-2.7v-2.6zm5.6 13.7a15.7 15.7 0 004.8 2.6l.4-1.6a13.7 13.7 0 01-4-2l-1.2 1m-.8 1.4a17.4 17.4 0 004.8 2.6l-1.2 1.1a18.7 18.7 0 01-4-2l.4-1.7m2.2-9.4l1.6.7 3-3.3-1-1.4-3.6 4m-1.3-1l-1-1.4 3-3.3 1.6.7-3.6 4m18.1 9.9l.8 1.4a16.7 16.7 0 003.6-3.1c.9.2 1.8 0 2.5-.5a2.4 2.4 0 00.3-3.5l-.1-.1a15 15 0 001.3-4.8h-1.7a13.3 13.3 0 01-1 4 3 3 0 00-1.4.2l-4.1-4.5-1.3 1 4.1 4.5a2.4 2.4 0 00.1 2.8 15 15 0 01-3.1 2.6zm6-4.8a1.2 1.2 0 00-1.5 0 1 1 0 00-.1 1.4 1.2 1.2 0 001.6.1 1 1 0 000-1.5zm2.2-4.5l1.6-.3.3-4.3-1.7-.6v2.5c0 1 0 1.9-.2 2.8zm-1.4-5.3l-1.7.4v2.2c0-.8-.3 2.1-.3 2.1l1.7.6.3-2.7v-2.6m-5.6 13.7a15.7 15.7 0 01-4.8 2.6l-.4-1.6a13.7 13.7 0 004-2l1.2 1m.8 1.4a17.4 17.4 0 01-4.8 2.6l1.2 1.1a18.6 18.6 0 004-2l-.4-1.7m-2.2-9.4l-1.6.7-2.9-3.3 1-1.4 3.5 4m1.3-1l1-1.4-3-3.3-1.6.7 3.6 4m-20.1-8.7l.5 1.6h4.5l.5-1.6h-5.5m21.1 0l-.5 1.6h-4.5l-.5-1.6h5.5m-11.6 21.9c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm1.9-7.8l1.7-.4v-4.3l-1.7-.5v5.2m-1.6 0l-1.7-.4v-4.3l1.7-.5v5.2"/>
+  <path fill="#c8b100" d="M211.5 294.2c.2-1 1-1.6 1.8-2V287h1.6v5.3c.8.3 1.5.9 1.7 1.6h4.4v.3h-6a1.2 1.2 0 00-1-.6c-.4 0-.7.3-1 .6h-1.5m12.2 0v-.3h4.1a2.4 2.4 0 01.2-.3l-5-5.7 1.2-1 5 5.6.2-.1V285h1.6v7.3h.3l4.9-5.5 1.2 1-4.9 5.5.3.6h4v.3h-13zm21.6 0a1.1 1.1 0 011-.6c.5 0 .8.3 1 .6h1.6c-.2-1-.9-1.6-1.8-2V287h-1.6v5.3c-.8.3-1.4.8-1.7 1.6h-4.4v.3h6m-30.2-15l6 6.8 1.3-1-6.1-6.7.3-.6h4.4V276h-4.4a2.6 2.6 0 00-2.5-1.7 2.6 2.6 0 00-2.7 2.5 2.5 2.5 0 001.8 2.4v5.2h1.6v-5.2h.3zm32 0v5.3h-1.7v-5.2a2.5 2.5 0 01-.4-.2l-6 6.8-1.3-1 6.2-6.9-.1-.3h-4.5V276h4.5a2.6 2.6 0 012.4-1.7 2.6 2.6 0 012.7 2.5 2.5 2.5 0 01-1.9 2.4zm-16.1 0v3.3h-1.7v-3.2a2.6 2.6 0 01-1.7-1.6h-4V276h4a2.6 2.6 0 012.5-1.7c1.2 0 2.2.7 2.5 1.7h4v1.6h-4a2.5 2.5 0 01-1.6 1.6zm-17.8 4l-1.7.4v4.3l1.7.5v-5.2m1.6 0l1.7.4v4.3l-1.7.5v-5.2m30.6 0l-1.7.4v4.3l1.7.5v-5.2m1.6 0l1.7.4v4.3l-1.7.5v-5.2m-25.5.8l1.6-.7 2.9 3.3-1 1.4-3.5-4m-1.3 1l-1 1.4 3 3.3 1.6-.7-3.6-4m18.5-1.1l-1.6-.7-3 3.3 1 1.4 3.6-4m1.2 1l1 1.4-3 3.3-1.5-.7 3.5-4m-20.3 9l.5-1.6h4.5l.5 1.6h-5.5m-6.7-17c0-.6.5-1 1.2-1a1 1 0 011 1c0 .6-.4 1-1 1a1.1 1.1 0 01-1.2-1zm12.1.8l-.5 1.6h-4.5l-.5-1.6h5.5m0-1.6l-.5-1.6h-4.5l-.5 1.6h5.5m15.7 17.8l-.5-1.6h-4.5l-.5 1.6h5.5m4.4-17c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm-16.1 0c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1.1 1a1.1 1.1 0 01-1.1-1zm6.2.8l.5 1.6h4.6l.5-1.6h-5.6m0-1.6l.5-1.6h4.6l.5 1.6h-5.6m-5.9 5l-1.7.5v4.3l1.7.5V281m1.7 0l1.6.5v4.3l-1.6.5V281"/>
+  <path fill="none" stroke="#c8b100" stroke-width=".3" d="M232.7 316.3a15.6 15.6 0 003.7-1.1l.8 1.4a17.6 17.6 0 01-4.3 1.2 2.6 2.6 0 01-2.6 2 2.6 2.6 0 01-2.5-2 17.5 17.5 0 01-4.6-1.2l.8-1.4c1.3.5 2.6.9 4 1a2.5 2.5 0 011.5-1.3v-6.7h1.6v6.7c.7.2 1.3.7 1.6 1.4zm-4.7-20.4a2.3 2.3 0 01-.2-.5h-4V294h4a2.6 2.6 0 01.2-.4l-5-5.6 1.2-1 5 5.5a2.2 2.2 0 01.2 0V285h1.7v7.3h.2l4.9-5.5 1.2 1-4.9 5.5.3.6h4v1.5h-4c0 .2-.2.4-.3.5l4.7 5.3-1.3 1-4.6-5.3-.2.1v8.7h-1.6V297l-.2-.1-4.8 5.3-1.2-1 4.7-5.3m-12.8-16.7l6 6.8 1.3-1-6.1-6.7.3-.6h4.4V276h-4.4a2.6 2.6 0 00-2.5-1.7 2.6 2.6 0 00-2.6 2.5 2.5 2.5 0 001.7 2.4v5.2h1.6v-5.2h.3zm6.5 34.8l-.8 1.4a16.6 16.6 0 01-3.6-3.1c-.9.2-1.8 0-2.5-.5a2.4 2.4 0 01-.3-3.5l.1-.1a15.3 15.3 0 01-1.2-4.8h1.6a13.1 13.1 0 001 4c.5 0 1 0 1.4.2l4.1-4.5 1.3 1-4.1 4.5c.6.9.5 2-.1 2.8a15.2 15.2 0 003.1 2.6zm-8.4-13.1V297a2.5 2.5 0 01-1.8-2.4c0-1 .8-2 1.8-2.4V287h1.6v5.3c.8.2 1.5.8 1.7 1.6h4.4v1.5h-4.4a2.6 2.6 0 01-1.6 1.6v3.9h-1.7m2.3 8.3c.4-.4 1.1-.5 1.6 0s.5 1 .1 1.4a1.2 1.2 0 01-1.6.1 1 1 0 010-1.5zm-2-4.5l-1.7-.3-.3-4.3 1.7-.6v2.5c0 1 0 1.8.3 2.7zm1.4-5.3l1.6.4v2.2c0-.8.3 2.1.3 2.1l-1.7.6-.3-2.7v-2.6zm5.5 13.7a15.7 15.7 0 004.8 2.6l.4-1.6a13.7 13.7 0 01-4-2l-1.2 1m-.8 1.4a17.4 17.4 0 004.8 2.6l-1.2 1.1a18.7 18.7 0 01-4-2l.4-1.7"/>
+  <path fill="none" stroke="#c8b100" stroke-width=".3" d="M221.9 305.1l1.6.7 3-3.3-1-1.4-3.6 4m-1.3-1l-1-1.4 3-3.3 1.6.7-3.6 4m-7.6-9.5c0-.6.5-1 1-1 .7 0 1.2.5 1.2 1 0 .6-.5 1.1-1.1 1.1a1 1 0 01-1.1-1zm25.7 19.4l.8 1.4a16.7 16.7 0 003.6-3.1c.9.2 1.8 0 2.6-.5a2.4 2.4 0 00.2-3.5l-.1-.1a15 15 0 001.3-4.8h-1.7a13.3 13.3 0 01-1 4 3 3 0 00-1.4.2l-4.1-4.5-1.3 1 4.1 4.5a2.4 2.4 0 00.1 2.8 15 15 0 01-3 2.6zm8.4-13.1V297a2.5 2.5 0 001.8-2.4c0-1-.7-2-1.8-2.4V287h-1.6v5.3c-.8.2-1.4.8-1.7 1.6h-4.4v1.5h4.4c.3.8.9 1.3 1.7 1.6v3.9h1.6zm-2.3 8.3a1.2 1.2 0 00-1.6 0 1 1 0 00-.1 1.4 1.2 1.2 0 001.6.1 1 1 0 000-1.5zm2-4.5l1.7-.3.3-4.3-1.7-.6v2.5c0 1 0 1.8-.2 2.7zm-1.3-5.3l-1.7.4v2.2c0-.8-.3 2.1-.3 2.1l1.7.6.3-2.7v-2.6m1.6-20.1v5.2h-1.6v-5.2a2.3 2.3 0 01-.4-.2l-6 6.8-1.2-1 6-7v-.2h-4.5V276h4.4a2.6 2.6 0 012.5-1.7 2.6 2.6 0 012.6 2.5 2.5 2.5 0 01-1.8 2.4zm-16 0v3.2h-1.7v-3.2a2.6 2.6 0 01-1.7-1.6h-4V276h4c.4-1 1.3-1.7 2.5-1.7s2.2.7 2.5 1.7h4v1.6h-4a2.5 2.5 0 01-1.6 1.6zm8.8 33.8a15.7 15.7 0 01-4.8 2.6l-.4-1.6a13.7 13.7 0 004-2l1.2 1m.8 1.4a17.4 17.4 0 01-4.8 2.6l1.2 1.1a18.7 18.7 0 004-2l-.4-1.7m-27.4-31.4l-1.7.5v4.3l1.7.5v-5.2m1.7 0l1.6.4v4.3l-1.6.5V283m30.5 0l-1.7.5v4.3l1.7.5V283"/>
+  <path fill="none" stroke="#c8b100" stroke-width=".3" d="M247.1 283.1l1.7.5v4.3l-1.7.5V283m-8.6 22l-1.6.7-2.9-3.3 1-1.4 3.5 4m1.3-1l1-1.4-3-3.3-1.6.7 3.6 4m-18.2-20l1.6-.7 3 3.3-1 1.4-3.6-4m-1.3 1l-1 1.4 3 3.3 1.6-.7-3.6-4m18.5-1.1l-1.6-.7-3 3.3 1 1.4 3.6-4m1.2 1l1 1.4-3 3.2-1.5-.6 3.5-4m-20.3 9l.5-1.6h4.5l.5 1.6h-5.5m0 1.5l.5 1.6h4.5l.5-1.6h-5.5M213 277c0-.6.5-1 1.2-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1.2-1zm12.1.8l-.5 1.6h-4.5l-.5-1.6h5.5m0-1.6l-.5-1.6h-4.5l-.5 1.6h5.5m20.1 18.5c0-.5.5-1 1.1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1.1-1 1.1a1 1 0 01-1.2-1zm-4.4-.7l-.5-1.6h-4.5l-.5 1.6h5.5m0 1.5l-.5 1.6h-4.5l-.5-1.6h5.5m-11.6 21.9c0-.6.5-1 1.1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1.1 1.1 0 01-1.2-1zm1.9-7.8l1.7-.4v-4.3l-1.7-.5v5.2m-1.6 0l-1.7-.4v-4.3l1.7-.5v5.2m15.7-32.6c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm-16.1 0c0-.6.5-1 1.1-1a1 1 0 011.1 1c0 .6-.5 1-1 1a1.1 1.1 0 01-1.2-1zm6.2.8l.5 1.6h4.6l.5-1.6h-5.5m0-1.6l.4-1.6h4.6l.5 1.6h-5.5m-6 5l-1.6.5v4.3l1.6.5V281m1.7 0l1.6.5v4.3l-1.6.5V281"/>
+  <path fill="#058e6e" d="M227.7 294.7a2.6 2.6 0 012.6-2.5 2.6 2.6 0 012.6 2.5 2.6 2.6 0 01-2.6 2.4c-1.4 0-2.6-1-2.6-2.4"/>
+  <path fill="#db4446" d="M230.9 229.7v-.6l.1-.3-2.3-.1a5.9 5.9 0 01-2.3-1.2c-.8-.7-1.1-1-1.6-1.2-1.3-.2-2.3.4-2.3.4s1 .4 1.7 1.3 1.5 1.3 1.8 1.4c.6.2 2.6 0 3.1.1l1.8.2"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M230.9 229.7v-.6l.1-.3-2.3-.1a5.9 5.9 0 01-2.3-1.2c-.8-.7-1.1-1-1.6-1.2-1.3-.2-2.3.4-2.3.4s1 .4 1.7 1.3 1.5 1.3 1.8 1.4c.6.2 2.6 0 3.1.1l1.8.2z"/>
+  <path fill="#ed72aa" stroke="#000" stroke-width=".4" d="M238.1 227.5v1.4c.2.6-.1 1.2 0 1.5 0 .4.1.6.3.9l.2.9-.7-.5-.6-.4v1c.1.2.3.8.6 1.1l1 1.3c.2.5.1 1.4.1 1.4s-.4-.7-.8-.8l-1.2-.7s.7.8.7 1.5c0 .8-.3 1.6-.3 1.6s-.3-.7-.8-1.1l-1-.9s.4 1.2.4 2v2.3l-.9-1-1-.7c0-.2.5.6.6 1.1 0 .5.3 2.3 1.8 4.5 1 1.3 2.3 3.6 5.3 2.9 3-.8 1.9-4.8 1.3-6.7a16.8 16.8 0 01-1-4.6c0-.8.6-2.9.5-3.3a8 8 0 01.2-3.1c.4-1.3.7-1.8.9-2.3.2-.6.4-.9.4-1.3l.1-1.3.7 1.3.1 1.5s.1-1 1-1.6c.8-.6 1.8-1.1 2-1.4.3-.3.3-.5.3-.5s0 1.8-.6 2.6l-1.7 2s.7-.3 1.2-.3h.9s-.6.4-1.4 1.6c-.8 1-.5 1.2-1 2.1-.6 1-1 1-1.7 1.5-1 .8-.5 4.2-.4 4.7.2.5 2 4.5 2 5.5s.2 3.2-1.5 4.6c-1.1 1-3 1-3.4 1.2-.4.3-1.2 1.1-1.2 2.8 0 1.7.6 2 1 2.4.6.5 1.2.2 1.3.6.2.3.2.5.5.7.2.2.3.4.2.8 0 .3-.8 1.1-1.1 1.7l-.8 2.4c0 .2-.1 1 .1 1.3 0 0 .9 1 .3 1.2-.4.2-.8-.2-1-.2l-.9.5c-.3-.1-.3-.3-.4-.8l-.1-.7c-.2 0-.3.2-.4.5 0 .2 0 .8-.3.8-.2 0-.5-.4-.8-.5-.2 0-.8-.2-.8-.4 0-.3.4-.9.7-1 .4 0 .8-.3.5-.5s-.5-.2-.7 0-.8 0-.7-.2v-.8c0-.2-.4-.5.1-.8.6-.3.8.2 1.4.1.6 0 .8-.3 1-.6.2-.3.2-1-.2-1.4-.4-.5-.7-.5-.9-.8l-.3-.9v2.2l-.7-.8c-.3-.3-.6-1.3-.6-1.3v1.3c0 .4.3.7.2.8-.1.1-.8-.7-1-.8a3.7 3.7 0 01-1-1l-.4-1.4a4.2 4.2 0 010-1.5l.4-1h-1.4c-.7 0-1.2-.3-1.5.2-.3.5-.2 1.5.2 2.8.3 1.2.5 1.9.4 2.1a3 3 0 01-.7.8h-.9a2.5 2.5 0 00-1.2-.3h-1.3l-1.1-.3c-.3.1-.8.3-.6.7.2.6-.2.7-.5.7l-.9-.2c-.4-.1-.9 0-.8-.4 0-.4.2-.4.4-.7.2-.3.2-.5 0-.5h-.6c-.2.2-.5.5-.8.4-.2-.1-.4-.4-.4-1s-.7-1.2 0-1.1c.5 0 1.3.4 1.4 0 .2-.3 0-.4-.2-.7s-.8-.4-.3-.7l.7-.5c.1-.2.4-.8.7-.6.6.2 0 .7.6 1.3.6.7 1 1 2 .8 1 0 1.3-.2 1.3-.5l-.1-1v-1s-.4.3-.5.6l-.4.8v-2a8 8 0 00-.2-.8l-.3.9-.1 1s-.7-.5-.5-1.5c.1-.7-.1-1.6.1-2 .2-.3.7-1.5 2-1.6h2.6l2-.3s-2.8-1.4-3.5-1.9a9.5 9.5 0 01-2-2l-.6-1.6s-.5 0-1 .3a5 5 0 00-1.2 1l-.7 1 .1-1.2v-.8s-.4 1.2-1 1.7l-1.4 1v-.8l.2-1s-.4.8-1.1 1c-.7 0-1.8 0-1.9.4 0 .5.2 1 0 1.4 0 .3-.4.5-.4.5l-.8-.4c-.4 0-.7.2-.7.2s-.3-.4-.2-.7c.1-.2.7-.6.5-.8l-.8.2c-.3.1-.8.3-.8-.2 0-.4.2-.7 0-1 0-.3 0-.5.2-.6l1.2-.1c0-.2-.2-.5-.8-.6-.6-.1-.8-.5-.5-.8.3-.2.3-.3.5-.6.1-.2.2-.7.7-.5.5.3.4.8 1 1a4 4 0 002-.2l1.5-1 1.5-1-1-.8c-.3-.3-.7-.9-1-1a8.3 8.3 0 00-1.8-.6 9 9 0 01-1.7-.5l.8-.3c.2-.2.6-.6.8-.6h.3-1.4c-.3-.1-1-.6-1.3-.6l-.8.1s.8-.4 1.4-.5l1-.1s-.9-.3-1.1-.6l-.6-1c-.2-.1-.3-.5-.6-.5l-1 .3c-.4 0-.6-.2-.6-.6l-.1-.5c-.2-.3-.6-.8-.2-1h1.4c0-.2-.5-.6-.8-.8-.4-.2-1-.5-.7-.8l.8-.5c.2-.3.3-1 .7-.7.4.2.8 1.2 1.1 1.1.3 0 .3-.8.3-1 0-.4 0-1 .2-.9.3 0 .5.4 1 .5.4 0 1-.1 1 .2 0 .3-.3.7-.6 1-.3.3-.4 1-.3 1.4.2.5.7 1.2 1.2 1.4.4.3 1.2.5 1.7.9.5.3 1.7 1.2 2.1 1.3l.8.4s.5-.2 1.1-.2c.7 0 2.1 0 2.6-.2.6-.2 1.3-.6 1-1-.1-.6-1.3-1-1.2-1.4 0-.4.5-.4 1.2-.4.8 0 1.8.1 2-1 .2-1 .2-1.5-.8-1.8-1-.2-1.8-.2-2-1-.2-.7-.4-.9-.2-1.1.3-.2.6-.3 1.4-.4.8 0 1.6 0 1.9-.2.2-.2.3-.7.6-.9.3-.2 1.4-.4 1.4-.4s1.4.7 2.7 1.7a15 15 0 012.2 2.1"/>
+  <path d="M228.1 226.8l-.2-.6v-.3s.8 0 .7.3c0 .2-.2.2-.3.3l-.2.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M228.1 226.8l-.2-.6v-.3s.8 0 .7.3c0 .2-.2.2-.3.3l-.2.3z"/>
+  <path d="M232 225.4v-.4s.7 0 1 .3c.5.4.9 1 .9 1l-.8-.4h-.5l-.3-.1v-.3h-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M232 225.4v-.4s.7 0 1 .3c.5.4.9 1 .9 1l-.8-.4h-.5l-.3-.1v-.3h-.3z"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M237.3 231.3l-.4-.7a8 8 0 01-.3-.4"/>
+  <path fill="#db4446" d="M217.4 226.6s.5.4.8.4h.8s.2-.5.1-.8c-.2-1.2-1.2-1.4-1.2-1.4s.3.7.1 1a2 2 0 01-.6.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M217.4 226.6s.5.4.8.4h.8s.2-.5.1-.8c-.2-1.2-1.2-1.4-1.2-1.4s.3.7.1 1a2 2 0 01-.6.8z"/>
+  <path fill="#db4446" d="M215.2 227.6s-.4-.7-1.3-.6c-.8 0-1.4.8-1.4.8h1.2c.3.3.4 1 .4 1l.7-.6a7.2 7.2 0 00.4-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M215.2 227.6s-.4-.7-1.3-.6c-.8 0-1.4.8-1.4.8h1.2c.3.3.4 1 .4 1l.7-.6a7.2 7.2 0 00.4-.6z"/>
+  <path fill="#db4446" d="M214.2 230.6s-.8.1-1.2.6c-.4.5-.3 1.3-.3 1.3s.4-.5.9-.5l1 .2-.1-.8-.3-.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M214.2 230.6s-.8.1-1.2.6c-.4.5-.3 1.3-.3 1.3s.4-.5.9-.5l1 .2-.1-.8-.3-.8z"/>
+  <path d="M228.2 230.5l.3-.5.3.5h-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M228.2 230.5l.3-.5.3.5h-.7"/>
+  <path d="M229 230.5l.3-.5.4.5h-.8"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M229 230.5l.3-.5.4.5h-.8"/>
+  <path d="M228.6 227.3l.8.3-.7.4-.1-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M228.6 227.3l.8.3-.7.4-.1-.6"/>
+  <path d="M229.5 227.6l.7.2-.5.4-.2-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M229.5 227.6l.7.2-.5.4-.2-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M224.2 233.7s-.7.2-1 .6c-.4.5-.3 1-.3 1s.6-.5 1.5-.3l1.2.3 1.3-.3s-.7.8-.7 1.3l.2 1.1c0 .7-.6 1.6-.6 1.6l1-.3a4.6 4.6 0 001.7-.8l.9-1s-.2 1 0 1.4l.2 1.6.8-.6c.2-.1.7-.4.9-.7l.3-1s0 .8.4 1.3l.6 1.6s.3-.8.6-1.1c.3-.4.7-.8.7-1a4.3 4.3 0 00-.1-.9l.4.8m-11 .6s.5-.8 1-1l1.1-.8.9-.4m1 5l1.3-.8a4 4 0 001-1"/>
+  <path fill="#db4446" d="M216.6 240.4s-.4-.5-1.1-.3c-.7 0-1.2.9-1.2.9s.6-.2 1-.1.6.4.6.4l.4-.4.3-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M216.6 240.4s-.4-.5-1.1-.3c-.7 0-1.2.9-1.2.9s.6-.2 1-.1.6.4.6.4l.4-.4.3-.6z"/>
+  <path fill="#db4446" d="M215.8 243.2s-.6 0-1.1.3c-.5.4-.5 1.2-.5 1.2s.4-.4.8-.3l.9.2v-.6c.2-.4-.1-.8-.1-.8"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M215.8 243.2s-.6 0-1.1.3c-.5.4-.5 1.2-.5 1.2s.4-.4.8-.3l.9.2v-.6c.2-.4-.1-.8-.1-.8z"/>
+  <path fill="#db4446" d="M217.2 245.8s0 .8.3 1.3c.4.5 1.1.5 1.1.5l-.3-.7c0-.4.3-.8.3-.8s-.3-.3-.7-.3h-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M217.2 245.8s0 .8.3 1.3c.4.5 1.1.5 1.1.5l-.3-.7c0-.4.3-.8.3-.8s-.3-.3-.7-.3h-.7zm16 1.3s2 1.2 1.9 2.2c0 1-1 2.3-1 2.3"/>
+  <path fill="#db4446" d="M224.2 252.6s-.4-.6-1.1-.6c-.7 0-1.4.7-1.4.7s.8-.1 1 .2l.5.6.5-.3.5-.6"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M224.2 252.6s-.4-.6-1.1-.6c-.7 0-1.4.7-1.4.7s.8-.1 1 .2l.5.6.5-.3.5-.6z"/>
+  <path fill="#db4446" d="M222.2 255.3s-1-.1-1.4.3c-.4.5-.4 1.3-.4 1.3s.6-.6 1-.5c.5 0 1 .3 1 .3v-.7l-.3-.7"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M222.2 255.3s-1-.1-1.4.3c-.4.5-.4 1.3-.4 1.3s.6-.6 1-.5c.5 0 1 .3 1 .3v-.7l-.3-.7z"/>
+  <path fill="#db4446" d="M224 258.1s-.3.7 0 1.1c.3.5 1 .8 1 .8s-.3-.4-.2-.8c.1-.3.7-.8.7-.8l-1.4-.2"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M224 258.1s-.3.7 0 1.1c.3.5 1 .8 1 .8s-.3-.4-.2-.8c.1-.3.7-.8.7-.8l-1.4-.2z"/>
+  <path fill="#db4446" d="M236 259.3s-.8-.2-1.2 0c-.5.3-.8 1.4-.8 1.4s.7-.6 1.2-.5c.5 0 1 .3 1 .3v-.8l-.2-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M236 259.3s-.8-.2-1.2 0c-.5.3-.8 1.4-.8 1.4s.7-.6 1.2-.5c.5 0 1 .3 1 .3v-.8l-.2-.4z"/>
+  <path fill="#db4446" d="M236.4 262.2s-.6.6-.4 1.1l.6 1s0-.7.2-1l1-.3-.7-.5a15.8 15.8 0 01-.7-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M236.4 262.2s-.6.6-.4 1.1l.6 1s0-.7.2-1l1-.3-.7-.5a15.8 15.8 0 01-.7-.3z"/>
+  <path fill="#db4446" d="M239.4 263s-.3.8.2 1.3c.6.5 1 .5 1 .5s-.3-.7-.2-1.1c.1-.5.5-.7.5-.7l-.8-.2-.7.3"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M239.4 263s-.3.8.2 1.3c.6.5 1 .5 1 .5s-.3-.7-.2-1.1c.1-.5.5-.7.5-.7l-.8-.2-.7.3z"/>
+  <path fill="#ffd691" stroke="#000" stroke-width=".5" d="M208.8 316.4c2 .6 3 2 3 3.8 0 2.3-2.2 4-5 4-3 0-5.3-1.7-5.3-4 0-1.7 1-3.6 3-3.8l-.2-.4-.7-.7h1.2l.8.5.5-.7c.3-.4.6-.5.6-.5l.6.6.3.5.7-.4.8-.3s0 .4-.2.7l-.1.7"/>
+  <path fill="#058e6e" stroke="#000" stroke-width=".5" d="M206.3 326.7s-3.8-2.6-5.5-3c-2-.4-4.5 0-5.5 0 0 0 1.2.8 1.8 1.4.5.5 2.3 1.5 3.3 1.8 3 .8 6-.2 6-.2m1 .2s2.4-2.5 5-2.9c3-.4 5 .3 6.2.6l-1.5.8c-.5.3-2 1.5-4 1.6-2 0-4.4-.3-4.8-.2l-.9.1"/>
+  <path fill="#ad1519" stroke="#000" stroke-width=".5" d="M206.7 323.8a4.8 4.8 0 010-7.1 4.8 4.8 0 011.5 3.5 4.9 4.9 0 01-1.5 3.6"/>
+  <path fill="#058e6e" stroke="#000" stroke-width=".5" d="M205.7 329s.6-1.5.6-2.7l-.1-2.1h.8s.3 1.1.3 2l-.1 2.4-.7.1-.8.3"/>
+  <path fill="#fff" d="M254 190.7c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M254 190.7c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M255.4 188.2c0-.6.5-1 1.1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M255.4 188.2c0-.6.5-1 1.1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M256.4 185.2c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M256.4 185.2c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z"/>
+  <path fill="#fff" d="M256.5 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M256.5 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M255.7 179c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M255.7 179c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M254.1 176.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M254.1 176.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M252 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M252 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M249.4 171.8c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M249.4 171.8c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1z"/>
+  <path fill="#fff" d="M246.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M246.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M243.3 169.1c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M243.3 169.1c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M239.9 168.5c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M239.9 168.5c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M236.6 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M236.6 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M233.3 168.5c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M233.3 168.5c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M230.1 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M230.1 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z"/>
+  <path fill="#fff" stroke="#000" stroke-width=".4" d="M231.7 171.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1m.6 3.1c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1m0 3c0-.5.6-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1m-1 2.8c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1 0 .6-.4 1-1 1a1 1 0 01-1-1m-1.9 2.6c0-.5.5-1 1-1 .7 0 1.2.5 1.2 1s-.5 1-1.1 1c-.6 0-1-.4-1-1"/>
+  <path fill="#fff" d="M227.6 166.5c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M227.6 166.5c0-.5.5-1 1.1-1a1 1 0 010 2 1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M224.8 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M224.8 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M221.6 164c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1 0 .5-.5 1-1 1-.6 0-1.1-.5-1.1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M221.6 164c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1 0 .5-.5 1-1 1-.6 0-1.1-.5-1.1-1z"/>
+  <path fill="#fff" d="M218.3 163.4c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M218.3 163.4c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z"/>
+  <path fill="#fff" d="M215 163.5c0-.6.5-1 1.1-1 .6 0 1 .4 1 1 0 .5-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M215 163.5c0-.6.5-1 1.1-1 .6 0 1 .4 1 1 0 .5-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M211.7 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M211.7 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M208.6 165.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M208.6 165.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z"/>
+  <path fill="#fff" d="M156 190.7c0-.5.4-1 1-1s1 .5 1 1c0 .6-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M156 190.7c0-.5.4-1 1-1s1 .5 1 1c0 .6-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M154.5 188.2c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M154.5 188.2c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M153.5 185.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M153.5 185.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M153.4 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M153.4 182c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M154.2 179c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M154.2 179c0-.6.5-1 1-1 .6 0 1 .4 1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M155.8 176.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M155.8 176.1c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1s-.5 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M158 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M158 173.8c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M160.5 171.8c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M160.5 171.8c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M163.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M163.5 170.3c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M166.6 169.1c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M166.6 169.1c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M170 168.5c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M170 168.5c0-.5.5-1 1.1-1a1 1 0 010 2c-.6 0-1-.4-1-1z"/>
+  <path fill="#fff" d="M173.4 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M173.4 168.3c0-.5.4-1 1-1s1 .5 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M176.6 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M176.6 168.5c0-.6.5-1 1-1 .6 0 1.1.4 1.1 1s-.5 1-1 1a1 1 0 01-1.1-1z"/>
+  <path fill="#fff" d="M179.8 168.5c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M179.8 168.5c0-.6.5-1 1-1 .7 0 1.2.4 1.2 1s-.5 1-1.1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" stroke="#000" stroke-width=".4" d="M178.2 171.2c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1m-.7 3.1c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1m-.2 3c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1m.9 2.8c0-.5.5-1 1-1 .6 0 1.1.5 1.1 1 0 .6-.5 1-1 1a1 1 0 01-1.1-1m1.8 2.6c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1"/>
+  <path fill="#fff" d="M182.3 166.5c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M182.3 166.5c0-.5.5-1 1-1a1 1 0 010 2 1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M185.2 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M185.2 165c0-.6.4-1 1-1s1 .4 1 1-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M188.3 164c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1 0 .5-.4 1-1 1s-1-.5-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M188.3 164c0-.6.5-1 1-1 .7 0 1.1.4 1.1 1 0 .5-.4 1-1 1s-1-.5-1-1z"/>
+  <path fill="#fff" d="M191.6 163.4c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M191.6 163.4c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M194.9 163.5c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M194.9 163.5c0-.6.4-1 1-1s1 .4 1 1c0 .5-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M198.2 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M198.2 164c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#fff" d="M201.3 165.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1"/>
+  <path fill="none" stroke="#000" stroke-width=".4" d="M201.3 165.1c0-.5.5-1 1-1 .7 0 1.1.5 1.1 1s-.4 1-1 1a1 1 0 01-1-1z"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M174.7 228.9h-1v-1h-1.5v3.6h1.6v2.5h-3.4v7h1.8v14.3h-3.5v7.3h27.2v-7.3h-3.5V241h1.8v-7h-3.4v-2.5h1.6V228h-1.6v.9h-.8v-1h-1.6v1h-1.1v-1h-1.6v3.6h1.6v2.5H184v-7.8h1.7v-3.5H184v.9h-1v-1h-1.5v1h-.9v-1H179v3.6h1.7v7.8h-3.3v-2.5h1.6V228h-1.6v.9h-.9v-1h-1.8v1zm-6 33.7H196m-27.3-1.8H196m-27.3-1.8H196m-27.3-1.7H196m-27.3-2H196m-23.8-1.6h20.2m-20.2-1.8h20.2m-20.2-2h20.2m-20.2-1.7h20.2m-20.2-1.8h20.2m-20.2-1.8h20.2m-20.2-1.7h20.2m-22-1.8h23.8m-23.8-1.8h23.8m-23.8-1.8h23.8m-23.8-1.8h23.8m-20.4-1.7h17m-10.2-1.8h3.4m-3.4-1.8h3.4m-3.4-1.8h3.4m-3.4-1.7h3.4m-5.1-2.2h6.8m-12 7.5h3.6m-5-2.2h6.6m-6.7 32.6v-1.8m0-1.8v-1.7m-1.8 1.7v1.8m3.4 0V259m1.7 3.6v-1.8m0-1.8v-1.7m0-2v-1.6m0-1.8v-2m-1.7 7.4v-2m-3.4 2v-2m7 0v2m1.5-2v-1.6m-5.1-1.8v1.8m3.5-1.8v1.8m3.3-1.8v1.8M179 252v-2m1.7-1.7v1.7m0-5.3v1.8m-1.7-3.6v1.8m1.7-3.5v1.7m-3.3-1.7v1.7m-3.5-1.7v1.7m-1.6-3.5v1.8m3.3-1.8v1.8m3.4-1.8v1.8m1.7-3.6v1.8m-3.3-1.8v1.8m-3.5-1.8v1.8m-1.6-3.6v1.8m6.7-1.8v1.8m-3.4-5.3v1.8m15.3-1.8h-3.5m5-2.2h-6.6m6.7 32.6v-1.8m0-1.8v-1.7m1.8 1.7v1.8m-3.4 0V259m-1.7 3.6v-1.8m0-1.8v-1.7m0-2v-1.6m0-1.8v-2m1.7 7.4v-2m3.4 2v-2m-7 0v2m-1.5-2v-1.6m5.1-1.8v1.8m-3.5-1.8v1.8m-3.3-1.8v1.8m1.7-1.8v-2m-1.7-1.7v1.7m0-5.3v1.8m1.7-3.6v1.8m-1.7-3.5v1.7m3.3-1.7v1.7m3.5-1.7v1.7m1.6-3.5v1.8m-3.3-1.8v1.8m-3.4-1.8v1.8m-1.7-3.6v1.8m3.3-1.8v1.8m3.5-1.8v1.8m1.6-3.6v1.8m-6.7-1.8v1.8m3.4-5.3v1.8m-7 18v-2m0-5.4v-1.8m0 5.4v-1.8m0-5.3v-1.8m0-1.8v-1.7m0-3.6v-1.8m0-1.7v-1.8m-8.3 4.6h3.5m3.3-5.3h3.4m3.3 5.3h3.5"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M186.8 262.6v-4.7c0-.8-.4-3.5-4.6-3.5-4 0-4.4 2.7-4.4 3.5v4.7h9z"/>
+  <path fill="#c8b100" stroke="#000" stroke-width=".4" d="M179.3 258.2l-2.2-.3c0-.9.2-2.2.9-2.6l2 1.5c-.3.2-.7 1-.7 1.4zm6 0l2.2-.3c0-.9-.2-2.2-.9-2.6l-2 1.5c.3.2.7 1 .7 1.4zm-2.2-2.3l1-2a5.3 5.3 0 00-2-.4l-1.7.4 1.1 2h1.6zm-4.2-5.5v-4.9c0-1.3-1-2.4-2.5-2.4s-2.4 1-2.4 2.4v4.9h4.9zm6.8 0v-4.9c0-1.3 1-2.4 2.5-2.4s2.4 1 2.4 2.4v4.9h-4.9zm-1.7-12l.4-4.4h-4.2l.2 4.4h3.6zm3.3 0l-.4-4.4h4.4l-.5 4.4h-3.5zm-10 0l.2-4.4h-4.2l.5 4.4h3.5z"/>
+  <path fill="#0039f0" d="M185.3 262.6v-4c0-.7-.5-2.7-3.1-2.7-2.4 0-2.9 2-2.9 2.7v4h6zm-6.9-12.7v-4.2c0-1-.6-2.2-2-2.2s-2 1.1-2 2.2v4.3h4zm7.8 0v-4.2c0-1 .7-2.2 2-2.2s2 1.1 2 2.2v4.3h-4z"/>
+  <path fill="#ad1519" d="M190.8 269.8c0-9.7 7-17.6 15.6-17.6s15.6 7.9 15.6 17.6-7 17.5-15.6 17.5-15.6-7.8-15.6-17.5"/>
+  <path fill="none" stroke="#000" stroke-width=".6" d="M190.8 269.8c0-9.7 7-17.6 15.6-17.6s15.6 7.9 15.6 17.6-7 17.5-15.6 17.5-15.6-7.8-15.6-17.5z"/>
+  <path fill="#005bbf" d="M195.4 269.7c0-7 5-12.8 11-12.8s11 5.7 11 12.8c0 7.2-5 13-11 13s-11-5.8-11-13"/>
+  <path fill="none" stroke="#000" stroke-width=".6" d="M195.4 269.7c0-7 5-12.8 11-12.8s11 5.7 11 12.8c0 7.2-5 13-11 13s-11-5.8-11-13z"/>
+  <path fill="#c8b100" d="M201.2 260.9s-1.3 1.4-1.3 2.7a6 6 0 00.6 2.4c-.2-.5-.8-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.1-.3.5-.5 1-.5s1 .4 1 1a.9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.7 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".3" d="M201.2 260.9s-1.3 1.4-1.3 2.7a6 6 0 00.6 2.4c-.2-.5-.8-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.1-.3.5-.5 1-.5s1 .4 1 1a.9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.7 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7z"/>
+  <path fill="#c8b100" d="M199.2 269.9h4.1v-1h-4.1v1z"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M199.2 269.9h4.1v-1h-4.1v1z"/>
+  <path fill="#c8b100" d="M211.4 260.9s-1.3 1.4-1.3 2.7c0 1.3.6 2.4.6 2.4-.2-.5-.7-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.2-.3.5-.5 1-.5a1 1 0 011 1 .9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.8.8 0 010-.3 1 1 0 011-1c.4 0 .8.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.6 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".3" d="M211.4 260.9s-1.3 1.4-1.3 2.7c0 1.3.6 2.4.6 2.4-.2-.5-.7-.8-1.4-.8-.8 0-1.4.6-1.4 1.3l.2.8.5.9c.2-.3.5-.5 1-.5a1 1 0 011 1 .9.9 0 010 .2h-1.2v1h1l-.8 1.5 1-.4.8.9.8-.9 1 .4-.7-1.5h1v-1h-1.1a.8.8 0 010-.3 1 1 0 011-1c.4 0 .8.3 1 .6l.4-1 .2-.7a1.4 1.4 0 00-1.4-1.3c-.6 0-1.2.3-1.4.9 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7z"/>
+  <path fill="#c8b100" d="M209.4 269.9h4.1v-1h-4.1v1z"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M209.4 269.9h4.1v-1h-4.1v1z"/>
+  <path fill="#c8b100" d="M206.3 269.6s-1.3 1.5-1.3 2.8.6 2.4.6 2.4c-.2-.5-.7-.9-1.4-.9-.8 0-1.4.6-1.4 1.4l.2.7.5 1c.1-.4.5-.6 1-.6a1 1 0 011 1 .9.9 0 010 .3h-1.2v1h1l-.8 1.5 1-.4.8.9.8-1 1 .5-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.2.9.6l.5-1 .2-.7a1.4 1.4 0 00-1.4-1.4c-.7 0-1.2.4-1.4 1 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7"/>
+  <path fill="none" stroke="#000" stroke-linejoin="round" stroke-width=".3" d="M206.3 269.6s-1.3 1.5-1.3 2.8.6 2.4.6 2.4c-.2-.5-.7-.9-1.4-.9-.8 0-1.4.6-1.4 1.4l.2.7.5 1c.1-.4.5-.6 1-.6a1 1 0 011 1 .9.9 0 010 .3h-1.2v1h1l-.8 1.5 1-.4.8.9.8-1 1 .5-.7-1.5h1v-1h-1.1a.9.9 0 010-.3 1 1 0 011-1c.4 0 .7.2.9.6l.5-1 .2-.7a1.4 1.4 0 00-1.4-1.4c-.7 0-1.2.4-1.4 1 0 0 .6-1.2.6-2.5s-1.4-2.7-1.4-2.7z"/>
+  <path fill="#c8b100" d="M204.3 278.6h4.1v-1h-4.1v1z"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M204.3 278.6h4.1v-1h-4.1v1z"/>
+  <path fill="#c8b100" d="M237.6 223.4h-.3a1.5 1.5 0 01-.3.4c-.2.2-.6.2-.8 0a.5.5 0 01-.1-.4.5.5 0 01-.5 0c-.3-.1-.3-.5-.1-.7v-.5h-.3l-.1.2c-.2.3-.5.3-.7.2a.6.6 0 010-.2h-.3c-.5.2-.7-1-.7-1.2l-.2.2s.2.7.1 1.2c0 .6-.3 1.2-.3 1.2a9 9 0 012.9 1.6 9 9 0 012.2 2.3l1.2-.5c.6-.2 1.3-.2 1.3-.2l.2-.2c-.3 0-1.5.1-1.5-.4v-.2a.7.7 0 01-.2 0c-.2-.2-.2-.4 0-.7l.2-.1v-.3h-.3l-.2.1c-.2.3-.6.3-.8 0a.4.4 0 01-.1-.4.6.6 0 01-.5 0c-.2-.2-.3-.5 0-.8l.2-.3v-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M237.6 223.4h-.3a1.5 1.5 0 01-.3.4c-.2.2-.6.2-.8 0a.5.5 0 01-.1-.4.5.5 0 01-.5 0c-.3-.1-.3-.5-.1-.7v-.5h-.3l-.1.2c-.2.3-.5.3-.7.2a.6.6 0 010-.2h-.3c-.5.2-.7-1-.7-1.2l-.2.2s.2.7.1 1.2c0 .6-.3 1.2-.3 1.2a9 9 0 012.9 1.6 9 9 0 012.2 2.3l1.2-.5c.6-.2 1.3-.2 1.3-.2l.2-.2c-.3 0-1.5.1-1.5-.4v-.2a.7.7 0 01-.2 0c-.2-.2-.2-.4 0-.7l.2-.1v-.3h-.3l-.2.1c-.2.3-.6.3-.8 0a.4.4 0 01-.1-.4.6.6 0 01-.5 0c-.2-.2-.3-.5 0-.8l.2-.3v-.3z"/>
+  <path d="M235.4 224h.2v.3h-.1c-.1 0-.1-.2 0-.2"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M235.4 224h.2v.3h-.1c-.1 0-.1-.2 0-.2z"/>
+  <path d="M236.3 224.8l-.3-.2v-.2h.1l.4.3.3.2v.2h-.2l-.3-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M236.3 224.8l-.3-.2v-.2h.1l.4.3.3.2v.2h-.2l-.3-.3"/>
+  <path d="M234.6 223.7l-.2-.2s-.1 0 0-.1l.3.1.3.1v.2h-.1l-.3-.1"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M234.6 223.7l-.2-.2s-.1 0 0-.1l.3.1.3.1v.2h-.1l-.3-.1"/>
+  <path d="M233.7 223h.2v.2h-.2s-.1-.1 0-.2"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M233.7 223h.2v.2h-.2s-.1-.1 0-.2z"/>
+  <path d="M237.3 225.5v-.2h-.3l.1.2h.2"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M237.3 225.5v-.2h-.3l.1.2h.2z"/>
+  <path d="M237.9 226.2l.2.2h.1c.1 0 0-.1 0-.2l-.2-.2-.2-.2h-.1v.2l.2.2"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M237.9 226.2l.2.2h.1c.1 0 0-.1 0-.2l-.2-.2-.2-.2h-.1v.2l.2.2"/>
+  <path d="M238.8 227v-.3h-.3v.2h.3"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M238.8 227v-.3h-.3v.2h.3z"/>
+  <path fill="#c8b100" d="M236.2 221.1h-.6l-.1.9v.1h.2l.7-.5-.3-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M236.2 221.1h-.6l-.1.9v.1h.2l.7-.5-.3-.5"/>
+  <path fill="#c8b100" d="M234.6 221.6v.5l.9.1h.1v-.2l-.5-.7-.5.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M234.6 221.6v.5l.9.1h.1v-.2l-.5-.7-.5.3"/>
+  <path fill="#c8b100" d="M236.4 222.6l-.4.3-.6-.7v-.1h1.1v.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M236.4 222.6l-.4.3-.6-.7v-.1h1.1v.5"/>
+  <path fill="#c8b100" d="M235.3 222a.3.3 0 01.4 0 .3.3 0 010 .3.3.3 0 01-.3 0 .3.3 0 01-.1-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M235.3 222a.3.3 0 01.4 0 .3.3 0 010 .3.3.3 0 01-.3 0 .3.3 0 01-.1-.3z"/>
+  <path fill="#c8b100" d="M233.2 221.1l-.2-.7-.4-.4s.4-.2.8.1c.4.3 0 .9 0 .9l-.2.1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M233.2 221.1l-.2-.7-.4-.4s.4-.2.8.1c.4.3 0 .9 0 .9l-.2.1z"/>
+  <path fill="#c8b100" d="M234.2 221.4l-.4.4-.6-.6v-.2h1v.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M234.2 221.4l-.4.4-.6-.6v-.2h1v.4"/>
+  <path fill="#c8b100" d="M233.1 221l.3-.1v.3c0 .2-.1.2-.2.2l-.1-.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M233.1 221l.3-.1v.3c0 .2-.1.2-.2.2l-.1-.3z"/>
+  <path fill="#c8b100" d="M238.3 222.5h-.5l-.3.7v.2h.2l.8-.4-.2-.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M238.3 222.5h-.5l-.3.7v.2h.2l.8-.4-.2-.5"/>
+  <path fill="#c8b100" d="M236.7 222.8v.5l.8.2h.1v-.2l-.4-.7-.5.2"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M236.7 222.8v.5l.8.2h.1v-.2l-.4-.7-.5.2"/>
+  <path fill="#c8b100" d="M238.4 224l-.5.2-.4-.7v-.2h.1l.9.2-.1.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M238.4 224l-.5.2-.4-.7v-.2h.1l.9.2-.1.5"/>
+  <path fill="#c8b100" d="M237.3 223.2h.4a.3.3 0 010 .4.3.3 0 01-.3 0 .3.3 0 010-.4"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M237.3 223.2h.4a.3.3 0 010 .4.3.3 0 01-.3 0 .3.3 0 010-.4z"/>
+  <path fill="#c8b100" d="M240.2 224.3l.1.5-.8.3h-.2v-.2l.4-.8.5.2"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M240.2 224.3l.1.5-.8.3h-.2v-.2l.4-.8.5.2"/>
+  <path fill="#c8b100" d="M240 225.8l-.5.1-.3-.8v-.1h.2l.8.3-.1.5"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M240 225.8l-.5.1-.3-.8v-.1h.2l.8.3-.1.5"/>
+  <path fill="#c8b100" d="M238.6 224.3l-.2.5.9.3h.1v-.1l-.3-.8-.5.1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M238.6 224.3l-.2.5.9.3h.1v-.1l-.3-.8-.5.1"/>
+  <path fill="#c8b100" d="M239.5 225.2a.3.3 0 000-.3.3.3 0 00-.4 0 .3.3 0 000 .3.3.3 0 00.4 0"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M239.5 225.2a.3.3 0 000-.3.3.3 0 00-.4 0 .3.3 0 000 .3.3.3 0 00.4 0z"/>
+  <path fill="#c8b100" d="M240.8 227h.8l.5.3s.1-.4-.3-.7c-.3-.3-.8.2-.8.2l-.2.2"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M240.8 227h.8l.5.3s.1-.4-.3-.7c-.3-.3-.8.2-.8.2l-.2.2z"/>
+  <path fill="#c8b100" d="M240.3 226.1l-.3.5.8.5v-.1h.2l-.1-1-.6.1"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M240.3 226.1l-.3.5.8.5v-.1h.2l-.1-1-.6.1"/>
+  <path fill="#c8b100" d="M241 227s.1-.1 0-.2h-.3c-.2 0-.2.1-.1.2h.3"/>
+  <path fill="none" stroke="#000" stroke-width=".3" d="M241 227s.1-.1 0-.2h-.3c-.2 0-.2.1-.1.2h.3zm38-21.9v.6h-2.4v-.6h1v-1.3h-.7v-.5h.6v-.6h.6v.6h.6v.6h-.6v1.2h1"/>
+  <path fill="none" stroke="#000" stroke-width="0" d="M134.4 217.1v-1.2m-.4 1.2v-1.2m-.2 1.2v-1.2m-.3 1.2v-1.2"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M133.2 217.1v-1.2m-.5 1.1v-1m.2 1v-1m-.7 1v-1m.2 1v-1m-.9 1v-1m.2 1v-1m.3 1v-1m-.7 1v-1m-.3.9v-.8m-.1.8v-.8m-.5.7v-.6m.2.6v-.6m-.4.5v-.5m-.2.5v-.4m-.3.3v-.3m-.3.3v-.2"/>
+  <path fill="none" stroke="#000" stroke-width=".2" d="M129.2 216.6v-.2"/>
+  <path fill="none" stroke="#000" stroke-width="0" d="M135.7 217v-1m-.5 1v-1m-.4 1.2V216m143 1.1V216m-.4 1.1V216m-.3 1.1V216m-.3 1.2V216"/>
+  <path fill="none" stroke="#000" stroke-width=".1" d="M276.6 217.1V216m-.6 1v-1m.3 1v-1m-.8 1v-1m.3 1v-1m-.9 1v-1m.2 1v-1m.2 1v-1m-.6 1v-1m-.3.9v-.8m-.2.8v-.8m-.4.7v-.6m.2.6v-.6m-.5.6v-.6m-.2.5v-.4m-.3.4v-.4m-.2.3v-.2"/>
+  <path fill="none" stroke="#000" stroke-width=".2" d="M272.6 216.6v-.2"/>
+  <path fill="none" stroke="#000" stroke-width="0" d="M279.1 217v-1m-.6 1v-1m-.4 1.1V216"/>
+</svg>
diff --git a/resources/flag/flag-fr.svg b/resources/flag/flag-fr.svg
new file mode 100644
index 0000000000000000000000000000000000000000..712c8a5db251ad3ac6fe808ebb6a6f579d1558c5
--- /dev/null
+++ b/resources/flag/flag-fr.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-fr" viewBox="0 0 640 480">
+  <g fill-rule="evenodd" stroke-width="1pt">
+    <path fill="#fff" d="M0 0h640v480H0z"/>
+    <path fill="#00267f" d="M0 0h213.3v480H0z"/>
+    <path fill="#f31830" d="M426.7 0H640v480H426.7z"/>
+  </g>
+</svg>
diff --git a/resources/flag/flag-gb.svg b/resources/flag/flag-gb.svg
new file mode 100644
index 0000000000000000000000000000000000000000..132dbedbe759f237677b0f96ef0a170c50cd9146
--- /dev/null
+++ b/resources/flag/flag-gb.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-gb" viewBox="0 0 640 480">
+  <path fill="#012169" d="M0 0h640v480H0z"/>
+  <path fill="#FFF" d="M75 0l244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0h75z"/>
+  <path fill="#C8102E" d="M424 281l216 159v40L369 281h55zm-184 20l6 35L54 480H0l240-179zM640 0v3L391 191l2-44L590 0h50zM0 0l239 176h-60L0 42V0z"/>
+  <path fill="#FFF" d="M241 0v480h160V0H241zM0 160v160h640V160H0z"/>
+  <path fill="#C8102E" d="M0 193v96h640v-96H0zM273 0v480h96V0h-96z"/>
+</svg>
diff --git a/resources/flag/flag-it.svg b/resources/flag/flag-it.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5cb92aaaf453a6f74acb32404318bb9242d0bca9
--- /dev/null
+++ b/resources/flag/flag-it.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-it" viewBox="0 0 640 480">
+  <g fill-rule="evenodd" stroke-width="1pt">
+    <path fill="#fff" d="M0 0h640v480H0z"/>
+    <path fill="#009246" d="M0 0h213.3v480H0z"/>
+    <path fill="#ce2b37" d="M426.7 0H640v480H426.7z"/>
+  </g>
+</svg>
diff --git a/resources/flag/flag-nl.svg b/resources/flag/flag-nl.svg
new file mode 100644
index 0000000000000000000000000000000000000000..20269372041a3ef27c78e1f3f7a02780b581c236
--- /dev/null
+++ b/resources/flag/flag-nl.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-nl" viewBox="0 0 640 480">
+  <path fill="#21468b" d="M0 0h640v480H0z"/>
+  <path fill="#fff" d="M0 0h640v320H0z"/>
+  <path fill="#ae1c28" d="M0 0h640v160H0z"/>
+</svg>
diff --git a/resources/flag/flag-us.svg b/resources/flag/flag-us.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5b552671e8059a7bb27b4e9c3d049026b448ec6f
--- /dev/null
+++ b/resources/flag/flag-us.svg
@@ -0,0 +1,10 @@
+<svg xmlns="http://www.w3.org/2000/svg" id="flag-icon-css-us" viewBox="0 0 640 480">
+  <g fill-rule="evenodd">
+    <g stroke-width="1pt">
+      <path fill="#bd3d44" d="M0 0h972.8v39.4H0zm0 78.8h972.8v39.4H0zm0 78.7h972.8V197H0zm0 78.8h972.8v39.4H0zm0 78.8h972.8v39.4H0zm0 78.7h972.8v39.4H0zm0 78.8h972.8V512H0z" transform="scale(.9375)"/>
+      <path fill="#fff" d="M0 39.4h972.8v39.4H0zm0 78.8h972.8v39.3H0zm0 78.7h972.8v39.4H0zm0 78.8h972.8v39.4H0zm0 78.8h972.8v39.4H0zm0 78.7h972.8v39.4H0z" transform="scale(.9375)"/>
+    </g>
+    <path fill="#192f5d" d="M0 0h389.1v275.7H0z" transform="scale(.9375)"/>
+    <path fill="#fff" d="M32.4 11.8L36 22.7h11.4l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.3-6.7H29zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 11-9.2-6.8-9.3 6.7 3.5-10.9-9.2-6.7h11.4zm64.8 0l3.6 10.9H177l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.3-6.7h11.5zm64.9 0l3.5 10.9H242l-9.3 6.7 3.6 11-9.3-6.8-9.3 6.7 3.6-10.9-9.3-6.7h11.4zm64.8 0l3.6 10.9h11.4l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.2-6.7h11.4zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.6 11-9.3-6.8-9.3 6.7 3.6-10.9-9.3-6.7h11.5zM64.9 39.4l3.5 10.9h11.5L70.6 57 74 67.9l-9-6.7-9.3 6.7L59 57l-9-6.7h11.4zm64.8 0l3.6 10.9h11.4l-9.3 6.7 3.6 10.9-9.3-6.7-9.3 6.7L124 57l-9.3-6.7h11.5zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 10.9-9.2-6.7-9.3 6.7 3.5-10.9-9.2-6.7H191zm64.8 0l3.6 10.9h11.4l-9.3 6.7 3.6 10.9-9.3-6.7-9.2 6.7 3.5-10.9-9.3-6.7H256zm64.9 0l3.5 10.9h11.5L330 57l3.5 10.9-9.2-6.7-9.3 6.7 3.5-10.9-9.2-6.7h11.4zM32.4 66.9L36 78h11.4l-9.2 6.7 3.5 10.9-9.3-6.8-9.2 6.8 3.5-11-9.3-6.7H29zm64.9 0l3.5 11h11.5l-9.3 6.7 3.5 10.9-9.2-6.8-9.3 6.8 3.5-11-9.2-6.7h11.4zm64.8 0l3.6 11H177l-9.2 6.7 3.5 10.9-9.3-6.8-9.2 6.8 3.5-11-9.3-6.7h11.5zm64.9 0l3.5 11H242l-9.3 6.7 3.6 10.9-9.3-6.8-9.3 6.8 3.6-11-9.3-6.7h11.4zm64.8 0l3.6 11h11.4l-9.2 6.7 3.5 10.9-9.3-6.8-9.2 6.8 3.5-11-9.2-6.7h11.4zm64.9 0l3.5 11h11.5l-9.3 6.7 3.6 10.9-9.3-6.8-9.3 6.8 3.6-11-9.3-6.7h11.5zM64.9 94.5l3.5 10.9h11.5l-9.3 6.7 3.5 11-9.2-6.8-9.3 6.7 3.5-10.9-9.2-6.7h11.4zm64.8 0l3.6 10.9h11.4l-9.3 6.7 3.6 11-9.3-6.8-9.3 6.7 3.6-10.9-9.3-6.7h11.5zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 11-9.2-6.8-9.3 6.7 3.5-10.9-9.2-6.7H191zm64.8 0l3.6 10.9h11.4l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.3-6.7H256zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 11-9.2-6.8-9.3 6.7 3.5-10.9-9.2-6.7h11.4zM32.4 122.1L36 133h11.4l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.3-6.7H29zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 10.9-9.2-6.7-9.3 6.7 3.5-10.9-9.2-6.7h11.4zm64.8 0l3.6 10.9H177l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.3-6.7h11.5zm64.9 0l3.5 10.9H242l-9.3 6.7 3.6 11-9.3-6.8-9.3 6.7 3.6-10.9-9.3-6.7h11.4zm64.8 0l3.6 10.9h11.4l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.2-6.7h11.4zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.6 11-9.3-6.8-9.3 6.7 3.6-10.9-9.3-6.7h11.5zM64.9 149.7l3.5 10.9h11.5l-9.3 6.7 3.5 10.9-9.2-6.8-9.3 6.8 3.5-11-9.2-6.7h11.4zm64.8 0l3.6 10.9h11.4l-9.3 6.7 3.6 10.9-9.3-6.8-9.3 6.8 3.6-11-9.3-6.7h11.5zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 10.9-9.2-6.8-9.3 6.8 3.5-11-9.2-6.7H191zm64.8 0l3.6 10.9h11.4l-9.2 6.7 3.5 10.9-9.3-6.8-9.2 6.8 3.5-11-9.3-6.7H256zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 10.9-9.2-6.8-9.3 6.8 3.5-11-9.2-6.7h11.4zM32.4 177.2l3.6 11h11.4l-9.2 6.7 3.5 10.8-9.3-6.7-9.2 6.7 3.5-10.9-9.3-6.7H29zm64.9 0l3.5 11h11.5l-9.3 6.7 3.6 10.8-9.3-6.7-9.3 6.7 3.6-10.9-9.3-6.7h11.4zm64.8 0l3.6 11H177l-9.2 6.7 3.5 10.8-9.3-6.7-9.2 6.7 3.5-10.9-9.3-6.7h11.5zm64.9 0l3.5 11H242l-9.3 6.7 3.6 10.8-9.3-6.7-9.3 6.7 3.6-10.9-9.3-6.7h11.4zm64.8 0l3.6 11h11.4l-9.2 6.7 3.5 10.8-9.3-6.7-9.2 6.7 3.5-10.9-9.2-6.7h11.4zm64.9 0l3.5 11h11.5l-9.3 6.7 3.6 10.8-9.3-6.7-9.3 6.7 3.6-10.9-9.3-6.7h11.5zM64.9 204.8l3.5 10.9h11.5l-9.3 6.7 3.5 11-9.2-6.8-9.3 6.7 3.5-10.9-9.2-6.7h11.4zm64.8 0l3.6 10.9h11.4l-9.3 6.7 3.6 11-9.3-6.8-9.3 6.7 3.6-10.9-9.3-6.7h11.5zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 11-9.2-6.8-9.3 6.7 3.5-10.9-9.2-6.7H191zm64.8 0l3.6 10.9h11.4l-9.2 6.7 3.5 11-9.3-6.8-9.2 6.7 3.5-10.9-9.3-6.7H256zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.5 11-9.2-6.8-9.3 6.7 3.5-10.9-9.2-6.7h11.4zM32.4 232.4l3.6 10.9h11.4l-9.2 6.7 3.5 10.9-9.3-6.7-9.2 6.7 3.5-11-9.3-6.7H29zm64.9 0l3.5 10.9h11.5L103 250l3.6 10.9-9.3-6.7-9.3 6.7 3.6-11-9.3-6.7h11.4zm64.8 0l3.6 10.9H177l-9 6.7 3.5 10.9-9.3-6.7-9.2 6.7 3.5-11-9.3-6.7h11.5zm64.9 0l3.5 10.9H242l-9.3 6.7 3.6 10.9-9.3-6.7-9.3 6.7 3.6-11-9.3-6.7h11.4zm64.8 0l3.6 10.9h11.4l-9.2 6.7 3.5 10.9-9.3-6.7-9.2 6.7 3.5-11-9.2-6.7h11.4zm64.9 0l3.5 10.9h11.5l-9.3 6.7 3.6 10.9-9.3-6.7-9.3 6.7 3.6-11-9.3-6.7h11.5z" transform="scale(.9375)"/>
+  </g>
+</svg>
diff --git a/resources/logo/web-ext/cesium-firefox.jpg b/resources/logo/web-ext/cesium-firefox.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..ea3b0b80b1cd90dd83eaed794a7f84313ed44fc6
Binary files /dev/null and b/resources/logo/web-ext/cesium-firefox.jpg differ
diff --git a/resources/logo/web-ext/cesium-firefox.png b/resources/logo/web-ext/cesium-firefox.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9f277ca7b00adeb7856e5ba066f59a5e897fbac
Binary files /dev/null and b/resources/logo/web-ext/cesium-firefox.png differ
diff --git a/resources/web-ext/manifest.json b/resources/web-ext/manifest.json
index c3ecefc83c4ab1bb22b577c8aaea4a9d7597a226..626b6dbbe512035fe675ded57a2443b03765cea0 100644
--- a/resources/web-ext/manifest.json
+++ b/resources/web-ext/manifest.json
@@ -1,14 +1,26 @@
 {
-  "short_name": "Cesium",
   "name": "Cesium",
-  "manifest_version": 2,
-  "version": "1.5.8",
+  "short_name": "Cesium",
+  "version": "1.6.7",
   "description": "Manage your Duniter Wallet on a libre currency, like Äž1",
   "background": {
     "scripts": ["background.js"]
   },
+  "permissions": ["storage"],
   "browser_action" : {
     "default_title": "Cesium",
-    "default_icon":  "img/logo_32px.png"
-  }
+    "default_icon": {
+      "32": "img/logo_32px.png",
+      "60": "img/logo_60px.png",
+      "96": "img/logo_96px.png",
+      "128": "img/logo_128px.png"
+    }
+  },
+  "icons": {
+    "32": "img/logo_32px.png",
+    "60": "img/logo_60px.png",
+    "96": "img/logo_96px.png",
+    "128": "img/logo_128px.png"
+  },
+  "manifest_version": 2
 }
diff --git a/scripts/check-reproducible-build.sh b/scripts/check-reproducible-build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4d3af4b9a97b78ecdd615b8a412fc17fd2af7714
--- /dev/null
+++ b/scripts/check-reproducible-build.sh
@@ -0,0 +1,117 @@
+#!/bin/bash
+
+# Get to the root project
+if [[ "_" == "_${PROJECT_DIR}" ]]; then
+  SCRIPT_DIR=$(dirname $0)
+  PROJECT_DIR=$(cd ${SCRIPT_DIR}/.. && pwd)
+  export PROJECT_DIR
+fi;
+
+# Preparing Android environment
+. ${PROJECT_DIR}/scripts/env-android.sh
+[[ $? -ne 0 ]] && exit 1
+
+cd ${PROJECT_DIR}
+
+# ----------------------------------
+# Check templates files build
+# ----------------------------------
+
+# Generate templates JS file
+echo "--------------------------------"
+echo "Building templates file... [1/2]"
+gulp template > /dev/null
+[[ $? -ne 0 ]] && exit 1
+
+TEMPLATES_FILE="${PROJECT_DIR}/www/dist/dist_js/app/templates.js"
+PLUGIN_TEMPLATES_FILE="${PROJECT_DIR}/www/dist/dist_js/plugins/templates.js"
+if [[ ! -f ${TEMPLATES_FILE} ]] || [[ ! -f ${PLUGIN_TEMPLATES_FILE} ]]; then
+  echo "ERROR - Missing file ${TEMPLATES_FILE} or ${PLUGIN_TEMPLATES_FILE}"
+  exit 1;
+fi;
+
+# Keep a copy
+rm -f "${TEMPLATES_FILE}.tmp"
+rm -f "${PLUGIN_TEMPLATES_FILE}.tmp"
+mv "${TEMPLATES_FILE}" "${TEMPLATES_FILE}.tmp"
+mv "${PLUGIN_TEMPLATES_FILE}" "${PLUGIN_TEMPLATES_FILE}.tmp"
+
+# Second generation
+echo "Building templates file... [2/2]"
+gulp template > /dev/null
+[[ $? -ne 0 ]] && exit 1
+echo "Building templates file [OK]"
+
+# Check diff
+echo "Checking diff between templates files..."
+diff "${TEMPLATES_FILE}" "${TEMPLATES_FILE}.tmp" > /tmp/templates.js.diff
+if [[ $? -ne 0 ]]; then
+  echo "ERROR: Detected some differences: build is not reproducible!"
+  echo "  Diff are visible at: /tmp/templates.js.diff"
+  exit 1;
+fi;
+diff "${PLUGIN_TEMPLATES_FILE}" "${PLUGIN_TEMPLATES_FILE}.tmp" > /tmp/plugin_templates.js.diff
+if [[ $? -ne 0 ]]; then
+  echo "ERROR: Detected some differences: build is not reproducible!"
+  echo "  Diff are visible at: /tmp/plugin_templates.js.diff"
+  exit 1;
+fi;
+echo "Checking diff between templates files... [OK]"
+
+# ----------------------------------
+# Check web extension build
+# ----------------------------------
+
+# Clean generated files (1/2)
+rm www/css/*.app*.css
+rm -rf www/dist
+rm -rf dist/web
+
+# Compile (1/2)
+echo "----------------------------"
+echo "Building web extension... [1/2]"
+gulp webExtBuild --release > /dev/null
+
+WEB_EXT_DIR="${PROJECT_DIR}/dist/web/ext"
+if [[ $? -ne 0 ]] || [[ ! -d "${WEB_EXT_DIR}" ]]; then
+  echo "ERROR - Build failed: missing folder ${WEB_EXT_DIR}"
+  exit 1;
+fi;
+
+# Keep a copy
+WEB_EXT_COPY_DIR="/tmp/cesium-extention"
+rm -rf "${WEB_EXT_COPY_DIR}"
+mv "${WEB_EXT_DIR}" "${WEB_EXT_COPY_DIR}"
+
+# Clean generated files (2/2)
+rm www/css/*.app*.css
+rm -rf www/dist
+rm -rf dist/web
+
+# Compile web extension (2/2)
+echo "Building web extension... [2/2]"
+gulp webExtBuild --release > /dev/null
+[[ $? -ne 0 ]] && exit 1
+
+echo "Building web extension... [OK]"
+
+echo "Checking diff between builds..."
+DIFF_FILE=/tmp/cesium-extention.diff
+diff -arq "${WEB_EXT_DIR}" "${WEB_EXT_COPY_DIR}" > ${DIFF_FILE}
+if [[ $? -ne 0 ]]; then
+  echo "Checking diff between builds... [FAILED] Build is NOT reproducible!"
+  echo "Please check following diff:"
+  cat ${DIFF_FILE}
+
+  # Clean temporary dir
+  rm -rf ${WEB_EXT_COPY_DIR}
+
+  exit 1;
+fi;
+
+# Final message
+echo "Checking diff between builds... [SUCCESS] Build is reproducible."
+
+# Clean temporary dir (silently)
+rm -rf ${WEB_EXT_COPY_DIR} > /dev/null
+rm /tmp/cesium-extention.diff
diff --git a/scripts/docker-build.sh b/scripts/docker-build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..15f15ac935af1e862f86a6541d569820b40fdb9b
--- /dev/null
+++ b/scripts/docker-build.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+# Get to the root project
+if [[ "_" == "_${PROJECT_DIR}" ]]; then
+  SCRIPT_DIR=$(dirname $0)
+  PROJECT_DIR=$(cd ${SCRIPT_DIR}/.. && pwd)
+  export PROJECT_DIR
+fi;
+
+cd ${PROJECT_DIR}
+
+CMD="sudo docker build ${PROJECT_DIR} -t cesium/release"
+echo "Executing: $CMD"
+$CMD
diff --git a/scripts/docker-start.sh b/scripts/docker-start.sh
index d9a1d17197768e0cbe383c2954533acea888ea56..367d4e80c50096344f8ed44a6b41abfc009932a8 100755
--- a/scripts/docker-start.sh
+++ b/scripts/docker-start.sh
@@ -9,7 +9,6 @@ fi;
 
 cd ${PROJECT_DIR}
 
-PWD=$(pwd)
-CMD="sudo docker run -ti --rm -p 8100:8100 -p 35729:35729 -v $PWD:/cesium:rw cesium:release"
+CMD="sudo docker run -ti --rm -p 8100:8100 -p 35729:35729 -v ${PROJECT_DIR}:/cesium:rw cesium:release"
 echo "Executing: $CMD"
 $CMD
diff --git a/scripts/env-android.sh b/scripts/env-android.sh
index cf7c45294070ba2762ea756ee5df93c42de2e376..32d7d52ddafc864aac662fa50df052afcfd23dcb 100755
--- a/scripts/env-android.sh
+++ b/scripts/env-android.sh
@@ -9,9 +9,7 @@ fi;
 
 # Preparing environment
 . ${PROJECT_DIR}/scripts/env-global.sh
-if [[ $? -ne 0 ]]; then
-  exit 1
-fi
+[[ $? -ne 0 ]] && exit 1
 
 if [[ "_" == "_${CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL}" ]]; then
   echo "Missing Gradle distribution URL - please export env variable 'CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'"
@@ -36,9 +34,7 @@ fi
 if [[ ! -d "${ANDROID_SDK_TOOLS_ROOT}" ]]; then
   cd "${PROJECT_DIR}/scripts"
   ./install-android-sdk-tools.sh
-  if [[ $? -ne 0 ]]; then
-    exit 1
-  fi
+  [[ $? -ne 0 ]] && exit 1
 fi
 
 # Install Gradle
@@ -49,13 +45,9 @@ if [[ "_" == "_$(which gradle)" && ! -d "${GRADLE_HOME}" ]]; then
   GRADLE_PARENT=$(dirname $GRADLE_HOME)
   test -e "${GRADLE_PARENT}" || mkdir -p ${GRADLE_PARENT}
   test -e "${GRADLE_PARENT}/gradle-${GRADLE_VERSION}" || unzip -qq gradle-${GRADLE_VERSION}-all.zip -d "${GRADLE_PARENT}"
-  if [[ $? -ne 0 ]]; then
-      exit 1
-  fi
+  [[ $? -ne 0 ]] && exit 1
   test -e "${GRADLE_HOME}" || mv "${GRADLE_PARENT}/gradle-${GRADLE_VERSION}" "${GRADLE_HOME}"
-  if [[ $? -ne 0 ]]; then
-      exit 1
-  fi
+  [[ $? -ne 0 ]] && exit 1
   test -e "${GRADLE_PARENT}/gradle-${GRADLE_VERSION}" || rm "${GRADLE_PARENT}/gradle-${GRADLE_VERSION}"
 fi
 
@@ -65,19 +57,16 @@ if [[ ! -d "${PROJECT_DIR}/platforms/android" ]]; then
   echo "Adding Cordova Android platform..."
   cd "${PROJECT_DIR}"
   ionic cordova prepare android --color --verbose
-  if [[ $? -ne 0 ]]; then
-    exit 1
-  fi
+  [[ $? -ne 0 ]] && exit 1
 fi
 
 # Copy local files
 if [[ -d "${PROJECT_DIR}/.local/android" ]]; then
   echo "Copying files from directory '${PROJECT_DIR}/.local/android' into '${PROJECT_DIR}/platforms/android'..."
   cp -rf ${PROJECT_DIR}/.local/android/* ${PROJECT_DIR}/platforms/android
-  if [[ $? -ne 0 ]]; then
-    exit 1
-  fi
+  [[ $? -ne 0 ]] && exit 1
 else
   echo "No directory '${PROJECT_DIR}/.local/android' found. Please create it, with a file 'release-signing.properties' for release signing"
 fi
 
+ echo "Environment is ready!"
diff --git a/scripts/env-global.sh b/scripts/env-global.sh
index 26ebd2b912248720091e52465111f12cd8f65bec..083de511c1e41a9a3e44e70041d7a2979420192b 100755
--- a/scripts/env-global.sh
+++ b/scripts/env-global.sh
@@ -24,8 +24,10 @@ NODEJS_VERSION=10
 
 ANDROID_NDK_VERSION=r19c
 ANDROID_SDK_VERSION=r29.0.2
-ANDROID_SDK_ROOT=/usr/lib/android-sdk
 ANDROID_SDK_TOOLS_VERSION=4333796
+ANDROID_SDK_ROOT=/usr/lib/android-sdk
+ANDROID_ALTERNATIVE_SDK_ROOT="${HOME}/Android/Sdk"
+ANDROID_SDK_TOOLS_ROOT=${ANDROID_SDK_ROOT}/build-tools
 ANDROID_OUTPUT_APK=${PROJECT_DIR}/platforms/android/build/outputs/apk
 ANDROID_OUTPUT_APK_DEBUG=${ANDROID_OUTPUT_APK}/debug
 ANDROID_OUTPUT_APK_RELEASE=${ANDROID_OUTPUT_APK}/release
@@ -33,23 +35,21 @@ ANDROID_OUTPUT_APK_RELEASE=${ANDROID_OUTPUT_APK}/release
 DIST_WEB=${PROJECT_DIR}/dist/web/build
 DIST_ANDROID=${PROJECT_DIR}/dist/android
 
-# Addons Modzilla ID
+# Addons Mozilla Web extension ID
 WEB_EXT_ID="{6f9922f7-a054-4609-94ce-d269993246a5}"
 
+# /!\ WARN can be define in your <project>/.local/env.sh file
 #JAVA_HOME=
 
 GRADLE_VERSION=4.10.3
 GRADLE_HOME=${HOME}/.gradle/${GRADLE_VERSION}
-CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=https\://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip
-
+CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip
 
 # Override with a local file, if any
 if [[ -f "${PROJECT_DIR}/.local/env.sh" ]]; then
   echo "Loading environment variables from: '.local/env.sh'"
   source ${PROJECT_DIR}/.local/env.sh
-  if [[ $? -ne 0 ]]; then
-    exit 1
-  fi
+  [[ $? -ne 0 ]] && exit 1
 else
   echo "No file '${PROJECT_DIR}/.local/env.sh' found. Will use defaults"
 fi
@@ -77,27 +77,17 @@ if [[ "_" == "_${JAVA_HOME}" ]]; then
 fi
 
 # Check Android SDK root path
-DEFAULT_ANDROID_SDK_ROOT="${HOME}/Android/Sdk"
-if [[ "_" == "_${ANDROID_SDK_ROOT}" ]]; then
-  if [[ -d "${DEFAULT_ANDROID_SDK_ROOT}" ]]; then
-    export ANDROID_SDK_ROOT="${DEFAULT_ANDROID_SDK_ROOT}"
-  else
-    echo "Please set env variable ANDROID_SDK_ROOT"
-    exit 1
-  fi
-fi
-if [[ ! -d "${ANDROID_SDK_ROOT}" ]]; then
-  if [[ ! -d "${ANDROID_SDK_ROOT}" ]]; then
-    export ANDROID_SDK_ROOT="${DEFAULT_ANDROID_SDK_ROOT}"
+if [[ "_" == "_${ANDROID_SDK_ROOT}" || ! -d "${ANDROID_SDK_ROOT}" ]]; then
+  if [[ -d "${ANDROID_ALTERNATIVE_SDK_ROOT}" ]]; then
+    export ANDROID_SDK_ROOT="${ANDROID_ALTERNATIVE_SDK_ROOT}"
   else
-    echo "Invalid path for ANDROID_SDK_ROOT: ${ANDROID_SDK_ROOT} is not a directory"
+    echo "Please set env variable ANDROID_SDK_ROOT to an existing directory"
     exit 1
   fi
 fi
 
-# Export Android SDK tools to path
-ANDROID_SDK_TOOLS_ROOT=${ANDROID_SDK_ROOT}/tools
-PATH=${ANDROID_SDK_TOOLS_ROOT}/bin:${GRADLE_HOME}/bin:$PATH
+# Add Java, Android SDK tools to path
+PATH=${ANDROID_SDK_TOOLS_ROOT}/bin:${GRADLE_HOME}/bin:${JAVA_HOME}/bin$:$PATH
 
 # Export useful variables
 export PATH \
@@ -121,9 +111,7 @@ if [[ -d "${NVM_DIR}" ]]; then
     # Or install it
     if [[ $? -ne 0 ]]; then
         nvm install ${NODEJS_VERSION}
-        if [[ $? -ne 0 ]]; then
-            exit 1;
-        fi
+        [[ $? -ne 0 ]] && exit 1
     fi
 else
     echo "nvm (Node version manager) not found (directory ${NVM_DIR} not found). Please install, and retry"
@@ -131,30 +119,26 @@ else
 fi
 
 # Install global dependencies
+YARN_PATH=`which yarn`
 IONIC_PATH=`which ionic`
 CORDOVA_PATH=`which cordova`
-if [[ "_" == "_${IONIC_PATH}" || "_" == "_${CORDOVA_PATH}" ]]; then
-  echo "Installing global dependencies..."
-  npm install -g cordova ionic native-run yarn
-  if [[ $? -ne 0 ]]; then
-      exit 1
-  fi
-fi
-
+CORDOVA_RES_PATH=`which cordova-res`
 NATIVE_RUN_PATH=`which native-run`
-if [[ "_" == "_${NATIVE_RUN_PATH}" ]]; then
+WEB_EXT_PATH=`which web-ext`
+if [[ "_" == "_${YARN_PATH}" || "_" == "_${IONIC_PATH}" || "_" == "_${CORDOVA_PATH}" || "_" == "_${CORDOVA_RES_PATH}" || "_" == "_${NATIVE_RUN_PATH}" || "_" == "_${WEB_EXT_PATH}" ]]; then
   echo "Installing global dependencies..."
-  npm install -g native-run
-  if [[ $? -ne 0 ]]; then
-      exit 1
-  fi
+  npm install -g yarn cordova cordova-res @ionic/cli web-ext native-run
+   [[ $? -ne 0 ]] && exit 1
+
+  # Make sure Ionic use yarn
+  ionic config set -g yarn true
 fi
 
 # Install project dependencies
 if [[ ! -d "${PROJECT_DIR}/node_modules" ]]; then
     echo "Installing project dependencies..."
     cd ${PROJECT_DIR}
-    yarn
+    yarn install
 fi
 
 # Install project submodules
diff --git a/scripts/ionic-update.sh b/scripts/ionic-update.sh
index 08a3df0d3f6ee7806f7e6e1e6cc7c7a1f2d343a9..ed521d91a9a1ea481eb90de7d6ca17cd05457549 100755
--- a/scripts/ionic-update.sh
+++ b/scripts/ionic-update.sh
@@ -8,7 +8,7 @@ if [[ "_" == "_${PROJECT_DIR}" ]]; then
 fi;
 
 # Preparing Android environment
-. ${PROJECT_DIR}/scripts/env-global.sh
+. ${PROJECT_DIR}/scripts/env-android.sh
 if [[ $? -ne 0 ]]; then
   exit 1
 fi
@@ -16,7 +16,7 @@ fi
 cd ${PROJECT_DIR}
 
 echo "Updating Ionic..."
-npm update -g ionic@latest
+npm update -g @ionic/cli
 
 echo "Updating Cordova..."
 npm update -g cordova@latest
@@ -24,8 +24,13 @@ if [[ $? -ne 0 ]]; then
   exit 1
 fi
 
-echo "Updating Cordova plugins..."
-ionic cordova platform update android --save
-if [[ $? -ne 0 ]]; then
-  exit 1
+if [[ ! -d "${PROJECT_DIR}/plugins" ]]; then
+  echo "Installing Cordova plugins..."
+  ionic cordova prepare
 fi
+
+#echo "Updating Cordova plugins..."
+#ionic cordova platform update android --save
+#if [[ $? -ne 0 ]]; then
+#  exit 1
+#fi
diff --git a/scripts/release-sign-extension.sh b/scripts/release-sign-extension.sh
index 9987add3aba2a481764e1235f43f3ccdad5de571..3ece68b6fe67dc13dfd76f7b580b3b8918b1fba9 100755
--- a/scripts/release-sign-extension.sh
+++ b/scripts/release-sign-extension.sh
@@ -11,6 +11,11 @@ fi;
 cd ${PROJECT_DIR}
 . ${PROJECT_DIR}/scripts/env-global.sh
 
+XPI_BASENAME=${PROJECT_NAME}-$current-an+fx.xpi
+XPI_FILE=${PROJECT_DIR}/dist/web/build/${XPI_BASENAME}
+XPI_FINAL_BASENAME=${PROJECT_NAME}-v$current-extension-firefox.xpi
+XPI_FINAL_FILE=${PROJECT_DIR}/dist/web/build/${XPI_FINAL_BASENAME}
+
 ### Control that the script is run on `dev` branch
 branch=$(git rev-parse --abbrev-ref HEAD)
 if [[ ! "$branch" = "master" ]];
@@ -38,18 +43,22 @@ fi
 ### Sign extension
 case "$1" in
   pre)
-    web-ext sign "--api-key=${AMO_JWT_ISSUER}" "--api-secret=${AMO_JWT_SECRET}" "--source-dir=${PROJECT_DIR}/dist/web/ext" "--artifacts-dir=${PROJECT_DIR}/dist/web/build"  --id=${WEB_EXT_ID} --channel=unlisted
-    if [[ $? -ne 0 ]]; then
-      exit 1
-    fi
+      web-ext sign "--api-key=${AMO_JWT_ISSUER}" "--api-secret=${AMO_JWT_SECRET}" "--source-dir=${PROJECT_DIR}/dist/web/ext" "--artifacts-dir=${PROJECT_DIR}/dist/web/build"  --id=${WEB_EXT_ID} --channel=unlisted
+      if [[ $? -ne 0 ]]; then
+        if [[ -f "${XPI_FILE}" || -f "${XPI_FINAL_FILE}" ]]; then
+          echo "WARN: web-ext failed! Continue anyway, because output file exists"
+        else
+          exit 1
+        fi;
+      fi
     ;;
   rel)
-    web-ext sign "--api-key=${AMO_JWT_ISSUER}" "--api-secret=${AMO_JWT_SECRET}" "--source-dir=${PROJECT_DIR}/dist/web/ext" "--artifacts-dir=${PROJECT_DIR}/dist/web/build"  --id=${WEB_EXT_ID} --channel=listed
-    if [[ $? -ne 0 ]]; then
+      web-ext sign "--api-key=${AMO_JWT_ISSUER}" "--api-secret=${AMO_JWT_SECRET}" "--source-dir=${PROJECT_DIR}/dist/web/ext" "--artifacts-dir=${PROJECT_DIR}/dist/web/build"  --id=${WEB_EXT_ID} --channel=listed
       # Comment out, because always failed with message:
       #   "Your add-on has been submitted for review. It passed validation but could not be automatically signed because this is a listed add-on."
-      #exit 1
-    fi
+      #if [[ $? -ne 0 ]]; then
+      #  exit 1
+      #fi
     ;;
   *)
     echo "No task given"
@@ -60,11 +69,8 @@ case "$1" in
 esac
 
 ## Rename output file
-XPI_BASENAME=${PROJECT_NAME}-$current-an+fx.xpi
-XPI_FILE=${PROJECT_DIR}/dist/web/build/${XPI_BASENAME}
 if [[ -f "${XPI_FILE}" ]]; then
-  cd ${PROJECT_DIR}/dist/web/build/
 
   # add a 'v' before version
-  mv ${XPI_BASENAME} ${PROJECT_NAME}-v$current-an+fx.xpi
+  mv ${XPI_FILE} ${XPI_FINAL_FILE}
 fi
diff --git a/scripts/release-to-github.sh b/scripts/release-to-github.sh
index 88f19c402cb26a9d2595c080e89a019bbc8d5d90..24fa6f37933f3ce759fe1bccb7a9d53fbdd1c077 100755
--- a/scripts/release-to-github.sh
+++ b/scripts/release-to-github.sh
@@ -129,8 +129,8 @@ else
 fi
 
 # Upload web extension (XPI) file
-WEB_EXT_XPI_BASENAME="${PROJECT_NAME}-v$current-an+fx.xpi"
-WEB_EXT_XPI_FILE="${DIST_WEB}/${WEB_EXT_BASENAME}"
+WEB_EXT_XPI_BASENAME="${PROJECT_NAME}-v$current-extension-firefox.xpi"
+WEB_EXT_XPI_FILE="${DIST_WEB}/${WEB_EXT_XPI_BASENAME}"
 if [[ -f "${WEB_EXT_XPI_FILE}" ]]; then
   result=$(curl -s -H ''"$GITHUT_AUTH"'' -H 'Content-Type: application/zip' -T "${WEB_EXT_XPI_FILE}" "${upload_url}?name=${WEB_EXT_XPI_BASENAME}")
   browser_download_url=$(echo "$result" | grep -P "\"browser_download_url\":[ ]?\"[^\"]+" | grep -oP "\"browser_download_url\":[ ]?\"[^\"]+"  | grep -oP "https://[A-Za-z0-9/.-]+")
diff --git a/scripts/release.sh b/scripts/release.sh
index 8ef9cbbc1c078ce900dea797e9c0c7338715bbe7..43f5d1438ebc6a2119bc4d3b6273c7d3575ebdfe 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -34,7 +34,7 @@ fi
 echo "Current Android version: $currentAndroid"
 
 # Check version format
-if [[ ! $2 =~ ^[0-9]+.[0-9]+.[0-9]+((a|b)[0-9]+)?$ || ! $3 =~ ^[0-9]+$ ]]; then
+if [[ ! $2 =~ ^[0-9]+.[0-9]+.[0-9]+(-(alpha|beta|rc)[-0-9]*)?$ || ! $3 =~ ^[0-9]+$ ]]; then
   echo "Wrong version format"
   echo "Usage:"
   echo " > ./release.sh [pre|rel] <version>  <android-version> <release_description>"
@@ -81,12 +81,16 @@ if [[ $? -ne 0 ]]; then
   exit 1
 fi
 
+
 echo "----------------------------------"
 echo "- Compiling sources..."
 echo "----------------------------------"
 cd ${PROJECT_DIR} || exit 1
 gulp config build --env default_fr || exit 1
 
+echo "Clean previous sha256 files..."
+rm -rf ${PROJECT_DIR}/dist/*.sha256
+
 echo "----------------------------------"
 echo "- Building Android artifact..."
 echo "----------------------------------"
@@ -94,9 +98,8 @@ mkdir -p ${DIST_ANDROID} || exit 1
 rm -rf ${DIST_ANDROID}/*.apk || exit 1
 rm -rf ${ANDROID_OUTPUT_APK_RELEASE}/*.apk || exit 1
 . scripts/build-android.sh --release
-if [[ $? -ne 0 ]]; then
-  exit 1
-fi
+[[ $? -ne 0 ]] && exit 1
+
 APK_RELEASE_FILE="${ANDROID_OUTPUT_APK_RELEASE}/android-release.apk"
 if [[ ! -f "${APK_RELEASE_FILE}" ]]; then
   echo "ERROR: Missing android artifact at ${APK_RELEASE_FILE}"
@@ -111,12 +114,15 @@ echo "- Building web and extension artifacts..."
 echo "----------------------------------"
 cd ${PROJECT_DIR} || exit 1
 
-# Run web build
+# Gnerate config (only once, to keep same config if web and web-extension artifacts)
 gulp config --env default
+
+# Run web build
 gulp webBuild --release
-if [[ $? -ne 0 ]]; then
-  exit 1
-fi
+[[ $? -ne 0 ]] && exit 1
+
+gulp webExtBuild --release
+[[ $? -ne 0 ]] && exit 1
 
 # check files exists
 DIST_WEB_FILE="${DIST_WEB}/${PROJECT_NAME}-v$2-web.zip"
@@ -156,7 +162,7 @@ if [[ $? -ne 0 ]]; then
 fi
 
 echo "----------------------------------"
-echo "- Uploading web extension to Modzilla ..."
+echo "- Uploading web extension to Mozilla ..."
 echo "----------------------------------"
 . ${PROJECT_DIR}/scripts/release-sign-extension.sh $1
 # FIXME: always failed: but continue
diff --git a/scripts/run-android.sh b/scripts/run-android.sh
index 7f1e37462183b9db441068cc148649497e59a768..a5d3b0a93fd6b54c0cb6a3c38920ca57805209c8 100755
--- a/scripts/run-android.sh
+++ b/scripts/run-android.sh
@@ -9,15 +9,14 @@ fi;
 
 # Preparing Android environment
 . ${PROJECT_DIR}/scripts/env-android.sh
-if [[ $? -ne 0 ]]; then
-  exit 1
-fi
+[[ $? -ne 0 ]] && exit 1
 
 cd ${PROJECT_DIR}
 
 # Run the build
 echo "Building Android application..."
 ionic cordova build android --warning-mode=none --color $*
+[[ $? -ne 0 ]] && exit 1
 
 echo "Running Android application..."
 if [[ "$1" == "--release" ]]; then
diff --git a/scss/ionic.app.scss b/scss/ionic.app.scss
index 4ab2de6263297822e822f4736f93b86987ed88d5..0a544a5fc507fa65100f8598820e0e656bccee5d 100644
--- a/scss/ionic.app.scss
+++ b/scss/ionic.app.scss
@@ -66,6 +66,9 @@ $screen-md:                       992px;
 $screen-md-max:                   1199px;
 $screen-lg:                       1200px;
 
+// Resolution for left menu show/hide
+$screen-nomenu-max:               $screen-xs-max;
+$screen-menu:                     $screen-sm;
 
 // IE10 on Windows Phone 8
 // IE10 on WP8 doesn't report CSS pixels, but actual device pixels. In
@@ -87,6 +90,9 @@ $screen-lg:                       1200px;
   @-ms-viewport {
     width: 320px;
   }
+  .no-padding-xxs {
+    padding: 0 !important;
+  }
 }
 
 // ----------------------------------
@@ -193,6 +199,9 @@ $screen-lg:                       1200px;
   .button.hidden-sm {
     display: flex;
   }
+  .button.button-icon.hidden-sm {
+    display: inline-block;
+  }
   .pull-right,
   .pull-left {
     .button.hidden-sm {
@@ -368,53 +377,188 @@ $screen-lg:                       1200px;
  Left menu
 =============== */
 
-// Resolution for left menu show/hide
-$screen-nomenu-max:               844px;
-$screen-menu:                     845px;
 
 // Screen without left menu
 @media screen and (max-width: $screen-nomenu-max) {
-  .hidden-nomenu {
-    display: none !important;
-    visibility: hidden !important;
-  }
   .visible-nomenu {
     display: inherit !important;
     visibility: visible !important;
   }
 }
-
 @media screen and (min-width: $screen-menu) {
-  .hidden-nomenu {
-    display: inherit;
-    visibility: visible;
-  }
   .visible-nomenu {
     display: none !important;
     visibility: hidden !important;
   }
 }
+.menu.menu-left {
 
-// Screen WITH left menu
-@media screen and (min-width: $screen-menu) {
-  .hidden-menu {
-    display: none !important;
-    visibility: hidden !important;
+  background-color: whitesmoke;
+  .item {
+    opacity: 0.75;
+    color: black;
   }
-  .visible-menu {
-    display: inherit !important;
-    visibility: visible !important;
+
+  .item-button-right > .button,
+  .item-button-right .item-content > .button,
+  .item-button-right > .buttons,
+  .item-button-right .item-content > .buttons {
+    top: 8px !important;
+  }
+
+  .item.active {
+    background-color: $active !important;
+
+    .item-content {
+      background-color: transparent;
+    }
+  }
+
+  .item-menu-disable {
+    color: $dark !important;
+  }
+
+  .item-spacer {
+    flex: 1 1 auto;
+  }
+
+  .item-actions {
+    min-height: 55px !important;
+  }
+
+  .item-closeable:hover {
+    cursor: pointer;
+  }
+
+
+  .item-closeable {
+    .close {
+      position: absolute;
+      right: 5px;
+      top: 5px;
+    }
+  }
+  .item-closeable:hover {
+    .close {
+      @extend .ion-close;
+    }
   }
 }
 
-@media screen and (max-width: $screen-nomenu-max) {
-  .hidden-menu {
-    display: inherit;
-    visibility: visible;
+
+// Menu on small screens
+@media screen and (max-width: $screen-sm-max) {
+  .menu.menu-left {
+
+    // Compact menu item (reduce height, etc.)
+    .item.item-divider {
+      min-height: 2px;
+      height: 2px;
+      padding-top: 0;
+      padding-bottom: 0;
+    }
+
+    .item,
+    .item.item-complex .item-content {
+      height: 40px;
+      min-height: 40px;
+      padding-top: 10px;
+      padding-bottom: 10px;
+
+      .badge {
+        top: 10px;
+        padding: 2px 6px;
+        font-size: 12px;
+      }
+    }
+
+    .item.item-complex {
+      padding-top: 0;
+    }
+
+    .item.item-button-right .button {
+      height: 30px;
+      min-height: 30px;
+      top: 4px;
+    }
+
+    .item-spacer {
+      display: none;
+      visibility: hidden;
+    }
+
+    // Hide footer on small screen
+    ion-content.has-footer {
+      bottom: 0 !important; /*ignore footer*/
+    }
+
+    .bar-header {
+      background-color: $positive-900-bg;
+      color: #fff;
+      height: 150px;
+      padding-right: 0 !important;
+
+      .platform-ios.platform-cordova & {
+        height: calc(constant(safe-area-inset-top) + 150px);
+        height: calc(env(safe-area-inset-top) + 150px);
+      }
+
+      .hero {
+        height: 150px;
+        box-shadow: none; // not need (define in bar-header)
+
+        .content {
+          bottom: 0;
+        }
+      }
+    }
+
+    .has-header {
+      top: 150px;
+
+      .platform-ios.platform-cordova & {
+        top: calc(constant(safe-area-inset-top) + 150px);
+        top: calc(env(safe-area-inset-top) + 150px);
+      }
+    }
+
   }
-  .visible-menu {
-    display: none;
-    visibility: hidden;
+
+}
+
+// Menu for NOT small screens
+@media screen and (min-width: $screen-md) {
+  .menu.menu-left {
+
+    .list {
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+      box-sizing: border-box;
+      flex-wrap: wrap;
+      justify-content: flex-end;
+    }
+
+    .item.item-divider {
+      min-height: 5px;
+      height: 5px;
+    }
+
+    .footer a {
+      font-size: 14px ! important;
+      color: grey !important;
+    }
+  }
+}
+
+@media screen and (min-width: $screen-md) {
+  .menu.menu-left {
+    background-image: url('../../resources/logo/svg/white/logo.large.empty.transparent.svg');
+    background-repeat: no-repeat;
+    background-position: -500px -100px;
+    background-size: 1024px 1024px;
+    background-color: whitesmoke;
+    height: 100%;
   }
 }
 
@@ -708,7 +852,7 @@ html, body {
 .bar.bar-header {
   padding-right: 5px !important;
 
-  .buttons-right span {
+  .buttons-right .right-buttons {
     margin-left: 0 !important;
   }
 }
@@ -769,6 +913,33 @@ html, body {
  Home page
 =============== */
 
+#home .ribbon {
+  position: fixed;
+  top: 15px;
+  right: -110px;
+  z-index: 500;
+  transform: rotate(45deg);
+  text-align: center;
+  width: 300px;
+  text-decoration: none;
+  box-shadow: 0 0 5px #000;
+  a:first-child {
+    opacity: 1 !important;
+  }
+  a {
+    opacity: 0.7;
+    width: 100%;
+  }
+
+  a:hover {
+    opacity: 1;
+    font-size: 16px;
+  }
+}
+#home h4.welcome .badge {
+  display: inline-block !important;
+  vertical-align: bottom;
+}
 #home .logo {
   margin-top: 15px;
   width: 100%;
@@ -906,6 +1077,13 @@ html, body {
   }
 }
 
+.popup-container.large {
+  .popup {
+    min-width: 250px !important;
+    width: 350px !important;
+  }
+}
+
 /******
 * 'ion-refresher'
 *******/
@@ -975,7 +1153,9 @@ html, body {
 -- */
 
 .view-wallet,
-.view-identity {
+.view-wallet-tx,
+.view-identity,
+.view-identity-tx {
   .qrcode {
     position: absolute;
     display: block;
@@ -983,57 +1163,78 @@ html, body {
     right: 0;
     width: 0;
     height: 0;
-    background: #fff;
-    z-index: 1;
+    background: white;
+    z-index: 5;
     -webkit-backface-visibility: hidden !important;
     backface-visibility: hidden !important;
-    -webkit-transition: all 0.5s ease-out !important;
-    transition: all 0.5s ease-out !important;
+    -webkit-transition: all 0.2s ease-in-out !important;
+    transition: all 0.2s ease-in-out !important;
     overflow: hidden;
-    img {
-      display: float;
+    svg, img {
+      display: unset;
       float: right;
       width: 0;
       height: 0;
-      z-index: 1;
-      transition: all 0.5s ease-out !important;
+      z-index: 5;
+      transition: all 0.2s ease-in-out !important;
     }
   }
 
   .qrcode.on {
     width: 50px;
     height: 50px;
-    padding: 3px;
+    padding: 0;
     margin: 7px;
-    img {
-      width: 44px;
-      height: 44px;
+    svg, img {
+      width: 50px;
+      height: 50px;
     }
   }
 
   .qrcode.on.active {
     margin: 0 !important;
-    padding: 10px;
+    padding: 0;
     width: 200px;
     height: 200px;
-    img {
-      width: 180px;
-      height: 180px;
+    svg, img {
+      width: 224px;
+      height: 224px;
+      margin: -12px -12px;
     }
   }
 }
 
 @media screen and (max-width: $screen-sm-max) {
   .view-wallet,
-  .view-identity  {
-    .hero.hero-qrcode-active {
-      h1, h2, h3, h4, h5, i.avatar {
-        margin-right: 200px;
+  .view-wallet-tx,
+  .view-identity,
+  .view-identity-tx {
+
+    .qrcode.on.active {
+      width: calc(min(100vh - 125px, 100vw));
+      height: 100%;
+      z-index: 10001;
+      svg, img {
+        width: calc(100%);
+        height: 100%;
+        margin: 0;
       }
     }
   }
 }
 
+@media screen and (min-width: $screen-md) {
+  .view-wallet,
+  .view-wallet-tx,
+  .view-identity,
+  .view-identity-tx {
+
+    .qrcode.on.active .footer {
+      display: none;
+      visibility: hidden;
+    }
+  }
+}
 
 .popover-wallet-actions {
   height: 400px;
@@ -1512,6 +1713,10 @@ a.underline:hover,
   }
 }
 
+.item.item-no-border {
+  border-width: 0;
+}
+
 .list .item.item-border {
   border-bottom: solid 1px #ccc !important;
   margin-bottom: 1px;
@@ -1839,164 +2044,100 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
   font-style: italic !important;
 }
 
+
 /**********
-   Screen - Left Menu
+   Screen - identity Certifications
 **********/
 
-.menu.menu-left {
-
-  background-color: whitesmoke;
-  .item {
-    opacity: 0.75;
-    color: black;
-  }
-
-  .item-button-right > .button,
-  .item-button-right .item-content > .button,
-  .item-button-right > .buttons,
-  .item-button-right .item-content > .buttons {
-    top: 8px !important;
-  }
-
-  .item.active {
-    background-color: $active !important;
-
-    .item-content {
-      background-color: transparent;
-    }
-  }
-
-  .item-menu-disable {
-    color: $dark !important;
-  }
+.certifications .item-divider .badge {
+  top: 16px !important;
 }
 
+.certifications-lg .avatar-large {
+  left: auto;
+  position: relative;
+  font-size: 55px !important;
+  height: 88px;
+  width: 88px;
+  color: #D9D9D9;
+  background-color: $stable-900-bg;
+  border: solid 1px #D9D9D9;
+}
 
-// Menu on small screens
-@media screen and (max-width: $screen-sm-max) {
-  .menu.menu-left {
-
-    // Compact menu item (reduce height, etc.)
-    .item.item-divider {
-      min-height: 2px;
-      height: 2px;
-      padding-top: 0;
-      padding-bottom: 0;
-    }
-
-    .item,
-    .item.item-complex .item-content {
-      height: 40px;
-      min-height: 40px;
-      padding-top: 10px;
-      padding-bottom: 10px;
-
-      .badge {
-        top: 10px;
-        padding: 2px 6px;
-        font-size: 12px;
-      }
-    }
-
-    .item.item-complex {
-      padding-top: 0;
-    }
-
-    .item.item-button-right .button {
-      height: 30px;
-      min-height: 30px;
-      top: 4px;
-    }
-
-
-    // Hide footer on small screen
-    ion-content.has-footer {
-      bottom: 0 !important; /*ignore footer*/
-    }
-
-    .bar-header {
-      background-color: $positive-900-bg;
-      color: #fff;
-      height: 150px;
-      padding-right: 0 !important;
-
-      .platform-ios.platform-cordova & {
-        height: calc(constant(safe-area-inset-top) + 150px);
-        height: calc(env(safe-area-inset-top) + 150px);
-      }
+/**********
+   Specific modes (demo, readonly)
+**********/
 
-      .hero {
-        height: 150px;
-        box-shadow: none; // not need (define in bar-header)
+/* -- readonly mode -- */
 
-        .content {
-          bottom: 0;
-        }
-      }
-    }
+.visible-readonly {
+  display: none;
+  visibility: hidden;
+}
 
-    .has-header {
-      top: 150px;
+body.readonly {
 
-      .platform-ios.platform-cordova & {
-        top: calc(constant(safe-area-inset-top) + 150px);
-        top: calc(env(safe-area-inset-top) + 150px);
-      }
-    }
+  .hidden-readonly {
+    display: none;
+    visibility: hidden;
+  }
+  .visible-readonly {
+    display: inherit !important;
+    visibility: visible !important;
   }
 }
 
-/**********
-   Menu
-**********/
+/* -- demo mode -- */
 
-// Menu for NOT small screens
-@media screen and (min-width: $screen-sm) {
-  .menu.menu-left {
+.visible-demo {
+  display: none;
+  visibility: hidden;
+}
 
-    .item.item-divider {
-      min-height: 5px;
-      height: 5px;
-    }
+body.demo {
 
-    .footer a {
-      font-size: 14px ! important;
-      color: grey !important;
-    }
+  .hidden-demo {
+    display: none;
+    visibility: hidden;
   }
-}
-
-@media screen and (min-width: $screen-md) {
-  .menu.menu-left {
-    background-image: url('../../resources/logo/svg/white/logo.large.empty.transparent.svg');
-    background-repeat: no-repeat;
-    background-position: -500px -100px;
-    background-size: 1024px 1024px;
-    background-color: whitesmoke;
-    height: 100%;
+  .visible-demo {
+    display: inherit !important;
+    visibility: visible !important;
   }
 }
 
-/**********
-   Screen - identity Certifications
-**********/
-
-.certifications .item-divider .badge {
-  top: 16px !important;
+.badge-app-mode {
+  font-weight: bold;
+  color: whitesmoke !important;
+  top: 10px;
+  padding: 0 4px;
+  text-transform: uppercase;
+  user-select: none;
 }
-
-.certifications-lg .avatar-large {
-  left: auto;
-  position: relative;
-  font-size: 55px !important;
-  height: 88px;
-  width: 88px;
-  color: #D9D9D9;
-  background-color: $stable-900-bg;
-  border: solid 1px #D9D9D9;
+#menu .badge-app-mode.left {
+  position: absolute;
+  font-size: 12px;
+  left: 1px;
+  transform-origin: 26px 5px;
+  transform: rotate(-10deg);
+}
+#menu .badge-app-mode.right {
+  position: absolute;
+  font-size: 14px;
+  right: 1px;
+  transform-origin: 26px 5px;
+  transform: rotate(10deg);
+}
+#menu .badge-app-mode.left:hover {
+  padding: 1px 4px;
+  font-size: 13px;
+  transform: rotate(-15deg);
+}
+#menu .badge-app-mode.right:hover {
+  padding: 2px 5px;
+  font-size: 16px;
+  transform: rotate(15deg);
 }
-
-
 /**********
    Help
 **********/
@@ -2028,10 +2169,18 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
   top: 8px;
   z-index: 99;
 }
+#menu .footer .icon-help:hover {
+  @extend .ion-ios-help;
+  color: $positive !important;
+  font-size: 31px !important;
+  top: 6px;
+  left: 11px;
+  transform: rotate(10deg);
+}
 
-/**********
-   Help Tip
-**********/
+  /**********
+     Help Tip
+  **********/
 
 .popover-helptip {
   background-color: rgba(68, 68, 68, 0.85) !important;
@@ -2051,6 +2200,10 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
   }
 }
 
+.popover-helptip.popover-bottom {
+  margin-top: 12px !important;
+}
+
 // Empeche les clignotement du backdrop, pendant le feature tour
 .nobackdrop .popover-backdrop.active {
   background-color: transparent !important;
@@ -2188,7 +2341,7 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
     height: 35px;
     width: 35px;
     position: relative;
-    left: 0;
+    left: 4px;
     top: 4px;
     border: solid 1px #D9D9D9;
   }
@@ -2204,6 +2357,33 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
     left: 0;
     top: 6px;
   }
+
+}
+
+.bar-header .button-clear.button-peer {
+  display: block;
+  height: 44px;
+  padding-top: 6px;
+  padding-bottom: 6px;
+  margin: 0;
+
+  * {
+    height: 32px;
+    line-height: 32px;
+  }
+}
+
+// Locale flags
+.bar-header .button.flag  {
+  height: 44px;
+  padding-top: 6px;
+  padding-bottom: 6px;
+  .flag-image {
+    position: relative;
+    bottom: 0;
+    width: 32px !important;
+    height: 32px !important;
+  }
 }
 
 .list {
@@ -2321,7 +2501,7 @@ $ionicon-var-badge-editable: $ionicon-var-edit + "\00a0";
    Drop zone component
 **********/
 
-div[dropzone] {
+div[drop-zone] {
   border: 2px dashed #bbb;
   border-radius: 5px;
   padding: 15px;
@@ -2337,7 +2517,7 @@ div[dropzone] {
   }
 }
 
-div[dropzone]:hover {
+div[drop-zone]:hover {
   background-color: $stable-100-bg;
 }
 
@@ -2491,6 +2671,11 @@ div[dropzone]:hover {
 
   .item {
     height: 48px;
+    padding-left: 60px;
+
+    .avatar {
+      border-radius: 0;
+    }
   }
 }
 
diff --git a/www/api/index.html b/www/api/index.html
index d3c3c2d29ee94e797e56feab123060eba72a76b2..cd769578d4b3d270b35d530e1d8d0c21a2c39cdd 100644
--- a/www/api/index.html
+++ b/www/api/index.html
@@ -15,7 +15,6 @@
   <!-- build:css dist_css/cesium-api.css -->
   <link rel="stylesheet" type="text/css" href="../css/ionic.app.min.css">
   <link rel="stylesheet" type="text/css" href="../css/style.css">
-  <link rel="stylesheet" type="text/css" href="../lib/angular-image-crop/image-crop-styles.css">
   <!--removeIf(device)-->
   <link rel="stylesheet" type="text/css" href="../css/style-no-device.css">
   <!--endRemoveIf(device)-->
@@ -24,43 +23,45 @@
 </head>
 </head>
 <body ng-app="cesium-api" id="cesium-api" ng-strict-di="true">
-<ion-nav-view>
-  <h3 style="text-align: center; padding-top: 25px; "><b>Cesium API</b></h3>
-  <h4 style="text-align: center;">Loading...</h4>
-</ion-nav-view>
-
-<!-- build:js dist_js/vendor-api.js -->
-<!-- vendor js -->
-<script src="../lib/moment/min/moment-with-locales.min.js"></script>
-<script src="../lib/numeral/numeral.js"></script>
-<script src="../lib/numeral/languages/fr.js"></script>
-<script src="../lib/numeral/languages/en-gb.js"></script>
-<script src="../lib/numeral/languages/nl-nl.js"></script>
-<script src="../lib/numeral/languages/es.js"></script>
-<script src="../lib/numeral/languages/it.js"></script>
-<script src="../js/vendor/numeral.eo.js"></script>
-<script src="../lib/socket.io-client/dist/socket.io.min.js"></script>
-<script src="../lib/underscore/underscore-min.js"></script>
-
-
-<!-- ionic/angularjs js -->
-<script src="../lib/ionic/js/ionic.min.js"></script>
-<script src="../lib/angular/angular.min.js"></script>
-<script src="../lib/angular-animate/angular-animate.min.js"></script>
-<script src="../lib/angular-sanitize/angular-sanitize.min.js"></script>
-<script src="../lib/angular-ui-router/release/angular-ui-router.min.js"></script>
-<script src="../lib/ionic/js/ionic-angular.min.js"></script>
-<script src="../lib/ionic-material/dist/ionic.material.min.js"></script>
-<script src="../lib/angular-resource/angular-resource.min.js"></script>
-<script src="../lib/angular-translate/angular-translate.min.js"></script>
-<script src="../lib/angular-messages/angular-messages.min.js"></script>
-<script src="../lib/angular-api/angular-api.js"></script>
-<script src="../lib/angular-cache/dist/angular-cache.min.js"></script>
-<script src="../lib/angular-screenmatch/dist/angular-screenmatch.min.js"></script>
-<script src="../lib/angular-bind-notifier/dist/angular-bind-notifier.min.js"></script>
-<script src="../lib/angular-file-saver/dist/angular-file-saver.bundle.min.js"></script>
-<script src="../lib/ng-idle/angular-idle.min.js"></script>
-<script src="../lib/angular-fullscreen/src/angular-fullscreen.js"></script>
+  <ion-nav-view>
+    <h3 style="text-align: center; padding-top: 25px; "><b>Cesium API</b></h3>
+    <h4 style="text-align: center;">Loading...</h4>
+  </ion-nav-view>
+
+  <!-- build:js dist_js/vendor-api.js -->
+  <!-- vendor js -->
+  <script src="../lib/moment/min/moment-with-locales.min.js"></script>
+  <script src="../lib/numeral/numeral.js"></script>
+  <script src="../lib/numeral/languages/fr.js"></script>
+  <script src="../lib/numeral/languages/en-gb.js"></script>
+  <script src="../lib/numeral/languages/nl-nl.js"></script>
+  <script src="../lib/numeral/languages/es.js"></script>
+  <script src="../lib/numeral/languages/it.js"></script>
+  <script src="../js/vendor/numeral.eo.js"></script>
+  <script src="../lib/qrcode-generator/js/qrcode.js"></script> <!-- FIXME remove this lib (see #903) -->
+
+  <script src="../lib/socket.io-client/dist/socket.io.min.js"></script>
+  <script src="../lib/underscore/underscore-min.js"></script>
+
+
+  <!-- ionic/angularjs js -->
+  <script src="../lib/ionic/js/ionic.min.js"></script>
+  <script src="../lib/angular/angular.min.js"></script>
+  <script src="../lib/angular-animate/angular-animate.min.js"></script>
+  <script src="../lib/angular-sanitize/angular-sanitize.min.js"></script>
+  <script src="../lib/angular-ui-router/release/angular-ui-router.min.js"></script>
+  <script src="../lib/ionic/js/ionic-angular.min.js"></script>
+  <script src="../lib/ionic-material/dist/ionic.material.min.js"></script>
+  <script src="../lib/angular-resource/angular-resource.min.js"></script>
+  <script src="../lib/angular-translate/angular-translate.min.js"></script>
+  <script src="../lib/angular-messages/angular-messages.min.js"></script>
+  <script src="../lib/angular-expose-api/dist/angular-expose-api.min.js"></script>
+  <script src="../lib/angular-cache/dist/angular-cache.min.js"></script>
+  <script src="../lib/angular-screenmatch/dist/angular-screenmatch.min.js"></script>
+  <script src="../lib/angular-bind-notifier/dist/angular-bind-notifier.min.js"></script>
+  <script src="../lib/angular-file-saver/dist/angular-file-saver.bundle.min.js"></script>
+  <script src="../lib/ng-idle/angular-idle.min.js"></script>
+  <script src="../lib/angular-fullscreen-toggle/dist/angular-fullscreen-toggle.min.js"></script>
 
   <script src="../js/vendor/base58.js" async></script>
   <!--removeIf(android)-->
diff --git a/www/css/style.css b/www/css/style.css
index 7f6bd56b27160896c2cd308486e67b15260b29c6..6ec81672f35e1d73d8bfd67fca887f8ded98a225 100644
--- a/www/css/style.css
+++ b/www/css/style.css
@@ -38,7 +38,9 @@
   min-width: 44px !important;
   max-width: 90px !important;
 }
-.bar .button.button-clear:first-child {
+
+.bar.bar-header .left-buttons > .button.button-clear:first-child,
+.bar.bar-header > .button.button-clear:first-child {
   margin-left: 5px;
 }
 
@@ -78,7 +80,6 @@
     text-align: center;
 }
 
-
 .col-pubkey {
   min-width: 130px !important;
 }
diff --git a/www/i18n/locale-en-GB.json b/www/i18n/locale-en-GB.json
index 7b4f7c5617820fcecae5532ce909b8a0d7c97ecc..f156db794b5ed4e9510d98c95081faf17fed7ced 100644
--- a/www/i18n/locale-en-GB.json
+++ b/www/i18n/locale-en-GB.json
@@ -98,8 +98,6 @@
     "CURRENCY": "Currency",
     "ACCOUNT": "My Account",
     "WALLETS": "My wallets",
-    "TRANSFER": "Transfer",
-    "SCAN": "Scan",
     "SETTINGS": "Settings",
     "NETWORK": "Network",
     "TRANSACTIONS": "My transactions"
@@ -119,11 +117,17 @@
   },
   "HOME": {
     "TITLE": "Cesium",
-    "WELCOME": "Welcome to the Cesium Application!",
+    "WELCOME": "Welcome to the Cesium application!",
+    "WELCOME_READONLY": "Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !",
     "MESSAGE": "Receive and send libre currency {{currency|abbreviate}}",
-    "BTN_CURRENCY": "Explore currency",
+    "MESSAGE_READONLY": "Real-time monitoring of libre currency {{currency|abbreviate}}",
+    "BTN_CURRENCY": "Explore currency {{currency|abbreviate}}",
     "BTN_ABOUT": "about",
     "BTN_HELP": "Help",
+    "BTN_NETWORK": "Network status",
+    "FREE_SOFTWARE": "Free software",
+    "FORK_ME": "Fork me!",
+    "SHOW_LICENSE": "Show license",
     "REPORT_ISSUE": "Report an issue",
     "NOT_YOUR_ACCOUNT_QUESTION" : "You do not own the account <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?",
     "BTN_CHANGE_ACCOUNT": "Disconnect this account",
@@ -148,6 +152,7 @@
     "USE_WALLETS_ENCRYPTION": "Secure the list",
     "USE_WALLETS_ENCRYPTION_HELP": "Enables you to encrypt the list of your wallets. Authentication required to access it.",
     "ENABLE_HELPTIP": "Enable contextual help tips",
+    "DISABLE_HELPTIP": "Disable contextual help tips",
     "ENABLE_UI_EFFECTS": "Enable visual effects",
     "HISTORY_SETTINGS": "Account operations",
     "DISPLAY_UD_HISTORY": "Display produced dividends?",
@@ -619,7 +624,8 @@
       "QUESTION_19": "What was your grand-father's job ?",
       "RECOVER_ID": "Recover my password...",
       "RECOVER_ID_HELP": "If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.",
-      "REVOCATION_WITH_FILE" : "Rekoke my member account...",
+      "RECOVER_ID_SELECT_FILE": "Select the <b>backup file of your identifiers</b> to use:",
+      "REVOCATION_WITH_FILE" : "Revoke my member account...",
       "REVOCATION_WITH_FILE_DESCRIPTION": "If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.",
       "REVOCATION_WITH_FILE_HELP": "To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.",
       "REVOCATION_WALLET": "Revoke this account immediately",
@@ -771,6 +777,7 @@
     "CHECK_NETWORK_CONNECTION": "No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.",
     "ISSUE_524_TX_FAILED": "Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.",
     "ADD_SECONDARY_WALLET_FAILED": "Unable to add secondary wallet.",
+    "REMOVE_SECONDARY_WALLET_FAILED": "Unable to remove secondary wallet.",
     "UPDATE_WALLET_LIST_FAILED": "Unable to refresh the list of wallets.",
     "LOAD_WALLET_LIST_FAILED": "Unable to load the list of wallets.",
     "SAVE_WALLET_LIST_FAILED": "Unable to save the list of wallets.",
@@ -824,6 +831,21 @@
     "USE_FALLBACK_NODE": "Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?",
     "ISSUE_524_SEND_LOG": "The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>"
   },
+  "MODE": {
+    "DEMO": {
+      "BADGE": "Demo",
+      "MODE": "Demonstration mode",
+      "FEATURE_NOT_AVAILABLE": "Functionality <b>not available</b> on this demonstration site.",
+      "MODE_HELP": "Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.",
+      "INSTALL_HELP": "For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."
+    },
+    "READONLY": {
+      "BADGE": "Monit",
+      "MODE": "Monitoring mode",
+      "MODE_HELP": "Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.",
+      "INSTALL_HELP": "If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."
+    }
+  },
   "DOWNLOAD": {
     "POPUP_TITLE": "<b>Revocation file</b>",
     "POPUP_REVOKE_MESSAGE": "To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>"
@@ -886,8 +908,8 @@
       "WALLET_RECEIVED_CERTS": "This shows the list of persons that certified you.",
       "WALLET_CERTIFY": "The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.",
       "WALLET_CERT_STOCK": "Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.",
-      "MENU_BTN_TX_MEMBER": "<b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.",
-      "MENU_BTN_TX": "View the history of <b>your transactions</b> here and send new payments.",
+      "MENU_BTN_WALLETS": "The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.",
+      "MENU_BTN_TX": "The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.",
       "MENU_BTN_WOT": "The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).",
       "WOT_SEARCH_TEXT_XS": "To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.",
       "WOT_SEARCH_TEXT": "To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.",
@@ -901,7 +923,8 @@
       "HEADER_BAR_BTN_PROFILE": "Click here to access your <b>user profile</b>",
       "SETTINGS_CHANGE_UNIT": "You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).",
       "END_LOGIN": "This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!",
-      "END_NOT_LOGIN": "This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> below."
+      "END_NOT_LOGIN": "This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> below.",
+      "END_READONLY": "This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."
     }
   },
   "API" :{
@@ -955,7 +978,7 @@
       "DEMO_RESULT": "Result returned by call:",
       "DEMO_RESULT_PEER": "Peer address used:",
       "DEMO_SUCCEED": "<i class=\"icon ion-checkmark\"></i> Success!",
-      "DEMO_CANCELLED": "<i class=\"icon ion-close\"></i> Canceled by user",
+      "DEMO_CANCELLED": "<i class=\"icon ion-close\"></i> Cancelled by user",
       "INTEGRATE_DIVIDER": "Website integration",
       "INTEGRATE_CODE": "Code:",
       "INTEGRATE_RESULT": "Result preview:",
diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json
index 101eb86894b569ec8ca9d82ceca588cfd3faeb66..2b8e0e7782cfc08b1e1275d9b4dd123615474bbf 100644
--- a/www/i18n/locale-en.json
+++ b/www/i18n/locale-en.json
@@ -98,8 +98,6 @@
     "CURRENCY": "Currency",
     "ACCOUNT": "My Account",
     "WALLETS": "My wallets",
-    "TRANSFER": "Transfer",
-    "SCAN": "Scan",
     "SETTINGS": "Settings",
     "NETWORK": "Network",
     "TRANSACTIONS": "My transactions"
@@ -119,11 +117,17 @@
   },
   "HOME": {
     "TITLE": "Cesium",
-    "WELCOME": "Welcome to the Cesium Application!",
+    "WELCOME": "Welcome to the Cesium application!",
+    "WELCOME_READONLY": "Welcome to Cesium <span class='badge badge-balanced'>Monit</span> !",
     "MESSAGE": "Receive and send libre currency {{currency|abbreviate}}",
-    "BTN_CURRENCY": "Explore currency",
+    "MESSAGE_READONLY": "Real-time monitoring of libre currency {{currency|abbreviate}}",
+    "BTN_CURRENCY": "Explore currency {{currency|abbreviate}}",
     "BTN_ABOUT": "about",
     "BTN_HELP": "Help",
+    "BTN_NETWORK": "Network status",
+    "FREE_SOFTWARE": "Free software",
+    "FORK_ME": "Fork me!",
+    "SHOW_LICENSE": "Show license",
     "REPORT_ISSUE": "Report an issue",
     "NOT_YOUR_ACCOUNT_QUESTION" : "You do not own the account <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?",
     "BTN_CHANGE_ACCOUNT": "Disconnect this account",
@@ -148,6 +152,7 @@
     "USE_WALLETS_ENCRYPTION": "Secure the list",
     "USE_WALLETS_ENCRYPTION_HELP": "Enables you to encrypt the list of your wallets. Authentication required to access it.",
     "ENABLE_HELPTIP": "Enable contextual help tips",
+    "DISABLE_HELPTIP": "Disable contextual help tips",
     "ENABLE_UI_EFFECTS": "Enable visual effects",
     "HISTORY_SETTINGS": "Account operations",
     "DISPLAY_UD_HISTORY": "Display produced dividends?",
@@ -619,7 +624,8 @@
       "QUESTION_19": "What was your grand-father's job ?",
       "RECOVER_ID": "Recover my password...",
       "RECOVER_ID_HELP": "If you have a <b>backup file of your identifiers</b>, you can find them by answering your personal questions correctly.",
-      "REVOCATION_WITH_FILE" : "Rekoke my member account...",
+      "RECOVER_ID_SELECT_FILE": "Select the <b>backup file of your identifiers</b> to use:",
+      "REVOCATION_WITH_FILE" : "Revoke my member account...",
       "REVOCATION_WITH_FILE_DESCRIPTION": "If you have <b>permanently lost your member account credentials (or if account security is compromised), you can use <b>the revocation file</b> of the account <b>to quit the Web Of Trust</b>.",
       "REVOCATION_WITH_FILE_HELP": "To <b>permanently revoke</ b> a member account, please drag the revocation file in the box below, or click in the box to search for a file.",
       "REVOCATION_WALLET": "Revoke this account immediately",
@@ -771,6 +777,7 @@
     "CHECK_NETWORK_CONNECTION": "No peer appears to be accessible.<br/><br/>Please <b>check your Internet connection</b>.",
     "ISSUE_524_TX_FAILED": "Failed to transfer.<br/><br/>A message has been sent to developers to help solve the problem.<b>Thank you for your help</b>.",
     "ADD_SECONDARY_WALLET_FAILED": "Unable to add secondary wallet.",
+    "REMOVE_SECONDARY_WALLET_FAILED": "Unable to remove secondary wallet.",
     "UPDATE_WALLET_LIST_FAILED": "Unable to refresh the list of wallets.",
     "LOAD_WALLET_LIST_FAILED": "Unable to load the list of wallets.",
     "SAVE_WALLET_LIST_FAILED": "Unable to save the list of wallets.",
@@ -824,6 +831,21 @@
     "USE_FALLBACK_NODE": "Peer <b>{{old}}</b> unreachable or invalid address.<br/><br/>Do you want to temporarily use the <b>{{new}}</b> node?",
     "ISSUE_524_SEND_LOG": "The transaction was rejected because of a known problem (issue #524) but not reproduced.<br/><br/>To help developers correct this error, do you accept <b>the transmission of your logs</b> per message?<br/><small>(No confidential data is sent)</small>"
   },
+  "MODE": {
+    "DEMO": {
+      "BADGE": "Demo",
+      "MODE": "Demonstration mode",
+      "FEATURE_NOT_AVAILABLE": "Functionality <b>not available</b> on this demonstration site.",
+      "MODE_HELP": "Cesium works in <b>demonstration mode</b>: consultation on account is available, but no operation can be performed.",
+      "INSTALL_HELP": "For <b>security reasons</b> we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."
+    },
+    "READONLY": {
+      "BADGE": "Monit",
+      "MODE": "Monitoring mode",
+      "MODE_HELP": "Cesium works in <b>monitoring mode</b>: only currency monitoring features are available.",
+      "INSTALL_HELP": "If you want to <b>create a wallet account</b> to send or received money, we recommend <b>installing</b> your copy of the software.<br/> Visit the site <a href='https://cesium.app'>www.cesium.app</a> for help."
+    }
+  },
   "DOWNLOAD": {
     "POPUP_TITLE": "<b>Revocation file</b>",
     "POPUP_REVOKE_MESSAGE": "To safeguard your account, please download the <b>account revocation document</b>. It will allow you to cancel your account (in case of account theft, ID, an incorrectly created account, etc.).<br/><br/><b>Please store it in a safe place.</b>"
@@ -886,8 +908,8 @@
       "WALLET_RECEIVED_CERTS": "This shows the list of persons that certified you.",
       "WALLET_CERTIFY": "The button <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> allows selecting an identity and certifying it.<br/><br/>Only users that are <b>already member</b> may certify others.",
       "WALLET_CERT_STOCK": "Your supply of certifications (to send) is limited to <b>{{sigStock}} certifications</b>.<br/><br/>This supply will replete itself over time, as and when earlier certifications expire.",
-      "MENU_BTN_TX_MEMBER": "<b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.",
-      "MENU_BTN_TX": "View the history of <b>your transactions</b> here and send new payments.",
+      "MENU_BTN_WALLETS": "The menu <b>{{'MENU.WALLETS'|translate}}</b> allows you to add additional wallets that you manage.",
+      "MENU_BTN_TX": "The menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> allow access to transactions history, and send new payments.",
       "MENU_BTN_WOT": "The menu <b>{{'MENU.WOT'|translate}}</b> allows searching <b>users</b> of the currency (member or not).",
       "WOT_SEARCH_TEXT_XS": "To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>The search will start automatically.",
       "WOT_SEARCH_TEXT": "To search in the registry, type the <b>first letters of a users pseudonym or public key</b>.<br/><br/>Then hit <b>Enter</b> to start the search.",
@@ -901,7 +923,8 @@
       "HEADER_BAR_BTN_PROFILE": "Click here to access your <b>user profile</b>",
       "SETTINGS_CHANGE_UNIT": "You can <b>change the display unit</b> of amounts by clicking here.<br/><br/>- Deactivate the option to show amounts in {{currency|capitalize}}.<br/>- Activate the option for relative amounts in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divided</b> by the current Universal Dividend).",
       "END_LOGIN": "This guided visit has <b>ended</b>.<br/><br/>Welcome to the <b>free economy</b>!",
-      "END_NOT_LOGIN": "This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> below."
+      "END_NOT_LOGIN": "This guided visit has <b>ended</b>.<br/><br/>If you wish to join the currency {{currency|capitalize}}, simply click <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> below.",
+      "END_READONLY": "This guided visit has <b>ended</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."
     }
   },
   "API" :{
diff --git a/www/i18n/locale-eo-EO.json b/www/i18n/locale-eo-EO.json
index fa8ac1339265bcfedeeaa112206072af0ae624a4..5e7115b72f14b1ee6254e2a77d058a3b41183cff 100644
--- a/www/i18n/locale-eo-EO.json
+++ b/www/i18n/locale-eo-EO.json
@@ -98,8 +98,6 @@
     "CURRENCY": "Mono",
     "ACCOUNT": "Mia konto",
     "WALLETS": "Miaj monujoj",
-    "TRANSFER": "Elspezo",
-    "SCAN": "Skani",
     "SETTINGS": "Parametroj",
     "NETWORK": "Reto",
     "TRANSACTIONS": "Miaj spezoj"
@@ -120,12 +118,18 @@
   "HOME": {
     "TITLE": "Cesium",
     "WELCOME": "Bonvenon ĉe la programo Cesium!",
+    "WELCOME_READONLY": "Bonvenon ĉe Cesium <span class='badge badge-balanced'>Observo</span>!",
     "MESSAGE": "Ricevu kaj sendu liberan monon {{currency|abbreviate}}",
-    "BTN_CURRENCY": "Esploru la monon {{name|abbreviate}}",
+    "MESSAGE_READONLY": "Sekvu la staton de la libera mono {{currency|abbreviate}} en tuja tempo.",
+    "BTN_CURRENCY": "Esploru la monon {{currency|abbreviate}}",
     "BTN_ABOUT": "prie",
     "BTN_HELP": "Reta helpo",
+    "BTN_NETWORK": "Stato de la reto",
+    "FREE_SOFTWARE": "Libera programo",
+    "FORK_ME": "Duobligu min!",
+    "SHOW_LICENSE": "Vidi la licencon de la programo",
     "REPORT_ISSUE": "fuŝaĵo",
-    "NOT_YOUR_ACCOUNT_QUESTION" : "Vi ne posedas la konton <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b> ?",
+    "NOT_YOUR_ACCOUNT_QUESTION" : "Vi ne posedas la konton <b class=\"ion-key\"> {{pubkey|formatPubkey}}</b>&nbsp;?",
     "BTN_CHANGE_ACCOUNT": "Malkonektu tiun ĉi konton",
     "CONNECTION_ERROR": "Nodo <b>{{server}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Kontrolu vian retkonekton, aŭ elektu alian nodon <a class=\"positive\" ng-click=\"doQuickFix('settings')\">ĉe la parametroj</a>.",
     "SHOW_ALL_FEED": "Vidi ĉion",
@@ -148,6 +152,7 @@
     "USE_WALLETS_ENCRYPTION": "Sekurigi la liston?",
     "USE_WALLETS_ENCRYPTION_HELP": "Ebligas sekurigi la liston de viaj monujoj (per ĉifrado), postulante aŭtentigado por aliri ilin.",
     "ENABLE_HELPTIP": "Aktivigi la rilatigajn help-vezikojn",
+    "DISABLE_HELPTIP": "Malaktivigi la rilatigajn help-vezikojn",
     "ENABLE_UI_EFFECTS": "Aktivigi la vid-efikojn",
     "HISTORY_SETTINGS": "Miaj spezoj",
     "DISPLAY_UD_HISTORY": "Afiŝi la produktitajn dividendojn?",
@@ -163,12 +168,12 @@
       "MINUTE": "Post {{value}}min de neatktiveco",
       "MINUTES": "Post {{value}}min de neatktiveco",
       "HOUR": "Post {{value}}h de neatktiveco",
-      "ALWAYS": "Fine de la sesio"
+      "ALWAYS": "Fine de la seanco"
     },
     "KEYRING_FILE": "Dosiero pri ŝlosilaro",
-    "KEYRING_FILE_HELP": "Ebligas <b>konektiĝi</b> aŭtomate por ĉiu ekuzo<br/>kaj eĉ <b>aŭtentiĝi</b> (nur se \"Finiĝo de la aŭtentiĝo\" estas agordita kiel \"fine de la sesio\").",
+    "KEYRING_FILE_HELP": "Ebligas <b>konektiĝi</b> aŭtomate por ĉiu ekuzo<br/>kaj eĉ <b>aŭtentiĝi</b> (nur se \"Finiĝo de la aŭtentiĝo\" estas agordita kiel \"fine de la seanco\").",
     "REMEMBER_ME": "Memori min?",
-    "REMEMBER_ME_HELP": "Ebligas resti identigita de sesio al alia, loke konservante la publikan ŝlosilon.",
+    "REMEMBER_ME_HELP": "Ebligas resti identigita de seanco al alia, loke konservante la publikan ŝlosilon.",
     "PLUGINS_SETTINGS": "Krom-programoj",
     "BTN_RESET": "Restarigi la originajn valorojn",
     "EXPERT_MODE": "Aktivigi la spertan moduson",
@@ -251,7 +256,7 @@
       "MEMBERS_VARIATION": "Variado depost la lasta UD",
       "MONEY_DIVIDER": "Mono",
       "MASS": "Mona maso",
-      "SHARE": "Maso por membro",
+      "SHARE": "Monkvanto por ĉiu membro",
       "UD": "Universala Dividendo",
       "C_ACTUAL": "Nuna kreskado",
       "MEDIAN_TIME": "Horo de la blokĉeno",
@@ -268,7 +273,7 @@
       "SIG_PERIOD": "Minimuma daŭro de atendado inter 2 sinsekvaj atestaĵoj senditaj de sama persono",
       "SIG_WINDOW": "Limdaŭro por akcepti atestaĵon",
       "SIG_VALIDITY": "Vivdaŭro de atestaĵo, kiu estis akceptita",
-      "MS_WINDOW": "Limdaŭro por akcepti aliĝ-peton kiel membron",
+      "MS_WINDOW": "Limdaŭro por la akcepto de aliĝ-peto",
       "MS_VALIDITY": "Vivdaŭro de aliĝo, kiu estis akceptita",
       "STEP_MAX": "Maksimuma distanco, per la atestaĵoj, inter nova eniranto kaj la referencaj membroj",
       "WOT_RULES_DIVIDER": "Reguloj de la reto de fido",
@@ -433,7 +438,7 @@
     "BTN_METHODS": "Aliaj metodoj",
     "BTN_METHODS_DOTS": "Ŝanĝi metodon...",
     "METHOD_POPOVER_TITLE": "Metodoj",
-    "MEMORIZE_AUTH_FILE": "Memorigi tiun ŝlosilaron por la daŭro de la sesio de retumado",
+    "MEMORIZE_AUTH_FILE": "Memorigi tiun ŝlosilaron por la daŭro de la retum-seanco",
     "SCRYPT_PARAMETERS": "Parametroj (Skripto):",
     "AUTO_LOGOUT": {
       "TITLE": "Informo",
@@ -516,7 +521,7 @@
       "TITLE": "Kreado de konto",
       "INTRO_WARNING_TIME": "La kreado de konto ĉe {{name|capitalize}} estas tre simpla. Bonvolu tamen dediĉi sufiĉe da tempo por ĝuste efektivigi tiun proceduron (por ne forgesi la identigilojn, pasvortojn, ktp.).",
       "INTRO_WARNING_SECURITY": "Kontrolu ke la aparatoj, kiujn vi nun uzas (komputilo, tabuleto, telefono), <b>estas sekurigitaj kaj fidindaj</b>.",
-      "INTRO_WARNING_SECURITY_HELP": "Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, sesio protektita per pasvorto aŭ PIN-kodo, ktp.",
+      "INTRO_WARNING_SECURITY_HELP": "Senvirusigilo ĝisdata, fajroŝirmilo aktivigita, seanco protektita per pasvorto aŭ PIN-kodo, ktp.",
       "INTRO_HELP": "Alklaku <b>{{'COMMON.BTN_START'|translate}}</b> por ekigi la kreadon de konto. Vi estos gvidata paŝon post paŝo.",
       "REGISTRATION_NODE": "Via aliĝo estos registrita tra la nodo Duniter <b>{{server}}</b>, kiu dissendos ĝin poste al la cetero de la mon-reto.",
       "REGISTRATION_NODE_HELP": "Se vi ne fidas tiun nodon, bonvolu ŝanĝi ĝin <a ng-click=\"doQuickFix('settings')\">en la parametroj</a> de Cesium.",
@@ -619,6 +624,7 @@
       "QUESTION_19": "Kio estis la profesio de via avo?",
       "RECOVER_ID": "Retrovi mian pasvorton...",
       "RECOVER_ID_HELP": "Se vi disponas <b>konserv-dosieron pri viaj identigiloj</b>, vi povas retrovi ilin respondante ĝuste viajn personajn demandojn.",
+      "RECOVER_ID_SELECT_FILE": "Elektu la uzotan <b>konserv-dosieron pri viaj identigiloj</b>:",
       "REVOCATION_WITH_FILE": "Nuligi mian membro-konton...",
       "REVOCATION_WITH_FILE_DESCRIPTION": "Se vi <b>definitive perdis viajn identigilojn</b> pri via membro-konto (aŭ ke la sekureco de la konto estas endanĝerigita), vi povas uzi <b>la dosieron pri nuligo</b> de la konto por <b>trudi ties definitivan eliradon el la reto de fido</b>.",
       "REVOCATION_WITH_FILE_HELP": "Por <b>definitive nuligi</b> membro-konton, bonvolu glitigi en la ĉi-suban zonon vian dosieron pri nuligo, aŭ alklaki la zonon por serĉadi dosieron.",
@@ -771,6 +777,7 @@
     "CHECK_NETWORK_CONNECTION": "Neniu nodo ŝajnas atingebla.<br/><br/>Bonvolu <b>kontroli vian retkonekton</b>.",
     "ISSUE_524_TX_FAILED": "Malsukcesa elspezo.<br/><br/>Mesaĝo estis sendita al la programistoj por faciligi la solvadon de la problemo. <b>Dankon pro via helpo</b>.",
     "ADD_SECONDARY_WALLET_FAILED": "Malsukceso por aldoni kroman monujon.",
+    "REMOVE_SECONDARY_WALLET_FAILED": "Malsukceso por forigi la kroman monujon.",
     "UPDATE_WALLET_LIST_FAILED": "Malsukceso por ĝisdatigi la kromajn monujojn.",
     "LOAD_WALLET_LIST_FAILED": "Malsukceso por ŝarĝi la kromajn monujojn.",
     "SAVE_WALLET_LIST_FAILED": "Malsukceso por konservi la kromajn monujojn.",
@@ -824,6 +831,21 @@
     "USE_FALLBACK_NODE": "Nodo <b>{{old}}</b> neatingebla aŭ adreso nevalida.<br/><br/>Ĉu vi volas provizore uzi la nodon <b>{{new}}</b> ?",
     "ISSUE_524_SEND_LOG": "La spezo estis forĵetita, pro konata anomalio (petslipo #524) sed <b>ne ripetita</b>.<br/><br/>Por helpi la programistojn korekti tiun eraron, <b>ĉu vi akceptas la sendadon de viaj protokolaj dosieroj</b> per mesaĝo?<br/><small>(neniu konfidenca dateno estas sendita)</small>."
   },
+  "MODE": {
+    "DEMO": {
+      "BADGE": "Provo",
+      "MODE": "Provmontra moduso",
+      "FEATURE_NOT_AVAILABLE": "Funkcio <b>ne disponebla</b> en tiu ĉi provmontra retejo.",
+      "MODE_HELP": "Cesium funkcias en <b>provmontra moduso</b>: Konsultado de konto eblas, sed neniu operacio povos esti registrita.",
+      "INSTALL_HELP": "Pro <b>sekurecaj kialoj</b> ni rekomendas al vi <b>instali</b> vian kopion de la programo Cesium. Vizitu la retejon <a href='https://cesium.app'>www.cesium.app</a> por ricevi helpon."
+    },
+    "READONLY": {
+      "BADGE": "Observo",
+      "MODE": "Observada moduso",
+      "MODE_HELP": "Cesium funkcias en <b>observada moduso</b>: disponeblas nur la funkciaro pri observado de la valuto.",
+      "INSTALL_HELP": "Se vi deziras <b>krei monuj-konton</b> por sendi aÅ­ ricevi monon, ni rekomendas al vi <b>instali vian kopion</b> de la programo Cesium. Vizitu la retejon <a href='https://cesium.app'>www.cesium.app</a> por ricevi helpon."
+    }
+  },
   "DOWNLOAD": {
     "POPUP_TITLE": "<b>Dosiero pri nuligo</b>",
     "POPUP_REVOKE_MESSAGE": "Por sekurigi vian konton, bonvolu elŝuti la <b>dokumenton pri konto-nuligo</b>. Ĝi ebligos al vi eventuale nuligi vian konton (kaze de konto-ŝtelo, ŝanĝo de identigilo, konto erare kreita, ktp.).<br/><br/><b>Bonvolu stoki ĝin en sekura loko.</b>"
@@ -871,7 +893,7 @@
       "NETWORK_PEERS": "La <b>nodoj</b> videblaj ĉi tie rilatas al la <b>komputiloj, kiuj ĝisdatigas kaj kontrolas</b> la blokĉenon.<br/><br/>Ju pli estas nodoj, des pli la mono havas administradon <b>malcentrigitan</b> kaj fidindan.",
       "NETWORK_PEERS_BLOCK_NUMBER": "Tiu ĉi <b>numero</b> (verda) indikas la <b>lastan blokon validigitan</b> por tiu ĉi nodo (lasta paĝo skribita en la granda konto-libro).<br/><br/>La verda koloro indikas, ke tiu ĉi bloko estas validigita ankaŭ de <b>la plej multaj el la aliaj nodoj</b>.",
       "NETWORK_PEERS_PARTICIPATE": "<b>Ĉiu membro</b>, ekipita per komputilo kun interreto, <b>povas partopreni aldonante nodon</b>. Sufiĉas <b>instali la programon Duniter</b> (libera kaj senpaga). <a href=\"{{installDocUrl}}\" target=\"_system\">Vidi la gvidilon pri instalado &gt;&gt;</a>.",
-      "MENU_BTN_ACCOUNT": "La menuo <b>{{'ACCOUNT.TITLE'|translate}}</b> ebligas aliri la administradon de via konto.",
+      "MENU_BTN_ACCOUNT": "La menuo <b>{{'MENU.ACCOUNT'|translate}}</b> ebligas aliri la administradon de via konto.",
       "MENU_BTN_ACCOUNT_MEMBER": "Konsultu ĉi tie la staton de via konto kaj la informojn pri viaj atestaĵoj.",
       "WALLET_CERTIFICATIONS": "Alklaku ĉi tien por konsulti la detalon pri viaj atestaĵoj (ricevitaj kaj senditaj).",
       "WALLET_RECEIVED_CERTIFICATIONS": "Alklaku ĉi tien por konsulti la detalon pri viaj <b>ricevitaj atestaĵoj</b>.",
@@ -886,8 +908,8 @@
       "WALLET_RECEIVED_CERTS": "Afiŝiĝos ĉi tie la listo de la personoj, kiuj atestis vin.",
       "WALLET_CERTIFY": "La butono <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> ebligas elekti identecon kaj atesti ĝin.<br/><br/>Nur uzantoj <b>jam membroj</b> povas atesti aliajn.",
       "WALLET_CERT_STOCK": "Via stoko da atestaĵoj (senditaj) estas limigita je <b>{{sigStock}} atestaĵoj</b>.<br/><br/>Tiu stoko plu evoluas laŭ la tempo, samtempe kiam la atestaĵoj malvalidiĝas.",
-      "MENU_BTN_TX_MEMBER": "La menuo <b>{{'MENU.TRANSACTIONS'|translate}}</b> ebligas konsulti vian konton, la liston de viaj spezoj, kaj sendi pagon.",
-      "MENU_BTN_TX": "Konsultu ĉi tie <b>la liston de viaj spezoj</b> kaj efektivigu novajn operaciojn.",
+      "MENU_BTN_WALLETS": "La menuo <b>{{'MENU.WALLETS'|translate}}</b> ebligas aldoni kromajn monujojn, kiujn vi mastrumas.",
+      "MENU_BTN_TX": "La menuo <b>{{'MENU.TRANSACTIONS'|translate}}</b> ebligas konsulti vian saldon, la histori-liston de viaj spezoj, kaj sendi pagon.",
       "MENU_BTN_WOT": "La menuo <b>{{'MENU.WOT'|translate}}</b> ebligas traserĉi inter la <b>uzantoj</b> de la mono (membroj aŭ ne).",
       "WOT_SEARCH_TEXT_XS": "Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de pseŭdonimo</b> (aŭ de publika ŝlosilo).<br/><br/>La serĉado ekos aŭtomate.",
       "WOT_SEARCH_TEXT": "Por traserĉi en la kontaro, tajpu la <b>unuajn literojn de de pseŭdonimo</b> (aŭ de publika ŝlosilo). <br/><br/>Premu poste sur la klavon <b>Enigi</b> por ekigi la serĉadon.",
@@ -901,7 +923,8 @@
       "HEADER_BAR_BTN_PROFILE": "Alklaku ĉi tien por aliri vian <b>uzanto-profilon.</b>",
       "SETTINGS_CHANGE_UNIT": "Vi povos <b>ŝanĝi la afiŝ-unuon</b> de la sumoj alklakante ĉi-supren.<br/><br/>- Malaktivigu la kromaĵon por afiŝi sumojn en {{currency|capitalize}}.<br/>- Aktivigu la kromaĵon por relativa afiŝado en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (ĉiuj sumoj estos <b>dividitaj</b> per la Universala Dividendo aktuala).",
       "END_LOGIN": "Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Bonan daŭrigon al vi, en la nova mondo de la<b>libera ekonomio</b>!",
-      "END_NOT_LOGIN": "Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Se vi deziras partopreni en la mono {{currency|capitalize}}, sufiĉos al vi alklaki <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> ĉi-sube."
+      "END_NOT_LOGIN": "Tiu ĉi gvidata vizito <b>finiĝis</b>!<br/><br/>Se vi deziras partopreni en la mono {{currency|capitalize}}, sufiĉos al vi alklaki <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> ĉi-sube.",
+      "END_READONLY": "Tiu ĉi gvidata vizito <b>finiĝis</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."
     }
   },
   "API" :{
@@ -974,7 +997,7 @@
         "PARAM_REDIRECT_URL": "Retadreso por redirektiĝo",
         "PARAM_REDIRECT_URL_HELP": "Retadreso (URL) por redirektiĝo, alvokita kiam la pago estis sendita. Ĝi povas enteni la sekvantajn signojn, kiuj estos anstataŭigitaj per la valoroj de la spezo: \"{tx}\", \"{hash}\", \"{comment}\", \"{amount}\", \"{pubkey}\" kaj \"{node}\".",
         "PARAM_CANCEL_URL": "Retadreso por nuligo",
-        "PARAM_CANCEL_URL_HELP": "Retadreso (URL) kaze de nuligo de la pago, fare de la uzanto. Äœi povas enteni la sekvantajn signojn, kiuj estos anstataÅ­igitaj lastmomente: \"{comment}\", \"{amount}\" kaj {pubkey}.",
+        "PARAM_CANCEL_URL_HELP": "Retadreso (URL) kaze de nuligo de la pago, fare de la uzanto. Äœi povas enteni la sekvantajn signojn, kiuj estos anstataÅ­igitaj lastmomente: \"{comment}\", \"{amount}\" kaj \"{pubkey}\".",
         "PARAM_PREFERRED_NODE": "Adreso de la preferata nodo",
         "PARAM_PREFERRED_NODE_HELP": "Adreso (URL) de la nodo Duniter preferinde uzota (\"g1.domaine.com:443\" aÅ­ \"https://g1.domaine.com\").",
         "EXAMPLES_HELP": "Jen ekzemploj pri integrado:",
diff --git a/www/i18n/locale-es-ES.json b/www/i18n/locale-es-ES.json
index f57fa6ae9fc8c12a0799f9b8fa96332fd0c5b9c2..e8c61e74ee9b18ebaaccffb02e7fa158852e71ab 100644
--- a/www/i18n/locale-es-ES.json
+++ b/www/i18n/locale-es-ES.json
@@ -10,21 +10,21 @@
     "BTN_YES": "Sí",
     "BTN_NO": "No",
     "BTN_SEND": "Enviar",
-    "BTN_SEND_MONEY": "Hacer una transferencia",
-    "BTN_SEND_MONEY_SHORT": "Transferencia",
+    "BTN_SEND_MONEY": "Hacer un pago",
+    "BTN_SEND_MONEY_SHORT": "Pago",
     "BTN_SAVE": "Guardar",
     "BTN_YES_SAVE": "Sí, guardar",
     "BTN_YES_CONTINUE": "Sí, continuar",
     "BTN_SHOW": "Ver",
     "BTN_SHOW_PUBKEY": "Ver la llave",
-    "BTN_RELATIVE_UNIT": "¿Mostrar las importes en DU?",
+    "BTN_RELATIVE_UNIT": "Mostrar importes en DU",
     "BTN_BACK": "Anterior",
     "BTN_NEXT": "Siguiente",
     "BTN_IMPORT": "Importar",
     "BTN_CANCEL": "Cancelar",
     "BTN_CLOSE": "Cerrar",
     "BTN_LATER": "Más tarde",
-    "BTN_LOGIN": "Connectarse",
+    "BTN_LOGIN": "Conectarse",
     "BTN_LOGOUT": "Desconexión",
     "BTN_ADD_ACCOUNT": "Nueva cuenta",
     "BTN_SHARE": "Compartir",
@@ -40,17 +40,17 @@
     "BTN_UNDERSTOOD": "Entendido",
     "BTN_OPTIONS": "Opciones",
     "BTN_HELP_TOUR": "Visita guiada",
-    "BTN_HELP_TOUR_SCREEN": "Descubrir esta pantalla",
+    "BTN_HELP_TOUR_SCREEN": "Explicar esta pantalla",
     "BTN_DOWNLOAD": "Descargar",
-    "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Descargar el estado de cuenta",
+    "BTN_DOWNLOAD_ACCOUNT_STATEMENT": "Descargar historial de cuenta",
     "BTN_MODIFY": "Modificar",
-    "CHOOSE_FILE": "Deposite archivo<br/>o clique para seleccionarlo",
+    "CHOOSE_FILE": "Arrastre el archivo<br/>o haga clic para seleccionarlo",
     "DAYS": "Días",
     "NO_ACCOUNT_QUESTION": "¿Todavía no es miembro? ¡Crear una cuenta!",
     "SEARCH_NO_RESULT": "Ningún resultado encontrado",
-    "LOADING": "Espere por favor...",
-    "LOADING_WAIT": "Espere por favor...<br/><small>(Esperando disponibilidad de nodo)</small>",
-    "SEARCHING": "Búsqueda en proceso...",
+    "LOADING": "Espere por favor…",
+    "LOADING_WAIT": "Espere por favor…<br/><small>(Esperando disponibilidad de nodo)</small>",
+    "SEARCHING": "Búsqueda en proceso…",
     "FROM": "De",
     "TO": "A",
     "COPY": "Copiar",
@@ -84,7 +84,7 @@
       "DATE" : "Fecha:",
       "TYPE" : "Tipo:",
       "SIZE": "Tamaño:",
-      "VALIDATING": "Validación en progreso..."
+      "VALIDATING": "Validando…"
     }
   },
   "SYSTEM": {
@@ -93,63 +93,68 @@
     "BTN_PICTURE_CAMERA": "<b>Cámara</b>"
   },
   "MENU": {
-    "HOME": "Recepción",
+    "HOME": "Inicio",
     "WOT": "Directorio",
     "CURRENCY": "Moneda",
     "ACCOUNT": "Mi cuenta",
     "WALLETS": "Mis monederos",
-    "TRANSFER": "Transferencia",
-    "SCAN": "Escáner",
-    "SETTINGS": "Configuraciones",
+    "SETTINGS": "Ajustes",
     "NETWORK": "Red",
-    "TRANSACTIONS": "Mis operaciones"
+    "TRANSACTIONS": "Mis transacciones"
   },
   "ABOUT": {
-    "TITLE": "A propósito ",
-    "LICENSE": "Aplicación <b>libre</b> (licencia GNU AGPLv3).",
-    "LATEST_RELEASE": "Hay una <b>versión más nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",
+    "BTN_OPEN_DEV_WINDOW": "Abrir ventana de depuración",
+    "TITLE": "Acerca de",
+    "LICENSE": "Software <b>libre</b> (licencia GNU AGPLv3).",
+    "LATEST_RELEASE": "Existe una <b>versión más nueva</b> de {{'COMMON.APP_NAME' | translate}} (<b>v{{version}}</b>)",
     "PLEASE_UPDATE": "Por favor actualice {{'COMMON.APP_NAME' | translate}} (última versión: <b>v{{version}}</b>)",
     "CODE": "Código fuente:",
+    "OFFICIAL_WEB_SITE": "Web oficial:",
     "DEVELOPERS": "Desarrollado por:",
     "FORUM": "Foro:",
-    "PLEASE_REPORT_ISSUE": "No dude en informarnos de las anomalías encontradas",
+    "PLEASE_REPORT_ISSUE": "No dude en informarnos de anomalías encontradas",
     "REPORT_ISSUE": "Reportar un problema"
   },
   "HOME": {
+    "FEED_SOURCE": "Fuente",
+    "READ_MORE": "Leer más",
+    "SHOW_ALL_FEED": "Ver todo",
     "TITLE": "Cesium",
-    "WELCOME": "Bienvenido(a) a la aplicación Cesium !",
-    "MESSAGE": "Seguir las cuentas de {{currency|abbreviate}} fácilmente",
+    "WELCOME": "¡Bienvenida/o a la aplicación Cesium!",
+    "MESSAGE": "Reciba y envíe moneda libre {{currency|abbreviate}} fácilmente",
     "BTN_CURRENCY": "Explorar la moneda",
-    "BTN_ABOUT": "Acerca de:",
+    "BTN_ABOUT": "Acerca de",
     "BTN_HELP": "Ayuda en línea",
-    "REPORT_ISSUE": "anomalía",
-    "NOT_YOUR_ACCOUNT_QUESTION": "¿Usted no es dueño de la cuenta <<b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?",
+    "REPORT_ISSUE": "Reportar anomalía",
+    "NOT_YOUR_ACCOUNT_QUESTION": "¿No es suya la cuenta <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?",
     "BTN_CHANGE_ACCOUNT": "Desconectar esta cuenta",
-    "CONNECTION_ERROR": "Nodo <b>{{servidor}}</b> inalcanzable o dirección inválida.<br/><br/>Compruebe su conexión a Internet, o nodo de conmutación <a class=\"positive\" ng-click=\"doQuickFix('settings')\">en la configuración</a>."
+    "CONNECTION_ERROR": "Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Compruebe su conexión a Internet, o nodo de conmutación <a class=\"positive\" ng-click=\"doQuickFix('settings')\">en los ajustes</a>."
   },
   "SETTINGS": {
-    "TITLE": "Configuración",
+    "TITLE": "Ajustes",
     "DISPLAY_DIVIDER": "Visualización",
     "STORAGE_DIVIDER": "Almacenamiento",
     "NETWORK_SETTINGS": "Red",
     "PEER": "Dirección del nodo Duniter",
     "PEER_CHANGED_TEMPORARY": "Dirección utilizada temporalmente",
-    "PERSIST_CACHE": "Mantener datos de navegación (experimental)",
+    "PEER_SHORT": "Nodo Duniter",
+    "PERSIST_CACHE": "Conservar los datos de navegación (experimental)",
     "PERSIST_CACHE_HELP": "Permite una navegación más rápida, conservando localmente los datos recibidos, para usar de una sesión a otra.",
     "USE_LOCAL_STORAGE": "Activar el almacenamiento local",
-    "USE_LOCAL_STORAGE_HELP": "Permitir el ahorro de almacenamiento local",
+    "USE_LOCAL_STORAGE_HELP": "Permitir conservar sus ajustes",
     "WALLETS_SETTINGS": "Mis monederos",
-    "USE_WALLETS_ENCRYPTION": "¿Asegurar la lista?",
-    "ENABLE_HELPTIP": "Activar las ayudas contextuales",
+    "USE_WALLETS_ENCRYPTION": "Cifrar el listado",
+    "USE_WALLETS_ENCRYPTION_HELP": "Permite proteger la lista de sus monederos (mediante cifrado), exigiendo una autenticación para acceder.",
+    "ENABLE_HELPTIP": "Activar la ayuda contextual",
     "ENABLE_UI_EFFECTS": "Activar los efectos visuales",
-    "HISTORY_SETTINGS": "Operaciones de cuentas",
-    "DISPLAY_UD_HISTORY": "¿Publicar los dividendos producidos?",
-    "TX_HISTORY_AUTO_REFRESH": "Activar actualización automática?",
-    "TX_HISTORY_AUTO_REFRESH_HELP": "Actualice el saldo y las operaciones automáticamente, en cada nuevo bloque.",
+    "HISTORY_SETTINGS": "Transacciones de la cuenta",
+    "DISPLAY_UD_HISTORY": "Mostrar los DU creados",
+    "TX_HISTORY_AUTO_REFRESH": "Activar actualización automática",
+    "TX_HISTORY_AUTO_REFRESH_HELP": "Actualizar el saldo y las transacciones automáticamente, con cada nuevo bloque.",
     "AUTHENTICATION_SETTINGS": "Autenticación",
     "KEEP_AUTH": "Caducidad de la autenticación",
     "KEEP_AUTH_SHORT": "Caducidad",
-    "KEEP_AUTH_HELP": "Definir cuándo limpiar la memoria de autenticación.",
+    "KEEP_AUTH_HELP": "Defina cuándo expira su sesión",
     "KEEP_AUTH_OPTION": {
       "NEVER": "Después de cada operación",
       "SECONDS": "Después de {{value}} segundos de inactividad",
@@ -158,18 +163,27 @@
       "HOUR": "Después de {{value}}h de inactividad",
       "ALWAYS": "Al finalizar la sesión"
     },
-    "KEYRING_FILE": "Archivo de llavero",
+    "KEYRING_FILE": "Archivo de llaves",
+    "KEYRING_FILE_HELP": "Le permite <b>conectarse</b> automáticamente en cada inicio <br/>e incluso de <b>autenticarse</b> (solo si \"Caducidad de la autenticación\" está configurada en modo: \"al finalizar la sesión\").",
     "REMEMBER_ME": "Recordarme",
     "REMEMBER_ME_HELP": "Permite mantenerse siempre conectado (no recomendado), conservando localmente la llave pública.",
     "PLUGINS_SETTINGS": "Extensiones",
-    "BTN_RESET": "Restaurar los valores por defecto" ,
-    "EXPERT_MODE": "Activar el modo experto",
+    "BTN_RESET": "Restaurar los valores por defecto",
+    "EXPERT_MODE": "Modo experto",
     "EXPERT_MODE_HELP": "Permite una visualización más detallada",
+    "BLOCK_VALIDITY_WINDOW": "Tiempo de incertitud de los bloques",
+    "DISABLE_HELPTIP": "Desactivar la opción de ayuda contextual",
+    "BLOCK_VALIDITY_WINDOW_SHORT": "Tiempo de incertitud",
+    "BLOCK_VALIDITY_WINDOW_HELP": "Tiempo de espera antes de considerar una información como validada",
+    "BLOCK_VALIDITY_OPTION": {
+      "NONE": "Sin espera",
+      "N": "{{time | formatDuration}} ({{count}} bloques)"
+    },
     "POPUP_PEER": {
       "TITLE": "Nodo Duniter",
       "HOST": "Dirección",
       "HOST_HELP": "Dirección: servidor:puerto",
-      "USE_SSL": "¿Segura?",
+      "USE_SSL": "Conexión segura",
       "USE_SSL_HELP": "(Cifrado SSL)",
       "BTN_SHOW_LIST": "Lista de nodos"
     }
@@ -178,7 +192,7 @@
     "HASH": "Hash: {{hash}}",
     "VIEW": {
       "HEADER_TITLE": "Bloque #{{number}}-{{hash|formatHash}}",
-      "TITLE_CURRENT": "Bloque corriente",
+      "TITLE_CURRENT": "Bloque actual",
       "TITLE": "Bloque #{{number|formatInteger}}",
       "COMPUTED_BY": "Calculado por el nodo de",
       "SHOW_RAW": "Ver el fichero en bruto",
@@ -218,7 +232,7 @@
     "LOOKUP": {
       "TITLE": "Bloques",
       "NO_BLOCK": "Ningún bloque",
-      "LAST_BLOCKS": "últimos bloques:",
+      "LAST_BLOCKS": "Últimos bloques:",
       "BTN_COMPACT": "Compactar"
     }
   },
@@ -229,17 +243,17 @@
       "TAB_WOT": "Red de confianza",
       "TAB_NETWORK": "Red",
       "TAB_BLOCKS": "Bloques",
-      "CURRENCY_SHORT_DESCRIPTION": "{{currency|abbreviate}} es una <b>moneda libre</b>, originada el {{firstBlockTime|formatFromNow}}. Ella cuenta actualmente <b>{{N}} miembros</b>, que producen y recibir un <a ng-click=\"showHelpModal('ud')\">Dividendo universal</a> (DU), cada {{dt|formatPeriod}}.",
+      "CURRENCY_SHORT_DESCRIPTION": "{{currency|abbreviate}} es una <b>moneda libre</b>, originada {{firstBlockTime|formatFromNow}}. Cuenta actualmente con <b>{{N}} miembros</b>, que producen y reciben un <a ng-click=\"showHelpModal('ud')\">Dividendo Universal</a> (DU) cada {{dt|formatPeriod}}.",
       "NETWORK_RULES_DIVIDER": "Reglas de la red",
       "CURRENCY_NAME": "Nombre de la moneda",
       "MEMBERS": "Cantidad de miembros",
-      "MEMBERS_VARIATION": "variaciones del último DU",
+      "MEMBERS_VARIATION": "Variación desde último DU",
       "MONEY_DIVIDER": "Moneda",
       "MASS": "Masa monetaria",
-      "SHARE": "Masa por miembro",
-      "UD": "Dividendo universal",
+      "SHARE": "Masa media por miembro",
+      "UD": "Dividendo Universal",
       "C_ACTUAL": "Crecimiento actual",
-      "MEDIAN_TIME": "Hora de la blockchain",
+      "MEDIAN_TIME": "Hora de la cadena de bloques",
       "POW_MIN": "Nivel mínimo de dificultad de cálculo",
       "MONEY_RULES_DIVIDER": "Reglas de la moneda",
       "C_RULE": "Crecimiento teórico objetivo",
@@ -248,18 +262,18 @@
       "REEVAL_SYMBOL": "reval",
       "DT_REEVAL_VALUE": "Todos los <b>{{dtReeval|formatDuration}}</b> ({{dtReeval/86400}} {{'COMMON.DAYS'|translate}})",
       "UD_REEVAL_TIME0": "Fecha de la primera revalorización",
-      "SIG_QTY_RULE": "Número de certificaciones requeridas para ser miembro",
-      "SIG_STOCK": "Número máximo de certificaciones emitidas por miembros",
-      "SIG_PERIOD": "Plazo mínimo de espera entre 2 certificaciones sucesivas emitidas por la misma persona",
-      "SIG_WINDOW": "Plazo límite para tomar en cuenta una certificación",
-      "SIG_VALIDITY": "Duración de una certificación que se ha tenido en cuenta.",
-      "MS_WINDOW": "Duración límite para toma en cuenta de una adhesión",
-      "MS_VALIDITY": "Duración de una certificación",
-      "STEP_MAX": "Distancia máxima entre un nuevo entrante y los miembros referentes",
+      "SIG_QTY_RULE": "Certificaciones requeridas para ser miembro",
+      "SIG_STOCK": "Máximo de certificaciones emitibles por miembros",
+      "SIG_PERIOD": "Espera mínima entre 2 certificaciones sucesivas emitidas por la misma persona",
+      "SIG_WINDOW": "Límite para tener en cuenta una certificación",
+      "SIG_VALIDITY": "Duración de una certificación tenida en cuenta",
+      "MS_WINDOW": "Límite para aprobar una solicitud de membresía",
+      "MS_VALIDITY": "Duración de una membresía aprobada",
+      "STEP_MAX": "Distancia máxima entre una nueva candidatura y cada miembro referente",
       "WOT_RULES_DIVIDER": "Reglas de la red de confianza",
-      "SENTRIES": "Cantidad de certificaciones necesarias para ser miembro referente",
-      "SENTRIES_FORMULA": "Cantidad de certificaciones necesarias para ser miembro referente (fórmula)",
-      "XPERCENT":"Porcentaje mínimo de miembros referentes necesario para respetar la regla de distancia",
+      "SENTRIES": "Certificaciones necesarias para ser miembro referente",
+      "SENTRIES_FORMULA": "Fórmula de las certificaciones necesarias para ser miembro referente",
+      "XPERCENT":"Porcentaje mínimo necesario de miembros referentes respentando la regla de distancia máxima",
       "AVG_GEN_TIME": "Tiempo medio entre dos bloques",
       "CURRENT": "actual",
       "MATH_CEILING": "TECHO",
@@ -269,17 +283,17 @@
     },
     "LICENSE": {
       "TITLE": "Licencia de la moneda",
-      "BTN_DOWNLOAD": "Descagar el fichero",
+      "BTN_DOWNLOAD": "Descargar el fichero",
       "NO_LICENSE_FILE": "Fichero de licencia no encontrado."
     }
   },
   "NETWORK": {
     "VIEW": {
-      "MEDIAN_TIME": "Hora de la blockchain",
-      "LOADING_PEERS": "Cargando los nodos...",
+      "MEDIAN_TIME": "Hora de la cadena de bloques",
+      "LOADING_PEERS": "Cargando nodos…",
       "NODE_ADDRESS": "Dirección:",
       "SOFTWARE": "Software:",
-      "WARN_PRE_RELEASE": "prelanzamiento (última versión estable: <b>{{version}}</b>)",
+      "WARN_PRE_RELEASE": "Prelanzamiento (última versión estable: <b>{{version}}</b>)",
       "WARN_NEW_RELEASE": "Versión <b>{{version}}</b> disponible",
       "WS2PID": "ID:",
       "PRIVATE_ACCESS": "Acceso privado",
@@ -315,7 +329,7 @@
     "VIEW": {
       "TITLE": "Nodo",
       "OWNER": "Propiedad de",
-      "SHOW_RAW_PEERING": "Ver la mapa de red",
+      "SHOW_RAW_PEERING": "Ver la ficha del par",
       "SHOW_RAW_CURRENT_BLOCK": "Ver el último bloque (formato bruto)",
       "LAST_BLOCKS": "Bloques recientes",
       "KNOWN_PEERS": "Nodos conocidos:",
@@ -328,15 +342,15 @@
   },
   "WOT": {
     "SEARCH_HELP": "Buscar (seudónimo o llave pública)",
-    "SEARCH_INIT_PHASE_WARNING": "Durante la etapa de preinscripción, el tiempo de búsqueda de las inscripciones en espera <b>puede ser largo</b>. Gracias por su paciencia...",
-    "REGISTERED_SINCE": "Registrado en",
-    "REGISTERED_SINCE_BLOCK": "Registrado en el bloque #",
+    "SEARCH_INIT_PHASE_WARNING": "Durante la etapa de preinscripción, el tiempo de búsqueda de las candidaturas en espera <b>puede tardar</b>. Por favor espere…",
+    "REGISTERED_SINCE": "Se registró en",
+    "REGISTERED_SINCE_BLOCK": "Se registró en el bloque #",
     "NO_CERTIFICATION": "Ninguna certificación validada",
     "NO_GIVEN_CERTIFICATION": "Ninguna certificación emitida",
     "NOT_MEMBER_PARENTHESIS": "(no miembro)",
     "IDENTITY_REVOKED_PARENTHESIS": "(identidad revocada)",
     "MEMBER_PENDING_REVOCATION_PARENTHESIS": "(revocación en proceso)",
-    "EXPIRE_IN": "Expira el",
+    "EXPIRE_IN": "Expira",
     "NOT_WRITTEN_EXPIRE_IN": "Fecha límite<br/>de procesamiento",
     "EXPIRED": "Expirado",
     "PSEUDO": "Seudónimo",
@@ -344,12 +358,12 @@
     "WRITTEN_ON_BLOCK": "Escrita en el bloque #{{block}}",
     "GENERAL_DIVIDER": "Informaciones generales",
     "NOT_MEMBER_ACCOUNT": "Cuenta no miembro",
-    "NOT_MEMBER_ACCOUNT_HELP": "Se trata de un simple monedero, sin solicitud de adhesión en espera.",
+    "NOT_MEMBER_ACCOUNT_HELP": "Se trata de un monedero simple, sin solicitud de membresía en espera",
     "TECHNICAL_DIVIDER": "Informaciones técnicas",
     "BTN_CERTIFY": "Certificar",
     "BTN_YES_CERTIFY": "Sí, certificar",
     "BTN_SELECT_AND_CERTIFY": "Nueva certificación",
-    "ACCOUNT_OPERATIONS": "Operaciones de cuenta",
+    "ACCOUNT_OPERATIONS": "Transacciones de la cuenta",
     "VIEW": {
       "POPOVER_SHARE_TITLE": "Identidad {{title}}"
     },
@@ -359,14 +373,14 @@
       "NEWCOMERS_COUNT": "{{count}} miembros",
       "PENDING": "Inscripciones en espera:",
       "PENDING_COUNT": "{{count}} inscripciones en espera",
-      "REGISTERED": "Inscrito {{sigDate | formatFromNow}}",
+      "REGISTERED": "Se inscribió {{sigDate | formatFromNow}}",
       "MEMBER_FROM": "Miembro desde {{memberDate|medianFromNowShort}}",
-      "BTN_NEWCOMERS": "Nuevos miembros",
-      "BTN_PENDING": "Inscripciones en espera",
+      "BTN_NEWCOMERS": "Miembros recientes",
+      "BTN_PENDING": "Candidaturas en espera",
       "SHOW_MORE": "Mostrar más",
-      "SHOW_MORE_COUNT": "(límite actual a {{limit}})",
-      "NO_PENDING": "Ninguna inscripción en espera.",
-      "NO_NEWCOMERS": "Ningun miembro."
+      "SHOW_MORE_COUNT": "(mostrar solo {{limit}})",
+      "NO_PENDING": "Ninguna candidatura en espera.",
+      "NO_NEWCOMERS": "Sin miembros."
     },
     "CONTACTS": {
       "TITLE": "Contactos"
@@ -385,7 +399,7 @@
       "SENTRY_MEMBER": "Miembro referente"
     },
     "OPERATIONS": {
-      "TITLE": "{{uid}} - Operaciones"
+      "TITLE": "{{uid}} - Transacciones"
     },
     "GIVEN_CERTIFICATIONS": {
       "TITLE": "{{uid}} - Certificaciones emitidas",
@@ -399,38 +413,38 @@
   },
   "LOGIN": {
     "TITLE": "<i class=\"icon ion-locked\"></i> Conexión",
-    "SCRYPT_FORM_HELP": "Ingrese sus credenciales.<br>Recuerde verificar que la clave pública es su cuenta.",
-    "PUBKEY_FORM_HELP": "Por favor ingrese una clave de cuenta pública:",
-    "FILE_FORM_HELP": "Elija el archivo de llavero para usar:",
-    "SCAN_FORM_HELP": "Escanee el código QR de la monedero.",
+    "SCRYPT_FORM_HELP": "Ingrese sus credenciales.<br>Recuerde comprobar que la llave pública pertenece a su cuenta.",
+    "PUBKEY_FORM_HELP": "Por favor ingrese una llave pública de cuenta:",
+    "FILE_FORM_HELP": "Elija el archivo de llaves a usar:",
+    "SCAN_FORM_HELP": "Escanee el código QR de un monedero.",
     "SALT": "Identificador secreto",
     "SALT_HELP": "Identificador secreto",
-    "SHOW_SALT": "¿Visualizar el identificador secreto?",
-    "PASSWORD": "Frase secreta",
-    "PASSWORD_HELP": "Frase secreta",
+    "SHOW_SALT": "Mostrar el identificador secreto",
+    "PASSWORD": "Contraseña",
+    "PASSWORD_HELP": "Contraseña",
     "PUBKEY_HELP": "llave pública",
-    "NO_ACCOUNT_QUESTION": "¿Aún no tiene cuenta?",
-    "HAVE_ACCOUNT_QUESTION": "¿Ya tienes una cuenta?",
+    "NO_ACCOUNT_QUESTION": "¿Aún no tiene cuenta? ",
+    "HAVE_ACCOUNT_QUESTION": "¿Ya tiene cuenta?",
     "CREATE_ACCOUNT": "Crear una cuenta",
     "CREATE_FREE_ACCOUNT": "Crear una cuenta gratis",
-    "FORGOTTEN_ID": "¿Olvidó su frase secreta?",
-    "ASSOCIATED_PUBKEY": "Clave pública del llavero:",
+    "FORGOTTEN_ID": "¿Olvidó su contraseña?",
+    "ASSOCIATED_PUBKEY": "Llave pública del archivo de llaves:",
     "BTN_METHODS": "Otros métodos",
-    "BTN_METHODS_DOTS": "Método de cambio...",
+    "BTN_METHODS_DOTS": "Otras vías…",
     "METHOD_POPOVER_TITLE": "Métodos",
-    "MEMORIZE_AUTH_FILE": "Recuerda este llavero al momento de la sesión de navegación",
-    "SCRYPT_PARAMETERS": "Configuraciones (Scrypt) :",
+    "MEMORIZE_AUTH_FILE": "Memorizar las llaves durante la sesión de navegación",
+    "SCRYPT_PARAMETERS": "Ajustes (Scrypt) :",
     "AUTO_LOGOUT": {
       "TITLE": "Información",
       "MESSAGE": "<i class=\"ion-android-time\"></i> Se ha <b>desconectado</b> de forma automática, después de un periodo de inactividad prolongada.",
       "BTN_RELOGIN": "Volver a conectarme",
-      "IDLE_WARNING": "Se desconectará en... {{countdown}}"
+      "IDLE_WARNING": "Será desconectado en… {{countdown}}"
     },
     "METHOD": {
-      "SCRYPT_DEFAULT": "Identificación predeterminada",
-      "SCRYPT_ADVANCED": "Sallaje avanzado",
-      "FILE": "Archivo llavero",
-      "PUBKEY": "Solo clave pública",
+      "SCRYPT_DEFAULT": "Estándar (por defecto)",
+      "SCRYPT_ADVANCED": "Aleatoriedad avanzada",
+      "FILE": "Archivo de llaves",
+      "PUBKEY": "Llave pública o seudónimo",
       "SCAN": "Escanear un código QR"
     },
     "SCRYPT": {
@@ -448,45 +462,141 @@
       "HELP": "Formato de archivo esperado: <b>.yml</b> o <b>.dunikey</b> (tipo PubSec, WIF o EWIF)."
     }
   },
+  "API": {
+    "COMMON": {
+        "CONNECTION_ERROR": "Nodo <b>{{server}}</b> inalcanzable o dirección inválida.<br/><br/>Verifique su conexión a Internet, o contacte con la administración del sitio.</a>.",
+        "LINK_DOC": "Documentación API",
+        "LINK_DOC_HELP": "Documentación para desarrolladores",
+        "LINK_STANDARD_APP": "Versión clásica",
+        "LINK_STANDARD_APP_HELP": "Abrir la versión clásica de {{'COMMON.APP_NAME'|translate}}"
+    },
+    "DOC": {
+        "AVAILABLE_PARAMETERS": "Lista de parámetros disponibles :",
+        "DEMO_CANCELLED": "<i class=\"icon ion-close\"></i> Cancelado por el usuario",
+        "DEMO_DIVIDER": "Probar",
+        "DEMO_HELP": "Para probar este servicio, haga clic en este botón. El resultado se mostrará debajo.",
+        "DEMO_RESULT": "Resultado retornado por la llamada :",
+        "DEMO_RESULT_PEER": "Dirección del nodo utilizado :",
+        "DEMO_SUCCEED": "<i class=\"icon ion-checkmark\"></i> ¡ Éxito !",
+        "DESCRIPTION_DIVIDER": "Descripción",
+        "INTEGRATE_CODE": "Código :",
+        "INTEGRATE_DIVIDER": "Integrar",
+        "INTEGRATE_PARAMETERS": "Parámetros",
+        "INTEGRATE_RESULT": "Previsualización del resultado :",
+        "PARAMETERS_DIVIDER": "Parámetros",
+        "TRANSFER": {
+            "DESCRIPTION": "Desde una web (ej: tienda online) puede delegar el pago en moneda libre con la API de Cesium. Para eso, simplemente ponga un link a la siguiente dirección :",
+            "EXAMPLE_BUTTON": "Botón HTML",
+            "EXAMPLE_BUTTON_BG_COLOR": "Color de fondo",
+            "EXAMPLE_BUTTON_BG_COLOR_HELP": "Ejemplo : #fbc14c, black, lightgrey, rgb(180,180,180)",
+            "EXAMPLE_BUTTON_DEFAULT_STYLE": "Estilo personalizado",
+            "EXAMPLE_BUTTON_DEFAULT_TEXT": "Pagar en {{currency|currencySymbol}}",
+            "EXAMPLE_BUTTON_FONT_COLOR": "Color del texto",
+            "EXAMPLE_BUTTON_FONT_COLOR_HELP": "Ejemplo : black, orange, rgb(180,180,180)",
+            "EXAMPLE_BUTTON_ICON_CESIUM": "Logo Cesium",
+            "EXAMPLE_BUTTON_ICON_DUNITER": "Logo Duniter",
+            "EXAMPLE_BUTTON_ICON_G1_BLACK": "Logo Äž1 (negro)",
+            "EXAMPLE_BUTTON_ICON_G1_COLOR": "Logo Äž1",
+            "EXAMPLE_BUTTON_ICON_NONE": "Ninguno",
+            "EXAMPLE_BUTTON_TEXT_HELP": "Texto del botón",
+            "EXAMPLE_BUTTON_TEXT_ICON": "Icono",
+            "EXAMPLE_BUTTON_TEXT_WIDTH": "Anchura",
+            "EXAMPLE_BUTTON_TEXT_WIDTH_HELP": "Ejemplo : 200px, 50%",
+            "EXAMPLES_HELP": "Ejemplos de integración :",
+            "PARAM_AMOUNT": "Cuantía",
+            "PARAM_AMOUNT_HELP": "Cuantía de la transición (obligatorio). Valores múltiples permitidos utilizando un separador (punto y coma, barra vertical o espacio).",
+            "PARAM_CANCEL_URL": "Dirección web de cancelación",
+            "PARAM_CANCEL_URL_HELP": "Dirección web (URL) en caso de anulación del pago por parte del usuario. Puede contener las siguientes palabras que serán remplazadas por sus valores dinámicamente en cada caso: \"{comment}\", \"{amount}\" y \"{pubkey}\".",
+            "PARAM_COMMENT": "Concepto (o comentario)",
+            "PARAM_COMMENT_HELP": "Concepto o comentario. Le permitirá por ejemplo identificar el pago en la cadena de bloques (blockchain).",
+            "PARAM_NAME": "Nombre (del destinatario o de su sitio web)",
+            "PARAM_NAME_HELP": "El nombre del destinatario, o de su sitio web. Puede ser un nombre leíble (\"Mi tienda en línea\"), o un dominio (\"Mitienda.com\").",
+            "PARAM_PREFERRED_NODE": "Dirección del nodo preferido",
+            "PARAM_PREFERRED_NODE_HELP": "Dirección (URL) del nodo Duniter a utilizar preferentemente (\"g1.domaine.com:443\" o \"https://g1.domaine.com\").",
+            "PARAM_PUBKEY": "Llave pública del destinatario",
+            "PARAM_PUBKEY_HELP": "La llave pública del destinatario (obligatoria)",
+            "PARAM_REDIRECT_URL": "Dirección web de redirección",
+            "PARAM_REDIRECT_URL_HELP": "Dirección web (URL) de redirección, llamada cuanda el pago ha sido enviado. Puede contener las palabras siguientes, que serán remplazadas por los valores de la transacción dinámicanente : \"{tx}\", \"{hash}\", \"{comment}\", \"{amount}\", \"{pubkey}\" y \"{node}\".",
+            "TITLE": "Pagos"
+        },
+        "URL_DIVIDER": "Dirección de llamada"
+    },
+    "HOME": {
+        "DOC_HEADER": "Servicios disponibles :",
+        "MESSAGE": "Bienvenido/a a la <b>documentación de la API</b> {{'COMMON.APP_NAME'|translate}}.<br/>Conecte sus sitios webs a la cadena de bloques <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> muy fácilmente !",
+        "MESSAGE_SHORT": "Conecte sus sitios a <a href=\"http://duniter.org\" target=\"_system\">Duniter</a> muy fácilmente !",
+        "TITLE": "Documentación API {{'COMMON.APP_NAME'|translate}}"
+    },
+    "TRANSFER": {
+        "AMOUNT": "Cuantía :",
+        "AMOUNTS_HELP": "Elija la cuantía :",
+        "COMMENT": "Concepto/Comentario de la operación :",
+        "DEMO": {
+            "BAD_CREDENTIALS": "Verifique sus credenciales.<br/>En modo demostración, las credenciales son : {{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}",
+            "HELP": "<b>Modo demostración</b> : Ningún pago será enviado realmente durante esta simulación.<br/>Utilice las credenciales : <b>{{'API.TRANSFER.DEMO.SALT'|translate}} / {{'API.TRANSFER.DEMO.PASSWORD'|translate}}</b>",
+            "PASSWORD": "demo",
+            "PUBKEY": "3G28bL6deXQBYpPBpLFuECo46d3kfYMJwst7uhdVBnD1",
+            "SALT": "demo"
+        },
+        "ERROR": {
+            "TRANSFER_FAILED": "Error en el pago"
+        },
+        "INFO": {
+            "CANCEL_REDIRECTING": "Pago cancelado.<br/>Redirigiendo al sitio del vendedor...",
+            "CANCEL_REDIRECTING_WITH_NAME": "Pago cancelado.<br/>Redirigiendo a <b>{{name}}</b>...",
+            "SUCCESS_REDIRECTING": "Pago enviado.<br/>Redirigiendo al sitio del vendedor...",
+            "SUCCESS_REDIRECTING_WITH_NAME": "Pago enviado.<br/>Redirigiendo a <b>{{name}}</b>..."
+        },
+        "NAME": "Nombre :",
+        "NODE": "Dirección del nodo :",
+        "PUBKEY": "Llave pública del destinatario :",
+        "SUMMARY": "Resumen del pago :",
+        "TITLE": "{{'COMMON.APP_NAME'|translate}} - Pago en línea",
+        "TITLE_SHORT": "Pago en línea"
+    }
+  },
   "AUTH": {
-    "TITLE": "<i class=\"icon ion-locked\"></i> AAutenticación",
+    "TITLE": "<i class=\"icon ion-locked\"></i> Autenticación",
     "BTN_AUTH": "Autenticar",
     "GENERAL_HELP": "Por favor, autentíquese:",
     "EXPECTED_UID_HELP": "Por favor inicie sesión en la cuenta de <i class=\"ion-person\"></i> {{uid}}:",
-    "EXPECTED_PUBKEY_HELP": "Por favor, autentifíquese en la monedero <i class=\"ion-key\"></i> {{pubkey|formatPubkey}} :",
-    "SCAN_FORM_HELP": "Escanee el código QR de la <b>clave privada</b> de la monedero."
+    "EXPECTED_PUBKEY_HELP": "Por favor, autentíquese en el monedero <br class=\"visible-xs\"/><i class=\"ion-key\"></i> {{pubkey|formatPubkey}} :",
+    "SCAN_FORM_HELP": "Escanee el código QR de la <b>llave privada</b> del monedero."
   },
   "ACCOUNT": {
     "TITLE": "Mi cuenta",
     "BALANCE": "Saldo",
-    "LAST_TX": "última validadas transacción",
+    "LAST_TX": "Últimas transacciones validadas",
     "BALANCE_ACCOUNT": "Saldo de la cuenta",
     "NO_TX": "Ninguna transacción",
     "SHOW_MORE_TX": "Mostrar más",
     "SHOW_ALL_TX": "Mostrar todo",
-    "TX_FROM_DATE": "(límite actual a {{fromTime|medianFromNowShort}})",
-    "PENDING_TX": "Transacciones en proceso de se procesadas",
+    "TX_FROM_DATE": "(mostrar solo {{fromTime|medianFromNowShort}})",
+    "OUT_DISTANCED": "Sus certificaciones recibidas provienen de un grupo demasiado aislado de la <a ng-click=\"showHelpModal('wot')\">Red de Confianza</a> (RdC) : la <a ng-click=\"showHelpModal('distance_rule')\">regla de distancia máxima</a> no se cumple.<br/>Deberá obtener certificaciones provinientes de otros sectores de la RdC, o esperar a que ésta estreche sus vínculos.",
+    "PENDING_TX": "Transacciones pendientes",
     "VALIDATING_TX": "Transacciones validadas",
     "ERROR_TX": "Transacciones no ejecutadas",
     "ERROR_TX_SENT": "Transacciones ejecutadas fallidas",
     "PENDING_TX_RECEIVED": "Tansacciones en espera de recepción",
     "EVENTS": "Eventos",
-    "WAITING_MEMBERSHIP": "Solicitud de adhesión emitida. En espera de aceptación.",
+    "WAITING_MEMBERSHIP": "Solicitud de membresía emitida. En espera de aceptación.",
     "WAITING_CERTIFICATIONS": "Debe obtener {{needCertificationCount}} certificación(es) para ser miembro.",
+    "WAITING_CERTIFICATIONS_HELP": "Para obtener sus certificaciones, solicitelas únicamente a miembros <b>que le conozcan bien (y en persona)</b>, como exige <a ng-click=\"showLicenseModal()\">la licencia de la moneda</a> que usted ha aceptado.<br/>Si no conoce lo suficiente a miembros, hágalo saber en <a ng-click=\"openLink($event, $root.settings.userForumUrl)\">el foro</a> para conocerlos en persona o asistir a algún encuentro.",
     "WILL_MISSING_CERTIFICATIONS": "Pronto le van a <b>faltar certificaciones</b> (al menos {{willNeedCertificationCount}} son necesarias)",
     "WILL_NEED_RENEW_MEMBERSHIP": "Su adhesión como miembro <b>va a expirar {{membershipExpiresIn|formatDurationTo}}</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a> mientras tanto.",
-    "NEED_RENEW_MEMBERSHIP": "No es miembro porque su adhesión <b>ha expirado</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a>.",
+    "NEED_RENEW_MEMBERSHIP": "Ya no es miembro porque su adhesión <b>ha expirado</b>. Piense en <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a>.",
+    "NEED_RENEW_MEMBERSHIP_AFTER_CANCELLED": "Ya no es miembro de la moneda, <b>por falta de certificaciones</b>. Considere <a ng-click=\"doQuickFix('renew')\">renovar su adhesión</a>.",
     "NO_WAITING_MEMBERSHIP": "No hay adhesión miembro en espera. Si desea <b>convertirse en miembro</b>, por favor <a ng-click=\"doQuickFix('membership')\">envíe su adhesión como miembro</a>.",
     "CERTIFICATION_COUNT": "Certificaciones recibidas",
     "CERTIFICATION_COUNT_SHORT": "Certificaciones",
     "SIG_STOCK": "Certificaciones emitidas",
     "BTN_RECEIVE_MONEY": "Recibir",
-    "BTN_SELECT_ALTERNATIVES_IDENTITIES": "Cambiar a otra identidad...",
-    "BTN_FIX_MEMBERSHIP": "Volver a enviar la adhesión...",
-    "BTN_MEMBERSHIP_RENEW": "Renovar la adhesión",
-    "BTN_MEMBERSHIP_RENEW_DOTS": "Renovar la adhesión...",
-    "BTN_MEMBERSHIP_OUT_DOTS": "Cancelar la adhesión...",
-    "BTN_SECURITY_DOTS": "Cuenta y securidad...",
+    "BTN_SELECT_ALTERNATIVES_IDENTITIES": "Cambiar a otra identidad…",
+    "BTN_FIX_MEMBERSHIP": "Volver a enviar la candidatura…",
+    "BTN_MEMBERSHIP_RENEW": "Renovar la membresía",
+    "BTN_MEMBERSHIP_RENEW_DOTS": "Renovar la membresía…",
+    "BTN_MEMBERSHIP_OUT_DOTS": "Cancelar la membresía…",
+    "BTN_SECURITY_DOTS": "Cuenta y seguridad…",
     "BTN_SHOW_DETAILS": "Publicar la información técnica",
     "LOCKED_OUTPUTS_POPOVER": {
       "TITLE": "Importe bloqueado",
@@ -495,35 +605,35 @@
       "LOCKED_AMOUNT": "Condiciones del importe:"
     },
     "NEW": {
-      "TITLE": "Inscripción",
-      "INTRO_WARNING_TIME": "Crear una cuenta en {{name|capitalize}} es muy simple. Sin embargo, por favor tome el tiempo suficiente para dar correctamente este paso (no olvidar los identificadores, frase secreta, etc.).",
-      "INTRO_WARNING_SECURITY": "Asegúrece de que el equipo que utiliza actualmente (ordenador, tableta, teléfono) <b>es seguro y digno de confianza</b>.",
-      "INTRO_WARNING_SECURITY_HELP": "Actualizaciones de antivirus, firewall activado, sesión protegidos por contraseña o código PIN, etc.",
+      "TITLE": "Registrarse",
+      "INTRO_WARNING_TIME": "Crear una cuenta en {{name|capitalize}} es muy simple. Sin embargo, por favor tome el tiempo suficiente para hacerlo correctamente (generar y memorizar bien las credenciales, etc.)",
+      "INTRO_WARNING_SECURITY": "Asegúrese de que el dispositivo actual (ordenador, tablet, teléfono) <b>es seguro y de confianza</b>.",
+      "INTRO_WARNING_SECURITY_HELP": "Antivirus, cortafuegos, sesión protegida por contraseña o número PIN, etc.",
       "INTRO_HELP": "Haga clic en <b>{{'COMMON.BTN_START'|translate}}</b> para iniciar la creación de la cuenta. Se le guiará paso a paso.",
       "REGISTRATION_NODE": "Su registro será grabado a través del nodo Duniter <b>{{server}}</b>, que luego se transmitirá al resto del sistema de la moneda.",
-      "REGISTRATION_NODE_HELP": "Si usted no confía en este nodo, <a ng-click=\"doQuickFix('settings')\">cambie la configuración</a> de Cesium.",
+      "REGISTRATION_NODE_HELP": "Si no confía en este nodo, <a ng-click=\"doQuickFix('settings')\">cambie los ajustes</a> de Cesium.",
       "SELECT_ACCOUNT_TYPE": "Elegir el tipo de cuenta a crear:",
       "MEMBER_ACCOUNT": "Cuenta miembro",
       "MEMBER_ACCOUNT_TITLE": "Crear una cuenta miembro",
-      "MEMBER_ACCOUNT_HELP": "Si aún no está inscrito como un individuo (Solamente una cuenta posible por individuo).",
+      "MEMBER_ACCOUNT_HELP": "Si todavía no tiene membresía (solamente una cuenta miembro posible por persona).",
       "WALLET_ACCOUNT": "Simple monedero",
       "WALLET_ACCOUNT_TITLE": "Crear una cuenta simple",
       "WALLET_ACCOUNT_HELP": "Monedero simple para todos los otros casos, por ejemplo si necesita una cuenta suplementaria.<br/>El Dividendo Universal no será producido para esta cuenta.",
-      "SALT_WARNING": "Elija su identificador secreto.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Retenga bien este identificador secreto</b>.<br/>¡En caso de pérdida, nadie podrá acceder a su cuenta!",
-      "PASSWORD_WARNING": "Elija su frase secreta.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Retenga bien esta frase secreta</b>.<br/>¡En caso de pérdida, nadie podrá acceder su cuenta!",
+      "SALT_WARNING": "Elija su identificador secreto.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien este identificador secreto</b>.<br/>¡En caso de pérdida, nadie podrá acceder a su cuenta!",
+      "PASSWORD_WARNING": "Elija su contraseña.<br/>Se solicitará cada vez que se conectará con esta cuenta.<br/><br/><b>Conserve bien esta contraseña</b>.<br/>¡En caso de pérdida, nadie podrá acceder su cuenta!",
       "PSEUDO_WARNING": "Elija un seudónimo.<br/>Sirve para que los otros miembros puedan encontrarlo más fácilmente.<br/><br/>No debe contener <b>ni espacios ni caracteres acentuados</b>.<div class='hidden-xs'><br/>Ejemplo: <span class='gray'>SophieDupond, MarcelChemin, etc.</span>",
       "PSEUDO": "Seudónimo",
       "PSEUDO_HELP": "Seudónimo",
       "SALT_CONFIRM": "Confirmación",
       "SALT_CONFIRM_HELP": "Confirmación del identificador secreto",
       "PASSWORD_CONFIRM": "Confirmación",
-      "PASSWORD_CONFIRM_HELP": "Confirmación de la frase secreta",
+      "PASSWORD_CONFIRM_HELP": "Confirmación de la contraseña",
       "SLIDE_6_TITLE": "Confirmación:",
-      "COMPUTING_PUBKEY": "Cálculo en proceso...",
-      "LAST_SLIDE_CONGRATULATION": "<b>¡Bien!</b> Ha introducido todas los datos necesarias.<br/><b>Puede solicitar</b> la creación de su cuenta.</b><br/><br/>Para su información, la llave pública que se muestra más abajo identificará su futura cuenta.<br/>Esta podrá ser comunicada a terceros para recibir sus pagos.<br/>Sin embargo, <b>no es útil</b> anotarla aquí.",
-      "CONFIRMATION_MEMBER_ACCOUNT": "<b class=\"assertive\">Advertencia:</b> el identificador secreto, la frase secreta y el seudónimo no podrán estar modificados.<br/><b>¡Asegúrese siempre de recordarlos!</b><br/><br/><b>¿Está usted seguro</b> de querer solicitar la inscripción?",
-      "CONFIRMATION_WALLET_ACCOUNT": "<b class=\"assertive\">Advertencia:</b> el identificador secreto y la frase secreta no podrán estar modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Está usted seguro</b> de querer continuar con estos identificadores?",
-      "CHECKING_PSEUDO": "Comprobar de disponibilidad...",
+      "COMPUTING_PUBKEY": "Cálculo en proceso…",
+      "LAST_SLIDE_CONGRATULATION": "<b>¡Bien!</b> Ha introducido todas los datos necesarios.<br/><b>Puede solicitar</b> la creación de su cuenta.</b><br/><br/>Para su información, la llave pública que se muestra más abajo identificará su futura cuenta.<br/>Esta podrá ser comunicada a terceros para recibir pagos.",
+      "CONFIRMATION_MEMBER_ACCOUNT": "<b class=\"assertive\">Advertencia:</b> el identificador secreto, la contraseña y el seudónimo no podrán ser modificados.<br/><b>¡Asegúrese siempre de recordarlos!</b><br/><br/><b>¿Desea</b> solicitar la inscripción?",
+      "CONFIRMATION_WALLET_ACCOUNT": "<b class=\"assertive\">Advertencia:</b> el identificador secreto y la contraseña no podrán ser modificados.<br/><b>¡Asegúrese de recordarlos siempre!</b><br/><br/><b>¿Desea</b> continuar?",
+      "CHECKING_PSEUDO": "Verificando…",
       "PSEUDO_AVAILABLE": "Este nombre está disponible",
       "PSEUDO_NOT_AVAILABLE": "Este nombre de usuario no está disponible",
       "INFO_LICENSE": "Para unirse a la moneda, le pedimos leer y aceptar esta licencia.",
@@ -536,65 +646,101 @@
     },
     "SELECT_IDENTITY_MODAL": {
       "TITLE": "Selección de identidad",
-      "HELP": "Se han enviado varias <b>identidades diferentes</b> para la clave pública <span class=\"gray\"><i class=\"ion-key\"></i>{{pubkey | formatPubkey}}</span>.<br/>Por favor, selecciona la carpeta para usar:"
+      "HELP": "Se han enviado varias <b>identidades diferentes</b> para la llave pública <span class=\"gray\"><i class=\"ion-key\"></i>{{pubkey | formatPubkey}}</span>.<br/>Por favor, selecciona la carpeta para usar:"
     },
     "SELECT_WALLET_MODAL": {
       "TITLE": "Selección de monedero"
     },
     "WALLET_LIST": {
+      "IMPORT_MODAL": {
+        "HELP": "Para <b>importar monederos</b>, haga clic para seleccionar o arrastre en la zona de abajo el archivo con la lista de monederos.",
+        "NO_NEW_WALLET": "Ningún monedero nuevo",
+        "TITLE": "Importar monederos",
+        "WALLET_COUNT": "<b>{{count}}</b> nuevo{{count > 1 ? 's' : ''}} monedero{{count > 1 ? 's' : ''}}"
+      },
       "TITLE": "Mis monederos",
       "BTN_NEW": "Añadir un monedero",
-      "BTN_DOWNLOAD": "Descargue la lista",
-      "BTN_IMPORT_FILE_DOTS": "Importar desde un archivo...",
-      "NO_WALLET": "Sin monedero secundaria",
-      "BTN_DELETE": "Eliminar una monedero secundaria...",
+      "BTN_DOWNLOAD": "Descargue el listado",
+      "BTN_IMPORT_FILE_DOTS": "Importar desde fichero…",
+      "NO_WALLET": "Sin monedero secundario",
+      "BTN_DELETE": "Eliminar un monedero secundario…",
       "BTN_RENAME": "Renombrar el monedero",
       "EXPORT_FILENAME": "monederos-{{pubkey|formatPubkey}}-{{currency}}.csv",
+      "TOTAL_DOTS": "Total : ",
       "EDIT_POPOVER": {
         "TITLE": "Renombrar el monedero",
-        "HELP": "Completa el nuevo nombre",
-        "NAME_HELP": "Nombre de la monedero"
+        "HELP": "Escribe el nuevo nombre",
+        "NAME_HELP": "Nombre del monedero"
       }
     },
     "SECURITY": {
-      "ADD_QUESTION": "Añadir una pregunta personalizada",
+      "KEYFILE": {
+        "ERROR": {
+            "BAD_CHECKSUM": "Suma de control (checksum) incorrecta",
+            "BAD_PASSWORD": "Frase secreta incorrecta"
+        },
+        "EWIF_FORMAT": "Formato EWIF (Encrypted Wallet Import Format) - v1",
+        "EWIF_FORMAT_HELP": "Este formato almacena su archivo de llaves <b>de forma cifrada</b> a partir de una frase secreta de su elección. También guarda una suma de control (checksum) para verificar la integridad del archivo.<br/><b>Atención :</b>¡ Asegúrese siempre de recordar su frase secreta !",
+        "PASSWORD_POPUP": {
+            "HELP": "Indique la frase secreta :",
+            "PASSWORD_HELP": "Frase secreta",
+            "TITLE": "Archivo de llaves cifrado"
+        },
+        "PUBSEC_FORMAT": "Formato PubSec",
+        "PUBSEC_FORMAT_HELP": "Este formato almacena su archivo de llaves de forma simple. Es compatible con Cesium, ğannonce y Duniter.<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !",
+        "WIF_FORMAT": "Formato WIF (Wallet Import Format) - v1",
+        "WIF_FORMAT_HELP": "Este formato almacena su archivo de llaves con una suma de control (checksum) para verificar la integridad del archivo. Es compatible con los monederos en papel (Duniter paper wallet).<br/><b>Atención :</b>El archivo <b>no está cifrado</b> (la llave privada aparece en claro) ; ¡ guárdelo en un lugar seguro !"
+      },
+      "ADD_QUESTION": "Añadir pregunta personalizada",
       "BTN_CLEAN": "Limpiar",
-      "BTN_RESET": "Reinicializar",
-      "DOWNLOAD_REVOKE": "Grabar un fichero de revocación",
-      "HELP_LEVEL": "Para generar un fichero de respaldo de sus identificadores, elija <strong> al menos {{nb}} preguntas:</strong>",
+      "BTN_RESET": "Reiniciar",
+      "DOWNLOAD_REVOKE": "Guardar un archivo de revocación",
+      "DOWNLOAD_REVOKE_HELP" : "Tener un archivo de revocación es importante, en caso de perdida de las credenciales. Le permitirá <b>invalidar y sacar su cuenta miembro fuera de la Red de Confianza</b>, convirtíendose en un monedero simple.",
+      "RECOVER_ID_SELECT_FILE": "Elija el <b>archivo para salvaguardar sus credenciales</b> a utilizar :",
+      "GENERATE_KEYFILE": "Generar mi archivo de llaves…",
+      "GENERATE_KEYFILE_HELP": "Genera un archivo que le permitirá atenticarse sin tener que introducir las credenciales.<br/><b>Cuidado:</b> este archivo contendrá su llave secreta; ¡Es muy importante conservarlo en un lugar seguro!",
+      "KEYFILE_FILENAME": "llavero-{{pubkey|formatPubkey}}-{{currency}}-{{format}}.dunikey",
+      "MEMBERSHIP_IN": "Registrarse como miembro…",
+      "MEMBERSHIP_IN_HELP": "Le permite <b>transformar</b> una cuenta de monedero simple <b>en una cuenta miembro</b>, enviando una petición de membresía. Solo si todavía no tiene una cuenta miembro.",
+      "SEND_IDENTITY": "Publicar identidad…",
+      "SEND_IDENTITY_HELP": "Le permite asociar un seudónimo a esta cuenta, pero <b>sin pedir ser miembro</b>. La validez de este seudónimo tiene un plazo limitado.",
+      "HELP_LEVEL": "Elija <strong> al menos {{nb}} preguntas:</strong>",
       "LEVEL": "Nivel de seguridad",
-      "LOW_LEVEL": "Bajo <span class=\"hidden-xs\">(mínimo dos preguntas)</span>",
-      "MEDIUM_LEVEL": "Medio <span class=\"hidden-xs\">(mínimo cuatro preguntas)</span>",
+      "LOW_LEVEL": "Bajo <span class=\"hidden-xs\">(2 preguntas min.)</span>",
+      "MEDIUM_LEVEL": "Medio <span class=\"hidden-xs\">(4 preguntas min.)</span>",
       "QUESTION_1": "¿Cómo se llamaba su mejor amigo de la adolescencia?",
       "QUESTION_2": "¿Cómo se llamaba su primer animal de compañía?",
       "QUESTION_3": "¿Cuál es el primer plato que aprendió a cocinar?",
       "QUESTION_4": "¿Cuál es la primera película que vió en un cine?",
       "QUESTION_5": "¿Cuál era el destino del primer avión que cogió?",
-      "QUESTION_6": "¿Cómo se llamaba su maestro favorito en la escuela primaria?",
+      "QUESTION_6": "¿Cómo se llamaba su docente favorito en la escuela primaria?",
       "QUESTION_7": "¿Cuál sería para usted el mejor oficio?",
-      "QUESTION_8": "¿Cuál es su libro para niños preferido?",
+      "QUESTION_8": "¿Cuál es su libro infantil preferido?",
       "QUESTION_9": "¿Cuál fue el modelo de su primer vehículo?",
-      "QUESTION_10": "¿Cuál fue su sobrenombre cuando era niña(o)?",
+      "QUESTION_10": "¿Cuál fue su sobrenombre durante su infancia?",
       "QUESTION_11": "¿Cuál fue su personaje o actor/actriz preferido/a cuando era estudiante?",
-      "QUESTION_12": "¿Cuál fue su cantante o grupo preferido/a cuando era estudiante?",
+      "QUESTION_12": "¿Cuál fue su cantante o grupo preferido cuando era estudiante?",
       "QUESTION_13": "¿En qué ciudad sus padres se encontraron?",
-      "QUESTION_14": "¿Cómo se llamaba su primer jefe?",
+      "QUESTION_14": "¿Cómo se llamaba su primer jefe/a?",
       "QUESTION_15": "¿Cómo se llama la calle donde creció?",
       "QUESTION_16": "¿Cómo se llama la primera playa donde se bañó?",
       "QUESTION_17": "¿Cuál es el primer álbum que compró?",
       "QUESTION_18": "¿Cuál es el nombre de su equipo deportivo preferido?",
       "QUESTION_19": "¿Cuál fue el oficio de su abuelo?",
-      "RECOVER_ID": "Recuperar sus identificadores",
+      "RECOVER_ID": "Recuperar sus credenciales",
       "REVOCATION_WITH_FILE": "Revocar una identidad a partir de un fichero",
-      "REVOCATION_WITH_FILE_DESCRIPTION": "Si ha perdido las credenciales de su cuenta de miembro de forma permanente (o la seguridad de la cuenta se ve comprometida), puede usar <b>el archivo de revocación de la cuenta</b> para forzar publicación final de la web de confianza.",
-      "REVOCATION_WITH_FILE_HELP": "Para <b>revocar permanentemente</b> una cuenta de miembro, arrastre el archivo de revocación en el cuadro siguiente o haga clic en el cuadro para buscar un archivo.",
-      "REVOCATION_FILENAME": "revocation-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",
+      "REVOCATION_WITH_FILE_DESCRIPTION": "Si ha perdido de forma permanente las credenciales de su cuenta miembro (o la seguridad de la cuenta se ve comprometida), puede usar <b>el archivo de revocación de la cuenta</b> para forzar la salida de la Red de Confianza.",
+      "REVOCATION_WITH_FILE_HELP": "Para <b>revocar permanentemente</b> una cuenta miembro, arrastre el archivo de revocación en el cuadro siguiente o haga clic en el cuadro para seleccionar un archivo.",
+      "REVOCATION_FILENAME": "revocacion-{{uid}}-{{pubkey|formatPubkey}}-{{currency}}.txt",
       "REVOCATION_WALLET": "Revocar esta identidad",
-      "SAVE_ID": "Grabar sus identificadores",
-      "STRONG_LEVEL": "Alto <span class=\"hidden-xs \">(6 preguntas mínimo)</span>",
-      "TITLE": "Cuenta y seguridad"
+      "SAVE_ID": "Guardar mis credenciales",
+      "STRONG_LEVEL": "Alto <span class=\"hidden-xs \">(6 preguntas min.)</span>",
+      "TITLE": "Cuenta y seguridad",
+      "RECOVER_ID_HELP": "Si dispone de un <b>archivo de recuperación de sus credenciales</b>, las puede reobtener respondiendo correctamente a las preguntas personales elegidas en su momento.",
+      "REVOCATION_WALLET_HELP": "Pedir la revocación de vuestra identidad comporta la <b>salida de la red de confianza</b> (definitiva para el seudónimo y la llave pública asociada). La cuenta no producirá ya más el Dividendo Universal.<br/>Podrá seguir usándola como monedero simple.",
+      "SAVE_ID_HELP": "Creación de un archivo de recuperación, para <b>reobtener su contraseña</b> (e identificador secreto) en caso de olvido. El archivo se <b>cifra</b> con ayuda de las preguntas personales elegidas."
     },
-    "FILE_NAME": "{{currency}} - Estado de cuenta {{pubkey|formatPubkey}} a {{currentTime|formatDateForFile}}.csv",
+    "FILE_NAME": "{{currency}}_HistorialDeCuenta_{{pubkey|formatPubkey}}_{{currentTime|formatDateForFile}}.csv",
     "HEADERS": {
       "TIME": "Fecha",
       "AMOUNT": "Cantidad",
@@ -620,12 +766,22 @@
     }
   },
   "ERROR": {
+    "ADD_SECONDARY_WALLET_FAILED": "Error añadiendo el monedero secundario.",
+    "COULD_NOT_ADD_EXISTING_WALLET": "Monedero ya existe en la lista.",
+    "COULD_NOT_ADD_MAIN_WALLET": "Este monedero <b>corresponde a la cuenta principal</b> con la que se conecta.<br/>Imposible añadirlo como monedero secundario.",
+    "ISSUE_524_TX_FAILED": "Error en la transferencia.<br/><br/>Un mensaje ha sido enviado a los/as desarrolladores/as para facilitar la resolución del problema. <b>Gracias por su ayuda</b>.",
+    "LOAD_WALLET_LIST_FAILED": "Error cargando los monederos secundarios.",
+    "ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION": "Usted debe <b>ser miembro (o haber sido miembro)</b> para poder efectuar esta acción.",
+    "RESTORE_WALLET_LIST_FAILED": "Error en la restauración de los monederos secundarios.",
+    "SAVE_WALLET_LIST_FAILED": "Error al guardar los monederos secundarios.",
+    "UNKNOWN_WALLET_ID": "Monedero secundario desconocido.",
+    "UPDATE_WALLET_LIST_FAILED": "Error en la actualización de los monederos secundarios.",
     "UNKNOWN_URI_FORMAT": "Formato URI desconocido",
-    "PUBKEY_INVALID_CHECKSUM": "Clave pública no válida (suma de comprobación incorrecta).",
+    "PUBKEY_INVALID_CHECKSUM": "Llave pública no válida (suma de comprobación incorrecta).",
     "POPUP_TITLE": "Error",
     "UNKNOWN_ERROR": "Error desconocido",
     "CRYPTO_UNKNOWN_ERROR": "Su navegador parece incompatible con las funcionalidades de cryptografía.",
-    "DOWNLOAD_KEYFILE_FAILED": "Error al generar el archivo de llavero.",
+    "DOWNLOAD_KEYFILE_FAILED": "Error al generar el archivo de llaves.",
     "EQUALS_TO_PSEUDO": "Debe ser diferente del seudónimo.",
     "EQUALS_TO_SALT": "Debe ser diferente del identificador secreto.",
     "FIELD_REQUIRED": "Campo obligatorio.",
@@ -638,14 +794,14 @@
     "FIELD_ACCENT": "Caracteres acentuados y comas no autorizados",
     "FIELD_NOT_NUMBER": "Valor numérico esperado",
     "FIELD_NOT_INT": "Valor entero esperado",
-    "FIELD_NOT_EMAIL": "Email no válido",
-    "PASSWORD_NOT_CONFIRMED": "No corresponde a la frase secreta.",
-    "SALT_NOT_CONFIRMED": "No corresponde al identificador secreto.",
+    "FIELD_NOT_EMAIL": "Correo electrónico no válido",
+    "PASSWORD_NOT_CONFIRMED": "No coincide con la contraseña anterior.",
+    "SALT_NOT_CONFIRMED": "No corresponde al identificador secreto anterior.",
     "SEND_IDENTITY_FAILED": "Error de la inscripción.",
     "SEND_CERTIFICATION_FAILED": "Error de la certificación.",
     "NEED_MEMBER_ACCOUNT_TO_CERTIFY": "No se puede certificar, porque su cuenta no <b>es miembro</b>.",
-    "NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF": "No se puede certificar, porque su cuenta ya no es miembro.<br/><br/>Todavía faltan certificaciones, o ahora no son validas.",
-    "IDENTITY_TO_CERTIFY_HAS_NO_SELF": "Cuenta no certificable. No se ha solicitado la adhesión, o no fue renovada.",
+    "NEED_MEMBER_ACCOUNT_TO_CERTIFY_HAS_SELF": "No se puede certificar, porque su cuenta todavía no es miembro.<br/><br/>Todavía faltan certificaciones para serlo.",
+    "IDENTITY_TO_CERTIFY_HAS_NO_SELF": "Esta cuenta no se pudo certificar. No se ha solicitado la membresía, o se necesita renovarla.",
     "LOGIN_FAILED": "Error durante la autentificación.",
     "LOAD_IDENTITY_FAILED": "Error de carga de la identidad.",
     "LOAD_REQUIREMENTS_FAILED": "Error de carga de las condiciones de la identidad.",
@@ -658,7 +814,7 @@
     "ALL_SOURCES_USED": "Por favor, espera el cálculo del bloque siguiente (Todas sus fuentes de moneda fueron utilizada).",
     "NOT_ENOUGH_SOURCES": "No lo bastante cambio para mandar este importe en una sola transacción.<br/>Importe máximo: {{amount}} {{unit}}<sub>{{subUnit}}</sub>.",
     "ACCOUNT_CREATION_FAILED": "Error en la creación de la cuenta miembro.",
-    "RESTORE_WALLET_DATA_ERROR": "Error en la recarga de las configuración desde el almacenamiento local",
+    "RESTORE_WALLET_DATA_ERROR": "Error en la recarga de los ajustes desde el almacenamiento local",
     "LOAD_WALLET_DATA_ERROR": "Error en la carga de los datos del monedero.",
     "COPY_CLIPBOARD_FAILED": "Copia de la valor imposible.",
     "TAKE_PICTURE_FAILED": "Error en la recuperación de la foto.",
@@ -673,16 +829,16 @@
     "INVALID_NODE_SUMMARY": "Nodo ilocalizable o dirección inválida.",
     "INVALID_USER_ID": "El seudónimo no debe contener ni espacios ni caracteres especiales o acentuado.",
     "INVALID_COMMENT": "El campo 'referencia’ no debe contener carácteres acentuados.",
-    "INVALID_PUBKEY": "La clave pública no tiene el formato esperado.",
+    "INVALID_PUBKEY": "La llave pública no tiene el formato esperado.",
     "INVALID_PUBKEY_CHECKSUM": "Suma de comprobación inválida.",
-    "IDENTITY_REVOKED": "Esta identidad <b>fue revocada</b>. No puede estar miembro.",
-    "IDENTITY_REVOKED_WITH_TIME": "Esta identidad <b>fue revocada {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). No puede estar miembro.",
+    "IDENTITY_REVOKED": "Esta identidad <b>fue revocada</b>. No puede volver a convertirla en miembro.",
+    "IDENTITY_REVOKED_WITH_TIME": "Esta identidad <b>fue revocada {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). No puede volver a convertirla en miembro.",
     "IDENTITY_PENDING_REVOCATION": "La <b>revocación de esta identidad</b> fue solicitado y esta en espera de tratamiento. Por lo que, la certificación es desactivada.",
     "IDENTITY_INVALID_BLOCK_HASH": "Esta solicitud de adhesión no es valida (porque denomina un bloque los nodos de la red han anulado): esta persona debe renovelar su solicitud de adhesión <b>antes que</b> estar certificada.",
     "IDENTITY_EXPIRED": "La publicación de esta identidad ha caducada: esta persona debe realizar una nueva solicitud de adhesión <b>antes que</b> estar certificada.",
-    "IDENTITY_SANDBOX_FULL": "EL nodo Duniter utilizado por Cesium ya no puede recibir más nuevas identidades, porque la fila de espera es llena.<br/><br/>Por favor, intenta ulteriormente o cambia de nodo (vía el menú <b>Paramètres</b>).",
+    "IDENTITY_SANDBOX_FULL": "EL nodo Duniter utilizado por Cesium ya no puede recibir más nuevas identidades, porque la fila de espera es llena.<br/><br/>Por favor, intenta ulteriormente o cambia de nodo (vía el menú <b>Ajustes</b>).",
     "IDENTITY_NOT_FOUND": "Identidad no encontrada",
-    "IDENTITY_TX_FAILED": "Las operaciones de carga fallidos",
+    "IDENTITY_TX_FAILED": "Error cargando las transacciones de la identidad",
     "WOT_PENDING_INVALID_BLOCK_HASH": "Adhesión no validada.",
     "WALLET_INVALID_BLOCK_HASH": "Su solicitud de adhesión ya no está validada (porque denomina un bloque los nodos de la red han anulado).<br/>Debe <a ng-click=\"doQuickFix('fixMembership')\">mandar una nueva solicitud</a> para resolver este problema.",
     "WALLET_IDENTITY_EXPIRED": "La publicación de <b>su identidad ha caducada</b>.<br/>Debe <a ng-click=\"doQuickFix('fixIdentity')\">publicar une outra vez su identidad</a> para resolver este problema.",
@@ -696,24 +852,24 @@
     "IDENTITY_ALREADY_CERTIFY": "Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación todavía es valida (expiration {{expiresIn|formatDurationTo}}).",
     "IDENTITY_ALREADY_CERTIFY_PENDING": "Ha <b>ya certificado</b> esta identidad.<br/><br/>Esta certificación está en espera de tratamiento (fecha límite de tratamiento {{expiresIn|formatDurationTo}}).",
     "UNABLE_TO_CERTIFY_TITLE": "Certificación imposible",
-    "LOAD_NEWCOMERS_FAILED": "Error el la carga de los miembros nuevos.",
-    "LOAD_PENDING_FAILED": "Error el la carga de las inscripciones en espera.",
-    "ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION": "Debe <b>estar miembro</b> para poder realizar esta acción.",
+    "LOAD_NEWCOMERS_FAILED": "No se pudo cargar las nuevas membresías.",
+    "LOAD_PENDING_FAILED": "No se pudo cargar las inscripciones pendientes.",
+    "ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION": "Debe <b>ser miembro</b> para poder realizar esta acción.",
     "ONLY_SELF_CAN_EXECUTE_THIS_ACTION": "Debe haber <b>publicado su identidad</b> para poder realizar esta acción.",
     "GET_BLOCK_FAILED": "Error en la recuperación del bloque",
     "INVALID_BLOCK_HASH": "Bloque no encontrado (hash diferente)",
     "DOWNLOAD_REVOCATION_FAILED": "Debe seleccionar un fichero de texto",
     "REVOCATION_FAILED": "Error en la revocación.",
     "SALT_OR_PASSWORD_NOT_CONFIRMED": "Identificador secreto o contraseña incorrectos",
-    "RECOVER_ID_FAILED": "Error en la recuperación de los identificadores",
-    "LOAD_FILE_FAILED": "Error en la carga del fichero",
+    "RECOVER_ID_FAILED": "Error en la recuperación de las credenciales",
+    "LOAD_FILE_FAILED": "Error en la carga del archivo",
     "NOT_VALID_REVOCATION_FILE": "Archivo de revocación no válido (formato de archivo erróneo)",
     "NOT_VALID_SAVE_ID_FILE": "Archivo no válido (formato de archivo erróneo)",
     "NOT_VALID_KEY_FILE": "Archivo no válido (formato de archivo erróneo)",
-    "EXISTING_ACCOUNT": "Su frase secreta corresponde a una cuenta existente, la <a ng-click=\"showHelpModal('pubkey')\">clave pública</a> es:",
-    "EXISTING_ACCOUNT_REQUEST": "Por favor, cambie su frase secreta para que coincida con una cuenta sin usar.",
+    "EXISTING_ACCOUNT": "Sus credenciales corresponden a una cuenta existente, la <a ng-click=\"showHelpModal('pubkey')\">llave pública</a> es:",
+    "EXISTING_ACCOUNT_REQUEST": "Por favor, cambie sus credenciales para que coincida con una cuenta sin usar.",
     "GET_LICENSE_FILE_FAILED": "Error al obtener el archivo de licencia",
-    "CHECK_NETWORK_CONNECTION": "Ningún nodo parece alcanzable.<br/><br/><b>Compruebe la conexión a Internet</b>.",
+    "CHECK_NETWORK_CONNECTION": "No se puede conectar a ningún nodo.<br/><br/><b>Compruebe la conexión a Internet</b>.",
     "INVALID_FILE_FORMAT": "Formato de archivo inválido.",
     "SAME_TX_RECIPIENT": "El destinatario debe ser diferente del emisor."
   },
@@ -727,7 +883,7 @@
     "NOT_NEED_MEMBERSHIP": "Ya es miembro.",
     "IDENTITY_WILL_MISSING_CERTIFICATIONS": "Esta identidad pronto va a necesitar certificaciones (al menos {{willNeedCertificationCount}}).",
     "IDENTITY_NEED_MEMBERSHIP": "Esta identidad no envió una solicitud de membresía. Ella tendrá que hacerlo si desea hacerse miembro.",
-    "HAS_ALTERNATIVE_IDENTITIES": "Hay <b>identidades múltiples</b> adjuntas a esta clave pública. <b>Antes de cualquier certificación</b>, <a ng-click=\"doQuickFix('showSelectIdentities')\">verifique otras identidades</a> para elegir la correcta o comuníquese con el propietario de la cuenta.",
+    "HAS_ALTERNATIVE_IDENTITIES": "Hay <b>identidades múltiples</b> adjuntas a esta llave pública. <b>Antes de cualquier certificación</b>, <a ng-click=\"doQuickFix('showSelectIdentities')\">verifique otras identidades</a> para elegir la correcta o comuníquese con el propietario de la cuenta.",
     "REVOCATION_SENT": "Revocación enviada",
     "REVOCATION_SENT_WAITING_PROCESS": "La <b>revocación de esta identidad</b> fue solicitada y está en espera de ser procesada.",
     "FEATURES_NOT_IMPLEMENTED": "Esta funcionalidad todavía está en proceso de desarrollo.<br/><br/>¿Por qué no <b>contribuir a Cesium</b>, para obtenerla más rápido? ;)",
@@ -737,61 +893,92 @@
     "POPUP_TITLE": "<b>Confirmación</b>",
     "POPUP_WARNING_TITLE": "<b>Advertencia</b>",
     "POPUP_SECURITY_WARNING_TITLE": "<i class=\"icon ion-alert-circled\"></i> <b>Advertencia de seguridad</b>",
-    "CERTIFY_RULES_TITLE_UID": "Certificar {{uid}}", "CERTIFY_RULES": "<b class=\"assertive\">NO CERTIFICAR</b> una cuenta si piense que :<br/><br/><ul><li>1.) no corresponde a una persona <b>física y viviente</b>.<li>2.) su propietario <b>posee una otra cuenta</b> ya certificada.<li>3.) su propietario viola (voluntariamente o no) la regla 1 o 2 (por ejemplo certificando cuentas falsas o duplicadas).</ul><br/><b>¿Está usted seguro</b> sin embargo querer certificar esta identidad?",
-    "TRANSFER": "<b>Recapitulativo de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li></ul><br/><b>¿Está usted seguro de querer realizar esta transferencia?</b>",
-    "TRANSFER_ALL": "<b>Recapitulativo de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> para <b>{{restTo}}</b></li></ul><br/><b>¿Está usted seguro de querer realizar esta transferencia?</b>",
-    "MEMBERSHIP_OUT": "Esta operación es <b>irreversible</b>.<br/></br/>¿Está usted seguro querer <b>anular su cuenta miembro</b>?",
-    "MEMBERSHIP_OUT_2": "¡Esta operación es <b>irreversible</b>!<br/><br/>¿Está usted seguro querer <b>anular su adhesión</b> como miembro?",
+    "CERTIFY_RULES_TITLE_UID": "Certificar {{uid}}",
+    "CERTIFY_RULES": "<b class=\"assertive\">NO CERTIFICAR</b> una cuenta si piensa que :<br/><br/><ul><li>1.) no corresponde a una persona <b>física y viva</b>.<li>2.) su propietario <b>posee otra cuenta</b> ya certificada.<li>3.) su propietario viola (voluntariamente o no) la regla 1 o 2 (por ejemplo certificando cuentas falsas o duplicadas).</ul><br/><b>¿Desea</b> todavía certificar esta identidad?",
+    "FULLSCREEN": "¿ Mostrar la aplicación en pantalla completa ?",
+    "EXIT_APP": "¿ Cerrar la aplicación ?",
+    "TRANSFER": "<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li></ul><br/><b>Desea realizar esta transferencia?</b>",
+    "TRANSFER_ALL": "<b>Resumen de la transferencia</b>:<br/><br/><ul><li> - De: {{from}}</li><li> - A: <b>{{to}}</b></li><li> - Importe: <b>{{amount}} {{unit}}</b></li><li> - Comentario: <i>{{comment}}</i></li><br/><li> - Resto: <b>{{restAmount}} {{unit}}</b> para <b>{{restTo}}</b></li></ul><br/><b>¿Desea realizar esta transferencia?</b>",
+    "MEMBERSHIP_OUT": "Esta operación es <b>irreversible</b>.<br/></br/>¿Desea <b>anular su cuenta miembro</b>?",
+    "MEMBERSHIP_OUT_2": "¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>anular su candidatura</b> como miembro?",
     "LOGIN_UNUSED_WALLET_TITLE": "¿Error de introducción de datos?",
-    "LOGIN_UNUSED_WALLET": "Está usted conectado a une cuenta que parece <b>inactiva</b>.<br/><br/>Si esta cuenta no corresponde a la suya, se trata probablemente de un <b>error al introducir los datos</b> de sus identificadores de conexión.<br/></br/><b>¿Quiere usted sin embargo continuar con esta cuenta?</b>",
-    "FIX_IDENTITY": "El seudónimo <b>{{uid}}</b> va a ser publicado de nuevo, en reemplazo del antiguo que caducó.<br/></br/><b>¿Está usted seguro</b> de querer continuar?",
-    "FIX_MEMBERSHIP": "Su solicitud de adhesión como miembro va a ser enviada de nuevo.<br/></br/><b>¿Está usted seguro</b>de querer continuar?",
-    "MEMBERSHIP": "Se enviará su solicitud de membresía como miembro.<br/></br/><b>¿Está usted seguro</b>de querer continuar?",
-    "RENEW_MEMBERSHIP": "Su adhesión como miembro va a estar renovada.<br/></br/><b>¿Está usted seguro</b>de querer continuar?",
-    "REVOKE_IDENTITY": "Va a <b>revocar definitivamente esta identidad</b>.<br/><br/>La llave pública y el seudónimo asociados <b>jamás podrán ser utilizados</b> (para una cuenta miembro). <br/></br/><b>¿Está usted seguro</b> de querer revocar definitivamente esta cuenta?",
-    "REVOKE_IDENTITY_2": "¡Esta operación es <b>irreversible</b>!<br/><br/>¿Está usted seguro de querer <b>revocar definitivamente</b> esta cuenta?",
-    "NOT_NEED_RENEW_MEMBERSHIP": "Su adhesión no necesita ser renovada (solo va a caducar en {{membershipExpiresIn|formatDuration}}).<br/></br/><b>¿Está usted segura(o)</b> de querer renovar su adhesión?",
-    "SAVE_BEFORE_LEAVE": "¿Quiere usted <b>guardar sus cambios</b> antes dejar la página?",
+    "LOGIN_UNUSED_WALLET": "Las credenciales introducidas corresponden a una cuenta que parece <b>inactiva</b>.<br/></br/><b>¿Quiere sin embargo continuar con esta cuenta?</b>",
+    "FIX_IDENTITY": "El seudónimo <b>{{uid}}</b> va a ser publicado de nuevo, en reemplazo del antiguo que caducó.<br/></br/><b>¿Desea</b> continuar?",
+    "FIX_MEMBERSHIP": "Su solicitud de adhesión como miembro va a ser enviada de nuevo.<br/></br/><b>¿Desea</b> continuar?",
+    "MEMBERSHIP": "Se enviará su solicitud de membresía como miembro.<br/></br/><b>¿Desea</b> continuar?",
+    "RENEW_MEMBERSHIP": "Su adhesión como miembro va a estar renovada.<br/></br/><b>¿Desea</b> continuar?",
+    "REVOKE_IDENTITY": "Va a <b>revocar definitivamente esta identidad</b>.<br/><br/>La llave pública y el seudónimo asociados <b>jamás podrán ser utilizados</b> (para una cuenta miembro). <br/><br/><b>¿Desea</b> revocar definitivamente esta cuenta?",
+    "REVOKE_IDENTITY_2": "¡Esta operación es <b>irreversible</b>!<br/><br/>¿Desea <b>revocar definitivamente</b> esta cuenta?",
+    "NOT_NEED_RENEW_MEMBERSHIP": "Su membresía no necesita ser renovada actualmente (caducará en {{membershipExpiresIn|formatDuration}}).<br/></br/><b>¿Confirma</b> querer renovar su membresía?",
+    "SAVE_BEFORE_LEAVE": "¿Desea <b>guardar sus cambios</b> antes de abandonar la página?",
     "SAVE_BEFORE_LEAVE_TITLE": "Cambios no registrados",
-    "LOGOUT": "¿Está usted segura(o) de querer desconectarse?",
-    "USE_FALLBACK_NODE": "Nodo <b>{{edad}}</ b> inalcanzable o no válido.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{nuevo}}</b>?"
+    "LOGOUT": "¿Desea desconectarse?",
+    "USE_FALLBACK_NODE": "Nodo <b>{{old}}</b> inalcanzable o dirección inválida.<br/><br/>¿Desea utilizar temporalmente el nodo <b>{{new}}</b>?",
+    "ISSUE_524_SEND_LOG": "La transacción ha sido rechazada a causa de una anomalía conocida (ticket #524) pero todavía <b>no replicable</b>.<br/><br/>Para ayudar a los/as desarrolladores/as a corregir este error, ¿ <b>acepta el envío de los logs(trazas del programa)</b> ?<br/><small>(ningún dato confidencia será enviado)</small>."
+  },
+  "MODE": {
+    "DEMO": {
+      "BADGE": "Demo",
+      "MODE": "Modo de demostración",
+      "FEATURE_NOT_AVAILABLE": "Funcionalidad <b>no disponible</b> en este sitio de demostración.",
+      "MODE_HELP": "Cesium funciona en <b> modo de demostración </b>: la consulta está disponible, pero no se puede realizar ninguna operación.",
+      "INSTALL_HELP": "Por <b>razones de seguridad</b> recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda."
+    },
+    "READONLY": {
+      "BADGE": "Monit",
+      "MODE": "Modo de supervisión",
+      "MODE_HELP": "Cesium funciona en <b> modo de supervisión </b>: solo están disponibles las funciones de monitoreo de divisas.",
+      "INSTALL_HELP": "Si desea <b>crear una cuenta</b> para enviar o recibir dinero, le recomendamos <b>instalar</b> su copia del software.<br/>Visite el sitio de Internet <a href='https://cesium.app'> www.cesium.app </a> para obtener ayuda."
+    }
   },
   "DOWNLOAD": {
     "POPUP_TITLE": "<b>Revocación del archivo</b>",
-    "POPUP_REVOKE_MESSAGE": "Para proteger su cuenta, descargar el <b>documento de revocación de cuenta</b>. Si se necesita cancelar su cuenta (en caso de robo, cambio de identificador, una cuenta falsa creada, etc.).<br/><br/><b>Por favor, almacénelo en un lugar seguro.</b>"
+    "POPUP_REVOKE_MESSAGE": "Para proteger su cuenta, descargue el <b>documento de revocación de cuenta</b>. Le permitirá cancelar su cuenta (en caso de robo, cambio de identificador, cuenta creada incorrectamente, etc.).<br/><br/><b>Por favor, almacénelo en un lugar seguro.</b>"
   },
   "HELP": {
     "TITLE": "Ayuda en línea",
     "JOIN": {
       "SECTION": "Inscripción",
-      "SALT": "El identificador secreto es muy importante. Sirve para mezclar la frase secreta, antes de calcular la <span class=\"text-italic\">llave pública</span> de su cuenta (su número) y la llave secreta para acceder a esta.<br/><b>Por favor, memorícelo muy bien</b> porque actualmente no existe ninguna manera para encontrarlo en caso de pérdida.<br/>Por otra parte, no puede ser modificado sin tener que crear una nueva cuenta.<br/><br/>Un buen identificador secreto debe ser suficientemente largo (al menos 8 carácteres) y lo más original posible.",
-      "PASSWORD": "La frase secreta es muy importante. Junto al identificador secreto, sirve a calcular el número (la llave pública) de su cuenta, y la llave secreta para acceder a ella.<br/><b>Por favor, memorícela muy bien</b> porque actualmente no existe ninguna manera para encontrarla en caso de pérdida (excepto el generar un fichero de respaldo).<br/>Por otra parte, no puede ser modificado sin deber creer una nueva cuenta.<br/><br/>Una buena frase secreta contiene (idealmente) al menos 8 carácteres, del que al menos una mayúscula y un número.",
-      "PSEUDO": "El seudónimo es solamente utilizado en caso de inscripción como <span class=\"text-italic\">miembro</span>. Siempre es asociado a un monedero (vía su <span class=\"text-italic\">llave pública</span>).<br/>El seudónimo se publica en la red para que los otros usuarios puedan identificarlo, certificarlo o enviar dinero a la cuenta.<br/>Un seudónimo debe ser único dentro de los miembros (<u>actuales</u> y antiguos)."
+      "SALT": "El identificador secreto es muy importante. Sirve para mezclar(<span class=\"text-italic\">hash</span>) la contraseña, antes de calcular la <span class=\"text-italic\">llave pública</span> (el número de cuenta) y la <span class=\"text-italic\">llave privada</span> para acceder a esta.<br/><b>Por favor, memorícelo muy bien</b> porque no existe ninguna forma de recuperarlo en caso de pérdida.<br/>No puede ser modificado. Deberá crear una nueva cuenta si lo pierde o se olvida.<br/><br/>Un buen identificador secreto debe ser suficientemente largo (al menos 8 carácteres) y lo más original posible.",
+      "PASSWORD": "La contraseña es muy importante. Junto al identificador secreto, sirve para calcular la llave pública (el número de cuenta), y la llave privada para acceder a ella.<br/><b>Por favor, memorícela muy bien</b> porque no existe ninguna forma de recuperarla en caso de pérdida (excepto si se tuviese un fichero de respaldo o <span class=\"text-italic\">backup</span>.).<br/>No puede ser modificada. Deberá crear una nueva cuenta si la pierde o se olvida.<br/><br/>Una buena contraseña contiene al menos 8 carácteres, con al menos una mayúscula y un dígito.",
+      "PSEUDO": "El seudónimo se utiliza solamente en caso de inscripción como <span class=\"text-italic\">miembro</span>. Siempre está asociado a un monedero (vía su <span class=\"text-italic\">llave pública</span>).<br/>Este se publica en la red para que los demás usuarios puedan identificar, certificar o enviar dinero a la cuenta.<br/>Un seudónimo debe ser único para cada miembro (actuales y antiguos)."
+    },
+    "LOGIN": {
+      "SECTION": "Autenticación",
+      "PUBKEY": "Llave pública",
+      "PUBKEY_DEF": "La llave pública del archivo de llaves es generada de las credenciales introducidas (cualquiera que sean), sin estar obligatoriamente vinculadas o contrastadas con ninguna cuenta ya usada. <br/><b>Asegúrese por lo tanto de que la llave pública es la misma con la que se creó originalmente su cuenta</b>. De lo contrario, se autogenerará una cuenta vacía que probablemente nunca ha sido usada, ya que el riesgo de coincidir con las credenciales de otra cuenta ajena es muy pequeño.<br/><a href=\"https://es.wikipedia.org/wiki/Criptograf%C3%ADa_de_curva_el%C3%ADptica\" target=\"_ system\">Conozca más sobre criptografía</a> con llaves públicas.",
+      "METHOD": "Métodos de autenticación",
+      "METHOD_DEF": "Diversas opciones están disponibles para conectar a las cuentas: <br/> - La conexión <b>con aleatoriedad (estándar o avanzada)</b> mezcla su contraseña con su identificador secreto, para limitar los intentos de ataque<br/> - La conexión <b>usando llave pública</b> le permite entrar sin credenciales, las cuales solo se le pedirán cuando alguna operación lo necesite.<br/> - La conexión <b>usando archivo de llaves</b> leerá las llave pública y privada de la cuenta desde un archivo sin necesitar sus credenciales. Varios formatos son posibles."
     },
     "GLOSSARY": {
       "SECTION": "Glosario",
-      "PUBKEY_DEF": "Una llave pública identifica un monedero. Puede identificar un miembro. En Cesium se calcula con el identificador y la frase secreta.",
+      "PUBKEY_DEF": "Una llave pública identifica un monedero, que puede estar asociado a un miembro o ser un monedero anónimo. En Cesium se calcula a partir del identificador secreto y la contraseña.",
       "MEMBER": "Miembro",
-      "MEMBER_DEF": "Un miembro es una persona humana física y viviente, deseosa de participar libremente a la comunidad monetaria. Percibe un dividendo universal, dependiendo de un período y un importe definido en las <span class=\"text-italic\">reglas de la moneda</span>",
+      "MEMBER_DEF": "Cada miembro es una persona humana física y viva, deseosa de participar libremente en la comunidad monetaria. Percibe un dividendo universal, de acuerdo a un periodo e importe definido en las <span class=\"text-italic\">reglas de la moneda</span>",
       "CURRENCY_RULES": "Reglas de la moneda",
-      "CURRENCY_RULES_DEF": "Las reglas de la moneda son definidas una sola vez por todas. Establecen el funcionamiento de la moneda: el cálculo del dividendo universal, la cantidad de certificaciones necesarias para ser miembro, la cantidad máxima de certificaciones que un miembro puede emitir, etc. <a href=\"#/app/currency\">Ver las reglas actuales</a>.<br/> Una <span class=\"text-italic\">BlockChain</span> que soporta y ejecuta estas reglas, y verifica continuamente su buena aplicación, hace posible que ellas no se modifiquen en el tiempo.",
+      "CURRENCY_RULES_DEF": "Las reglas de la moneda se han definido una vez y para siempre. Establecen el funcionamiento de la moneda: el cálculo del dividendo universal, la cantidad de certificaciones necesarias para ser miembro, la cantidad máxima de certificaciones que cada miembro puede emitir, etc. <a href=\"#/app/currency\">Ver las reglas actuales</a>.<br/> Sus parámetros no pueden alterarse gracias a una <span class=\"text-italic\">Cadena de Bloques</span> que soporta, implementa y verifica la buena aplicación de estas reglas.",
       "BLOCKCHAIN": "Cadena de bloques (<span class=\"text-italic\">Blockchain</span>)",
-      "BLOCKCHAIN_DEF": "La BlockChain es un sistema descentralizado, que, para el caso de Duniter, sirve a mantener y ejecutar las <span class=\"text-italic\">reglas de la moneda</span>.<br/><a href=\"http://duniter.org\" target=\"_system\">Saber más a proposito de Duniter</a> y el funcionamiento de su blockchain.",
-      "UNIVERSAL_DIVIDEND_DEF": "El Dividendo Universal (DU) es la cantidad de moneda co-creada por cada miembro, dependiendo del periodo y del cálculo definidos en las <span class=\"text-italic\">reglas de la moneda</span>.<br/>En cada periodo, los miembros reciben en sus cuentas la misma cantidad de dinero.<br/><br/>El DU crece regularmente, para ser justo entre los miembros (actuales y futuros), calculado en función de la esperanza de vida media, como demostrado en la Théorie Relative de la Monnaie (TRM) = Teoría Relativa de la Moneda, aún no está traducida en español, contáctenos para contribuir a su traducción.<br/><a href=\"http://trm.creationmonetaire.info\">Saber más a propósito de la TRM</a> y las monedas libres."
+      "BLOCKCHAIN_DEF": "La cadena de bloques es un sistema descentralizado, que en el caso de Duniter, sirve para mantener e implementar las <span class=\"text-italic\">reglas de la moneda</span>.<br/><a href=\"http://duniter.org\" target=\"_system\">Más información</a> acerca de Duniter y el funcionamiento de su cadena de bloques.",
+      "UNIVERSAL_DIVIDEND_DEF": "El Dividendo Universal (DU) es la cantidad de moneda co-creada por cada miembro, dependiendo del periodo y del cálculo definidos en las <span class=\"text-italic\">reglas de la moneda</span>.<br/>En cada periodo, los miembros reciben en sus cuentas la misma cantidad de moneda.<br/><br/>El DU crece regularmente, para ser justo entre cada miembro (actualmente y en el futuro), y calculado en función de la esperanza de vida media, como se demuestra en la <span class=\"text-italic\">Teoría Relativa de la Moneda</span> (TRM, de Stéphane Laborde).<br/><a href=\"http://trm.creationmonetaire.info\">Más información</a> sobre la TRM y las monedas libres.",
+      "WOT": "Red de Confianza (RdC)",
+      "WOT_DEF": "La Red de Confianza se compone del conjunto de miembros de la moneda, y de los enlaces de certificaciones que los conectan.",
+      "DISTANCE_RULE": "Regla de distancia",
+      "DISTANCE_RULE_DEF": "La regle de distancia de la Red de Confianza define <b>una distancia máxima a respetar</b> entre una candidatura y número mínimo miembros referentes (aquellos más conectados). Esta distancia es calculada utilizando los enlaces de certificación."
     },
     "TIP": {
       "MENU_BTN_CURRENCY": "El menú <b>{{'MENU.CURRENCY'|translate}}</b> permite consultar las <b>reglas de la moneda</b> y su estado.",
-      "CURRENCY_WOT": "El <b>número de miembros</b> demuestra la importancia de la comunidad y permite <b>seguir su evolución</b>.",
-      "CURRENCY_MASS": "Siga aquí la <b>cantidad total de moneda</b> existente y su <b>distribución media</b> por miembro.<br/><br/>Esto permite juzgar la <b>importancia de un importe</b>, en relación con lo que <b>poseen los otros</b> en sus cuentas (como media).",
+      "CURRENCY_WOT": "El <b>número de miembros</b> muestra el peso de la comunidad y permite <b>seguir su evolución</b>.",
+      "CURRENCY_MASS": "Siga aquí la <b>cantidad total de moneda</b> existente y su <b>distribución media</b> por miembro.<br/><br/>Esto permite juzgar la <b>relevancia de un importe</b>, en relación con lo que <b>poseen los demás</b> en sus cuentas (de media).",
       "CURRENCY_UNIT_RELATIVE": "La unidad utilizada (&ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;) significa que los importes en {{currency|capitalize}} han sido divididos entre el valor del <b>Dividendo Universal</b> (DU).<br/><br/><small> Esta unidad relativa es <b>pertinente</b>, porque permanece estable, independiente de la cantidad de moneda que aumenta constantemente.</small>",
       "CURRENCY_CHANGE_UNIT": "Este botón permite <b>cambiar la unidad</b>, para visualizar los importes <b>directamente en {{currency|capitalize}}</b> (en lugar de &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;).",
       "CURRENCY_CHANGE_UNIT_TO_RELATIVE": "Este botón permite <b>cambiar la unidad</b>, para visualizar los importes en &ldquo;<b>{{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub></b>&rdquo;, es decir, relativo al Dividendo Universal (el monto co-producido por cada miembro).",
-      "CURRENCY_RULES": "Las <b>reglas</b> de la moneda fijan su funcionamiento <b>exacto y previsible</b>.<br/><br/>Es el propio ADN de la moneda, que hace que su código monetario sea <b>legible y transparente</b>.", "MENU_BTN_NETWORK": "El menú <b>{{'MENU.NETWORK'|translate}}</b> permite consultar el estado de la red.",
-      "NETWORK_BLOCKCHAIN": "Todas las operaciones de la moneda están registradas dentro de un grand libro de cuenta <b>público e infalsificable</b>, también llamado <b>cadena de bloques</b> (<em>BlockChain</em> en inglés).",
-      "NETWORK_PEERS": "Los <b>nodos</b> visibles aquí corresponden a los <b>ordenadores que actualizan y controlan</b> la cadena de bloques.<br/><br/>Entre más nodos estén conectados, la moneda tendrá una gestión más <b>descentralizada</b> y digna de confianza.",
-      "NETWORK_PEERS_BLOCK_NUMBER": "Este <b>número</b> (en verde) indica el <b>último bloque validado</b> por este nodo (última pagina escrita dentro del grand libro de cuentas).<br/><br/>El color verde indica que este bloque ha sido también validado por <b>la mayoría de los otros nodos</b>.",
-      "NETWORK_PEERS_PARTICIPATE": "<b>Cada miembro</b>, equipado de un ordenador conectador a Internet, <b>puede participar añadiendo un nodo</b>.  Necesita <b>instalar el programa Duniter</b> (libre y gratis). <a href=\"{{installDocUrl}}\" target=\"_system\">Ver el manual de uso &gt;&gt;</a>.",
-      "MENU_BTN_ACCOUNT": "El menú <b>{{'ACCOUNT.TITLE'|translate}}</b> permite acceder a la gestión de su cuenta.",
+      "CURRENCY_RULES": "Las <b>reglas</b> de la moneda fijan su funcionamiento <b>exacto y previsible</b>.<br/><br/>Es el propio ADN de la moneda, que hace que su código monetario sea <b>legible y transparente</b>.",
+      "MENU_BTN_NETWORK": "El menú <b>{{'MENU.NETWORK'|translate}}</b> permite consultar el estado de la red.",
+      "NETWORK_BLOCKCHAIN": "Todas las transacciones de la moneda están registradas dentro de un gran libro de contabilidad <b>público e infalsificable</b>, conocido como la <b>cadena de bloques</b> (<em>BlockChain</em> en inglés).",
+      "NETWORK_PEERS": "Los <b>nodos</b> visibles aquí corresponden a los <b>dispositivos de miembros que actualizan y validan</b> la cadena de bloques.<br/><br/>Cuanto más nodos haya conectados, la moneda tendrá una gestión más <b>descentralizada</b> y digna de confianza.",
+      "NETWORK_PEERS_BLOCK_NUMBER": "Este <b>número</b> (en verde) indica el <b>último bloque validado</b> por este nodo (última página escrita en la cadena de bloques).<br/><br/>El color verde indica que este bloque ha sido también validado por <b>la mayoría del resto de nodos</b>.",
+      "NETWORK_PEERS_PARTICIPATE": "<b>Cada miembro</b>, equipado de un dispositivo conectado a Internet, <b>puede contribuir añadiendo un nodo</b>.  Necesita <b>instalar el programa Duniter</b> (libre y gratuito). <a href=\"{{installDocUrl}}\" target=\"_system\">Ver manual de uso &gt;&gt;</a>.",
+      "MENU_BTN_ACCOUNT": "<b>{{'ACCOUNT.TITLE'|translate}}</b> permite acceder a la gestión y al historial de su cuenta.",
       "MENU_BTN_ACCOUNT_MEMBER": "Consulte aquí el estado de su cuenta y la información sobre sus certificaciones.",
       "WALLET_CERTIFICATIONS": "Haga clic aquí para consultar el detalle de sus certificaciones (recibidas y emitidas).",
       "WALLET_RECEIVED_CERTIFICATIONS": "Haga clic aquí para consultar el detalle de sus <b>certificaciones recibidas</b>.",
@@ -805,24 +992,25 @@
       "WALLET_SEND_NO_MONEY": "Realizar un pago en algunos clics.<br/>(Su saldo ya no lo permite)",
       "WALLET_OPTIONS": "Este botón permite acceder a las <b>acciones de adhesión</b> y de seguridad.<br/><br/>¡No olvide echar un vistazo!",
       "WALLET_RECEIVED_CERTS": "Se exhibirá aquí la lista de las personas que le han certificado.",
-      "WALLET_CERTIFY": "El botón <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permite seleccionar una identidad y certificarla.<br/><br/>Sólo usuarios <b>miembros</b> pueden certificar a otros.",
+      "WALLET_CERTIFY": "El botón <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permite seleccionar una identidad y certificarla.<br/><br/>Solo quienes son <b>miembros</b> pueden certificar a otras personas.",
       "WALLET_CERT_STOCK": "Su stock de certificaciones (emitidas) es limitado a <b>{{sigStock}} certificaciones</b>.<br/><br/>Este stock se renueva con el tiempo, a medida que las certificaciones caducan.",
-      "MENU_BTN_TX_MEMBER": "El menú <b>{{'MENU.TRANSACTIONS'|translate}}</b> permite consultar su saldo, el historial de sus transacciones y mandar un pago.",
-      "MENU_BTN_TX": "Consulte aquí <b>el historial de sus transacciones</b> y efectúe nuevas operaciones.",
+      "MENU_BTN_TX": "El menú <b>{{'MENU.TRANSACTIONS'|translate}}</b> permite consultar su saldo, el historial de transacciones y realizar nuevos pagos.",
+      "MENU_BTN_WALLETS": "El menú <b>{{'MENU.WALLETS'|translate}}</b> permite añadir monederos complementarios que usted maneja.",
       "MENU_BTN_WOT": "El menú <b>{{'MENU.WOT'|translate}}</b> permite buscar <b>usuarios</b> de la moneda (miembro o no).",
-      "WOT_SEARCH_TEXT_XS": "Para buscar en el directorio, escribe las <b>primeras letras de un seudónimo</b> (o de una llave pública).<br/><br/>La búsqueda se iniciará automáticamente.",
-      "WOT_SEARCH_TEXT": "Para buscar en el directorio, escribe las <b>primeras letras de un seudónimo</b> (o de una llave pública). <br/><br/>Luego, pulsa en la tecla <b>Entrada</b> para iniciar la búsqueda.",
-      "WOT_SEARCH_RESULT": "Visualiza la ficha detallada simplemente <b>haciendo un clic</b> sobre una línea.",
-      "WOT_VIEW_CERTIFICATIONS": "La línea <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> muestra cuántos miembros han validado esta identidad.<br/><br/>Estas certificaciones atestiguan que la cuenta pertenece a <b>una persona humana viviente</b> y que no tenga <b>ninguna otra cuenta miembro</b>.",
+      "WOT_SEARCH_TEXT_XS": "Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública).<br/><br/>La búsqueda se iniciará automáticamente.",
+      "WOT_SEARCH_TEXT": "Para buscar en el directorio, escriba las <b>primeras letras de un seudónimo</b> (o de una llave pública). <br/><br/>Luego, pulse en la tecla <b>Intro</b> para iniciar la búsqueda.",
+      "WOT_SEARCH_RESULT": "Visualice la ficha detallada <b>haciendo clic</b> sobre una fila.",
+      "WOT_VIEW_CERTIFICATIONS": "La opción <b>{{'ACCOUNT.CERTIFICATION_COUNT'|translate}}</b> muestra qué miembros han validado esta identidad.<br/><br/>Estas certificaciones atestiguan que la cuenta pertenece a <b>una persona humana viva</b> y que no posee <b>ninguna otra cuenta miembro</b>.",
       "WOT_VIEW_CERTIFICATIONS_COUNT": "Necesita al menos <b>{{sigQty}} certificaciones</b> para ser miembro y recibir el <b>Dividendo Universal</b>.",
       "WOT_VIEW_CERTIFICATIONS_CLICK": "Un clic aquí permite abrir <b>la lista de todas las certificaciones</b> de la identidad (recibidas y emitidas).",
       "WOT_VIEW_CERTIFY": "El botón <b>{{'WOT.BTN_CERTIFY'|translate}}</b> permite añadir su certificación a esta identidad.",
-      "CERTIFY_RULES": "<b>Atención:</b> Certificar solamente <b>personas físicas vivas</b>, que no posean ninguna otra cuenta miembro.<br/><br/>¡La seguridad de la moneda depende de la vigilancia de cada uno!",
-      "MENU_BTN_SETTINGS": "Los <b>{{'MENU.SETTINGS'|translate}}</b> le permitirán configurar la aplicación.",
-      "HEADER_BAR_BTN_PROFILE": "Haga un clic aquí para acceder a su <b>perfil de usuario</b>",
-      "SETTINGS_CHANGE_UNIT": "Podrá <b>cambiar la unidad de visualización</b> de los importes haciendo un clic más arriba.<br/><br/>- Desactive la opción para visualizar los importes en {{currency|capitalize}}.<br/>- Active la opción para visualizar los importes relativos al {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (todos los importes serán <b>dividido</b> entre el Dividendo Universal actual).",
-      "END_LOGIN": "¡La visita guiada ha <b>terminado</b>!<br/><br/>¡Buena suerte en este nuevo mundo de la <b>economía libre</b> !",
-      "END_NOT_LOGIN": "¡La visita guiada ha <b>terminado</b>!<br/><br/>Si quiere utilizar la moneda {{currency|capitalize}}, tiene que hacer un clic en <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> más abajo."
+      "CERTIFY_RULES": "<b>Atención:</b> Certifique solamente <b>personas físicas vivas</b>, que no posean ya ninguna otra cuenta miembro.<br/><br/>¡La seguridad de la red de la moneda depende del cuidado de cada persona!",
+      "MENU_BTN_SETTINGS": "En <b>{{'MENU.SETTINGS'|translate}}</b> podrá configurar la aplicación.",
+      "HEADER_BAR_BTN_PROFILE": "Haga clic aquí para acceder a su <b>perfil</b>",
+      "SETTINGS_CHANGE_UNIT": "Podrá <b>cambiar la unidad de visualización</b> de los importes haciendo clic aquí.<br/><br/>- Desactive la opción para mostrar los importes en {{currency|capitalize}}.<br/>- Actívela para importes relativos al {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (las cantidades de los importes se mostrarán <b>divididos</b> entre el Dividendo Universal actual).",
+      "END_LOGIN": "La visita guiada ha <b>terminado</b>.<br/><br/>¡Buena suerte en este nuevo mundo de la <b>economía libre</b> !",
+      "END_NOT_LOGIN": "La visita guiada ha <b>terminado</b>.<br/><br/>Si quiere utilizar la moneda {{currency|capitalize}}, tiene que hacer un clic en <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> más abajo.",
+      "END_READONLY": "La visita guiada ha <b>terminado</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."
     }
   }
 }
diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json
index 3ed72166bc9593e65171a9dcdeb5e1efbe6ab7c9..c4cd376f9e9f245729f8857a7596b378e36ae936 100644
--- a/www/i18n/locale-fr-FR.json
+++ b/www/i18n/locale-fr-FR.json
@@ -98,8 +98,6 @@
     "CURRENCY": "Monnaie",
     "ACCOUNT": "Mon compte",
     "WALLETS": "Mes portefeuilles",
-    "TRANSFER": "Virement",
-    "SCAN": "Scanner",
     "SETTINGS": "Paramètres",
     "NETWORK": "Réseau",
     "TRANSACTIONS": "Mes opérations"
@@ -120,12 +118,18 @@
   "HOME": {
     "TITLE": "Cesium",
     "WELCOME": "Bienvenue dans l'application Cesium !",
+    "WELCOME_READONLY": "Bienvenue dans Cesium <span class='badge badge-balanced'>Monit</span> !",
     "MESSAGE": "Recevez et envoyez de la monnaie libre {{currency|abbreviate}}",
-    "BTN_CURRENCY": "Explorer la monnaie {{name|abbreviate}}",
+    "MESSAGE_READONLY": "Suivez l'état de la monnaie libre {{currency|abbreviate}} en temps réel.",
+    "BTN_CURRENCY": "Explorer la monnaie {{currency|abbreviate}}",
     "BTN_ABOUT": "à propos",
     "BTN_HELP": "Aide en ligne",
+    "BTN_NETWORK": "État du réseau",
+    "FREE_SOFTWARE": "Logiciel libre",
+    "FORK_ME": "Cloner moi !",
+    "SHOW_LICENSE": "Voir la license de l'application",
     "REPORT_ISSUE": "anomalie",
-    "NOT_YOUR_ACCOUNT_QUESTION" : "Vous n'êtes pas propriétaire du compte <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b> ?",
+    "NOT_YOUR_ACCOUNT_QUESTION" : "Vous n'êtes pas propriétaire du compte <b class=\"ion-key\"> {{pubkey|formatPubkey}}</b>&nbsp;?",
     "BTN_CHANGE_ACCOUNT": "Déconnecter ce compte",
     "CONNECTION_ERROR": "Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou changer de nœud <a class=\"positive\" ng-click=\"doQuickFix('settings')\">dans les paramètres</a>.",
     "SHOW_ALL_FEED": "Voir tout",
@@ -148,6 +152,7 @@
     "USE_WALLETS_ENCRYPTION": "Sécuriser la liste ?",
     "USE_WALLETS_ENCRYPTION_HELP": "Permet de sécuriser la liste de vos portefeuilles (par chiffrement), en exigeant une authentification pour y accéder.",
     "ENABLE_HELPTIP": "Activer les bulles d'aide contextuelles",
+    "DISABLE_HELPTIP": "Désactiver les bulles d'aide contextuelles",
     "ENABLE_UI_EFFECTS": "Activer les effets visuels",
     "HISTORY_SETTINGS": "Mes opérations",
     "DISPLAY_UD_HISTORY": "Afficher les dividendes produits ?",
@@ -619,6 +624,7 @@
       "QUESTION_19": "Quel était le métier de votre grand-père ?",
       "RECOVER_ID": "Retrouver mon mot de passe...",
       "RECOVER_ID_HELP": "Si vous disposez d'un <b>fichier de sauvegarde de vos identifiants</b>, vous pouvez les retrouver en répondant correctement à vos questions personnelles.",
+      "RECOVER_ID_SELECT_FILE": "Choisissez le <b>fichier de sauvegarde de vos identifiants</b> à utiliser :",
       "REVOCATION_WITH_FILE": "Révoquer mon compte membre...",
       "REVOCATION_WITH_FILE_DESCRIPTION": "Si vous avez <b>définitivement perdus vos identifiants</b> de compte membre (ou que la sécurité du compte est compromise), vous pouvez utiliser <b>le fichier de révocation</b> du compte pour <b>forcer sa sortie définitive de la toile de confiance</b>.",
       "REVOCATION_WITH_FILE_HELP": "Pour <b>révoquer définitivement</b> un compte membre, veuillez glisser dans la zone ci-dessous votre fichier de révocation, ou bien cliquer dans la zone pour rechercher un fichier.",
@@ -771,6 +777,7 @@
     "CHECK_NETWORK_CONNECTION": "Aucun nœud ne semble accessible.<br/><br/>Veuillez <b>vérifier votre connexion Internet</b>.",
     "ISSUE_524_TX_FAILED": "Échec du virement.<br/><br/>Un message a été envoyé aux développeurs pour faciliter la résolution du problème. <b>Merci de votre aide</b>.",
     "ADD_SECONDARY_WALLET_FAILED": "Échec de l'ajout du portefeuille secondaire.",
+    "REMOVE_SECONDARY_WALLET_FAILED": "Échec de la suppression du portefeuille secondaire.",
     "UPDATE_WALLET_LIST_FAILED": "Échec du rafraîchissement des portefeuilles secondaires.",
     "LOAD_WALLET_LIST_FAILED": "Échec du chargement des portefeuilles secondaires.",
     "SAVE_WALLET_LIST_FAILED": "Échec de la sauvegarde des portefeuilles secondaires.",
@@ -824,6 +831,21 @@
     "USE_FALLBACK_NODE": "Nœud <b>{{old}}</b> injoignable ou adresse invalide.<br/><br/>Voulez-vous temporairement utiliser le nœud <b>{{new}}</b> ?",
     "ISSUE_524_SEND_LOG": "La transaction a été rejetée, à cause d'une anomalie connue (ticket #524) mais <b>non reproduite</b>.<br/><br/>Pour aider les développeurs à corriger cette erreur, <b>acceptez-vous la transmission de vos logs</b> par message ?<br/><small>(aucune donnée confidentielle n'est envoyée)</small>."
   },
+  "MODE": {
+    "DEMO": {
+      "BADGE": "Démo",
+      "MODE": "Mode démonstration",
+      "FEATURE_NOT_AVAILABLE": "Fonctionnalité <b>non disponible</b> sur ce site de démonstration.",
+      "MODE_HELP": "Cesium fonctionne en <b>mode démonstration</b> : la consultation de compte est possible, mais aucune opération ne pourra être réalisée.",
+      "INSTALL_HELP": "Pour des <b>raisons de sécurité</b> nous vous recommandons <b>d'installer</b> votre copie de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide."
+    },
+    "READONLY": {
+      "BADGE": "Monit",
+      "MODE": "Mode monitoring",
+      "MODE_HELP": "Cesium fonctionne en <b>mode monitoring</b> : sono disponibili solo le funzionalità di monitoraggio della valuta.",
+      "INSTALL_HELP": "Si vous souhaitez <b>créer un compte portefeuille</b> pour envoyer ou recevoir de la monnaie, nous vous recommandons <b>d'installer votre copie</b> de l'application Cesium. Visitez le site <a href='https://cesium.app'>www.cesium.app</a> pour obtenir de l'aide."
+    }
+  },
   "DOWNLOAD": {
     "POPUP_TITLE": "<b>Fichier de révocation</b>",
     "POPUP_REVOKE_MESSAGE": "Pour sécuriser votre compte, veuillez télécharger le <b>document de révocation de compte</b>. Il vous permettra le cas échéant d'annuler votre compte (en cas d'un vol de compte, d'un changement d'identifiant, d'un compte créé à tort, etc.).<br/><br/><b>Veuillez le stocker en lieu sûr.</b>"
@@ -871,7 +893,7 @@
       "NETWORK_PEERS": "Les <b>nœuds</b> visibles ici correspondent aux <b>ordinateurs qui actualisent et contrôlent</b> la chaine de blocs.<br/><br/>Plus il y a de nœuds, plus la monnaie a une gestion <b>décentralisée</b> et digne de confiance.",
       "NETWORK_PEERS_BLOCK_NUMBER": "Ce <b>numéro</b> (en vert) indique le <b>dernier bloc validé</b> pour ce nœud (dernière page écrite dans le grand livre de comptes).<br/><br/>La couleur verte indique que ce bloc est également validé par <b>la plupart des autres nœuds</b>.",
       "NETWORK_PEERS_PARTICIPATE": "<b>Chaque membre</b>, équipé d'un ordinateur avec Internet, <b>peut participer en ajoutant un nœud</b>. Il suffit d'<b>installer le logiciel Duniter</b> (libre et gratuit). <a href=\"{{installDocUrl}}\" target=\"_system\">Voir le manuel d'installation &gt;&gt;</a>.",
-      "MENU_BTN_ACCOUNT": "Le menu <b>{{'ACCOUNT.TITLE'|translate}}</b> permet d'accéder à la gestion de votre compte.",
+      "MENU_BTN_ACCOUNT": "Le menu <b>{{'MENU.ACCOUNT'|translate}}</b> permet d'accéder à la gestion de votre compte.",
       "MENU_BTN_ACCOUNT_MEMBER": "Consultez ici l'état de votre compte et les informations sur vos certifications.",
       "WALLET_CERTIFICATIONS": "Cliquez ici pour consulter le détail de vos certifications (reçues et émises).",
       "WALLET_RECEIVED_CERTIFICATIONS": "Cliquez ici pour consulter le détail de vos <b>certifications reçues</b>.",
@@ -886,8 +908,8 @@
       "WALLET_RECEIVED_CERTS": "S'affichera ici la liste des personnes qui vous ont certifié.",
       "WALLET_CERTIFY": "Le bouton <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permet de sélectionner une identité et de la certifier.<br/><br/>Seuls des utilisateurs <b>déjà membres</b> peuvent en certifier d'autres.",
       "WALLET_CERT_STOCK": "Votre stock de certifications (émises) est limité à <b>{{sigStock}} certifications</b>.<br/><br/>Ce stock se renouvelle avec le temps, au fur et à mesure que les certifications s'invalident.",
-      "MENU_BTN_TX_MEMBER": "Le menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> permet de consulter votre solde, l'historique vos transactions et d'envoyer un paiement.",
-      "MENU_BTN_TX": "Consultez ici <b>l'historique de vos transactions</b> et effectuez de nouvelles opérations.",
+      "MENU_BTN_WALLETS": "Le menu <b>{{'MENU.WALLETS'|translate}}</b> permet d'ajouter des portefeuilles supplémentaires que vous gérer.",
+      "MENU_BTN_TX": "Le menu <b>{{'MENU.TRANSACTIONS'|translate}}</b> permet de consulter votre solde, l'historique vos transactions et d'envoyer un paiement.",
       "MENU_BTN_WOT": "Le menu <b>{{'MENU.WOT'|translate}}</b> permet de rechercher parmi les <b>utilisateurs</b> de la monnaie (membres ou non).",
       "WOT_SEARCH_TEXT_XS": "Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique).<br/><br/>La recherche se lancera automatiquement.",
       "WOT_SEARCH_TEXT": "Pour rechercher dans l'annuaire, tapez les <b>premières lettres d'un pseudonyme</b> (ou d'une clé publique). <br/><br/>Appuyer ensuite sur <b>Entrée</b> pour lancer la recherche.",
@@ -901,7 +923,8 @@
       "HEADER_BAR_BTN_PROFILE": "Cliquez ici pour accéder à votre <b>profil utilisateur.</b>",
       "SETTINGS_CHANGE_UNIT": "Vous pourrez <b>changer d'unité d'affichage</b> des montants en cliquant ci-dessus.<br/><br/>- Désactivez l'option pour un affichage des montants en {{currency|capitalize}}.<br/>- Activez l'option pour un affichage relatif en {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (tous les montants seront <b>divisés</b> par le Dividende Universel courant).",
       "END_LOGIN": "Cette visite guidée est <b>terminée</b> !<br/><br/>Bonne continuation à vous, dans le nouveau monde de l'<b>économie libre</b> !",
-      "END_NOT_LOGIN": "Cette visite guidée est <b>terminée</b> !<br/><br/>Si vous souhaitez rejoindre la monnaie {{currency|capitalize}}, il vous suffira de cliquer sur <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> ci-dessous."
+      "END_NOT_LOGIN": "Cette visite guidée est <b>terminée</b> !<br/><br/>Si vous souhaitez rejoindre la monnaie {{currency|capitalize}}, il vous suffira de cliquer sur <b>{{'LOGIN.CREATE_FREE_ACCOUNT'|translate}}</b> ci-dessous.",
+      "END_READONLY": "Cette visite guidée est <b>terminée</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."
     }
   },
   "API" :{
@@ -910,7 +933,7 @@
       "LINK_DOC_HELP": "Documentation pour les développeurs",
       "LINK_STANDARD_APP": "Version classique",
       "LINK_STANDARD_APP_HELP": "Ouvrir la version classique de {{'COMMON.APP_NAME'|translate}}",
-      "CONNECTION_ERROR": "Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou contactez l'administrateur du site</a>."
+      "CONNECTION_ERROR": "Nœud <b>{{server}}</b> injoignable ou adresse invalide.<br/><br/>Vérifiez votre connexion Internet, ou contactez l'administrateur du site."
     },
     "HOME": {
       "TITLE": "Documentation API {{'COMMON.APP_NAME'|translate}}",
@@ -974,7 +997,7 @@
         "PARAM_REDIRECT_URL": "Adresse web de redirection",
         "PARAM_REDIRECT_URL_HELP": "Adresse web (URL) de redirection, appelé quand le paiement a été envoyé. Peut contenir les chaînes suivantes, qui seront remplacées par les valeurs de la transaction : \"{tx}\", \"{hash}\", \"{comment}\", \"{amount}\", \"{pubkey}\" et \"{node}\".",
         "PARAM_CANCEL_URL": "Adresse web d'annulation",
-        "PARAM_CANCEL_URL_HELP": "Adresse web (URL) en cas d'annulation du paiement, par l'utilisateur. Peut contenir les chaînes suivantes, qui seront remplacées dynamiquement : \"{comment}\", \"{amount}\" et {pubkey}.",
+        "PARAM_CANCEL_URL_HELP": "Adresse web (URL) en cas d'annulation du paiement, par l'utilisateur. Peut contenir les chaînes suivantes, qui seront remplacées dynamiquement : \"{comment}\", \"{amount}\" et \"{pubkey}\".",
         "PARAM_PREFERRED_NODE": "Adresse du nœud préféré",
         "PARAM_PREFERRED_NODE_HELP": "Adresse (URL) du nœud Duniter à utiliser de préférence (\"g1.domaine.com:443\" ou \"https://g1.domaine.com\").",
         "EXAMPLES_HELP": "Voici des exemples d'intégration :",
diff --git a/www/i18n/locale-it-IT.json b/www/i18n/locale-it-IT.json
index 9baa8dacb71edea3db2491c2ad08413e6c0e0ddf..13ab1f37cb47592312a5045a2be2a5be2a621200 100644
--- a/www/i18n/locale-it-IT.json
+++ b/www/i18n/locale-it-IT.json
@@ -20,6 +20,7 @@
      "BTN_RELATIVE_UNIT": "Mostra importi in DU?",
      "BTN_BACK": "Indietro",
      "BTN_NEXT": "Avanti",
+     "BTN_IMPORT": "Importazione",
      "BTN_CANCEL": "Cancellare",
      "BTN_CLOSE": "Chiudere",
      "BTN_LATER": "Più tardi",
@@ -48,6 +49,7 @@
      "NO_ACCOUNT_QUESTION": "Non sei ancora membro? Registrati subito!",
      "SEARCH_NO_RESULT": "Nessun risultato trovato",
      "LOADING": "Caricando...",
+     "LOADING_WAIT": "Caricando...<br/><small>(Cesium interroga dal nodo peer Duniter)</small>",
      "SEARCHING": "Cercando...",
      "FROM": "Da",
      "TO": "A",
@@ -96,8 +98,6 @@
      "CURRENCY": "Moneta",
      "ACCOUNT": "Mio conto",
      "WALLETS": "I miei portafogli",
-     "TRANSFER": "Trasferire",
-     "SCAN": "Scansionare",
      "SETTINGS": "Impostazioni",
      "NETWORK": "Rete",
      "TRANSACTIONS": "Miei pagamenti"
@@ -106,30 +106,42 @@
      "TITLE": "A proposito",
      "LICENSE": "<b>Free/libre software</b> (License GNU AGPLv3).",
      "CODE": "Codice sorgente:",
+     "OFFICIAL_WEB_SITE": "Sito ufficiale:",
      "DEVELOPERS": "Sviluppatori:",
      "FORUM": "Forum:",
-     "DEV_WARNING": "Attenzione!",
-     "DEV_WARNING_MESSAGE": "Questa app è ancora in sviluppo attivo.<br/>Facci sapere se trovi dei bugs!",
-     "DEV_WARNING_MESSAGE_SHORT": "Questa app è tutt'ora instabile (in sviluppo)",
+     "PLEASE_REPORT_ISSUE": "Non esitate a parlarci delle anomalie riscontrate",
      "REPORT_ISSUE": "Segnalare un bug"
    },
    "HOME": {
      "TITLE": "Cesium",
-     "WELCOME": "Benvenuti nell'{{'COMMON.APP_NAME'|translate}} App!",
-     "MESSAGE": "Scambiate in moneta libera. {{currency|abbreviate}}!",
-     "BTN_CURRENCY": "Esplorare la moneta",
+     "WELCOME": "Benvenuti nell'Cesium App!",
+     "WELCOME_READONLY": "Benvenuti nell'Cesium <span class='badge badge-balanced'>Monit</span>!",
+     "MESSAGE": "Scambiate in moneta libera {{currency|abbreviate}}",
+     "MESSAGE_READONLY": "Monitoraggio in tempo reale di moneta libera {{currency|abbreviate}}",
+     "BTN_CURRENCY": "Esplorare la moneta {{currency|abbreviate}}",
      "BTN_ABOUT": "a proposito",
      "BTN_HELP": "Aiuto",
+     "BTN_NETWORK": "Stato della rete",
+     "FREE_SOFTWARE": "Free software",
+     "FORK_ME": "Fork me!",
+     "SHOW_LICENSE": "Mostra licenza",
      "REPORT_ISSUE": "Segnalare un bug",
      "NOT_YOUR_ACCOUNT_QUESTION" : "Non sei proprietario del conto <b><i class=\"ion-key\"></i> {{pubkey|formatPubkey}}</b>?",
      "BTN_CHANGE_ACCOUNT": "Disconettere questo conto",
-     "CONNECTION_ERROR": "Peer <b>{{server}}</b> irraggiungibile o indirizzo invalido. <br/><br/> Verifica tua connessione or cambia nodo. <a class=\"positive\" ng-click=\"doQuickFix('settings')\">nell impostazioni. </a>."
+     "CONNECTION_ERROR": "Peer <b>{{server}}</b> irraggiungibile o indirizzo invalido. <br/><br/> Verifica tua connessione or cambia nodo. <a class=\"positive\" ng-click=\"doQuickFix('settings')\">nell impostazioni. </a>.",
+     "SHOW_ALL_FEED": "Mostra tutto",
+     "READ_MORE": "Leggi di più",
+     "FEED_SOURCE": "Fonte"
    },
    "SETTINGS": {
      "TITLE": "Impostazioni",
+     "DISPLAY_DIVIDER": "Schermo",
+     "STORAGE_DIVIDER": "Conservazione",
      "NETWORK_SETTINGS": "Rete",
      "PEER": "Indirizzo peer Duniter",
+     "PEER_SHORT": "Indirizzo peer",
      "PEER_CHANGED_TEMPORARY": "Indirizzo usato per un tempo determinato",
+     "PERSIST_CACHE": "Conserva i dati di navigazione (sperimentale)",
      "USE_LOCAL_STORAGE": "Abilitare local storage",
      "USE_LOCAL_STORAGE_HELP": "Permette di salvare tue impostazioni",
      "ENABLE_HELPTIP": "Abilitare consigli dinamici",
@@ -608,6 +620,7 @@
      }
    },
    "ERROR": {
+     "UNKNOWN_URI_FORMAT": "Formato URI sconosciuto",
      "POPUP_TITLE": "Errore",
      "UNKNOWN_ERROR": "Errore",
      "CRYPTO_UNKNOWN_ERROR": "Suo navigatore non sembra compatibile con le funzionalità di cryptografia.",
@@ -659,6 +672,7 @@
      "INVALID_USER_ID": "Il campo del 'pseudonimo' non deve avere spazi vuoti o caratteri speciali.",
      "INVALID_COMMENT": "Il formato del campo 'reference' è errato.",
      "INVALID_PUBKEY": "If formato della chiave pubblica è errato.",
+     "INVALID_PUBKEY_CHECKSUM": "Checkum non valido.",
      "IDENTITY_REVOKED": "Questa identità <b>è stata revocata</b>. Non puo più diventare membro.",
      "IDENTITY_REVOKED_WITH_TIME": "Questa identità <b>è stata revocata {{revocationTime|medianFromNow}}</b> ({{revocationTime|medianDate}}). Non puo più diventare membro.",
      "IDENTITY_PENDING_REVOCATION": "L'<b>annulamento di questa identità</b> è stata richiesta ed è in corso di evaluazione. Capacità ad inviare certificazioni disabilitata",
@@ -683,6 +697,7 @@
      "LOAD_NEWCOMERS_FAILED": "Impossibile caricare i nuovi membri.",
      "LOAD_PENDING_FAILED": "Impossibile caricare le certificazioni pendenti.",
      "ONLY_MEMBER_CAN_EXECUTE_THIS_ACTION": "Devi <b>essere membro</b> per poter fare questo.",
+     "ONLY_MEMBER_OR_WAS_MEMBER_CAN_EXECUTE_THIS_ACTION": "Devi <b>essere membro</b> (o era un membro) per poter fare questo.",
      "ONLY_SELF_CAN_EXECUTE_THIS_ACTION": "Devi aver <b>publiccato tua identità</b> per poter fare questo.",
      "GET_BLOCK_FAILED": "Impossibile caricare il blocco",
      "INVALID_BLOCK_HASH": "Blocco non trovato (hash errato)",
@@ -738,7 +753,22 @@
      "USE_FALLBACK_NODE": "Peer <b>{{old}}</b> indisponibile o indirizzo errato.<br/><br/>Vuoi utilizzare temporanemante il <b>{{new}}</b> nodo?",
      "INVALID_FILE_FORMAT": "Formato file non valido.",
      "SAME_TX_RECIPIENT": "Il destinatario deve essere diverso dall'emittente."
+  },
+  "MODE": {
+    "DEMO": {
+      "BADGE": "Demo",
+      "MODE": "Modalità dimostrativa",
+      "FEATURE_NOT_AVAILABLE": "Funzionalità <b>non disponibile</b> su questo sito dimostrativo.",
+      "MODE_HELP": "Il cesio funziona in <b>modalità dimostrativa</b>: è disponibile la consultazione per conto, ma non è possibile eseguire alcuna operazione per conto.",
+      "INSTALL_HELP": "Per <b>motivi di sicurezza</b> ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza."
     },
+    "READONLY": {
+      "BADGE": "Monit",
+      "MODE": "Modalità di monitoraggio",
+      "MODE_HELP": "Il cesio funziona in <b>modalità monitoraggio</b>: sono disponibili solo le funzionalità di monitoraggio della valuta.",
+      "INSTALL_HELP": "Se desidera <b>creare un account di portafoglio</b> per inviare o ricevere valuta, ti consigliamo di <b>installare</b> la tua copia del software.<br/>Visita il sito <a href='https://cesium.app'>www.cesium.app</a> per assistenza."
+    }
+  },
    "DOWNLOAD": {
      "POPUP_TITLE": "<b>File di cancellazione dell'identità/b>",
      "POPUP_REVOKE_MESSAGE": "Per migliorare la sicurezza del tuo conto, scarica <b>il documento di revoca del conto</b>. Ti consentirà di revocare tuo conto (nel caso di violazione del conto, della tua identità, conto creato con errori, etc.).<br/><br/><b>Tiene questo document al sicuro.</b>"
@@ -797,8 +827,7 @@
        "WALLET_RECEIVED_CERTS": "Questo mostra l'elenco delle persone che ti hanno fatto entrare nella WoT.",
        "WALLET_CERTIFY": "Questo bottone <b>{{'WOT.BTN_SELECT_AND_CERTIFY'|translate}}</b> permette di selezionare e certificare una identità.<br/><br/>Solo gli utenti <b>che sono già membri</b> possono certificare gli altri.",
        "WALLET_CERT_STOCK": "Tuo stock di certificazioni da dare è limitato a <b>{{sigStock}} certificazioni</b>.<br/><br/>Questo stock si rifornisce col tempo, man mano che le certificazioni inviate scadono.",
-       "MENU_BTN_TX_MEMBER": "<b>{{'MENU.TRANSACTIONS'|translate}}</b> permette l'accesso alla cronologia delle transazioni, e permette di fare nuovi bonifici.",
-       "MENU_BTN_TX": "Visualizza la cronologia <b>delle tue transazioni</b> qui e fai nuovi bonifici.",
+       "MENU_BTN_TX": "<b>{{'MENU.TRANSACTIONS'|translate}}</b> permette l'accesso alla cronologia delle transazioni, e permette di fare nuovi bonifici.",
        "MENU_BTN_WOT": "Il menu<b>{{'MENU.WOT'|translate}}</b> permette di cercare <b>utenti</b> della moneta (membri o non).",
        "WOT_SEARCH_TEXT_XS": "Per fare una ricerca nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>La ricerca inizierà automaticamente.",
        "WOT_SEARCH_TEXT": "Per cercare nel annuario, digita <b>le prime lettere dello pseudonimo o della chiave pubblica di un utente</b>.<br/><br/>Dopodichè calca <b>Enter</b> per avviare la ricerca.",
@@ -812,7 +841,8 @@
        "HEADER_BAR_BTN_PROFILE": "Clicca qui per entrare nel <b>tuo profilo utente</b>",
        "SETTINGS_CHANGE_UNIT": "Puoi cambiare <b>l'unità</b> della moneta cliccando qui.<br/><br/>- Disabilita questa opzione per vedere gli importi in {{currency|capitalize}}.<br/>- Abilita l'opzione per importi relativi in {{'COMMON.UD'|translate}}<sub>{{currency|abbreviate}}</sub> (<b>divisi</b> dal attuale Dividendo Universale).",
        "END_LOGIN": "Il tour guidato <b>è finito</b>.<br/><br/>Benvenuto nel <b>economia libera</b>!",
-       "END_NOT_LOGIN": "Il tour guidato <b>è finito</b>.<br/><br/>Se desideri entrare nella Web of Trust {{currency|capitalize}}, basta cliccare <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> qui sotto."
+       "END_NOT_LOGIN": "Il tour guidato <b>è finito</b>.<br/><br/>Se desideri entrare nella Web of Trust {{currency|capitalize}}, basta cliccare <b>{{'LOGIN.CREATE_ACCOUNT'|translate}}</b> qui sotto.",
+       "END_READONLY": "Il tour guidato <b>è finito</b>.<br/><br/>{{'MODE.READONLY.INSTALL_HELP'|translate}}."
      }
    },
   "API" :{
diff --git a/www/i18n/locale-nl-NL.json b/www/i18n/locale-nl-NL.json
index 9949b11df3c29b2be72e21e54e3d14a93a6e0dc7..bc5a3a7131c5f6a54b8d605bf054bd850c22c585 100644
--- a/www/i18n/locale-nl-NL.json
+++ b/www/i18n/locale-nl-NL.json
@@ -87,8 +87,6 @@
     "CURRENCY": "Valuta",
     "CURRENCIES": "Valuta's",
     "ACCOUNT": "Mijn rekening",
-    "TRANSFER": "Overmaken",
-    "SCAN": "Scannen",
     "SETTINGS": "Instellingen",
     "NETWORK": "Netwerk",
     "TRANSACTIONS": "Mijn transacties"
@@ -488,7 +486,11 @@
     "COPY_TO_CLIPBOARD_DONE": "Kopie geslaagd",
     "MEMBERSHIP_OUT_SENT": "Opzegging lidmaatschap succesvol verzonden",
     "NOT_NEED_MEMBERSHIP": "Je bent al lid.",
-    "IDENTITY_WILL_MISSING_CERTIFICATIONS": "Deze identiteit heeft binnenkort onvoldoende certificaties (ten minste {{willNeedCertificationCount}} nodig)."
+    "IDENTITY_WILL_MISSING_CERTIFICATIONS": "Deze identiteit heeft binnenkort onvoldoende certificaties (ten minste {{willNeedCertificationCount}} nodig).",
+    "REVOCATION_SENT": "Intrekking succesvol verzonden",
+    "REVOCATION_SENT_WAITING_PROCESS": "Intrekking <b>is succesvol verzonden</b>. Het wacht op verwerking.",
+    "FEATURE_NOT_AVAILABLE_ON_DEMO": "Functionaliteit niet beschikbaar op deze demonstratiesite.<br/>Om <b>veiligheidsredenen</b> raden we u aan uw kopie van de software te <b>installeren</b>.<br/>Bezoek de website <a href='https://cesium.app'>www.cesium.app</a> voor hulp.",
+    "EMPTY_TX_HISTORY": "Aucune operatie à exporteur"
   },
   "CONFIRM": {
     "POPUP_TITLE": "<b>Bevestiging</b>",
diff --git a/www/img/flag-eo.png b/www/img/flag-eo.png
new file mode 100644
index 0000000000000000000000000000000000000000..afd17b81607382c799b9924ddf411570a15ef4dd
Binary files /dev/null and b/www/img/flag-eo.png differ
diff --git a/www/img/flag-es.png b/www/img/flag-es.png
new file mode 100644
index 0000000000000000000000000000000000000000..65814c3e39eeb609bb5aaadf377e5ea6adcc6cf4
Binary files /dev/null and b/www/img/flag-es.png differ
diff --git a/www/img/flag-fr.png b/www/img/flag-fr.png
new file mode 100644
index 0000000000000000000000000000000000000000..00c2b429da04543a129cd2fa3dbd6af876182f56
Binary files /dev/null and b/www/img/flag-fr.png differ
diff --git a/www/img/flag-gb.png b/www/img/flag-gb.png
new file mode 100644
index 0000000000000000000000000000000000000000..531836ec058768fdbf91dd9909d73d4ef0fbad88
Binary files /dev/null and b/www/img/flag-gb.png differ
diff --git a/www/img/flag-it.png b/www/img/flag-it.png
new file mode 100644
index 0000000000000000000000000000000000000000..26071b13ea5509c4cc4b31b143e1993d8c4e9984
Binary files /dev/null and b/www/img/flag-it.png differ
diff --git a/www/img/flag-nl.png b/www/img/flag-nl.png
new file mode 100644
index 0000000000000000000000000000000000000000..01b16127ae4573eaafd0439e158401746b81d52c
Binary files /dev/null and b/www/img/flag-nl.png differ
diff --git a/www/img/flag-us.png b/www/img/flag-us.png
new file mode 100644
index 0000000000000000000000000000000000000000..44b3c28f400d3242e643742cfd56c441da4199f7
Binary files /dev/null and b/www/img/flag-us.png differ
diff --git a/www/img/splash.png b/www/img/splash.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ba82fcde6981d43e16c90293097932504c58875
Binary files /dev/null and b/www/img/splash.png differ
diff --git a/www/index.html b/www/index.html
index fe43c3f752a3952427c05955b6d60f527ac2dd05..eda74b02f348bb3120e4ef438b6dbdc0eae85ac3 100644
--- a/www/index.html
+++ b/www/index.html
@@ -16,14 +16,14 @@
     <!-- build:css dist_css/cesium.css -->
     <link rel="stylesheet" type="text/css" href="css/ionic.app.css">
     <link rel="stylesheet" type="text/css" href="css/style.css">
-    <link rel="stylesheet" type="text/css" href="lib/angular-image-crop/image-crop-styles.css">
+    <link rel="stylesheet" type="text/css" href="lib/angular-image-crop/dist/angular-image-crop.min.css">
     <!-- removeIf(device) -->
     <link rel="stylesheet" type="text/css" href="css/style-no-device.css">
     <!-- endRemoveIf(device) -->
 
     <!-- removeIf(no-plugin) -->
-    <link rel="stylesheet" type="text/css" href="css/leaflet.app.min.css">
-    <link rel="stylesheet" type="text/css" href="lib/chart.js/dist/Chart.min.css">
+    <link rel="stylesheet" type="text/css" href="css/leaflet.app.css">
+    <link rel="stylesheet" type="text/css" href="lib/chart.js/dist/Chart.css">
     <link rel="stylesheet" type="text/css" href="dist/dist_css/plugins/es/css/style.css">
     <link rel="stylesheet" type="text/css" href="dist/dist_css/plugins/graph/css/style.css">
     <link rel="stylesheet" type="text/css" href="dist/dist_css/plugins/map/css/style.css">
@@ -53,17 +53,17 @@
 
   </head>
   <body id="cesium" ng-strict-di="true" window-exit-unauth="true"
-        ng-class="{'nobackdrop': $root.tour, 'expert-mode': $root.settings.expertMode}">
+        ng-class="{'nobackdrop': $root.tour, 'expert-mode': $root.settings.expertMode, 'demo': $root.config.demo && !$root.config.readonly, 'readonly': $root.config.readonly}"
+        style="background-color: #1a237e;">
     <ion-nav-view>
       <div class="loader">
-        <h3 style="text-align: center; padding-top: 25px; "><b>Cesium</b></h3>
-        <h4 style="text-align: center;"><i class="icon ion-load-a"></i></h4>
+        <h3 style="text-align: center; padding-top: 25px; color: whitesmoke;"><b>Cesium</b></h3>
+        <h4 style="text-align: center; color: whitesmoke;"><i class="icon ion-load-a"></i></h4>
       </div>
     </ion-nav-view>
 
     <!-- build:js dist_js/vendor.js -->
     <!-- vendor js -->
-    <script src="lib/moment/min/moment-with-locales.min.js"></script>
 
     <script src="lib/numeral/numeral.js"></script>
     <script src="lib/numeral/languages/fr.js"></script>
@@ -72,10 +72,13 @@
     <script src="lib/numeral/languages/es.js"></script>
     <script src="lib/numeral/languages/it.js"></script>
     <script src="js/vendor/numeral.eo.js"></script>
+
+    <script src="lib/qrcode-generator/js/qrcode.js"></script>
+    <script src="lib/aes-js/index.js"></script>
+
+    <script src="lib/moment/min/moment-with-locales.min.js"></script>
     <script src="lib/socket.io-client/dist/socket.io.min.js"></script>
     <script src="lib/underscore/underscore-min.js"></script>
-    <script src="lib/qrcode.js/qrcode.min.js"></script>
-    <script src="lib/aes-js/index.js"></script>
     <script src="lib/chart.js/dist/Chart.min.js"></script>
 
     <!-- ionic/angular js -->
@@ -89,18 +92,18 @@
     <script src="lib/angular-resource/angular-resource.min.js"></script>
     <script src="lib/angular-translate/angular-translate.min.js"></script>
     <script src="lib/angular-messages/angular-messages.min.js"></script>
-    <script src="lib/angular-api/angular-api.js"></script>
+    <script src="lib/angular-expose-api/dist/angular-expose-api.min.js"></script>
     <script src="lib/angular-cache/dist/angular-cache.min.js"></script>
     <script src="lib/angular-screenmatch/dist/angular-screenmatch.min.js"></script>
     <script src="lib/angular-bind-notifier/dist/angular-bind-notifier.min.js"></script>
-    <script src="lib/angular-image-crop/image-crop.js"></script>
+    <script src="lib/angular-image-crop/dist/angular-image-crop.js"></script>
     <script src="lib/angular-file-saver/dist/angular-file-saver.bundle.min.js"></script>
     <script src="lib/ng-idle/angular-idle.min.js"></script>
     <script src="lib/angular-simple-logger/dist/angular-simple-logger.light.min.js"></script>
     <script src="lib/ui-leaflet/dist/ui-leaflet.min.no-header.js"></script>
     <script src="lib/ion-digit-keyboard/dist/ion-digit-keyboard.min.js"></script>
     <script src="lib/angular-chart.js/dist/angular-chart.min.js"></script>
-    <script src="lib/angular-fullscreen/src/angular-fullscreen.js"></script>
+    <script src="lib/angular-fullscreen-toggle/dist/angular-fullscreen-toggle.min.js"></script>
 
     <script src="js/vendor/base58.js" async></script>
     <!--removeIf(android)-->
@@ -249,6 +252,7 @@
     <script src="dist/dist_js/plugins/map/js/services/wot-services.js"></script>
     <script src="dist/dist_js/plugins/map/js/services/registry-services.js"></script>
     <script src="dist/dist_js/plugins/map/js/services/utils-services.js"></script>
+    <script src="dist/dist_js/plugins/map/js/controllers/common-controllers.js"></script>
     <script src="dist/dist_js/plugins/map/js/controllers/wot-controllers.js"></script>
     <script src="dist/dist_js/plugins/map/js/controllers/registry-controllers.js"></script>
     <script src="dist/dist_js/plugins/map/js/controllers/network-controllers.js"></script>
diff --git a/www/js/api/app.js b/www/js/api/app.js
index c595aa435d48e9d75b19c99104cab76ad2b64161..5eb16b7b66c85646b3772b8481895cc5acb7bd24 100644
--- a/www/js/api/app.js
+++ b/www/js/api/app.js
@@ -4,8 +4,8 @@
 // 'starter' is the name of this angular module example (also set in a <body> attribute in index.html)
 // the 2nd parameter is an array of 'requires'
 // 'starter.controllers' is found in controllers.js
-angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalprecht.translate', 'ngApi', 'angular-cache', 'angular.screenmatch',
-  'FBAngular', // = angular-fullscreen
+angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalprecht.translate', 'ngApi', 'angular-cache',
+  'angular.screenmatch', 'angular-fullscreen-toggle',
   // removeIf(no-device)
   'ngCordova',
   // endRemoveIf(no-device)
@@ -82,7 +82,7 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
 
     $scope.showLocalesPopover = function(event) {
       UIUtils.popover.show(event, {
-        templateUrl: 'templates/api/locales_popover.html',
+        templateUrl: 'templates/api/popover_locales.html',
         scope: $scope,
         autoremove: true,
         afterShow: function(popover) {
@@ -228,13 +228,21 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
     $scope.$watch('transferButton.style', $scope.computeTransferButtonHtml, true);
   })
 
-  .controller('ApiTransferCtrl', function ($scope, $rootScope, $timeout, $controller, $state, $q, $translate, $filter,
-                                           $window, $ionicHistory, BMA, CryptoUtils, UIUtils, csSettings, csCurrency,
-                                           csPlatform, csTx, csWallet, csDemoWallet){
+  .controller('ApiTransferCtrl', function($scope, $rootScope, $timeout, $controller, $state, $q, $translate, $filter,
+                                          $window, $ionicHistory, BMA, CryptoUtils, UIUtils, csConfig, csSettings,
+                                          csPlatform, csCurrency, csTx, csWallet, csDemoWallet) {
     'ngInject';
 
+    // WARN: Disable demo mode, on the API (a non-blocking warn message will be display later)
+    var config = csConfig;
+    if (config.demo) {
+      config = angular.copy(config);
+      config.demo = false;
+      config.readonly = false;
+    }
+
     // Initialize the super class and extend it.
-    angular.extend(this, $controller('AuthCtrl', {$scope: $scope}));
+    angular.extend(this, $controller('AuthCtrl', {$scope: $scope, csConfig: config}));
 
     $scope.loading = true;
     $scope.transferData = {
@@ -340,7 +348,7 @@ angular.module('cesium-api', ['ionic', 'ionic-material', 'ngMessages', 'pascalpr
       $scope.loading = true;
 
       // Set BMA node
-      if (!$scope.error && $scope.node && !BMA.node.same($scope.node.host, $scope.node.port)) {
+      if (!$scope.error && $scope.node && !BMA.node.same($scope.node)) {
         console.debug("[api] Using preferred node: {0}:{1}".format($scope.node.host, $scope.node.port));
         BMA.stop();
         BMA.copy($scope.node);
diff --git a/www/js/app.js b/www/js/app.js
index 2c8db1246555b2660c1bdfc0c854adbb49de1518..39116d84dc9b0fed4385924ce9c74712c3d768a2 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -5,8 +5,7 @@
 // the 2nd parameter is an array of 'requires'
 // 'starter.controllers' is found in controllers.js
 angular.module('cesium', ['ionic', 'ionic-material', 'ngMessages', 'ngSanitize', 'pascalprecht.translate',
-  'ngApi', 'angular-cache', 'angular.screenmatch', 'angular.bind.notifier', 'ImageCropper', 'ion-digit-keyboard',
-  'FBAngular', // = angular-fullscreen
+  'ngApi', 'angular-cache', 'angular.screenmatch', 'angular.bind.notifier', 'ImageCropper', 'ion-digit-keyboard', 'angular-fullscreen-toggle',
   // removeIf(no-device)
   'ngCordova',
   // endRemoveIf(no-device)
diff --git a/www/js/config.js b/www/js/config.js
index 59a156b177db77b03fe3c62f049a76238c7b15c8..8f3722b07ec6873b302141795194e783db6f5fa1 100644
--- a/www/js/config.js
+++ b/www/js/config.js
@@ -10,6 +10,8 @@ angular.module("cesium.config", [])
 
 .constant("csConfig", {
 	"cacheTimeMs": 300000,
+	"demo": false,
+	"readonly": false,
 	"fallbackLanguage": "en",
 	"rememberMe": true,
 	"showUDHistory": true,
@@ -22,11 +24,11 @@ angular.module("cesium.config", [])
 	"expertMode": false,
 	"decimalCount": 2,
 	"httpsMode": false,
-	"shareBaseUrl": "https://g1.duniter.fr",
+	"shareBaseUrl": "https://demo.cesium.app/",
 	"helptip": {
 		"enable": true,
 		"installDocUrl": {
-			"fr-FR": "https://duniter.org/fr/wiki/duniter/installer/",
+			"fr-FR": "https://duniter.org/fr/miner-des-blocs/installer/",
 			"en": "https://duniter.org/en/wiki/duniter/install/"
 		}
 	},
@@ -41,7 +43,7 @@ angular.module("cesium.config", [])
 			"fr-FR": "https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-fr.json",
 			"en": "https://raw.githubusercontent.com/duniter/cesium/master/doc/feed/feed-en.json"
 		},
-		"maxContentLength": 650
+		"maxContentLength": 1300
 	},
 	"node": {
 		"host": "g1.duniter.org",
@@ -53,7 +55,19 @@ angular.module("cesium.config", [])
 			"port": 443
 		},
 		{
-			"host": "g1.monnaielibreoccitanie.org",
+			"host": "g1.librelois.fr",
+			"port": 443
+		},
+		{
+			"host": "g1.e-is.pro",
+			"port": 443
+		},
+		{
+			"host": "duniter.moul.re",
+			"port": 443
+		},
+		{
+			"host": "g1.presles.fr",
 			"port": 443
 		},
 		{
@@ -61,7 +75,11 @@ angular.module("cesium.config", [])
 			"port": 443
 		},
 		{
-			"host": "g1.duniter.fr",
+			"host": "duniter.normandie-libre.fr",
+			"port": 443
+		},
+		{
+			"host": "g1.duniter.org",
 			"port": 443
 		}
 	],
@@ -76,15 +94,19 @@ angular.module("cesium.config", [])
 			"enable": true,
 			"askEnable": true,
 			"useRemoteStorage": true,
-			"host": "g1.data.duniter.fr",
+			"host": "g1.data.e-is.pro",
 			"port": 443,
 			"fallbackNodes": [
+				{
+					"host": "g1.data.presles.fr",
+					"port": 443
+				},
 				{
 					"host": "g1.data.le-sou.org",
 					"port": 443
 				},
 				{
-					"host": "g1.data.duniter.fr",
+					"host": "g1.data.mithril.re",
 					"port": 443
 				}
 			],
@@ -97,9 +119,9 @@ angular.module("cesium.config", [])
 			"defaultCountry": "France"
 		}
 	},
-	"version": "1.5.8",
-	"build": "2020-03-06T18:48:02.714Z",
+	"version": "1.6.7",
+	"build": "2020-05-06T09:07:27.415Z",
 	"newIssueUrl": "https://git.duniter.org/clients/cesium-grp/cesium/issues/new"
 })
 
-;
\ No newline at end of file
+;
diff --git a/www/js/controllers/app-controllers.js b/www/js/controllers/app-controllers.js
index c3b9c69571dfdc8d30c5f8ffefa399503285c479..7a12d4e338a964025fd42f796f4f419815dc4383 100644
--- a/www/js/controllers/app-controllers.js
+++ b/www/js/controllers/app-controllers.js
@@ -62,7 +62,7 @@ function PluginExtensionPointController($scope, PluginService) {
  * Abstract controller (inherited by other controllers)
  */
 function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $timeout,
-                       $ionicHistory, $controller, $window, csPlatform, CryptoUtils, csCrypto,
+                       $ionicHistory, $controller, $window, csPlatform, csSettings, CryptoUtils, csCrypto,
                        UIUtils, BMA, csWallet, Device, Modals, csConfig, csHttp
 ) {
   'ngInject';
@@ -161,17 +161,20 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $
   // Show Help tour
   ////////////////////////////////////////
 
-  $scope.createHelptipScope = function(isTour, helpController) {
+  $scope.createHelptipScope = function(isTour, ctrlName) {
     if (!isTour && ($rootScope.tour || !$rootScope.settings.helptip.enable || UIUtils.screen.isSmall())) {
       return; // avoid other helptip to be launched (e.g. csWallet)
     }
+    ctrlName = ctrlName || 'HelpTipCtrl';
     // Create a new scope for the tour controller
     var helptipScope = $scope.$new();
-    $controller(helpController||'HelpTipCtrl', { '$scope': helptipScope});
+    $controller(ctrlName, { '$scope': helptipScope});
     return helptipScope;
   };
 
-  $scope.startHelpTour = function(helpController, skipClearCache) {
+  $scope.startHelpTour = function(event, skipClearCache) {
+    if (event && event.defaultPrevented) return false; // Event stopped;
+
     $rootScope.tour = true; // to avoid other helptip to be launched (e.g. csWallet)
 
     // Clear cache history
@@ -179,11 +182,11 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $
       $ionicHistory.clearHistory();
       return $ionicHistory.clearCache()
         .then(function() {
-          $scope.startHelpTour(helpController, true/*continue*/);
+          $scope.startHelpTour(null, true/*continue*/);
         });
     }
 
-    var helptipScope = $scope.createHelptipScope(true/*is tour*/, helpController);
+    var helptipScope = $scope.createHelptipScope(true/*is tour*/);
     return helptipScope.startHelpTour()
       .then(function() {
         helptipScope.$destroy();
@@ -194,6 +197,19 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $
       });
   };
 
+  $scope.disableHelpTour = function(event) {
+    if (event) {
+      event.preventDefault();
+      event.stopPropagation();
+    }
+
+    if (csSettings.data.helptip && csSettings.data.helptip.enable) {
+      $rootScope.settings.helptip.enable = false;
+      csSettings.store();
+    }
+
+  };
+
   ////////////////////////////////////////
   // Login & wallet
   ////////////////////////////////////////
@@ -342,10 +358,10 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $
             });
         }
         else {
-          UIUtils.loading.hide();
+          UIUtils.loading.hide(10);
         }
       })
-      .catch(UIUtils.onError());
+      .catch(UIUtils.onError('ERROR.LOGOUT'));
   };
   // Do authentification
   $scope.doAuth = function(options) {
@@ -489,7 +505,7 @@ function AppController($scope, $rootScope, $state, $ionicSideMenuDelegate, $q, $
     var skip = $scope.fullscreen || !UIUtils.screen.isSmall() || !Device.isWeb();
     if (skip) return;
 
-    return UIUtils.alert.confirm('CONFIRM.FULLSCREEN', null, {
+    return UIUtils.alert.confirm('CONFIRM.FULLSCREEN', undefined, {
       cancelText: 'COMMON.BTN_NO',
       okText: 'COMMON.BTN_YES'
     })
@@ -518,6 +534,7 @@ function HomeController($scope, $state, $timeout, $ionicHistory, $translate, $ht
   $scope.loading = true;
   $scope.locales = angular.copy(csSettings.locales);
   $scope.smallscreen = UIUtils.screen.isSmall();
+  $scope.showInstallHelp = false;
 
   $scope.enter = function(e, state) {
     if (ionic.Platform.isIOS()) {
@@ -578,7 +595,7 @@ function HomeController($scope, $state, $timeout, $ionicHistory, $translate, $ht
     $http.get(feedUrl, {responseType: 'json', cache: csCache.get(null, csCache.constants.LONG)})
       .success(function(feed) {
         console.debug('[home] Feeds loaded in {0}ms'.format(Date.now()-now));
-        if (!feed || !feed.items || !feed.items.length) return // skip if empty
+        if (!feed || !feed.items || !feed.items.length) return; // skip if empty
 
         feed.items = feed.items.reduce(function(res, item) {
           if (!item || (!item.title && !item.content_text && !item.content_html)) return res; // Skip
@@ -614,7 +631,7 @@ function HomeController($scope, $state, $timeout, $ionicHistory, $translate, $ht
         console.error('[home] Failed to load feeds.');
         $scope.feed = null;
       });
-  }
+  };
 
   /**
    * Catch click for quick fix
@@ -633,6 +650,7 @@ function HomeController($scope, $state, $timeout, $ionicHistory, $translate, $ht
     $translate.use(langKey);
     $scope.hideLocalesPopover();
     csSettings.data.locale = _.findWhere($scope.locales, {id: langKey});
+    csSettings.store();
     $scope.loadFeeds();
   };
 
@@ -640,7 +658,7 @@ function HomeController($scope, $state, $timeout, $ionicHistory, $translate, $ht
 
   $scope.showLocalesPopover = function(event) {
     UIUtils.popover.show(event, {
-      templateUrl: 'templates/api/locales_popover.html',
+      templateUrl: 'templates/common/popover_locales.html',
       scope: $scope,
       autoremove: true,
       afterShow: function(popover) {
diff --git a/www/js/controllers/blockchain-controllers.js b/www/js/controllers/blockchain-controllers.js
index 7db5956958accf0210b84c5025f18f460f1a5652..e9dc0a5457d274c47a9b427fc25bdd460d2392d9 100644
--- a/www/js/controllers/blockchain-controllers.js
+++ b/www/js/controllers/blockchain-controllers.js
@@ -140,7 +140,7 @@ function BlockLookupController($scope, $timeout, $focus, $filter, $state, $ancho
           node.port = serverParts[1];
         }
 
-        if (BMA.node.same(node.host, node.port)) {
+        if (BMA.node.same(node)) {
           $scope.node = BMA;
         }
         else {
@@ -454,7 +454,7 @@ function BlockLookupController($scope, $timeout, $focus, $filter, $state, $ancho
         $anchorScroll('block-' + block.number);
       }, 900);
     }
-    else if (BMA.node.same($scope.node.host, $scope.node.port)) {
+    else if (BMA.node.same($scope.node)) {
       $state.go('app.view_block_hash', {number: block.number, hash: block.hash});
     }
     else {
@@ -534,7 +534,7 @@ function BlockViewController($scope, $ionicPopover, $state, UIUtils, BMA, csCurr
           node.port = serverParts[1];
         }
 
-        if (BMA.node.same(node.host, node.port)) {
+        if (BMA.node.same(node)) {
           $scope.node = BMA;
         }
         else {
diff --git a/www/js/controllers/help-controllers.js b/www/js/controllers/help-controllers.js
index 860dda14572b132abca105f4ee804b93d7232b48..eeb7336a841eb80418142b2d766237dff306ae0c 100644
--- a/www/js/controllers/help-controllers.js
+++ b/www/js/controllers/help-controllers.js
@@ -130,7 +130,7 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
         return $scope.executeStep(partName, steps, index+1);
       })
       .catch(function(err) {
-        if (err && err.message == 'transition prevented') {
+        if (err && err.message === 'transition prevented') {
           console.error('ERROR: in help tour [{0}], in step [{1}] -> use large if exists, to prevent [transition prevented] error'.format(partName, index));
         }
         else {
@@ -161,117 +161,143 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
     $scope.tour = true;
     $scope.continue = true;
 
-    // Currency
-    return $scope.startCurrencyTour(0, true)
-      .then(function(endIndex){
-        if (!endIndex || $scope.cancelled) return false;
-        csSettings.data.helptip.currency=endIndex;
-        csSettings.store();
-        return $scope.continue;
-      })
+    console.debug("[help] Starting help tour... {demo: {0}, readonly: {1}, isLogin: {2}}".format(
+      csConfig.demo, csConfig.readonly, csWallet.isLogin()));
+
+    // Wallet (if NOT readonly and NOT login)
+    return ((!csConfig.readonly && csWallet.isLogin()) ? $scope.startWalletNoLoginTour(0, true) : $q.when(true))
 
-      // Network
+      // Wallet (if login)
       .then(function(next){
         if (!next) return false;
-        return $scope.startNetworkTour(0, true)
+        if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue
+        return $scope.startWalletTour(0, true)
           .then(function(endIndex){
-            if (!endIndex || $scope.cancelled) return false;
-            csSettings.data.helptip.network=endIndex;
+            if (!endIndex) return false;
+            csSettings.data.helptip.wallet=endIndex;
             csSettings.store();
             return $scope.continue;
           });
       })
 
-      // Wot lookup
+      // Wallet certifications
       .then(function(next){
         if (!next) return false;
-        return $scope.startWotLookupTour(0, true)
+        if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue
+        return $scope.startWalletCertTour(0, true)
           .then(function(endIndex){
-            if (!endIndex || $scope.cancelled) return false;
-            csSettings.data.helptip.wotLookup=endIndex;
+            if (!endIndex) return false;
+            csSettings.data.helptip.walletCerts=endIndex;
             csSettings.store();
             return $scope.continue;
           });
       })
 
-      // Wot identity
+      // My operations (if login)
       .then(function(next){
         if (!next) return false;
-        return $scope.startWotTour(0, true)
+        if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue
+        return $scope.startTxTour(0, true)
           .then(function(endIndex){
-            if (!endIndex || $scope.cancelled) return false;
-            csSettings.data.helptip.wot=endIndex;
+            if (!endIndex) return false;
+            csSettings.data.helptip.tx=endIndex;
             csSettings.store();
             return $scope.continue;
           });
       })
 
-      // Identity certifications
+      // My wallets (if login)
       .then(function(next){
         if (!next) return false;
-        return $scope.startWotCertTour(0, true)
+        if (csConfig.readonly || !csWallet.isLogin()) return true; // not login or readonly: continue
+        return $scope.startWalletsTour(0, true)
           .then(function(endIndex){
             if (!endIndex) return false;
-            csSettings.data.helptip.wotCerts=endIndex;
+            csSettings.data.helptip.wallets=endIndex;
             csSettings.store();
             return $scope.continue;
           });
       })
 
-      // Wallet (if NOT login)
+      // Header tour
       .then(function(next){
         if (!next) return false;
-        return $scope.startWalletNoLoginTour(0, true);
+        if (csConfig.readonly) return true; // readonly: continue
+        return $scope.startHeaderTour(0, true);
       })
 
-      // Wallet (if login)
+      // Settings tour (if not readonly mode)
       .then(function(next){
         if (!next) return false;
-        if (!csWallet.isLogin()) return true; // not login: continue
-        return $scope.startWalletTour(0, true)
+        if (csConfig.readonly) return true; // Skip if readonly mode (will be play later)
+        return $scope.startSettingsTour(0, true);
+      })
+
+      // Wot lookup tour
+      .then(function(next){
+        if (!next) return false;
+        return $scope.startWotLookupTour(0, true)
           .then(function(endIndex){
-            if (!endIndex) return false;
-            csSettings.data.helptip.wallet=endIndex;
+            if (!endIndex || $scope.cancelled) return false;
+            csSettings.data.helptip.wotLookup=endIndex;
             csSettings.store();
             return $scope.continue;
           });
       })
 
-      // Wallet certifications
+      // Wot identity
       .then(function(next){
         if (!next) return false;
-        if (!csWallet.isLogin()) return true; // not login: continue
-        return $scope.startWalletCertTour(0, true)
+        return $scope.startWotTour(0, true)
           .then(function(endIndex){
-            if (!endIndex) return false;
-            csSettings.data.helptip.walletCerts=endIndex;
+            if (!endIndex || $scope.cancelled) return false;
+            csSettings.data.helptip.wot=endIndex;
             csSettings.store();
             return $scope.continue;
           });
       })
 
-      // My operations (if login)
+      // Identity certifications
       .then(function(next){
         if (!next) return false;
-        if (!csWallet.isLogin()) return true; // not login: continue
-        return $scope.startTxTour(0, true)
+        return $scope.startWotCertTour(0, true)
           .then(function(endIndex){
             if (!endIndex) return false;
-            csSettings.data.helptip.tx=endIndex;
+            csSettings.data.helptip.wotCerts=endIndex;
             csSettings.store();
             return $scope.continue;
           });
       })
 
-      // Header tour
+      // Currency tour
       .then(function(next){
         if (!next) return false;
-        return $scope.startHeaderTour(0, true);
+
+        return $scope.startCurrencyTour(0, true)
+          .then(function(endIndex){
+            if (!endIndex || $scope.cancelled) return false;
+            csSettings.data.helptip.currency=endIndex;
+            csSettings.store();
+            return $scope.continue;
+          });
+      })
+
+      // Network tour
+      .then(function(next){
+        if (!next) return false;
+        return $scope.startNetworkTour(0, true)
+          .then(function(endIndex){
+            if (!endIndex || $scope.cancelled) return false;
+            csSettings.data.helptip.network=endIndex;
+            csSettings.store();
+            return $scope.continue;
+          });
       })
 
-      // Settings tour
+      // Settings tour (if readonly mode)
       .then(function(next){
         if (!next) return false;
+        if (!csConfig.readonly) return true; // Skip if NOT readonly
         return $scope.startSettingsTour(0, true);
       })
 
@@ -304,7 +330,7 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
           bindings: {
             content: 'HELP.TIP.MENU_BTN_CURRENCY',
             icon: {
-              position: 'left'
+              position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'
             }
           }
         });
@@ -392,7 +418,8 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
             },
             hasNext: hasNext
           },
-          timeout: 1200 // need for Firefox
+          timeout: 1200, // need for Firefox
+          retry: 2
         });
       }
     ];
@@ -416,7 +443,7 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
         // Select the second tabs
         $timeout(function () {
           var tabs = $window.document.querySelectorAll('ion-tabs .tabs a');
-          if (tabs && tabs.length == 3) {
+          if (tabs && tabs.length === 3) {
             angular.element(tabs[2]).triggerHandler('click');
           }
         }, 100);
@@ -434,7 +461,7 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
           bindings: {
             content: 'HELP.TIP.MENU_BTN_NETWORK',
             icon: {
-              position: 'left'
+              position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'
             }
           }
         });
@@ -529,7 +556,7 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
           bindings: {
             content: 'HELP.TIP.MENU_BTN_WOT',
             icon: {
-              position: 'left'
+              position: UIUtils.screen.isSmall() || csConfig.readonly ? 'left' : 'bottom-left'
             }
           },
           onError: 'continue'
@@ -634,6 +661,8 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
    * @returns {*}
    */
   $scope.startWotCertTour = function(startIndex, hasNext) {
+    if (csConfig.readonly) return $q.when(true);
+
     var steps = [
 
       function() {
@@ -693,6 +722,32 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
             hasNext: hasNext
           }
         });
+      },
+
+      function () {
+        $ionicSideMenuDelegate.toggleLeft(true);
+        return $scope.showHelpTip('helptip-menu-btn-tx', {
+          bindings: {
+            content: 'HELP.TIP.MENU_BTN_TX',
+            icon: {
+              position: 'left'
+            },
+            hasNext: hasNext
+          }
+        });
+      },
+
+      function () {
+        $ionicSideMenuDelegate.toggleLeft(true);
+        return $scope.showHelpTip('helptip-menu-btn-wallets', {
+          bindings: {
+            content: 'HELP.TIP.MENU_BTN_WALLETS',
+            icon: {
+              position: 'left'
+            },
+            hasNext: hasNext
+          }
+        });
       }
     ];
 
@@ -736,7 +791,9 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
                 icon: {
                   position: UIUtils.screen.isSmall() ? 'right' : 'center'
                 }
-              }
+              },
+              timeout: UIUtils.screen.isSmall() ? 2000 : 1000,
+              retry: 10
             });
           });
       },
@@ -912,7 +969,7 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
         $ionicSideMenuDelegate.toggleLeft(true);
         return $scope.showHelpTip('helptip-menu-btn-tx', {
           bindings: {
-            content: csWallet.data.isMember ? 'HELP.TIP.MENU_BTN_TX_MEMBER' : 'HELP.TIP.MENU_BTN_TX',
+            content: 'HELP.TIP.MENU_BTN_TX',
             icon: {
               position: 'left'
             }
@@ -965,12 +1022,36 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
       });
   };
 
+  /**
+   * Features tour on My wallets
+   * @returns {*}
+   */
+  $scope.startWalletsTour = function(startIndex, hasNext) {
+
+    var steps = [
+      function () {
+        $ionicSideMenuDelegate.toggleLeft(true);
+        return $scope.showHelpTip('helptip-menu-btn-wallets', {
+          bindings: {
+            content: 'HELP.TIP.MENU_BTN_WALLETS',
+            icon: {
+              position: 'left'
+            },
+            hasNext: hasNext
+          }
+        });
+      }
+    ];
+
+    return $scope.executeStep('my-wallets', steps, startIndex);
+  };
+
   /**
    * header tour
    * @returns {*}
    */
   $scope.startHeaderTour = function(startIndex, hasNext) {
-    if (UIUtils.screen.isSmall()) return $q.when(true);
+    if (UIUtils.screen.isSmall() || csConfig.readonly) return $q.when(true);
 
     function _getProfilBtnElement() {
       var elements = $window.document.querySelectorAll('#helptip-header-bar-btn-profile');
@@ -984,11 +1065,14 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
         if (UIUtils.screen.isSmall()) return true; // skip for small screen
         var element = _getProfilBtnElement();
         if (!element) return true;
+
         return $scope.showHelpTip(element, {
           bindings: {
             content: 'HELP.TIP.HEADER_BAR_BTN_PROFILE',
             icon: {
-              position: 'right'
+              position: 'right',
+              // If home; add offset because of locales button
+              style: $state.is('app.home') ? 'margin-right: 60px' : undefined
             }
           }
         });
@@ -1047,13 +1131,13 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
     var steps = [
 
       function () {
-        if (!UIUtils.screen.isSmall()) return true;
+        if (!UIUtils.screen.isSmall() && !csConfig.readonly) return true;
         $ionicSideMenuDelegate.toggleLeft(true);
-        return $scope.showHelpTip('helptip-menu-btn-settings', {
+        return $scope.showHelpTip(UIUtils.screen.isSmall() ? 'helptip-menu-btn-settings' : 'menu-btn-settings', {
           bindings: {
             content: 'HELP.TIP.MENU_BTN_SETTINGS',
             icon: {
-              position: 'left'
+              position: UIUtils.screen.isSmall() ? 'left' : 'bottom-left'
             }
           },
           timeout: 1000
@@ -1129,7 +1213,7 @@ function HelpTipController($scope, $state, $window, $ionicSideMenuDelegate, $tim
         .then(function(){
           return $scope.showHelpTip('helptip-home-logo', {
            bindings: {
-             content: 'HELP.TIP.END_NOT_LOGIN',
+             content: !csConfig.readonly ? 'HELP.TIP.END_NOT_LOGIN' : 'HELP.TIP.END_READONLY',
              contentParams: contentParams,
              hasNext: false
            }
diff --git a/www/js/controllers/join-controllers.js b/www/js/controllers/join-controllers.js
index 0cfa56f3c7e8d218b8048512d315e6baacf34269..f4444fd7c98afc93a917e34e75b3c1ce29ea93fd 100644
--- a/www/js/controllers/join-controllers.js
+++ b/www/js/controllers/join-controllers.js
@@ -40,7 +40,7 @@ function JoinController($scope, $timeout, $controller, Modals, csWallet) {
 
 }
 
-function JoinChooseAccountTypeModalController($scope, $state, Modals, UIUtils, csCurrency) {
+function JoinChooseAccountTypeModalController($scope, $state, Modals, UIUtils, csConfig, csCurrency) {
   'ngInject';
 
   $scope.formData = {};
@@ -86,6 +86,9 @@ function JoinChooseAccountTypeModalController($scope, $state, Modals, UIUtils, c
   };
 
   $scope.selectAccountTypeAndClose = function(type) {
+    if (csConfig.demo) {
+      return UIUtils.alert.demo();
+    }
     $scope.formData.accountType = type;
     $scope.closeModal($scope.formData);
   };
diff --git a/www/js/controllers/login-controllers.js b/www/js/controllers/login-controllers.js
index f5f40c7e0bd3ce82f778830ec444cffe2d6a53b2..527495df719def631ab0ccf4fb16100d743a89de 100644
--- a/www/js/controllers/login-controllers.js
+++ b/www/js/controllers/login-controllers.js
@@ -43,12 +43,17 @@ function LoginController($scope, $timeout, $controller, csWallet) {
 
 }
 
-function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, CryptoUtils, csCrypto, ionicReady,
-                              UIUtils, BMA, Modals, csSettings, Device, parameters) {
+function LoginModalController($scope, $timeout, $q, $ionicPopover, $window, CryptoUtils, csCrypto, ionicReady,
+                              UIUtils, BMA, Modals, csConfig, csSettings, Device, parameters) {
   'ngInject';
 
   parameters = parameters || {};
 
+  // Demo mode: force PUBKEY method
+  if (csConfig.demo) {
+    parameters.method = 'PUBKEY';
+  }
+
   $scope.computing = false;
   $scope.pubkey = null;
   $scope.formData = {};
@@ -419,7 +424,11 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, Cr
   $scope.changeMethod = function(method, params){
     $scope.hideMethodsPopover();
 
-    if (!method || method == $scope.formData.method) return; // same method
+    if (method !== 'PUBKEY' && csConfig.demo) {
+      return UIUtils.alert.demo();
+    }
+
+    if (!method || method === $scope.formData.method) return; // same method
 
     console.debug("[login] method is: " + method);
     $scope.formData.method = method;
@@ -431,7 +440,7 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, Cr
     }
 
     // Scrypt (advanced or not)
-    if (method == 'SCRYPT_DEFAULT' || method == 'SCRYPT_ADVANCED') {
+    if (method === 'SCRYPT_DEFAULT' || method === 'SCRYPT_ADVANCED') {
       $scope.pubkey = null;
 
 
@@ -451,9 +460,9 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, Cr
       }
       $scope.changeScrypt(scrypt);
 
-      $scope.autoComputePubkey = $scope.autoComputePubkey && (method == 'SCRYPT_DEFAULT');
+      $scope.autoComputePubkey = $scope.autoComputePubkey && (method === 'SCRYPT_DEFAULT');
     }
-    else if (method == 'SCAN') {
+    else if (method === 'SCAN') {
       return $scope.doScan();
     }
     else {
@@ -506,14 +515,17 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, Cr
       });
   };
 
-  $scope.fileChanged = function(event) {
-    $scope.validatingFile = true;
-    $scope.formData.file = event && event.target && event.target.files && event.target.files.length && event.target.files[0];
-    if (!$scope.formData.file) {
+  $scope.onFileChanged = function(file) {
+    if (!file || !file.fileData) {
       $scope.validatingFile = false;
-      return;
+      return; // Skip
     }
-
+    $scope.formData.file = {
+      name: file.fileData.name,
+      size: file.fileData.size,
+      content: file.fileContent
+    };
+    $scope.validatingFile = true;
     $timeout(function() {
       console.debug("[login] key file changed: ", $scope.formData.file);
       $scope.validatingFile = true;
@@ -526,7 +538,7 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, Cr
           }
           else {
             $scope.formData.file.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);
-            $scope.formData.file.valid = !$scope.expectedPubkey || $scope.expectedPubkey == $scope.formData.file.pubkey;
+            $scope.formData.file.valid = !$scope.expectedPubkey || $scope.expectedPubkey === $scope.formData.file.pubkey;
             $scope.validatingFile = false;
           }
 
@@ -544,51 +556,6 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, Cr
     });
   };
 
-  /**
-   * On the file chooser
-   */
-  $scope.openFileChooser = function() {
-    var elements = angular.element(document.getElementById('loginImportFile'));
-    if (elements && elements.length) {
-      elements[0].click();
-    }
-  }
-
-  /**
-   * On file drop
-   */
-  $scope.onKeyFileDrop = function(file) {
-    if (!file || !file.fileData) return;
-
-    $scope.formData.file = {
-      name: file.fileData.name,
-      size: file.fileData.size,
-      content: file.fileContent
-    };
-    $scope.validatingFile = true;
-    $timeout(function() {
-      return $scope.readKeyFile($scope.formData.file, {withSecret: false})
-        .then(function (keypair) {
-          if (!keypair || !keypair.signPk) {
-            $scope.formData.file.valid = false;
-            $scope.formData.file.pubkey = undefined;
-          }
-          else {
-            $scope.formData.file.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);
-            $scope.formData.file.valid = !$scope.expectedPubkey || $scope.expectedPubkey == $scope.formData.file.pubkey;
-            $scope.validatingFile = false;
-          }
-
-        })
-        .catch(function (err) {
-          $scope.validatingFile = false;
-          $scope.formData.file.valid = false;
-          $scope.formData.file.pubkey = undefined;
-          UIUtils.onError('ERROR.AUTH_FILE_ERROR')(err);
-        });
-    });
-  };
-
   $scope.removeKeyFile = function() {
     $scope.formData.file = undefined;
   };
@@ -634,18 +601,25 @@ function LoginModalController($scope, $timeout, $q, $ionicPopover, $document, Cr
   // TODO : for DEV only
   /*$timeout(function() {
     $scope.formData = {
-      username: 'benoit.lavenier@e-is.pro',
-      password: ''
+      method: 'SCRYPT_DEFAULT',
+      username: 'abc',
+      password: 'def'
     };
-    //$scope.form = {$valid:true};
-  }, 900);*/
+    $scope.form = {$valid:true};
+
+    $timeout($scope.doLogin, 500);
+  }, 900); */
 }
 
 
-function AuthController($scope, $controller){
+function AuthController($scope, $controller, csConfig){
+
+  var config = angular.copy(csConfig);
+  config.demo = false;
+  config.readonly = false;
 
   // Initialize the super class and extend it.
-  angular.extend(this, $controller('LoginModalCtrl', {$scope: $scope, parameters: {auth: true}}));
+  angular.extend(this, $controller('LoginModalCtrl', {$scope: $scope, parameters: {auth: true}, csConfig: config}));
 
   $scope.setForm = function(form) {
     $scope.form = form;
diff --git a/www/js/controllers/network-controllers.js b/www/js/controllers/network-controllers.js
index 35ca9fda82b47b71ede1c54bdfd3d6e91de225db..7a718b9359b3f1d9683048981e608c651a912839 100644
--- a/www/js/controllers/network-controllers.js
+++ b/www/js/controllers/network-controllers.js
@@ -92,8 +92,9 @@ function NetworkLookupController($scope,  $state, $location, $ionicPopover, $win
     csCurrency.get()
       .then(function (currency) {
         if (currency) {
-          $scope.node = !BMA.node.same(currency.node.host, currency.node.port) ?
-            BMA.instance(currency.node.host, currency.node.port) : BMA;
+          var isDefaultNode = BMA.node.same(currency.node);
+          $scope.node = isDefaultNode ? BMA :
+            BMA.instance(currency.node.host, currency.node.port);
           if (state && state.stateParams) {
             if (state.stateParams.type && ['mirror', 'member', 'offline'].indexOf(state.stateParams.type) != -1) {
               $scope.search.type = state.stateParams.type;
@@ -116,6 +117,10 @@ function NetworkLookupController($scope,  $state, $location, $ionicPopover, $win
    * Leave the view
    */
   $scope.leave = function() {
+    // Close node, if not the default BMA
+    if ($scope.node !== BMA) {
+      $scope.node.close();
+    }
     if (!$scope.networkStarted) return;
     $scope.removeListeners();
     csNetwork.close();
@@ -452,6 +457,7 @@ function PeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp, B
 
   $scope.load = function() {
 
+    console.debug("[peer-popover] Loading peer info...");
     $scope.loading = true;
     $scope.formData = {};
 
diff --git a/www/js/controllers/settings-controllers.js b/www/js/controllers/settings-controllers.js
index 4981f8e68c5b3b1137e79074f71d2dda6f7205f3..0239a70f41783582505d17b80b4a3610a53e0f51 100644
--- a/www/js/controllers/settings-controllers.js
+++ b/www/js/controllers/settings-controllers.js
@@ -84,24 +84,24 @@ function SettingsController($scope, $q, $window, $ionicHistory, $ionicPopup, $ti
     $q.all([
       csSettings.ready(),
       csCurrency.parameters()
-        .then(function(parameters) {
-          return parameters && parameters.avgGenTime;
-        })
-        // Make sure to continue even if node is down - Fix #788
         .catch(function(err) {
-          console.error("[settings] Could not not currency parameters. Using default 'avgGenTime' (300)", err);
-          return {avgGenTime: 300};
+          // Continue (will use default value)
+          // Make sure to continue even if node is down - Fix #788
         })
         .then(function(parameters) {
+          var avgGenTime = parameters && parameters.avgGenTime;
+          if (!avgGenTime || avgGenTime < 0) {
+            console.warn("[settings] Could not not currency parameters. Using default G1 'avgGenTime' (300s)");
+            avgGenTime = 300; /* = G1 value = 5min */
+          }
           _.each($scope.blockValidityWindows, function(blockCount) {
             if (blockCount > 0) {
-              $scope.blockValidityWindowLabels[blockCount].labelParams.time= parameters.avgGenTime * blockCount;
+              $scope.blockValidityWindowLabels[blockCount].labelParams.time = avgGenTime * blockCount;
             }
           });
         })
     ])
-      .then($scope.load)
-    ;
+    .then($scope.load);
   });
 
   $scope.setPopupForm = function(popupForm) {
@@ -167,8 +167,7 @@ function SettingsController($scope, $q, $window, $ionicHistory, $ionicPopup, $ti
       }
       UIUtils.loading.show();
 
-      var nodeBMA = BMA.instance(newNode.host, newNode.port, newNode.useSsl, true /*cache*/);
-      nodeBMA.isAlive()
+      BMA.isAlive(newNode)
         .then(function(alive) {
           if (!alive) {
             UIUtils.loading.hide();
@@ -180,7 +179,8 @@ function SettingsController($scope, $q, $window, $ionicHistory, $ionicPopup, $ti
           UIUtils.loading.hide();
           angular.merge($scope.formData.node, newNode);
           delete $scope.formData.node.temporary;
-          BMA.copy(nodeBMA);
+          BMA.stop();
+          BMA.copy(newNode);
           $scope.bma = BMA;
 
           // Restart platform (or start if not already started)
diff --git a/www/js/controllers/transfer-controllers.js b/www/js/controllers/transfer-controllers.js
index ad1f64538d1a5adb611abb8f1e6f729b55d01de4..32386d350c6edd75e4a889377eb62bc7a7448889 100644
--- a/www/js/controllers/transfer-controllers.js
+++ b/www/js/controllers/transfer-controllers.js
@@ -275,6 +275,8 @@ function TransferModalController($scope, $q, $translate, $timeout, $filter, $foc
   };
 
   $scope.doTransfer = function() {
+    if ($scope.loading) return; // Skip
+
     $scope.form.$submitted=true;
 
     if(!$scope.form.$valid || !$scope.formData.destPub || !$scope.formData.amount) {
diff --git a/www/js/controllers/wallet-controllers.js b/www/js/controllers/wallet-controllers.js
index e14831fa9e5b263178720ee7eba9e59ace634b6f..59224fef7532a939a74785d6dabdbfc9b1e06f17 100644
--- a/www/js/controllers/wallet-controllers.js
+++ b/www/js/controllers/wallet-controllers.js
@@ -91,7 +91,7 @@ function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state,
     }
     else {
       // update view (to refresh avatar + plugin data, such as profile, subscriptions...)
-      UIUtils.loading.hide();
+      UIUtils.loading.hide(10);
       $timeout($scope.updateView, 300);
     }
   };
@@ -105,15 +105,19 @@ function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state,
         $scope.formData = walletData;
         $scope.loading=false; // very important, to avoid TX to be display before wallet.currentUd is loaded
         $scope.updateView();
+        $scope.addListeners();
+
         $scope.showQRCode();
         if (wallet.isDefault()) $scope.showHelpTip();
-        $scope.addListeners();
-        UIUtils.loading.hide(); // loading could have be open (e.g. new account)
+
+        UIUtils.loading.hide(10); // loading could have be open (e.g. new account)
       })
       .catch(function(err){
         if (err === 'CANCELLED') {
           $scope.showHome();
+          return;
         }
+        UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR')(err);
       });
   };
 
@@ -467,27 +471,26 @@ function WalletController($scope, $rootScope, $q, $ionicPopup, $timeout, $state,
   };
 
   $scope.showQRCode = function(timeout) {
-    if (!$scope.qrcode) {
-      $scope.qrcode = new QRCode(
-        $scope.qrcodeId,
-        {
-          text: $scope.formData.pubkey,
-          width: 180,
-          height: 180,
-          correctLevel: QRCode.CorrectLevel.L
-        });
-      UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);
-    }
-    else {
-      $scope.qrcode.clear();
-      $scope.qrcode.makeCode($scope.formData.pubkey);
-      UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);
+    if (!wallet || !$scope.qrcodeId) return; // Skip
+
+    // Get the DIV element
+    var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));
+    if (!element) {
+      console.error("[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.".format($scope.qrcodeId));
+      return;
     }
+
+    wallet.loadQrCode()
+      .then(function(svg) {
+        element.html(svg);
+        UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);
+      });
   };
 
   $scope.hideQRCode = function() {
-    if ($scope.qrcode) {
-      $scope.qrcode.clear();
+    if (!$scope.qrcodeId) return;
+    var element = angular.element(document.querySelector('#' + $scope.qrcodeId));
+    if (element) {
       UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});
     }
   };
@@ -686,6 +689,7 @@ function WalletTxController($scope, $ionicPopover, $state, $timeout, $location,
   $scope.loading = true;
   $scope.settings = csSettings.data;
   $scope.listeners = [];
+  $scope.qrcodeId = 'qrcode-wallet-tx-' + $scope.$id;
 
   var wallet;
 
@@ -720,7 +724,7 @@ function WalletTxController($scope, $ionicPopover, $state, $timeout, $location,
   $scope.$on('$ionicView.leave', $scope.leave);
 
   $scope.load = function() {
-    if (!wallet) return;
+    if (!wallet) return $q.reject('Missing wallet');
 
     var hasMinData = wallet.isDataLoaded({minData: true});
     var options = {
@@ -737,15 +741,21 @@ function WalletTxController($scope, $ionicPopover, $state, $timeout, $location,
         $scope.formData = walletData;
         $scope.loading = false; // very important, to avoid TX to be display before wallet.currentUd is loaded
         $scope.updateView();
+        $scope.addListeners();
+
         $scope.showFab('fab-transfer');
+        $scope.showQRCode();
         if (wallet.isDefault()) $scope.showHelpTip();
-        $scope.addListeners();
-        UIUtils.loading.hide(); // loading could have be open (e.g. during login phase)
+
+        return UIUtils.loading.hide(10); // loading could have be open (e.g. during login phase)
       })
       .catch(function(err){
         if (err === 'CANCELLED') {
           $scope.showHome();
+          return;
         }
+        console.error(err);
+        UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR')(err);
       });
   };
 
@@ -802,6 +812,31 @@ function WalletTxController($scope, $ionicPopover, $state, $timeout, $location,
       .catch(UIUtils.onError('ERROR.REFRESH_WALLET_DATA'));
   };
 
+  $scope.showQRCode = function(timeout) {
+    if (!wallet || !$scope.qrcodeId) return; // Skip
+
+    // Get the DIV element
+    var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));
+    if (!element) {
+      console.error("[wallet-controller] Cannot found div #{0} for the QRCode. Skipping.".format($scope.qrcodeId));
+      return;
+    }
+
+    wallet.loadQrCode()
+      .then(function(svg) {
+        element.html(svg);
+        UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);
+      });
+  };
+
+  $scope.hideQRCode = function() {
+    if (!$scope.qrcodeId) return;
+    var element = angular.element(document.querySelector('#' + $scope.qrcodeId));
+    if (element) {
+      UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});
+    }
+  };
+
   /* -- add listeners -- */
 
   $scope.addListeners = function() {
@@ -1074,7 +1109,7 @@ function WalletTxErrorController($scope, UIUtils, csSettings, csWallet) {
 
 }
 
-function WalletSecurityModalController($scope, UIUtils, csWallet, $translate, parameters){
+function WalletSecurityModalController($scope, UIUtils, csConfig, csWallet, $translate, parameters){
 
   var wallet = parameters && parameters.wallet || csWallet;
 
@@ -1116,6 +1151,10 @@ function WalletSecurityModalController($scope, UIUtils, csWallet, $translate, pa
       });
     });
 
+  $scope.$on("$ionicSlides.sliderInitialized", function(event, data){
+    // Disable swipe
+    data.slider.lockSwipes();
+  });
 
   $scope.slidePrev = function() {
     $scope.slides.slider.unlockSwipes();
@@ -1185,7 +1224,10 @@ function WalletSecurityModalController($scope, UIUtils, csWallet, $translate, pa
     }
   };
 
-  $scope.selectOption = function(option){
+  $scope.selectOption = function(option, enableOnDemo){
+    if (!enableOnDemo && csConfig.demo) {
+      return UIUtils.alert.demo();
+    }
     $scope.option = option;
     $scope.slideNext();
   };
@@ -1232,13 +1274,12 @@ function WalletSecurityModalController($scope, UIUtils, csWallet, $translate, pa
   };
 
   /**
-   * Recover Id
+   * Set the file content
    */
-
-  $scope.recoverContent = function(file) {
+  $scope.onFileChanged = function(file) {
     $scope.hasContent = angular.isDefined(file) && file !== '';
     $scope.fileData = file.fileData ? file.fileData : '';
-    $scope.isValidFile = $scope.fileData !== '' && $scope.fileData.type == 'text/plain';
+    $scope.isValidFile = $scope.fileData !== '' && $scope.fileData.type === 'text/plain';
 
     if ($scope.isValidFile && $scope.option === 'recoverID') {
       $scope.content = file.fileContent.split('\n');
@@ -1290,7 +1331,8 @@ function WalletSecurityModalController($scope, UIUtils, csWallet, $translate, pa
         else {
           UIUtils.alert.error('ERROR.RECOVER_ID_FAILED');
         }
-      });
+      })
+      .catch(UIUtils.onError('ERROR.RECOVER_ID_FAILED'));
 
   };
 
@@ -1447,7 +1489,16 @@ function WalletSecurityModalController($scope, UIUtils, csWallet, $translate, pa
         $scope.closeModal();
         return UIUtils.loading.hide();
       })
-      .catch(UIUtils.onError('ERROR.REVOCATION_FAILED'));
+      .catch(function(err) {
+        if ($scope.revocation){
+          $scope.isValidFile = false;
+          $scope.revocationError = err && err.message || err || 'ERROR.REVOCATION_FAILED';
+          UIUtils.loading.hide(10);
+        }
+        else {
+          UIUtils.onError('ERROR.REVOCATION_FAILED')(err);
+        }
+      });
   };
 
 
diff --git a/www/js/controllers/wallets-controllers.js b/www/js/controllers/wallets-controllers.js
index 8825522a9ec4ba7067f63e32c25df12d2773b7d0..a7526041b32b8fbbaaa13beccda2d8853c196b4b 100644
--- a/www/js/controllers/wallets-controllers.js
+++ b/www/js/controllers/wallets-controllers.js
@@ -317,27 +317,23 @@ function WalletListAbstractController($scope, $q, $timeout, UIUtils, filterTrans
       success: UIUtils.loading.show,
       method: 'PUBKEY' // Default method - fix #767
     })
-      .then(function(walletData) {
-        if (!walletData || !walletData.pubkey) { // User cancelled
+      .then(function(data) {
+        if (!data || !data.pubkey) { // User cancelled
           UIUtils.loading.hide(100);
           return;
         }
 
         // Avoid to add main wallet again
-        if (csWallet.isUserPubkey(walletData.pubkey)) {
-          UIUtils.loading.hide();
-          UIUtils.alert.error('ERROR.COULD_NOT_ADD_MAIN_WALLET');
-          return;
+        if (csWallet.isUserPubkey(data.pubkey)) {
+          throw new Error('ERROR.COULD_NOT_ADD_MAIN_WALLET');
         }
 
         // Avoid to add exists wallet again
-        if (csWallet.children.hasPubkey(walletData.pubkey)) {
-          UIUtils.loading.hide();
-          UIUtils.alert.error('ERROR.COULD_NOT_ADD_EXISTING_WALLET');
-          return;
+        if (csWallet.children.hasPubkey(data.pubkey)) {
+          throw new Error('ERROR.COULD_NOT_ADD_EXISTING_WALLET');
         }
 
-        console.debug("[wallet] Adding secondary wallet {{0}}".format(walletData.pubkey.substring(0,8)));
+        console.debug("[wallet] Adding secondary wallet {{0}}".format(data.pubkey && data.pubkey.substring(0,8)));
 
         // Add the child wallet
         return $scope.addNewWallet(wallet)
@@ -346,12 +342,7 @@ function WalletListAbstractController($scope, $q, $timeout, UIUtils, filterTrans
             $scope.updateView();
           });
       })
-      .catch(function(err) {
-        if (err === 'CANCELLED') {
-          // Silent
-          UIUtils.loading.hide();
-        }
-      });
+      .catch(UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED'));
   };
 
   /* -- Method to override by subclasses-- */
@@ -506,23 +497,21 @@ function WalletListViewController($scope, $controller, $state, $timeout, $q, $tr
       showDefault: false
     })
       .then(function(wallet) {
-        if (!wallet || !wallet.id) return;
+        if (!wallet || !wallet.id) return; // User has cancelled
 
         // Auth (if encryption is need))
         return (csSettings.data.useLocalStorageEncryption ? csWallet.auth({minData: true}) : $q.when())
 
           // Remove the wallet
           .then(function() {
-            csWallet.children.remove(wallet.id);
+            return csWallet.children.remove(wallet.id);
+          })
+          // Refresh UI
+          .then(function() {
             UIUtils.loading.hide();
             $scope.updateView();
           })
-          .catch(function(err) {
-            if (err === 'CANCELLED') {
-              return UIUtils.loading.hide();
-            }
-            UIUtils.onError('ERROR.ADD_SECONDARY_WALLET_FAILED')(err);
-          });
+          .catch(UIUtils.onError('ERROR.REMOVE_SECONDARY_WALLET_FAILED'));
       });
   };
 
@@ -552,6 +541,7 @@ function WalletListViewController($scope, $controller, $state, $timeout, $q, $tr
       'WalletListImportModalCtrl'
     )
       .then(function(items){
+
         if (!items || !items.length) return; // User cancel
 
         UIUtils.loading.show();
@@ -755,13 +745,13 @@ function WalletListImportModalController($scope, $timeout, BMA, csWallet) {
   $scope.isValidFile = false;
   $scope.validatingFile = false;
 
-  $scope.importFromFile = function(file) {
+  $scope.onFileChanged = function(file) {
     $scope.validatingFile = true;
 
     $scope.hasContent = angular.isDefined(file) && file !== '';
     $scope.fileData = file.fileData ? file.fileData : '';
     var isValidFile = $scope.fileData !== '' &&
-      ($scope.fileData.type == 'text/csv' || $scope.fileData.type == 'text/plain' || 'application/vnd.ms-excel' /*fix issue #810*/);
+      ($scope.fileData.type === 'text/csv' || $scope.fileData.type === 'text/plain' || 'application/vnd.ms-excel' /*fix issue #810*/);
 
     // Bad file type: invalid file
     if (!isValidFile) {
diff --git a/www/js/controllers/wot-controllers.js b/www/js/controllers/wot-controllers.js
index f7fc54dd4a81d7f957983700b4d16ab502daa108..2fe87e0f932e3b2996811efc9d7021fffdd2dcaf 100644
--- a/www/js/controllers/wot-controllers.js
+++ b/www/js/controllers/wot-controllers.js
@@ -1079,7 +1079,8 @@ function WotIdentityViewController($scope, $rootScope, $controller, $timeout, $s
       if ($scope.loading) { // load once
 
         return $scope.load(state.stateParams.pubkey.trim(), state.stateParams.uid, options)
-          .then(onLoadSuccess);
+          .then(onLoadSuccess)
+          .catch(UIUtils.onError("ERROR.LOAD_IDENTITY_FAILED"));
       }
     }
 
@@ -1137,27 +1138,27 @@ function WotIdentityViewController($scope, $rootScope, $controller, $timeout, $s
   };
 
   $scope.showQRCode = function(timeout) {
-    if (!$scope.qrcode) {
-      $scope.qrcode = new QRCode(
-        $scope.qrcodeId,
-        {
-          text: $scope.formData.pubkey,
-          width: 180,
-          height: 180,
-          correctLevel: QRCode.CorrectLevel.L
-        });
-      UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);
+    if (!$scope.qrcodeId || !$scope.formData.pubkey) return; // Skip
+
+    // Get the DIV element
+    var element = angular.element(document.querySelector('#' + $scope.qrcodeId + ' .content'));
+    if (!element) {
+      console.error("[wot-controller] Cannot found div #{0} for the QRCode. Skipping.".format($scope.qrcodeId));
+      return;
     }
-    else {
-      $scope.qrcode.clear();
-      $scope.qrcode.makeCode($scope.formData.pubkey);
+
+    console.debug("[wot-controller] Generating QR code for identity...");
+    $timeout(function() {
+      var svg = UIUtils.qrcode.svg($scope.formData.pubkey);
+      element.html(svg);
       UIUtils.motion.toggleOn({selector: '#'+$scope.qrcodeId}, timeout || 1100);
-    }
+    });
   };
 
   $scope.hideQRCode = function() {
-    if ($scope.qrcode) {
-      $scope.qrcode.clear();
+    if (!$scope.qrcodeId) return;
+    var element = angular.element(document.querySelector('#' + $scope.qrcodeId));
+    if (element) {
       UIUtils.motion.toggleOff({selector: '#'+$scope.qrcodeId});
     }
   };
diff --git a/www/js/directives.js b/www/js/directives.js
index c5ffb69b63a08a72024d360f2ce5ed1cc392c66e..8bedee67bc0d044225d3c99ed8cf0d350c8b6003 100644
--- a/www/js/directives.js
+++ b/www/js/directives.js
@@ -368,49 +368,101 @@ angular.module('cesium.directives', [])
     };
   })
 
-.directive("dropzone", function($parse) {
+.directive("dropZone", function($parse) {
     return {
       restrict: 'A',
       scope: false,
-        link: function(scope, elem, attrs) {
-          var fn = $parse(attrs.dropzone);
-          elem.bind('dragover', function (e) {
-            e.stopPropagation();
-            e.preventDefault();
-          });
-          elem.bind('dragenter', function(e) {
-            e.stopPropagation();
-            e.preventDefault();
-          });
-          elem.bind('dragleave', function(e) {
-            e.stopPropagation();
-            e.preventDefault();
-          });
-          elem.bind('drop', function(e) {
-            e.stopPropagation();
-            e.preventDefault();
-            var fileData = {
-              name: e.dataTransfer.files[0].name,
-              size: e.dataTransfer.files[0].size,
-              type: e.dataTransfer.files[0].type
-            };
-
-            var reader = new FileReader();
-            reader.onload = function(onLoadEvent) {
-              scope.$apply(function () {
-                fn(scope, {
-                  file: {
-                    fileContent: onLoadEvent.target.result,
-                    fileData : fileData}
-                });
+      link: function(scope, elem, attrs) {
+        var fn = $parse(attrs.dropZone);
+        elem.bind('dragover', function (e) {
+          e.stopPropagation();
+          e.preventDefault();
+        });
+        elem.bind('dragenter', function(e) {
+          e.stopPropagation();
+          e.preventDefault();
+        });
+        elem.bind('dragleave', function(e) {
+          e.stopPropagation();
+          e.preventDefault();
+        });
+        elem.bind('drop', function(e) {
+          e.stopPropagation();
+          e.preventDefault();
+          var file = e.dataTransfer.files[0];
+          var fileData = {
+            name: file.name,
+            size: file.size,
+            type: file.type
+          };
+
+          var reader = new FileReader();
+          reader.onload = function(onLoadEvent) {
+            scope.$apply(function () {
+              fn(scope, {
+                file: {
+                  file: file,
+                  fileContent: onLoadEvent.target.result,
+                  fileData : fileData}
               });
-            };
-            reader.readAsText(e.dataTransfer.files[0]);
-          });
+            });
+          };
+          reader.readAsText(e.dataTransfer.files[0]);
+        });
+      }
+    };
+  })
+
+
+  // See http://embed.plnkr.co/2vgnFe/
+  .directive('fileSelect', function ($parse) {
+    'use strict';
+
+    return {
+      restrict: 'A',
+      scope: false,
+      template: '<input type="file" style="display: none;" />' +
+        '<ng-transclude></ng-transclude>',
+      transclude: true,
+      link: function (scope, element, attrs) {
+        var fn = $parse(attrs.fileSelect);
+
+        var fileInput = element.children('input[file]');
+
+        if (attrs.accept) {
+          fileInput[0].accept = attrs.accept;
+        }
+
+        fileInput.on('change', function (onChangeEvent) {
+          var reader = new FileReader();
+          var file = this.files[0];
+          var fileData = {
+            name: file.name,
+            size: file.size,
+            type: file.type
+          };
+
+          reader.onload = function(onLoadEvent) {
+            scope.$applyAsync(function() {
+              fn(scope, {
+                file: {
+                  file: file,
+                  fileContent: onLoadEvent.target.result,
+                  fileData : fileData}
+              });
+            });
+          };
+          reader.readAsText((onChangeEvent.srcElement || onChangeEvent.target).files[0]);
+        });
+
+        element.on('click', function () {
+          fileInput[0].click();
+        });
       }
     };
   })
 
+
   // Un-authenticate when window closed
   // see: https://stackoverflow.com/questions/28197316/javascript-or-angularjs-defer-browser-close-or-tab-close-between-refresh
   .directive('windowExitUnauth', function($window, csSettings, csWallet) {
@@ -427,5 +479,4 @@ angular.module('cesium.directives', [])
         });
       }
     };
-  })
-;
+  });
diff --git a/www/js/platform.js b/www/js/platform.js
index f2e30f8ebdcbe4f6db732f7be4bc8f97a9498543..e243bc4174d76dd374cc527a6f4d6bc46d024579 100644
--- a/www/js/platform.js
+++ b/www/js/platform.js
@@ -35,7 +35,12 @@ angular.module('cesium.platform', ['ngIdle', 'cesium.config', 'cesium.services']
 
   .config(function($compileProvider, csConfig) {
     'ngInject';
-     $compileProvider.debugInfoEnabled(csConfig.debug === true);
+
+    $compileProvider.debugInfoEnabled(csConfig.debug === true);
+
+    // Fix issue #893
+    // See https://stackoverflow.com/questions/31859257/firefox-addon-using-angularjs-ng-src-not-working
+    $compileProvider.imgSrcSanitizationWhitelist(/^\s*(filesystem:resource|resource|moz-extension|chrome-extension|file|data):/);
   })
 
   .config(function($animateProvider) {
@@ -107,6 +112,10 @@ angular.module('cesium.platform', ['ngIdle', 'cesium.config', 'cesium.services']
       listeners,
       removeChangeStateListener;
 
+    // Fix csConfig values
+    csConfig.demo = csConfig.demo === true || csConfig.demo === 'true' || false;
+    csConfig.readonly = csConfig.readonly === true || csConfig.readonly === 'true' || false;
+
     function disableChangeState() {
       if (removeChangeStateListener) return; // make sure to call this once
 
@@ -147,7 +156,7 @@ angular.module('cesium.platform', ['ngIdle', 'cesium.config', 'cesium.services']
       var newServer = fallbackNode.host + ((!fallbackNode.port && fallbackNode.port != 80 && fallbackNode.port != 443) ? (':' + fallbackNode.port) : '');
 
       // Skip is same as actual node
-      if (BMA.node.same(fallbackNode.host, fallbackNode.port)) {
+      if (BMA.node.same(fallbackNode)) {
         console.debug('[platform] Skipping fallback node [{0}]: same as actual node'.format(newServer));
         return checkBmaNodeAlive(); // loop (= go to next node)
       }
@@ -434,7 +443,7 @@ if (typeof String.prototype.trim !== 'function') {
 if (Math && typeof Math.trunc !== 'function') {
   console.debug("Adding Math.trunc() -> was missing on this platform");
   Math.trunc = function(number) {
-    return (number - 0.5).toFixed();
+    return parseInt((number - 0.5).toFixed());
   };
 }
 
diff --git a/www/js/services/bma-services.js b/www/js/services/bma-services.js
index 5bd2decd1513c85025a5ab60445c7e2b78cc2ad3..e045aeb89e01e792f2af0d9e75e32ff6c89efdeb 100644
--- a/www/js/services/bma-services.js
+++ b/www/js/services/bma-services.js
@@ -2,13 +2,15 @@
 
 angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.settings.services'])
 
-.factory('BMA', function($q, $window, $rootScope, $timeout, csCrypto, Api, Device, UIUtils, csConfig, csSettings, csHttp) {
+.factory('BMA', function($q, $window, $rootScope, $timeout, csCrypto, Api, Device, UIUtils, csConfig, csSettings, csCache, csHttp) {
   'ngInject';
 
   function BMA(host, port, useSsl, useCache) {
 
-    var pubkey = "[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}";
     var
+      id = (!host ? 'default' : '{0}:{1}'.format(host, (port || (useSsl ? '443' : '80')))), // Unique id of this instance
+      cachePrefix = "BMA-",
+      pubkey = "[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{43,44}",
       // TX output conditions
       SIG = "SIG\\((" + pubkey + ")\\)",
       XHX = 'XHX\\(([A-F0-9]{1,64})\\)',
@@ -71,7 +73,12 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       listeners,
       that = this;
 
-    that.api = new Api(this, 'BMA-' + that.server);
+    that.raw = {
+      getByPath: {},
+      postByPath: {},
+      wsByPath: {}
+    };
+    that.api = new Api(this, 'BMA-' + id);
     that.started = false;
     that.init = init;
 
@@ -82,15 +89,12 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       console.debug('[BMA] Enable SSL (forced by config or detected in URL)');
     }
 
-    if (host) {
-      init(host, port, useSsl, useCache);
-    }
-    that.useCache = useCache; // need here because used in get() function
+    if (host)  init(host, port, useSsl);
+    that.useCache = angular.isDefined(useCache) ? useCache : true; // need here because used in get() function
 
-    function init(host, port, useSsl, useCache) {
+    function init(host, port, useSsl) {
       if (that.started) that.stop();
       that.alive = false;
-      that.cache = _emptyCache();
 
       // Use settings as default, if exists
       if (csSettings.data && csSettings.data.node) {
@@ -98,7 +102,6 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
         port = port || csSettings.data.node.port;
 
         useSsl = angular.isDefined(useSsl) ? useSsl : (port == 443 || csSettings.data.node.useSsl || that.forceUseSsl);
-        useCache =  angular.isDefined(useCache) ? useCache : true;
       }
 
       if (!host) {
@@ -107,7 +110,6 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       that.host = host;
       that.port = port || 80;
       that.useSsl = angular.isDefined(useSsl) ? useSsl : (that.port == 443 || that.forceUseSsl);
-      that.useCache = angular.isDefined(useCache) ? useCache : false;
       that.server = csHttp.getServer(host, port);
       that.url = csHttp.getUrl(host, port, ''/*path*/, useSsl);
     }
@@ -120,35 +122,31 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       return new RegExp(regexpContent);
     }
 
-    function _emptyCache() {
-      return {
-        getByPath: {},
-        postByPath: {},
-        wsByPath: {}
-      };
-    }
-
     function closeWs() {
-      if (!that.cache) return;
+      if (!that.raw) return;
 
       console.warn('[BMA] Closing all websockets...');
-      _.keys(that.cache.wsByPath||{}).forEach(function(key) {
-        var sock = that.cache.wsByPath[key];
+      _.keys(that.raw.wsByPath||{}).forEach(function(key) {
+        var sock = that.raw.wsByPath[key];
         sock.close();
       });
-      that.cache.wsByPath = {};
+      that.raw.wsByPath = {};
     }
 
-    that.cleanCache = function() {
-      console.debug('[BMA] Cleaning requests cache...');
-      closeWs();
-      that.cache = _emptyCache();
-    };
+   function cleanCache() {
+     console.debug("[BMA] Cleaning cache {prefix: '{0}'}...".format(cachePrefix));
+     csCache.clear(cachePrefix);
 
-    get = function (path, cacheTime) {
+     // Clean raw requests by path cache
+     that.raw.getByPath = {};
+     that.raw.postByPath = {};
+     that.raw.wsByPath = {};
+   }
+
+   function get(path, cacheTime) {
 
       cacheTime = that.useCache && cacheTime || 0 /* no cache*/ ;
-      var cacheKey = path + (cacheTime ? ('#'+cacheTime) : '');
+      var requestKey = path + (cacheTime ? ('#'+cacheTime) : '');
 
       var getRequestFn = function(params) {
 
@@ -161,15 +159,15 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
           });
         }
 
-        var request = that.cache.getByPath[cacheKey];
+        var request = that.raw.getByPath[requestKey];
         if (!request) {
           if (cacheTime) {
-            request = csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime);
+            request = csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime, null, null, cachePrefix);
           }
           else {
             request = csHttp.get(that.host, that.port, path, that.useSsl);
           }
-          that.cache.getByPath[cacheKey] = request;
+          that.raw.getByPath[requestKey] = request;
         }
         var execCount = 1;
         return request(params)
@@ -195,9 +193,9 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       };
 
       return getRequestFn;
-    };
+    }
 
-    post = function(path) {
+    function post(path) {
       var postRequest = function(obj, params) {
         if (!that.started) {
           if (!that._startPromise) {
@@ -208,42 +206,47 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
           });
         }
 
-        var request = that.cache.postByPath[path];
+        var request = that.raw.postByPath[path];
         if (!request) {
           request =  csHttp.post(that.host, that.port, path, that.useSsl);
-          that.cache.postByPath[path] = request;
+          that.raw.postByPath[path] = request;
         }
         return request(obj, params);
       };
 
       return postRequest;
-    };
+    }
 
-    ws = function(path) {
+    function ws(path) {
       return function() {
-        var sock = that.cache.wsByPath[path];
+        var sock = that.raw.wsByPath[path];
         if (!sock || sock.isClosed()) {
           sock =  csHttp.ws(that.host, that.port, path, that.useSsl);
 
           // When close, remove from cache
           sock.onclose = function() {
-            delete that.cache.wsByPath[path];
+            delete that.raw.wsByPath[path];
           };
 
-          that.cache.wsByPath[path] = sock;
+          that.raw.wsByPath[path] = sock;
         }
         return sock;
       };
-    };
+    }
 
-    that.isAlive = function() {
-      return csHttp.get(that.host, that.port, '/node/summary', that.useSsl)()
+    that.isAlive = function(node) {
+      node = node || that;
+      // WARN:
+      //  - Cannot use previous get() function, because
+      //    node can be !=that, or not be started yet
+      //  - Do NOT use cache here
+      return csHttp.get(node.host, node.port, '/node/summary', node.useSsl)()
         .then(function(json) {
           var software = json && json.duniter && json.duniter.software;
           var isCompatible = true;
 
           // Check duniter min version
-          if (software === 'duniter' && json.duniter.version && true) {
+          if (software === 'duniter' && json.duniter.version) {
             isCompatible = csHttp.version.isCompatible(csSettings.data.minVersion, json.duniter.version);
           }
           // TODO: check version of other software (DURS, Juniter, etc.)
@@ -260,6 +263,17 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
         });
     };
 
+    function isSameNode(node2) {
+      node2 = node2 || {};
+      node2.useSsl = angular.isDefined(node2.useSsl) ? node2.useSsl : (node2.port && node2.port == 443);
+      // Same host
+      return that.host === node2.host &&
+          // Same port
+          ((!that.port && !node2.port2) || (that.port == node2.port2||80)) &&
+          // Same useSsl
+          (that.useSsl === node2.useSsl);
+    }
+
     function removeListeners() {
       _.forEach(listeners, function(remove){
         remove();
@@ -275,13 +289,10 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
     }
 
     function onSettingsChanged(settings) {
-
-      var server = csHttp.getUrl(settings.node.host, settings.node.port, ''/*path*/, settings.node.useSsl);
-      var hasChanged = (server !== that.url);
-      if (hasChanged) {
-        init(settings.node.host, settings.node.port, settings.node.useSsl, that.useCache);
-        that.restart();
-      }
+      // Wait 1s (because settings controller can have restart the service), then copy the settings node
+      $timeout(function() {
+        exports.copy(settings.node);
+      }, 1000);
     }
 
     that.isStarted = function() {
@@ -289,8 +300,8 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
     };
 
     that.ready = function() {
-      if (that.started) return $q.when(true);
-      return that._startPromise || that.start();
+      if (that.started) return $q.when(that.alive);
+      return (that._startPromise || that.start());
     };
 
     that.start = function() {
@@ -309,30 +320,24 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
           });
       }
 
-      if (that.useSsl) {
-        console.debug('[BMA] Starting [{0}] (SSL on)...'.format(that.server));
-      }
-      else {
-        console.debug('[BMA] Starting [{0}]...'.format(that.server));
-      }
-
+      console.debug("[BMA] Starting {0} {ssl: {1})...".format(that.server, that.useSsl));
       var now = Date.now();
 
       that._startPromise = $q.all([
-          csSettings.ready,
+          csSettings.ready(),
           that.isAlive()
         ])
         .then(function(res) {
           that.alive = res[1];
           if (!that.alive) {
-            console.error('[BMA] Could not start [{0}]: node unreachable'.format(that.server));
+            console.error("[BMA] Could not start {0} : unreachable".format(that.server));
             that.started = true;
             delete that._startPromise;
             return false;
           }
 
           // Add listeners
-          if (!listeners || listeners.length === 0) {
+          if (!listeners || !listeners.length) {
             addListeners();
           }
           console.debug('[BMA] Started in '+(Date.now()-now)+'ms');
@@ -346,14 +351,24 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
     };
 
     that.stop = function() {
+      if (!that.started && !that._startPromise) return $q.when(); // Skip multiple call
+
       console.debug('[BMA] Stopping...');
+
       removeListeners();
-      csHttp.cache.clear();
-      that.cleanCache();
-      that.alive = false;
-      that.started = false;
       delete that._startPromise;
-      that.api.node.raise.stop();
+
+      if (that.alive) {
+        closeWs();
+        cleanCache();
+        that.alive = false;
+        that.started = false;
+        that.api.node.raise.stop();
+      }
+      else {
+        that.started = false;
+      }
+      return $q.when();
     };
 
     that.restart = function() {
@@ -397,10 +412,8 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
         TX_OUTPUT_FUNCTIONS: test(OUTPUT_FUNCTIONS)
       },
       node: {
-        summary: get('/node/summary', csHttp.cache.LONG),
-        same: function(host2, port2) {
-          return host2 === that.host && ((!that.port && !port2) || (that.port == port2||80)) && (that.useSsl == (port2 && port2 === 443));
-        },
+        summary: get('/node/summary', csCache.constants.LONG),
+        same: isSameNode,
         forceUseSsl: that.forceUseSsl
       },
       network: {
@@ -416,11 +429,11 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       },
       wot: {
         lookup: get('/wot/lookup/:search'),
-        certifiedBy: get('/wot/certified-by/:pubkey', csHttp.cache.SHORT),
-        certifiersOf: get('/wot/certifiers-of/:pubkey', csHttp.cache.SHORT),
+        certifiedBy: get('/wot/certified-by/:pubkey', csCache.constants.SHORT),
+        certifiersOf: get('/wot/certifiers-of/:pubkey', csCache.constants.SHORT),
         member: {
-          all: get('/wot/members', csHttp.cache.LONG),
-          pending: get('/wot/pending', csHttp.cache.SHORT)
+          all: get('/wot/members', csCache.constants.LONG),
+          pending: get('/wot/pending', csCache.constants.SHORT)
         },
         requirements: function(params, cache) {
           // No cache by default
@@ -432,8 +445,8 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
         revoke: post('/wot/revoke')
       },
       blockchain: {
-        parameters: get('/blockchain/parameters', csHttp.cache.VERY_LONG),
-        block: get('/blockchain/block/:block', csHttp.cache.SHORT),
+        parameters: get('/blockchain/parameters', csCache.constants.VERY_LONG),
+        block: get('/blockchain/block/:block', csCache.constants.SHORT),
         blocksSlice: get('/blockchain/blocks/:count/:from'),
         current: function(cache) {
           // No cache by default
@@ -441,15 +454,15 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
         },
         membership: post('/blockchain/membership'),
         stats: {
-          ud: get('/blockchain/with/ud', csHttp.cache.MEDIUM),
+          ud: get('/blockchain/with/ud', csCache.constants.MEDIUM),
           tx: get('/blockchain/with/tx'),
-          newcomers: get('/blockchain/with/newcomers', csHttp.cache.MEDIUM),
+          newcomers: get('/blockchain/with/newcomers', csCache.constants.MEDIUM),
           hardship: get('/blockchain/hardship/:pubkey'),
           difficulties: get('/blockchain/difficulties')
         }
       },
       tx: {
-        sources: get('/tx/sources/:pubkey', csHttp.cache.SHORT),
+        sources: get('/tx/sources/:pubkey', csCache.constants.SHORT),
         process: post('/tx/process'),
         history: {
           all: function(params) {
@@ -473,7 +486,7 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
                 return res;
               });
           },
-          blocks: get('/tx/history/:pubkey/blocks/:from/:to', csHttp.cache.LONG),
+          blocks: get('/tx/history/:pubkey/blocks/:from/:to', csCache.constants.LONG),
           pending: get('/tx/history/:pubkey/pending')
         }
       },
@@ -484,16 +497,16 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       version: {},
       raw: {
         blockchain: {
-          currentWithCache: get('/blockchain/current', csHttp.cache.SHORT),
+          currentWithCache: get('/blockchain/current', csCache.constants.SHORT),
           current: get('/blockchain/current')
         },
         wot: {
-          requirementsWithCache: get('/wot/requirements/:pubkey', csHttp.cache.LONG),
+          requirementsWithCache: get('/wot/requirements/:pubkey', csCache.constants.LONG),
           requirements: get('/wot/requirements/:pubkey')
         },
         tx: {
           history: {
-            timesWithCache: get('/tx/history/:pubkey/times/:from/:to', csHttp.cache.LONG),
+            timesWithCache: get('/tx/history/:pubkey/times/:from/:to', csCache.constants.LONG),
             times: get('/tx/history/:pubkey/times/:from/:to'),
             all: get('/tx/history/:pubkey')
           }
@@ -681,14 +694,24 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
     };
 
     exports.copy = function(otherNode) {
-      var wasStarted = that.started;
 
       var server = csHttp.getUrl(otherNode.host, otherNode.port, ''/*path*/, otherNode.useSsl);
       var hasChanged = (server !== that.url);
       if (hasChanged) {
+        var wasStarted = that.started;
+        if (wasStarted) that.stop();
         that.init(otherNode.host, otherNode.port, otherNode.useSsl, that.useCache/*keep original value*/);
-        // Restart (only if was already started)
-        return wasStarted ? that.restart() : $q.when();
+        if (wasStarted) {
+          return $timeout(function () {
+            return that.start()
+              .then(function (alive) {
+                if (alive) {
+                  that.api.node.raise.restart();
+                }
+                return alive;
+              });
+          }, 200); // Wait stop finished
+        }
       }
     };
 
@@ -951,7 +974,7 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
         duniterLatestReleaseUrl.port,
         "/" + duniterLatestReleaseUrl.pathname,
         /*useSsl*/ (+(duniterLatestReleaseUrl.port) === 443 || duniterLatestReleaseUrl.protocol === 'https:' || that.forceUseSsl),
-        csHttp.cache.LONG
+        csCache.constants.LONG
       ) :
       // No URL define: use a fake function
       function() {
@@ -990,9 +1013,10 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
     angular.merge(that, exports);
   }
 
-  var service = new BMA(undefined, undefined, undefined, true);
+  var service = new BMA();
 
   service.instance = function(host, port, useSsl, useCache) {
+    useCache = angular.isDefined(useCache) ? useCache : false; // No cache by default
     return new BMA(host, port, useSsl, useCache);
   };
 
@@ -1003,9 +1027,9 @@ angular.module('cesium.bma.services', ['ngApi', 'cesium.http.services', 'cesium.
       host: host,
       port: port,
       useSsl: useSsl,
-      url: csHttp.getUrl(host, port, ''/*path*/, useSsl),
+      url: csHttp.getUrl(host, port, ''/*no path*/, useSsl),
       node: {
-        summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csHttp.cache.LONG, false, timeout)
+        summary: csHttp.getWithCache(host, port, '/node/summary', useSsl, csCache.constants.MEDIUM, false/*autoRefresh*/, timeout)
       },
       network: {
         peering: {
diff --git a/www/js/services/cache-services.js b/www/js/services/cache-services.js
index 64cfe86e721df078a76c0ead095f8759e7b88617..48736f2ea3688b7d87697de23c4a4463d44594b3 100644
--- a/www/js/services/cache-services.js
+++ b/www/js/services/cache-services.js
@@ -84,7 +84,7 @@ angular.module('cesium.cache.services', ['angular-cache'])
   }
 
   function onSettingsChanged(settings) {
-    var newStorageMode = getSettingsStorageMode(settings)
+    var newStorageMode = getSettingsStorageMode(settings);
     var hasChanged = (newStorageMode !== storageMode);
     if (hasChanged) {
       storageMode = newStorageMode;
diff --git a/www/js/services/currency-services.js b/www/js/services/currency-services.js
index a65054d00054a83f2e69969b345bb2c1fb415887..4efb6fac8be54798e59c200a85c9d468f5cc9f46 100644
--- a/www/js/services/currency-services.js
+++ b/www/js/services/currency-services.js
@@ -209,7 +209,7 @@ angular.module('cesium.currency.services', ['ngApi', 'cesium.bma.services'])
 
   function ready() {
     if (started) return $q.when(data);
-    return startPromise || start();
+    return (startPromise || start());
   }
 
   function stop() {
@@ -223,11 +223,26 @@ angular.module('cesium.currency.services', ['ngApi', 'cesium.bma.services'])
     return $timeout(start, 200);
   }
 
-  function start() {
+  function start(bmaAlive) {
+    if (startPromise) return startPromise;
+    if (started) return $q.when(data);
+
+    if (!bmaAlive) {
+      return BMA.ready()
+        .then(function(alive) {
+          if (alive) return start(alive); // Loop
+          return $timeout(start, 500); // Loop, after a delay, because BMA node seems to be not alive...
+        });
+    }
+
     console.debug('[currency] Starting...');
     var now = Date.now();
 
     startPromise = BMA.ready()
+      .then(function(started) {
+        if (started) return true;
+        return $timeout(function() {return start(true);}, 500);
+      })
 
       // Load data
       .then(loadData)
diff --git a/www/js/services/http-services.js b/www/js/services/http-services.js
index 32030a16e72afbf1496321986aed1b75ba89e035..8ce34f4532f28dd0c0430315f29bc37317815901 100644
--- a/www/js/services/http-services.js
+++ b/www/js/services/http-services.js
@@ -7,8 +7,8 @@ angular.module('cesium.http.services', ['cesium.cache.services'])
 
   var
     sockets = [],
-    cachePrefix = 'csHttp-'
-  ;
+    defaultCachePrefix = 'csHttp-',
+    allCachePrefixes = {};
 
   if (!timeout) {
     timeout=4000; // default
@@ -34,10 +34,14 @@ angular.module('cesium.http.services', ['cesium.cache.services'])
       reject(data);
     }
     else {
-      if (status == 404) {
+      if (status == 403) {
+        reject({ucode: 403, message: 'Resource is forbidden' + (url ? ' ('+url+')' : '')});
+      }
+      else if (status == 404) {
         reject({ucode: 404, message: 'Resource not found' + (url ? ' ('+url+')' : '')});
       }
       else if (url) {
+        console.error('[http] Get HTTP error {status: ' + status + '} on [' + url + ']');
         reject('Error while requesting [' + url + ']');
       }
       else {
@@ -91,7 +95,10 @@ angular.module('cesium.http.services', ['cesium.cache.services'])
 
   function getResourceWithCache(host, port, path, useSsl, maxAge, autoRefresh, forcedTimeout, cachePrefix) {
     var url = getUrl(host, port, path, useSsl);
+    cachePrefix = cachePrefix || defaultCachePrefix;
     maxAge = maxAge || csCache.constants.LONG;
+    allCachePrefixes[cachePrefix] = true;
+
     //console.debug('[http] will cache ['+url+'] ' + maxAge + 'ms' + (autoRefresh ? ' with auto-refresh' : ''));
 
     return function(params) {
@@ -230,7 +237,7 @@ angular.module('cesium.http.services', ['cesium.cache.services'])
                 _open(self, null, params);
               }
               else if (closeEvent) {
-                console.debug('[http] TODO -- Unexpected close of websocket [{0}]: error code: '.format(path), closeEvent);
+                console.debug('[http] Unexpected close of websocket [{0}]: error code: '.format(path), closeEvent && closeEvent.code || closeEvent);
 
                 // Force new connection
                 self.delegate = null;
@@ -458,6 +465,7 @@ angular.module('cesium.http.services', ['cesium.cache.services'])
         if (!isPositiveInteger(parts[i])) {
           return false;
         }
+        parts[i] = parseInt(parts[i]);
       }
       return true;
     }
@@ -491,11 +499,18 @@ angular.module('cesium.http.services', ['cesium.cache.services'])
     return compareVersionNumbers(minVersion, actualVersion) <= 0;
   }
 
-  var cache = angular.copy(csCache.constants);
-  cache.clear = function() {
-    console.debug('[http] Cleaning cache...');
+  function clearCache(cachePrefix) {
+    cachePrefix = cachePrefix || defaultCachePrefix;
+    console.debug("[http] Cleaning cache {prefix: '{0}'}...".format(cachePrefix));
     csCache.clear(cachePrefix);
-  };
+  }
+
+  function clearAllCache() {
+    console.debug('[http] Cleaning all caches...');
+    _.keys(allCachePrefixes).forEach(function(cachePrefix) {
+      csCache.clear(cachePrefix);
+    });
+  }
 
   return {
     get: getResource,
@@ -516,7 +531,10 @@ angular.module('cesium.http.services', ['cesium.cache.services'])
       compare: compareVersionNumbers,
       isCompatible: isVersionCompatible
     },
-    cache: cache
+    cache:  angular.merge({
+      clear: clearCache,
+      clearAll: clearAllCache
+    }, csCache.constants)
   };
 })
 ;
diff --git a/www/js/services/modal-services.js b/www/js/services/modal-services.js
index fd024fff98d7910057a61dcd06102da8b91c7039..3ff97d62e0d469c9653ee2644194a38a42a6bdf6 100644
--- a/www/js/services/modal-services.js
+++ b/www/js/services/modal-services.js
@@ -6,7 +6,7 @@ angular.module('cesium.modal.services', ['cesium.utils.services'])
 
 })
 
-.controller('AboutModalCtrl', function ($scope, UIUtils, csHttp) {
+.controller('AboutModalCtrl', function ($scope, csConfig, UIUtils, csHttp, filterTranslations) {
   'ngInject';
 
   $scope.openLink = function(event, uri, options) {
@@ -19,6 +19,9 @@ angular.module('cesium.modal.services', ['cesium.utils.services'])
 
     return csHttp.uri.open(uri, options);
   };
+
+  // Change UTC date into user date
+  $scope.buildDate = moment(csConfig.build).format(filterTranslations.DATE_PATTERN || 'YYYY-MM-DD HH:mm');
 })
 
 .factory('ModalUtils', function($ionicModal, $rootScope, $q, $injector, $controller, $timeout, Device) {
diff --git a/www/js/services/network-services.js b/www/js/services/network-services.js
index 7cdee80e5aa80009b025bf4226e32d5627730068..e38aad0dfab5e25287d585dac660c6cc1dcd202f 100644
--- a/www/js/services/network-services.js
+++ b/www/js/services/network-services.js
@@ -498,6 +498,7 @@ angular.module('cesium.network.services', ['ngApi', 'cesium.currency.services',
       // Get current block
       return peer.api.blockchain.current(false/*no cache*/)
         .then(function(block) {
+          if (!block) throw new Error('Wrong response for /blockchain/current (empty)');
           peer.currentNumber = block.number;
           peer.online = true;
           peer.buid = buid(block);
@@ -665,12 +666,16 @@ angular.module('cesium.network.services', ['ngApi', 'cesium.currency.services',
         if (data.expertMode) {
           score += (100     * (peer.difficulty ? (10000-peer.difficulty) : 0));
           score += (1       * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));
+          score += (0.001       * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 3, true) : 0));
         }
         else {
           score += (100     * (peer.uid ? computeScoreAlphaValue(peer.uid, 2, true) : 0));
-          score += (1       * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 2, true) : 0));
+          score += (0.001       * (!peer.uid ? computeScoreAlphaValue(peer.pubkey, 3, true) : 0));
         }
-        score += (peer.isBma() ? (peer.isSsl() ? 0.01 : 0.001) :0); // If many endpoints: BMAS first, then BMA
+        score += (0.00001     * (peer.isBma() ? (peer.isSsl() ? 1 : 0.5) :0)); // If many endpoints: BMAS first, then BMA
+
+        peer.score = score;
+
         return -score;
       });
 
diff --git a/www/js/services/settings-services.js b/www/js/services/settings-services.js
index c7cf9ad9c7d305e46c8e58d4494f9d5a7c3abb44..5249c912ab3836782106a037732a9747002eae01 100644
--- a/www/js/services/settings-services.js
+++ b/www/js/services/settings-services.js
@@ -6,13 +6,13 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config'])
 
   // Define app locales
   var locales = [
-    {id:'en',    label:'English', country: 'us'},
-    {id:'en-GB', label:'English (UK)', country: 'gb'},
-    {id:'eo-EO', label:'Esperanto'},
-    {id:'fr-FR', label:'Français' , country: 'fr'},
-    {id:'nl-NL', label:'Nederlands', country: 'nl'},
-    {id:'es-ES', label:'Spanish', country: 'es'},
-    {id:'it-IT', label:'Italiano', country: 'it'}
+    {id:'en',    label:'English', flag: 'us'},
+    {id:'en-GB', label:'English (UK)', flag: 'gb'},
+    {id:'eo-EO', label:'Esperanto', flag: 'eo'},
+    {id:'fr-FR', label:'Français', flag: 'fr'},
+    {id:'nl-NL', label:'Nederlands', flag: 'nl'},
+    {id:'es-ES', label:'Spanish', flag: 'es'},
+    {id:'it-IT', label:'Italiano', flag: 'it'}
   ];
   var fallbackLocale = csConfig.fallbackLanguage ? fixLocale(csConfig.fallbackLanguage) : 'en';
 
@@ -59,6 +59,8 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config'])
     timeWarningExpireMembership: 2592000 * 2 /*=2 mois*/,
     timeWarningExpire: 2592000 * 3 /*=3 mois*/,
     minVersion: '1.1.0',
+    sourceUrl: 'https://git.duniter.org/clients/cesium-grp/cesium',
+    sourceLicenseUrl: 'https://git.duniter.org/clients/cesium-grp/cesium/-/raw/master/LICENSE',
     newIssueUrl: "https://git.duniter.org/clients/cesium-grp/cesium/issues/new",
     userForumUrl: "https://forum.monnaie-libre.fr",
     latestReleaseUrl: "https://api.github.com/repos/duniter/cesium/releases/latest",
@@ -90,6 +92,7 @@ angular.module('cesium.settings.services', ['ngApi', 'cesium.config'])
       wotCerts: 0,
       wallet: 0,
       walletCerts: 0,
+      wallets: 0,
       header: 0,
       settings: 0
     },
diff --git a/www/js/services/tx-services.js b/www/js/services/tx-services.js
index 67979b0ec1f238aca5878628e9c9541631b7a2e6..7c54a7cb1c3370e0d197fefe7e798d103d0feb26 100644
--- a/www/js/services/tx-services.js
+++ b/www/js/services/tx-services.js
@@ -64,6 +64,7 @@ angular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',
                 return sum - outputAmount;
               }
             }
+
           }
 
           // Complex unlock condition, on the issuer pubkey
@@ -95,8 +96,8 @@ angular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',
         var time = tx.time || tx.blockstampTime;
 
         // Avoid duplicated tx, or tx to him self
-        var txKey = amount + ':' + tx.hash + ':' + time;
-        if (!processedTxMap[txKey]) {
+        var txKey = (amount !== 0) && amount + ':' + tx.hash + ':' + time;
+        if (txKey && !processedTxMap[txKey]) {
           processedTxMap[txKey] = true; // Mark as processed
           var newTx = {
             time: time,
@@ -228,7 +229,7 @@ angular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',
           tx.history.sort(function(tx1, tx2) {
             return (tx2.time - tx1.time);
           });
-          var firstValidatedTxIndex = tx.history.findIndex(function(tx){
+          var firstValidatedTxIndex = _.findIndex(tx.history, function(tx){
             return (tx.block_number <= current.number - csSettings.data.blockValidityWindow);
           });
           // remove validating from history
@@ -287,6 +288,13 @@ angular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',
   function loadData(pubkey, fromTime) {
     var now = Date.now();
 
+    var data;
+
+    // Alert user, when request is too long (> 2s)
+    $timeout(function() {
+      if (!data) UIUtils.loading.update({template: "COMMON.LOADING_WAIT"});
+    }, 2000);
+
     return $q.all([
 
       // Load Sources
@@ -298,7 +306,7 @@ angular.module('cesium.tx.services', ['ngApi', 'cesium.bma.services',
 
       .then(function(res) {
         // Copy sources and balance
-        var data = res[0];
+        data = res[0];
         data.tx = res[1];
 
         var txPendings = [];
diff --git a/www/js/services/utils-services.js b/www/js/services/utils-services.js
index 3c18ed4f932b202b9ccb08b38b83f6b171404b4f..c7a2dd3e21c06c52dd387b848f38810d0720ba01 100644
--- a/www/js/services/utils-services.js
+++ b/www/js/services/utils-services.js
@@ -1,4 +1,6 @@
-angular.module('cesium.utils.services', [])
+// var qrcode;
+
+angular.module('cesium.utils.services', ['angular-fullscreen-toggle'])
 
 // Replace the '$ionicPlatform.ready()', to enable multiple calls
 // See http://stealthcode.co/multiple-calls-to-ionicplatform-ready/
@@ -41,17 +43,17 @@ angular.module('cesium.utils.services', [])
 
   function alertError(err, subtitle) {
     if (!err) {
-      return $q.when();
+      return $q.when(); // Silent
     }
 
     return $q(function(resolve) {
-      $translate([err, subtitle, 'ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK'])
+      $translate([err, 'ERROR.POPUP_TITLE', 'ERROR.UNKNOWN_ERROR', 'COMMON.BTN_OK'].concat(subtitle ? [subtitle] : []))
         .then(function (translations) {
           var message = err.message || translations[err];
           return $ionicPopup.show({
             template: '<p>' + (message || translations['ERROR.UNKNOWN_ERROR']) + '</p>',
             title: translations['ERROR.POPUP_TITLE'],
-            subTitle: translations[subtitle],
+            subTitle: subtitle && translations[subtitle] || undefined,
             buttons: [
               {
                 text: '<b>'+translations['COMMON.BTN_OK']+'</b>',
@@ -66,17 +68,23 @@ angular.module('cesium.utils.services', [])
     });
   }
 
-  function alertInfo(message, subtitle) {
+  function alertInfo(message, subtitle, options) {
+    if (!message) return $q.reject("Missing 'message' argument");
+    options = options || {};
+    options.cssClass = options.cssClass || 'info';
+    options.okText = options.okText || 'COMMON.BTN_OK';
+
     return $q(function(resolve) {
-      $translate([message, subtitle, 'INFO.POPUP_TITLE', 'COMMON.BTN_OK'])
+      $translate([message, 'INFO.POPUP_TITLE', options.okText].concat(subtitle ? [subtitle] : []))
         .then(function (translations) {
           $ionicPopup.show({
             template: '<p>' + translations[message] + '</p>',
             title: translations['INFO.POPUP_TITLE'],
-            subTitle: translations[subtitle],
+            subTitle: subtitle && translations[subtitle] || undefined,
+            cssClass: options.cssClass,
             buttons: [
               {
-                text: translations['COMMON.BTN_OK'],
+                text: translations[options.okText],
                 type: 'button-positive',
                 onTap: function(e) {
                   resolve(e);
@@ -92,6 +100,14 @@ angular.module('cesium.utils.services', [])
     return alertInfo('INFO.FEATURES_NOT_IMPLEMENTED');
   }
 
+  function alertDemo() {
+    return $translate(["MODE.DEMO.FEATURE_NOT_AVAILABLE", "MODE.DEMO.INSTALL_HELP"])
+      .then(function(translations) {
+        var message = translations["MODE.DEMO.FEATURE_NOT_AVAILABLE"] + "<br/><br/>" + translations["MODE.DEMO.INSTALL_HELP"];
+        return alertInfo(message, undefined, {cssClass: 'large'});
+      });
+  }
+
   function askConfirm(message, title, options) {
     title = title || 'CONFIRM.POPUP_TITLE';
 
@@ -157,6 +173,7 @@ angular.module('cesium.utils.services', [])
   }
 
   function showToast(message, duration, position) {
+    if (!message) return $q.reject("Missing 'message' argument");
     duration = duration || 'short';
     position = position || 'bottom';
 
@@ -203,7 +220,7 @@ angular.module('cesium.utils.services', [])
         reject(fullMsg);
       }
       // If just a user cancellation: silent
-      else if (fullMsg == 'CANCELLED') {
+      else if (fullMsg === 'CANCELLED') {
         return hideLoading(10); // timeout, to avoid bug on transfer (when error on reference)
       }
 
@@ -740,6 +757,50 @@ angular.module('cesium.utils.services', [])
     toggleOff: toggleOff
   };
 
+  function createQRCodeObj(text, typeNumber,
+                        errorCorrectionLevel, mode, mb) {
+
+    mb = mb || 'default'; // default | SJIS | UTF-8
+    qrcode.stringToBytes = qrcode.stringToBytesFuncs[mb];
+
+    var qr = qrcode(typeNumber || 4, errorCorrectionLevel || 'M');
+    qr.addData(text, mode);
+    qr.make();
+
+    return qr;
+  }
+
+  /**
+   * Create a QRCode as an <svg> tag
+   * @param text
+   * @param typeNumber
+   * @param errorCorrectionLevel
+   * @param mode
+   * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'
+   * @returns {string}
+   */
+  function getSvgQRCode(text, typeNumber,
+                        errorCorrectionLevel, mode, mb) {
+
+    var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);
+    return qr.createSvgTag();
+  }
+
+  /**
+   * Create a QRCode as an <img> tag
+   * @param text
+   * @param typeNumber
+   * @param errorCorrectionLevel
+   * @param mode
+   * @param mb multibyte ? value: 'default' | 'SJIS' | 'UTF-8'
+   * @returns {string}
+   */
+  function getImgQRCode(text, typeNumber,
+                           errorCorrectionLevel, mode, mb) {
+
+    var qr = createQRCodeObj(text, typeNumber, errorCorrectionLevel, mode, mb);
+    return qr.createImgTag();
+  }
 
   function toggleOn(options, timeout) {
     // We have a single option, so it may be passed as a string or property
@@ -794,7 +855,8 @@ angular.module('cesium.utils.services', [])
       error: alertError,
       info: alertInfo,
       confirm: askConfirm,
-      notImplemented: alertNotImplemented
+      notImplemented: alertNotImplemented,
+      demo: alertDemo
     },
     loading: {
       show: showLoading,
@@ -812,6 +874,10 @@ angular.module('cesium.utils.services', [])
     ink: ionicMaterialInk.displayEffect,
     motion: raw.motion,
     setEffects: setEffects,
+    qrcode: {
+      svg: getSvgQRCode,
+      img: getImgQRCode
+    },
     fab: {
       show: showFab,
       hide: hideFab
diff --git a/www/js/services/wallet-services.js b/www/js/services/wallet-services.js
index 51cf9cc97760c158e3fdc07a5be3630fa56cf67b..cc54c98e239b65a19bec452a004bd07a401ddf19 100644
--- a/www/js/services/wallet-services.js
+++ b/www/js/services/wallet-services.js
@@ -41,6 +41,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
     resetData = function(init) {
       data.loaded = false;
       data.pubkey= null;
+      data.qrcode=null;
 
       data.uid = null;
       data.localName = null;
@@ -158,8 +159,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
       var keepAuth = csSettings.data.keepAuthIdle > 0;
 
       var authData;
-      return (options && options.authData && $q.when(options.authData) ||
-        Modals.showLogin(options))
+      return (options && options.authData ? $q.when(options.authData) : Modals.showLogin(options))
         .then(function(res){
           if (!res || !res.pubkey ||
              (!needLogin && res.pubkey !== data.pubkey) ||
@@ -235,7 +235,10 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
         })
         .then(function() {
           if (options && options.silent) {
-            UIUtils.loading.hide();
+            UIUtils.loading.hide(10);
+          }
+          else {
+            UIUtils.loading.hide(1000);
           }
 
           return keepAuth ? data : angular.merge({}, data, authData);
@@ -286,6 +289,14 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
           });
       }
 
+      // Disable auth, if readonly or demo
+      if (csConfig.readonly || csConfig.demo) {
+        return UIUtils.alert.demo()
+          .then(function() {
+            throw 'CANCELLED';
+          });
+      }
+
       if (isAuth() && (!options || !options.forceAuth)) {
         return $q.when(data);
       }
@@ -704,10 +715,11 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
         .catch(function(err) {
           // Retry once (can be a timeout, because Duniter node are long to response)
           if (!secondTry) {
-            console.error("[wallet] Unable to load requirements: Will retrying... ", err);
+            console.error("[wallet] Unable to load requirements (first try): {0}. Retrying once...".format(err && err.message || err), err);
             UIUtils.loading.update({template: "COMMON.LOADING_WAIT"});
             return loadRequirements(withCache, true);
           }
+          console.error("[wallet] Unable to load requirements (after a second try): {0}".format(err && err.message || err), err);
           throw err;
         });
     },
@@ -840,6 +852,15 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
         });
     },
 
+    loadQrCode = function(){
+      if (!data.pubkey || data.qrcode) return $q.when(data.qrcode);
+      console.debug("[wallet] Creating SVG QRCode...");
+      return $timeout(function() {
+        data.qrcode = UIUtils.qrcode.svg(data.pubkey);
+        return data.qrcode;
+      });
+    },
+
     loadData = function(options) {
 
       var alertIfUnusedWallet = !csCurrency.data.initPhase && (!csSettings.data.wallet || csSettings.data.wallet.alertIfUnusedWallet) &&
@@ -862,8 +883,12 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
         loadPromise = loadFullData();
       }
 
-      return loadPromise
+      return $q.all([
+        loadPromise,
 
+        // Create the QR code
+        loadQrCode()
+      ])
         // Warn if wallet has been never used - see #167
         .then(function() {
           var unused = isNeverUsed();
@@ -909,6 +934,9 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
     loadFullData = function(fromTime) {
       data.loaded = false;
 
+      var now = Date.now();
+      console.debug("[wallet] Loading {{0}} full data...".format(data.pubkey && data.pubkey.substr(0,8)));
+
       return $q.all([
 
           // Get requirements
@@ -939,6 +967,10 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
         })
         .then(function() {
           data.loaded = true;
+          console.debug("[wallet] Loaded {{0}} full data in {1}ms".format(data.pubkey && data.pubkey.substr(0,8), Date.now() - now));
+
+          // Make sure to hide loading, because sometimes it stay - should fix freeze screen
+          UIUtils.loading.hide(1000);
           return data;
         })
         .catch(function(err) {
@@ -954,6 +986,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
       if (!options.requirements) {
         return $q.when(data);
       }
+
       return refreshData(options)
         .then(function(data) {
           data.loaded = true;
@@ -962,16 +995,16 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
     },
 
     refreshData = function(options) {
-        options = options || {
-          requirements: true,
-          sources: true,
-          tx: {
-            enable: true,
-            fromTime: data.tx && data.tx.fromTime !== 'pending' ? data.tx.fromTime : undefined // keep previous time
-          },
-          sigStock: true,
-          api: true
-        };
+      options = options || {
+        requirements: true,
+        sources: true,
+        tx: {
+          enable: true,
+          fromTime: data.tx && data.tx.fromTime !== 'pending' ? data.tx.fromTime : undefined // keep previous time
+        },
+        sigStock: true,
+        api: true
+      };
 
       // Force some load (requirements) if not already loaded
       options.requirements = angular.isDefined(options.requirements) ? options.requirements : !data.requirements.loaded;
@@ -983,6 +1016,9 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
 
       var jobs = [];
 
+      var now = Date.now();
+      console.debug("[wallet] {0} {{1}} data, with options: ".format(!data.loaded ? 'Loading' : 'Refreshing', data.pubkey.substr(0,8)), options);
+
       // Get requirements
       if (options.requirements) {
         // Reset events
@@ -1010,7 +1046,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
       if (options.sigStock) jobs.push(loadSigStock());
 
       return (jobs.length ? $q.all(jobs) : $q.when())
-        .then(function(){
+        .then(function() {
           // Skip api
           if (angular.isDefined(options.api) && !options.api) return data;
 
@@ -1018,13 +1054,20 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
           return api.data.raisePromise.load(data)
             .then(function(){
 
+              console.debug("[wallet] {0} {{1}} data in {2}ms".format(!data.loaded ? 'Loaded' : 'Refreshed', data.pubkey.substr(0,8), Date.now() - now));
+
               // Compute if full loaded
               if (!data.loaded) {
-                data.loaded = data.requirements.loaded && data.sources;
+                data.loaded = data.requirements.loaded && data.sources && true;
               }
 
               return data;
             });
+        })
+        .catch(function(err) {
+          console.error("[wallet] Error while {0} data: {1}".format(!data.loaded ? 'Loading' : 'Refreshing', (err && err.message || err)), err);
+          data.loaded = data.requirements.loaded && data.sources && true;
+          throw err;
         });
     },
 
@@ -1715,6 +1758,9 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
     },
 
     recoverId = function(recover) {
+      if (!recover || !recover.cypherNonce || !recover.cypherSalt || !recover.cypherPwd) {
+        throw {message:'ERROR.INVALID_FILE_FORMAT'};
+      }
       var nonce = CryptoUtils.util.decode_base58(recover.cypherNonce);
       return getkeypairSaveId(recover)
         .then(function (recover) {
@@ -1729,7 +1775,8 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
           return recover;
         })
         .catch(function(err){
-          console.warn('Incorrect answers - Unable to recover passwords');
+          console.warn('Incorrect answers: unable to recover identifiers', err);
+          throw new Error('Incorrect answers: unable to recover identifiers');
         });
     },
 
@@ -2001,8 +2048,8 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
       data.children = data.children || [];
       var childIndex = _.findIndex(data.children, function(child) {return child.id === id;});
       if (childIndex === -1) {
-        console.warn('[wallet] Unable to remove child wallet {'+id+'} (not found)');
-        return;
+        console.warn('[wallet] Unable to remove child wallet {{0}} (not found)'.format(id));
+        throw new Error('Wallet with id {{0}} not found'.format(id));
       }
       // Remove the wallet, and return it
       var wallet = data.children.splice(childIndex, 1)[0];
@@ -2011,9 +2058,10 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
       wallet.stop();
 
       // Store (store children locally)
-      if (!options || angular.isUndefined(options.store) || options.store) {
+      if (!options || options.store !== false) {
         return storeData();
       }
+      return $q.when();
     },
 
     getChildWalletById = function(id) {
@@ -2051,15 +2099,15 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
       if (!data.pubkey) throw new Error('User not login!');
       return (data.children || []).reduce(function(res, wallet) {
         return wallet.data.pubkey ? res.concat(wallet.data.pubkey) : res;
-      }, [data.pubkey])
-    }
+      }, [data.pubkey]);
+    },
 
     getByPubkey = function(pubkey) {
       if (!pubkey) throw new Error("Missing 'pubkey' argument !");
       if (!data.pubkey) throw new Error('User not login!');
       if (data.pubkey === pubkey) return exports; // main wallet
       return getChildWalletByPubkey(pubkey);
-    }
+    },
 
     downloadChildrenWalletFile = function() {
       return $q.all([
@@ -2404,6 +2452,7 @@ angular.module('cesium.wallet.services', ['ngApi', 'ngFileSaver', 'cesium.bma.se
       getData: getData,
       loadData: loadData,
       refreshData: refreshData,
+      loadQrCode: loadQrCode,
       // internal
       internal: {
         addListener: addListener,
diff --git a/www/license/license_g1-es-ES.md b/www/license/license_g1-es-ES.md
index d97c51c01794bc426c815662e231ef323473cf31..82f786d383d6908970e3e66e769c720c5fadf71c 100644
--- a/www/license/license_g1-es-ES.md
+++ b/www/license/license_g1-es-ES.md
@@ -1,81 +1,79 @@
 Licencia Äž1 - v0.2.8
-===================
+====================
 
 :fecha: 2017-04-04 12:59
-:modificación: 2018-02-24 09:30
+:modificada: 2019-04-16 22:30
 
 **Licencia de la moneda y compromiso de responsabilidad.**
 
-Cualquier certificación de un nuevo miembro de Ğ1 debe ir primero acompañada por la transmisión de esta licencia de moneda Ğ1 la cual el certificador debe garantizar que ha sido estudiada, entendida y aceptada por la persona que será certificada.
+Cualquier certificación de nueva membresía de Ğ1 debe ir primero acompañada por la transmisión de esta licencia de moneda Ğ1 cuyo certificador debe asegurar que ha sido estudiada, entendida y aceptada por la persona que será certificada.
 
 Cualquier evento de encuentro relacionado con Ğ1 debe ir acompañado de la transmisión de esta licencia, que puede leerse en voz alta y transmitirse por cualquier medio.
 
 Red de confianza Äž1 (RdC Äž1)
 ------------------------------
 
-** Aviso de advertencia :** Certificar no solo es asegurarte de que has conocido a la persona, es asegurar a la comunidad Ğ1 que conoces a la persona lo suficientemente bien y que sabes cómo contactarla fácilmente, y ser capaz de identificar una cuenta duplicada realizada por una persona que has certificado, u otros tipos de problemas (desaparición ...), haciendo verificaciones cruzadas que revelan el problema en caso de que lo haya.
+** Aviso de advertencia :** Certificar no solo es asegurarse de que te has encontrado físicamente con la persona. Es asegurar a la comunidad Ğ1 que conoces a la persona lo suficientemente bien y que sabrás cómo contactarla fácilmente, y ser capaz de identificar una cuenta duplicada o falsa realizada por una persona que has certificado, u otro tipo de problema (desaparición ...), efectuando verificaciones comparativas que revelen el problema.
 
-**Consejos muy recomendados**
+**Consejos fuertemente recomendados**
 
-Bien conocer a una persona significa que puedes comunicarte con ella por varios medios distintos (físicos, electrónicos, otros ...) pero también que conoces a varias personas que la conocen bien y, por lo tanto, pueden comunicarse con ella igualmente. Especialmente si no conoces bien ninguno de sus otros certificadores, es una clara indicación de que no conoces bien a la persona; una certificación de este tipo provoca una alerta hacia toda la comunidad Ğ1. En caso de conocimiento insuficiente, es importante NO certificar.
+Conocer bien a una persona significa que puedes comunicarte con ella por varios medios distintos (físicos, electrónicos, etc ...) pero también que conoces a varias personas que también la conocen bien y, por lo tanto, pueden contactar con ella igualmente. Además si no conoces bien a nadie de quienes ya le han certificado, es una clara indicación de que no conoces bien a la persona; una certificación de este tipo provoca una alerta hacia toda la comunidad Ğ1. En caso de conocimiento insuficiente, es importante NO certificar.
 
-Nunca certifiques solo, sino que acompañado por al menos otro miembro de la RdC Ğ1 para evitar cualquier mal manejo. En caso de error, advierte a otros miembros de la RdC Ğ1 inmediatamente.
+Nunca certifiques solo/a, sino acompáñate por al menos otro/a miembro de la RdC Ğ1 para evitar cualquier error de manejo. En caso de error, advierte a quienes ya son miembros de la RdC Ğ1 inmediatamente.
 
-Antes de cualquier certificación, asegúrate de verificar si su cuenta (tanto si se esté validando como ya sea miembro) ha recibido ya una o más certificaciones. Si es necesario, solicite información para ponerte en contacto con estos otros certificadores para verificar juntos que conoces bien la persona en cuestión por la creación de la nueva cuenta, así como la clave pública correspondiente.
+Antes de cualquier certificación, asegúrate de verificar si su cuenta (tanto si es nueva candidatura o ya miembro) ha recibido ya una o más certificaciones. Si es necesario, solicite información para ponerte en contacto con quienes ya le hayan certificado para verificar juntos/as que conocéis bien la persona en cuestión concerniente, así como su llave pública correspondiente.
 
-Comprueba que la persona a punta de ser certificada domina el manejo su cuenta: una buena manera de comprobar esto es transferir unos Äž1 a la cuenta de destino, y luego pedir la vuelta a tu propia cuenta. Esto asegura el control eficaz, por el futuro certificado, de su clave privada.
+Comprueba que la persona a ser certificada domina bien el manejo de su cuenta: una buena manera de comprobar esto es transferir unas Ğ1 a la cuenta destino, y luego pedir la devolución a tu propia cuenta. Esto asegura el buen manejo por quien va a ser certificado, de su llave privada.
 
-Compruebe que tus contactos hayan estudiado y comprendido a fondo la licencia Äž1 actualizada.
+Comprueba que tus contactos hayan estudiado y comprendido la licencia Äž1 actualizada.
 
-Si te das cuenta de que un certificador real o potencial de la cuenta en cuestión no conoce a la persona interesada, avise inmediatamente a los expertos del tema dentro de tus contactos de la RdC Ğ1, para que la RdC Ğ1 verifique el procedimiento de validación.
+Si te percatas de que un/a certificador/a real o potencial de la cuenta candidata no conoce a la persona interesada, avisa inmediatamente a quien tenga experiencia en el tema de tus contactos en la RdC Ğ1, para que la RdC Ğ1 verifique el proceso de validación.
 
 Cuando eres miembro de la RdC Ğ1 y estás a punto de certificar una nueva cuenta:
 
 
-** Estás seguro: **
+** Estás seguro de: **
 
-1 °) de conocer lo suficiente (no solo "de visu") la persona que declara administrar esta clave pública (nueva cuenta). Vea los consejos altamente recomendados más arriba para asegurarte de que conoces "bien".
+1°) Conocer suficientemente bien (además de conocerla físicamente) a la persona que declara poseer esta llave pública (nueva cuenta). Lea los consejos fuertemente recomendados más arriba para asegurarte de que la "conoces bien".
 
-2) Haber comprobado personalmente con ella que esta es la clave pública que está a punto de certificar (consulte las sugerencias anteriores).
+2°) Haber comprobado personalmente con ella de que se trata de esta llave pública que está a punto de certificar (lea las sugerencias anteriores).
 
-3°) Haber verificado con la persona interesada que ha generado su documento de revocación de cuenta Duniter que le permitirá, si es necesario, desactivar su estado de miembro (caso de robo de cuenta, un cambio de identificación, una cuenta creada incorrectamente, etc.).
+3°) Haber verificado con la persona interesada que ha generado su documento o archivo de revocación de cuenta Duniter que le permitirá, si es necesario, desactivar su estado de miembro (en caso de robo de cuenta, cambio de identificación, cuenta creada incorrectamente, etc.).
 
-4a °) De haberte encontrado con la persona físicamente para asegurarte de que la conoces bien y quién es ella que administra esta clave pública.
+4a°) De haberte encontrado con la persona físicamente para asegurarte de que es ella a quien conoces bien y quién posee esta llave pública.
 
-4b °) O verificar de forma remota el enlace entre la clave pública y la persona, contactando a esta persona por diferentes medios de comunicación, como correo en papel + red social + foro + correo electronico + video conferencia + teléfono (reconocer la voz). Porque si se puede piratear una cuenta de correo electrónico o una cuenta de foro, es mucho más difícil imaginar piratear cuatro medios de comunicación separados, e imitar la apariencia (video) y la voz de la persona además.
+4b°) O realizar de forma remota la verificación entre la llave pública y esa persona (que ya has encontrado físicamente), contactándola por diferentes medios de comunicación, como por correo ordinario + redes sociales + foro + correo electronico + video conferencia + teléfono (reconociendo la voz). Ya que si se puediese piratear una cuenta de correo electrónico o una cuenta en un foro, es mucho más difícil imaginar piratear cuatro medios de comunicación separados, e imitar la apariencia (video) e incluso la voz de la persona.
 
-El 4a °) sin embargo, es preferible a 4b °), mientras que los puntos 1 °) 2 °) y 3 °) son previamente indispensables.
+El 4a°) sin embargo, es preferible al 4b°), mientras que los puntos 1°) 2°) y 3°) son ante todo indispensables.
 
 **Reglas abreviadas de la RdC :**
 
-Cada miembro tiene un stock de 100 posibles certificaciones, que solo puede emitir a razón de 1 certificación cada 5 días.
+Cada miembro tiene una reserva de 100 certificaciones posibles, que solo puede emitir a razón de 1 certificación cada 5 días.
 
-Válido por 2 meses, se adopta definitivamente una certificación para un nuevo miembro siesta persona tiene al menos otras 4 certificaciones al cabo de estos 2 meses, de lo contrario, el proceso de inscripción deberá reiniciarse.
+Válida durante 2 meses, una certificación se toma en consideración definitivamente para una nueva candidatura de membresía si esta persona tiene al menos otras 4 certificaciones al cabo de estos 2 meses, de lo contrario, el proceso de candidatura deberá reiniciarse.
 
-Para convertirse en un nuevo miembro de la RdC Äž1 es necesario obtener 5 certificaciones y y estar a una distancia <= 5 pasos del 80% de los referentes de la RdC.
+Para convertirse en nuevo/a miembro de la RdC Ğ1 es necesario obtener 5 certificaciones y estar a una distancia de <= 5 pasos con como mínimo un 80% del total de miembros referentes de la RdC.
 
-Un miembro de la RdC Ğ1 es un miembro referente cuando ha recibido y emitido al menos Y [N] certificaciones donde N es el número de miembros RdC e Y [N] = techo N ^ (1/5). Ejemplos:
+Alguien es miembro referente de la RdC Ğ1 cuando ha recibido y también emitido al menos Y[N] certificaciones donde N es el total de miembros en la RdC e Y[N] = techo N^(1/5). Ejemplos:
 
-* Para 1024 < N ≤ 3125 tenemos Y[N] = 5
-* Para 7776 < N ≤ 16807 tenemos Y[N] = 7
-* para 59049 < N ≤ 100 000 tenemos Y[N] = 10
+* Para 1024 < N ≤ 3125 se obtiene que Y[N] = 5
+* Para 7776 < N ≤ 16807 se obtiene que Y[N] = 7
+* para 59049 < N ≤ 100.000 se obtiene que Y[N] = 10
 
-Una vez que el nuevo miembro participa en  la RdC Ğ1, sus certificaciones seguirán siendo válidas durante 2 años.
+Una vez que alguien es nuevo/a miembro de la RdC Ğ1, sus certificaciones serán válidas durante 2 años.
 
-Para seguir siendo miembro, debe renovar su acuerdo regularmente con su clave privada (cada 12 meses) y asegurarse de que siempre tenga al menos 5 certificaciones válidas más de allá de los 2 años.
+Para seguir siendo miembro, se debe renovar el acuerdo regularmente mediante la llave privada (cada 12 meses) y asegurarse de que siempre se tenga al menos 5 certificaciones válidas después de los 2 años.
 
 Moneda Äž1
 ----------
 
-Ğ1 se genera a través de un Dividendo Universal (DU) para cada ser humano en el Anillo de Confianza Ğ1, que tiene la siguiente forma:
+Ğ1 se genera a través de un Dividendo Universal (DU) para cada ser humano miembro de la Red de Confianza Ğ1, de la siguiente forma:
 
 * 1 DU por persona y por día.
 
-**Codigo de la moneda Äž1**
+La cantidad en Ğ1 del DU es idéntica cada día hasta el próximo equinoccio(cada 6 meses) cuando se re-evaluará el DU según la fórmula :
 
-La cantidad en Ğ1 del DU es idéntica cada día hasta el próximo equinoccio en el que se re-evaluará el DU según la fórmula (con 1 día = 86,400 segundos): :
-
-* DU día (próximo equinoccio) = DU día(equinoccio) + c² (M/N)(equinoccio) / (182,625 días)
+* DU diario (próximo equinoccio) = DU diario (equinoccio) + c² (M/N)(equinoccio) / (15778800 segundos)
 
 Y como parámetros:
 
@@ -84,14 +82,14 @@ Y como parámetros:
 
 Y como variables :
 
-* *M* la oferta de dinero o masa monetaria total en el equinoccio
-* *N* el número de miembros al día del equinoccio
+* *M* la masa monetaria total en el equinoccio
+* *N* el número de miembros el día del equinoccio
 
 Software Äž1 y licencia Äž1
 --------------------------
 
-El software Ğ1 que permite a los usuarios administrar su uso de Ğ1 debe transmitir esta licencia con el software y todos los parámetros técnicos de la moneda Ğ1 y de la RdC Ğ1 que se ingresan en el bloque 0 de Ğ1. El software que no cumple con estas obligaciones de la licencia no es compatible con Ğ1.
+El software Ğ1 que permita a los usuarios administrar su uso de Ğ1 debe transmitir esta licencia y todos los parámetros técnicos de la moneda Ğ1 y de la RdC Ğ1 que han sido configurados en el bloque 0 de Ğ1. El software que no cumpla con estas obligaciones de la licencia no es compatible con Ğ1.
 
-Para obtener más informaciones en los detalles técnicos, es posible consultar directamente el código de Duniter, que es un software libre así como los datos de la blockchain Ğ1, recuperándolos a través de una instancia de Duniter Ğ1 (o nodo).
+Para más detalle en los aspectos técnicos, es posible consultar directamente el código de Duniter, que es un software libre así como los datos de la cadena de bloques (blockchain) Ğ1, recuperándolos a través de una instancia (o nodo) de Duniter Ğ1.
 
-Más información en el sitio web del equipo de Duniter https://www.duniter.org
\ No newline at end of file
+Más información en el sitio web del equipo Duniter https://www.duniter.org
\ No newline at end of file
diff --git a/www/manifest.json b/www/manifest.json
index c5b40ce79935a4d68e29a67fe63b318a10ea3716..7969871fe6f0206a12dc5d444460656a52ef3c6f 100644
--- a/www/manifest.json
+++ b/www/manifest.json
@@ -2,9 +2,9 @@
   "short_name": "Cesium",
   "name": "Cesium",
   "manifest_version": 1,
-  "version": "1.5.8",
+  "version": "1.6.7",
   "default_locale": "fr",
-  "description": "Manage your Duniter Wallet on a libre currency, like Äž1",
+  "description": "Cesium Wallet for Äž1 libre currency",
   "icons": [
     {
       "src": "img/logo_32px.png",
@@ -29,6 +29,7 @@
   ],
   "background_color": "#1a237e",
   "theme_color": "black",
+  "dir": "ltr",
   "start_url": "/#/app/home",
   "display": "standalone"
 }
diff --git a/www/plugins/es/css/style.css b/www/plugins/es/css/style.css
index edeb37ef823a1e190a908a8680121d6c4b35f2be..fafbf6ccc5fc33b4f6644c853911a27e6bfa84c3 100644
--- a/www/plugins/es/css/style.css
+++ b/www/plugins/es/css/style.css
@@ -338,3 +338,6 @@
   height: 57px;
 }
 
+.view-wallet .item-wallet-help a {
+  text-decoration: underline;
+}
diff --git a/www/plugins/es/i18n/locale-en-GB.json b/www/plugins/es/i18n/locale-en-GB.json
index eec0d9c4fc65cb58420e525554eb30cf95e030b9..b54746a51002ca7188665b6b49990b14551329ba 100644
--- a/www/plugins/es/i18n/locale-en-GB.json
+++ b/www/plugins/es/i18n/locale-en-GB.json
@@ -301,8 +301,8 @@
       "RECORD_PUBKEY_HELP": "Public key to receive payments"
     },
     "WALLET": {
-      "REGISTRY_DIVIDER": "Pages",
-      "REGISTRY_HELP": "Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."
+      "PAGE_DIVIDER": "Pages",
+      "PAGE_DIVIDER_HELP": "Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref=\"app.es_network\">the Cesium+ network</a>."
     },
     "ERROR": {
       "LOAD_CATEGORY_FAILED": "Loading main activities failed",
@@ -320,7 +320,7 @@
   },
   "PROFILE": {
     "PROFILE_DIVIDER": "Cesium+ profile",
-    "PROFILE_DIVIDER_HELP": "These are ancillary data, stored outside the currency network.",
+    "PROFILE_DIVIDER_HELP": "These are ancillary data, stored outside the currency network, in <a ui-sref=\"app.es_network\">the Cesium+ network</a>.",
     "NO_PROFILE_DEFINED": "No Cesium+ profile",
     "BTN_ADD": "Create my profile",
     "BTN_EDIT": "Edit my profile",
@@ -337,7 +337,7 @@
     "TECHNICAL_DIVIDER": "Technical data",
     "MODAL_AVATAR": {
       "TITLE": "Avatar",
-      "SELECT_FILE_HELP": "<b>Choose an image file</b>, by clicking on the button below:",
+      "SELECT_FILE_HELP": "<b>Choose an image file</b>:",
       "BTN_SELECT_FILE": "Choose an image",
       "RESIZE_HELP": "<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",
       "RESULT_HELP": "<b>Here is the result</b> as seen on your profile:"
diff --git a/www/plugins/es/i18n/locale-en.json b/www/plugins/es/i18n/locale-en.json
index eec0d9c4fc65cb58420e525554eb30cf95e030b9..b54746a51002ca7188665b6b49990b14551329ba 100644
--- a/www/plugins/es/i18n/locale-en.json
+++ b/www/plugins/es/i18n/locale-en.json
@@ -301,8 +301,8 @@
       "RECORD_PUBKEY_HELP": "Public key to receive payments"
     },
     "WALLET": {
-      "REGISTRY_DIVIDER": "Pages",
-      "REGISTRY_HELP": "Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions."
+      "PAGE_DIVIDER": "Pages",
+      "PAGE_DIVIDER_HELP": "Pages refer to activities accepting money or promoting it: local shops, companies, associations, institutions. They are stored outside the currency network, in <a ui-sref=\"app.es_network\">the Cesium+ network</a>."
     },
     "ERROR": {
       "LOAD_CATEGORY_FAILED": "Loading main activities failed",
@@ -320,7 +320,7 @@
   },
   "PROFILE": {
     "PROFILE_DIVIDER": "Cesium+ profile",
-    "PROFILE_DIVIDER_HELP": "These are ancillary data, stored outside the currency network.",
+    "PROFILE_DIVIDER_HELP": "These are ancillary data, stored outside the currency network, in <a ui-sref=\"app.es_network\">the Cesium+ network</a>.",
     "NO_PROFILE_DEFINED": "No Cesium+ profile",
     "BTN_ADD": "Create my profile",
     "BTN_EDIT": "Edit my profile",
@@ -337,7 +337,7 @@
     "TECHNICAL_DIVIDER": "Technical data",
     "MODAL_AVATAR": {
       "TITLE": "Avatar",
-      "SELECT_FILE_HELP": "<b>Choose an image file</b>, by clicking on the button below:",
+      "SELECT_FILE_HELP": "<b>Choose an image file</b>:",
       "BTN_SELECT_FILE": "Choose an image",
       "RESIZE_HELP": "<b>Re-crop the image</b> if necessary. A click on the image allows to move it. Click on the area at the bottom left to zoom in.",
       "RESULT_HELP": "<b>Here is the result</b> as seen on your profile:"
diff --git a/www/plugins/es/i18n/locale-eo-EO.json b/www/plugins/es/i18n/locale-eo-EO.json
index 8572520b29465529e1e5ac6e8a1e5a4e59ed1679..f179c238a90322533e3908fa7b50064a4515bdb2 100644
--- a/www/plugins/es/i18n/locale-eo-EO.json
+++ b/www/plugins/es/i18n/locale-eo-EO.json
@@ -351,8 +351,8 @@
       "RECORD_PUBKEY_HELP": "Publika ŝlosilo por ricevi la pagojn"
     },
     "WALLET": {
-      "REGISTRY_DIVIDER": "Paĝoj",
-      "REGISTRY_HELP": "La paĝoj listigas agadojn, kiuj akceptas la liberan monon aŭ helpas ĝin: komercoj, entreprenoj, asocioj, institucioj."
+      "PAGE_DIVIDER": "Paĝoj",
+      "PAGE_DIVIDER_HELP": "La paĝoj listigas agadojn, kiuj akceptas la liberan monon aŭ helpas ĝin: komercoj, entreprenoj, asocioj, institucioj."
     },
     "ERROR": {
       "LOAD_CATEGORY_FAILED": "Malsukceso por ŝarĝi la liston de la agadoj",
@@ -387,7 +387,7 @@
     "TECHNICAL_DIVIDER": "Teknikaj informoj",
     "MODAL_AVATAR": {
       "TITLE": "Profil-foto",
-      "SELECT_FILE_HELP": "Bonvolu <b>elekti bildo-dosieron</b>, alklakante la ĉi-suban butonon:",
+      "SELECT_FILE_HELP": "Bonvolu <b>elekti bildo-dosieron</b>:",
       "BTN_SELECT_FILE": "Elekti foton",
       "RESIZE_HELP": "<b>Rekadri la bildon</b>, laŭbezone. Pluigi klakon sur la bildo ebligas movi ĝin. Alklaku la zonon malsupre maldekstre por zomi.",
       "RESULT_HELP": "<b>Jen la rezulto</b> tiel videbla ĉe via profilo:"
diff --git a/www/plugins/es/i18n/locale-es-ES.json b/www/plugins/es/i18n/locale-es-ES.json
index 50077c822aa462a01aea4d5d8e757da3797257bb..e4f29520da828c87704c61dfbad72cc8c29edf07 100644
--- a/www/plugins/es/i18n/locale-es-ES.json
+++ b/www/plugins/es/i18n/locale-es-ES.json
@@ -1,29 +1,85 @@
 {
   "COMMON": {
+    "ABUSES_TEXT": "{{total}} personne{{total > 1 ? 's' : ''}} {{total > 1 ? 'ont' : 'a'}} signalé un problème",
+    "BTN_LIKE": "Me gusta",
+    "BTN_LIKE_REMOVE": "Dejar de gustarme",
+    "BTN_REMOVE_REPORTED_ABUSE": "Cancelar mi reporte",
+    "BTN_REPORT_ABUSE_DOTS": "Reportar un problema o un abuso...",
+    "COMMENT_HELP": "Comentario",
+    "LIKES_TEXT": "A {{total}} persona{{total > 1 ? 's' : ''}} {{total > 1 ? 'les' : 'le'}} gusta esta página",
+    "NOTIFICATION": {
+        "HAS_UNREAD": "Tiene {{count}} notificaci{{count>0?'ones':'ón'}} no leída{{count>0?'s':''}}",
+        "TITLE": "Nueva notificación | {{'COMMON.APP_NAME'|translate}}"
+    },
+    "REPORT_ABUSE": {
+      "ASK_DELETE": "¿ Solicitar la eliminación ?",
+      "CONFIRM": {
+          "SENT": "Reporte enviado. ¡ Gracias !"
+      },
+      "REASON_HELP": "Yo explico el problema...",
+      "SUB_TITLE": "Por favor explique brevemente el problema :",
+      "TITLE": "Señalar un problema"
+    },
+
     "CATEGORY": "Categoría",
     "CATEGORIES": "Categorías",
     "CATEGORY_SEARCH_HELP": "Búsqueda",
     "LAST_MODIFICATION_DATE": "Actualización el",
-    "SUBMIT_BY": "Sometido por",
+    "SUBMIT_BY": "Enviado por",
     "BTN_PUBLISH": "Publicar",
     "BTN_PICTURE_DELETE": "Suprimir",
     "BTN_PICTURE_FAVORISE": "Principal",
     "BTN_PICTURE_ROTATE": "Girar",
     "BTN_ADD_PICTURE": "Añadir una foto",
     "NOTIFICATIONS": {
-      "TITLE": "Notificaciónes",
+      "TITLE": "Notificaciones",
       "MARK_ALL_AS_READ": "Marcar todo como leído",
       "NO_RESULT": "Ningúna notificación",
       "SHOW_ALL": "Ver todo",
-      "LOAD_NOTIFICATIONS_FAILED": "Fracaso en la carga de las notificaciónes"
+      "LOAD_NOTIFICATIONS_FAILED": "Fallo en la carga de las notificaciones"
+    }
+  },
+  "DOCUMENT": {
+    "HASH": "Hash: ",
+    "LOOKUP": {
+      "BTN_COMPACT": "Compactar",
+      "HAS_CREATE_OR_UPDATE_PROFILE": "ha creado o modificado su perfil",
+      "LAST_DOCUMENTS_DOTS": "Últimos documentos :",
+      "TITLE": "Búsqueda de documentos",
+      "BTN_ACTIONS": "Acciones",
+      "SEARCH_HELP": "issuer:AAA*, time:1508406169",
+      "LAST_DOCUMENTS": "Últimos documentos",
+      "SHOW_QUERY": "Ver la búsqueda",
+      "HIDE_QUERY": "Esconder la búsqueda",
+      "HEADER_TIME": "Fecha/Hora",
+      "HEADER_ISSUER": "Emisor",
+      "HEADER_RECIPIENT": "Destinatario",
+      "READ": "Leído",
+      "BTN_REMOVE": "Sumprimer este documento",
+      "POPOVER_ACTIONS": {
+        "TITLE": "Acciones",
+        "REMOVE_ALL": "Suprimir estos documentos..."
+      }
+    },
+    "INFO": {
+      "REMOVED": "Documento suprimido"
+    },
+    "CONFIRM": {
+      "REMOVE": "¿ Desea <b>suprimir este documento</b> ?",
+      "REMOVE_ALL": "¿ Desea <b>suprimer estos documentos</b> ?"
+    },
+    "ERROR": {
+      "LOAD_DOCUMENTS_FAILED": "Error al buscar los documentos",
+      "REMOVE_FAILED": "Error al suprimir el documento",
+      "REMOVE_ALL_FAILED": "Error al suprimir los documentos"
     }
   },
   "MENU": {
-    "REGISTRY": "Profesionales",
+    "REGISTRY": "Páginas",
     "USER_PROFILE": "Mi perfil",
     "MESSAGES": "Mensajes",
-    "NOTIFICATIONS": "Notificaciónes",
-    "INVITATIONS": "Invitaciónes"
+    "NOTIFICATIONS": "Notificaciones",
+    "INVITATIONS": "Invitaciones"
   },
   "ACCOUNT": {
     "NEW": {
@@ -31,22 +87,22 @@
       "ORGANIZATION_ACCOUNT_HELP": "Si representa una empresa, una asociación, etc.<br/>Ningún dividendo universal será creído por esta cuenta."
     },
     "EVENT": {
-      "MEMBER_WITHOUT_PROFILE": "Para obtener sus certificaciónes más rapidamente, completa <a ui-sref=\"app.edit_profile\">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable."
+      "MEMBER_WITHOUT_PROFILE": "Para obtener sus certificaciones más rapidamente, complete <a ui-sref=\"app.edit_profile\">su perfil usuario</a>. Los miembros concederán más fácilmente su confianza a una identidad verificable."
     },
     "ERROR": {
-      "WS_CONNECTION_FAILED": "Cesium no puede recibir las notificaciónes, a causa de un error técnico (conexión al nodo de datos Cesium+).<br/><br/>Si el problema persiste, por favor <b>elige un otro nodo de datos</b> en las configuraciónes Cesium+."
+      "WS_CONNECTION_FAILED": "Cesium no puede recibir las notificaciones, a causa de un error técnico (conexión al nodo de datos Cesium+).<br/><br/>Si el problema persiste, por favor <b>elige un otro nodo de datos</b> en los ajustes de Cesium+."
     }
   },
   "WOT": {
-    "BTN_SUGGEST_CERTIFICATIONS_DOTS": "Sugerir identidad a certificar...",
-    "BTN_ASK_CERTIFICATIONS_DOTS": "Solicitar otros miembros a certificarme…",
-    "BTN_ASK_CERTIFICATION": "Solicitar una certificación",
+    "BTN_SUGGEST_CERTIFICATIONS_DOTS": "Sugerir identidades a certificar…",
+    "BTN_ASK_CERTIFICATIONS_DOTS": "Pedir a miembros que le certifiquen…",
+    "BTN_ASK_CERTIFICATION": "Pedir una certificación",
     "SUGGEST_CERTIFICATIONS_MODAL": {
-      "TITLE": "Sugerir certificaciónes",
+      "TITLE": "Sugerir certificaciones",
       "HELP": "Selectionar sus sugerencias"
     },
     "ASK_CERTIFICATIONS_MODAL": {
-      "TITLE": "Solicitar certificaciónes",
+      "TITLE": "Solicitar certificaciones",
       "HELP": "Selectionar los destinatarios"
     },
     "SEARCH": {
@@ -55,25 +111,25 @@
       "DIVIDER_GROUP": "Grupos"
     },
     "CONFIRM": {
-      "SUGGEST_CERTIFICATIONS": "Está usted segura/o querer <b>mandar estas sugerencia de certificatión</b> ?",
-      "ASK_CERTIFICATION": "Está usted segura/o querer <b>mandar una solicitud de certificación</b> ?",
-      "ASK_CERTIFICATIONS": "Está usted segura/o querer <b>mandar una solicitud de certificación</b> a estas personas ?"
+      "SUGGEST_CERTIFICATIONS": "¿Desea <b>enviar estas sugerencias de certificatión</b> ?",
+      "ASK_CERTIFICATION": "¿Desea <b>enviar una solicitud de certificación</b> ?",
+      "ASK_CERTIFICATIONS": "¿Desea <b>enviar una solicitud de certificación</b> a estas personas ?"
     }
   },
   "INVITATION": {
-    "TITLE": "Invitaciónes",
+    "TITLE": "Invitaciones",
     "NO_RESULT": "Ningúna invitación en espera",
-    "BTN_DELETE_ALL": "Suprimir todas las invitaciónes",
+    "BTN_DELETE_ALL": "Suprimir todas las invitaciones",
     "BTN_DELETE": "Suprimir la invitación",
     "BTN_NEW_INVITATION": "Nueva invitación",
     "ASK_CERTIFICATION": "<a href=\"#/app/wot/{{pubkey}}/{{::uid}}\">{{::name||uid}}</a> solicita su certificación",
-    "SUGGESTION_CERTIFICATION": "<a href=\"#/app/wot/{{::pubkey}}/{{::uid}}\">{{::name||uid}}</a> él es sugerido por certificación",
+    "SUGGESTION_CERTIFICATION": "<a href=\"#/app/wot/{{::pubkey}}/{{::uid}}\">{{::name||uid}}</a> ha sido sugerido/a para certificación",
     "SUGGESTED_BY": "Sugerencia mandada por <a class=\"positive\" href=\"#/app/wot/{{::issuer.pubkey}}/{{::issuer.uid}}\">{{::issuer.name||issuer.uid}}</a>",
     "NOTIFICATIONS": {
-      "TITLE": "Invitaciónes"
+      "TITLE": "Invitaciones"
     },
     "LIST": {
-      "TITLE": "Invitaciónes"
+      "TITLE": "Invitaciones"
     },
     "NEW": {
       "TITLE": "Nueva invitación",
@@ -82,22 +138,22 @@
       "RECIPIENTS_MODAL_TITLE": "Destinatarios",
       "RECIPIENTS_MODAL_HELP": "Por favor, elige los destinatarios :",
       "SUGGESTION_IDENTITIES": "Sugerencia de certificación",
-      "SUGGESTION_IDENTITIES_HELP": "Certificaciónes a sugerir",
+      "SUGGESTION_IDENTITIES_HELP": "Certificaciones a sugerir",
       "SUGGESTION_IDENTITIES_MODAL_TITLE": "Sugerencias",
       "SUGGESTION_IDENTITIES_MODAL_HELP": "Por favor, elige sus sugerencias :"
     },
     "CONFIRM": {
-      "DELETE_ALL_CONFIRMATION": "La supresión de las invitaciónes es una <b>operación ireversible</b>.<br/><br/><b>Está usted segura/o </b> querer continuar ?",
-      "SEND_INVITATIONS_TO_CERTIFY": "Está usted segura/o querer <b>mandar esta invitación a certificar</b> ?"
+      "DELETE_ALL_CONFIRMATION": "La supresión de las invitaciones es una <b>operación ireversible</b>.<br/><br/>¿ Desea continuar ?",
+      "SEND_INVITATIONS_TO_CERTIFY": "¿ Desea <b>mandar esta invitación a certificar</b> ?"
     },
     "INFO": {
       "INVITATION_SENT": "Invitación mandada"
     },
     "ERROR": {
-      "LOAD_INVITATIONS_FAILED": "Fracaso en la carga de las invitaciónes",
-      "REMOVE_INVITATION_FAILED": "Fracaso durante la supresión de la invitación",
-      "REMOVE_ALL_INVITATIONS_FAILED": "Fracaso durante la supresión de las invitaciónes",
-      "SEND_INVITATION_FAILED": "Fracaso durante el envío de la invitación",
+      "LOAD_INVITATIONS_FAILED": "Fallo en la carga de las invitaciones",
+      "REMOVE_INVITATION_FAILED": "Fallo durante la supresión de la invitación",
+      "REMOVE_ALL_INVITATIONS_FAILED": "Fallo durante la supresión de las invitaciones",
+      "SEND_INVITATION_FAILED": "Fallo durante el envío de la invitación",
       "BAD_INVITATION_FORMAT": "<span class=\"assertive\"><i class=\"ion-close-circled\"></i> Invitación ilegible (formato desconocido)</span> - mandada por <a ui-sref=\"app.wot_identity({pubkey: '{{::pubkey}}', uid: '{{::uid}}' })\">{{::name||uid}}</a>"
     }
   },
@@ -108,6 +164,8 @@
     "COMMENT_HELP_REPLY_TO": "Su repuesta…",
     "BTN_SEND": "Mandar",
     "POPOVER_SHARE_TITLE": "Mensaje #{{number}}",
+    "MODIFIED_ON": "modificado el {{time|formatDate}}",
+    "MODIFIED_PARENTHESIS": "(modificado entonces)",
     "REPLY": "Responder",
     "REPLY_TO": "Repuesta a :",
     "REPLY_TO_LINK": "En repuesta a ",
@@ -115,8 +173,8 @@
     "REPLY_COUNT": "{{replyCount}} repuestas",
     "DELETED_COMMENT": "Comentario suprimido",
     "ERROR": {
-      "FAILED_SAVE_COMMENT": "Fracaso durante el respaldo del comentario",
-      "FAILED_REMOVE_COMMENT": "Fracaso durante la supresión del comentario"
+      "FAILED_SAVE_COMMENT": "Fallo durante el respaldo del comentario",
+      "FAILED_REMOVE_COMMENT": "Fallo durante la supresión del comentario"
     }
   },
   "MESSAGE": {
@@ -133,14 +191,14 @@
     },
     "LIST": {
       "INBOX": "Bandeja de entrada",
-      "OUTBOX": "Mensajes mandados",
+      "OUTBOX": "Mensajes enviados",
       "LAST_INBOX": "Nuevos mensajes",
       "LAST_OUTBOX": "Mensajes enviados",
       "BTN_LAST_MESSAGES": "Mensajes recientes",
       "TITLE": "Mensajes",
       "SEARCH_HELP": "Buscar en mensajes",
       "POPOVER_ACTIONS": {
-        "TITLE": "Opciónes",
+        "TITLE": "Opciones",
         "DELETE_ALL": "Suprimir todos los mensajes"
       }
     },
@@ -151,23 +209,23 @@
       "TO": "A",
       "OBJECT": "Objeto",
       "OBJECT_HELP": "Objeto",
-      "ENCRYPTED_HELP": "Por favor, nota que este mensaje será cifrado antes envío, a fin que solo el destinatario pueda leerlo, y que esté asegurado que usted esté bien su autor.",
+      "ENCRYPTED_HELP": "Tenga en cuenta que este mensaje será cifrado antes del envío, con el fin de que solo el destinatario pueda leerlo, y que se tenga la seguridad de que la autoría es suya.",
       "MESSAGE": "Mensaje",
       "MESSAGE_HELP": "Contenido del mensaje",
-      "CONTENT_CONFIRMATION": "El contenido del mensaje es vacío.<br/><br/>Sin embargo, quiere mandar el mensaje ?"
+      "CONTENT_CONFIRMATION": "El contenido del mensaje está vacío.<br/><br/>¿ Sin embargo, quiere mandar el mensaje ?"
     },
     "VIEW": {
       "TITLE": "Mensaje",
-      "SENDER": "Mandado por",
-      "RECIPIENT": "Mandado a",
+      "SENDER": "Enviado por",
+      "RECIPIENT": "Enviado a",
       "NO_CONTENT": "Mensaje vacío",
       "DELETE": "Eliminar el mensaje"
     },
     "CONFIRM": {
-      "REMOVE": "Está usted segura/o querer <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.",
-      "REMOVE_ALL" : "Está usted segura/o querer <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.",
-      "MARK_ALL_AS_READ": "Está usted segura/o querer <b>marcar todos los mensajes como leído</b> ?",
-      "USER_HAS_NO_PROFILE": "Esta identidad no tiene ningún perfil Cesium+. Se puede que no utilice la extensión Cesium+, y <b>así no consultará su mensaje</b>.<br/><br/>Está usted segura/o querer <b>continuar</b> a pesar de todo ?"
+      "REMOVE": "¿ Desea <b>suprimir este mensaje</b> ?<br/><br/>Esta operación es ireversible.",
+      "REMOVE_ALL" : "¿ Desea <b>suprimir todos los mensajes</b> ?<br/><br/>Esta operación es ireversible.",
+      "MARK_ALL_AS_READ": "¿ Desea <b>marcar todos los mensajes como leído</b> ?",
+      "USER_HAS_NO_PROFILE": "Esta identidad no tiene ningún perfil Cesium+. Puede que no tenga habilitada la extensión Cesium+, y <b>no podrá ver su mensaje</b>.<br/><br/>¿ Desea <b>continuar</b> a pesar de todo ?"
     },
     "INFO": {
       "MESSAGE_REMOVED": "Mensaje suprimido",
@@ -175,18 +233,18 @@
       "MESSAGE_SENT": "Mensaje mandado"
     },
     "ERROR": {
-      "SEND_MSG_FAILED": "Fracaso durante el envío del mensaje.",
-      "LOAD_MESSAGES_FAILED": "Fracaso durante la recuperación de los mensajes.",
-      "LOAD_MESSAGE_FAILED": "Fracaso durante la recuperación del mensaje.",
+      "SEND_MSG_FAILED": "Fallo durante el envío del mensaje.",
+      "LOAD_MESSAGES_FAILED": "Fallo durante la recuperación de los mensajes.",
+      "LOAD_MESSAGE_FAILED": "Fallo durante la recuperación del mensaje.",
       "MESSAGE_NOT_READABLE": "Lectura del mensaje imposible.",
-      "USER_NOT_RECIPIENT": "No esta el destinatario de este mensaje : deciframiento imposible.",
-      "NOT_AUTHENTICATED_MESSAGE": "La autenticidad del mensaje es dudosa o su contenido es corrupto.",
-      "REMOVE_MESSAGE_FAILED": "Fracaso en la supresión del mensaje",
+      "USER_NOT_RECIPIENT": "No está el destinatario de este mensaje : deciframiento imposible.",
+      "NOT_AUTHENTICATED_MESSAGE": "La autenticidad del mensaje es dudosa o su contenido está corrupto.",
+      "REMOVE_MESSAGE_FAILED": "Fallo en la supresión del mensaje",
       "MESSAGE_CONTENT_TOO_LONG": "Valor demasiado largo ({{maxLength}} carácteres max).",
       "MARK_AS_READ_FAILED": "Imposible marcar el mensaje como 'leído'.",
-      "LOAD_NOTIFICATIONS_FAILED": "Fracaso durante la recuperación de las notificaciónes de mensajes.",
-      "REMOVE_All_MESSAGES_FAILED": "Fracaso durante la supresión de todos los mensajes.",
-      "MARK_ALL_AS_READ_FAILED": "Fracaso durante el marcaje de los mensajes como leído.",
+      "LOAD_NOTIFICATIONS_FAILED": "Fallo durante la recuperación de las notificaciones de mensajes.",
+      "REMOVE_All_MESSAGES_FAILED": "Fallo durante la supresión de todos los mensajes.",
+      "MARK_ALL_AS_READ_FAILED": "Fallo durante el marcaje de los mensajes como leído.",
       "RECIPIENT_IS_MANDATORY": "El destinatario es obligatorio."
     }
   },
@@ -197,7 +255,7 @@
       "HEADER_MEDIAN_TIME": "Fecha / Hora",
       "HEADER_BLOCK": "Bloque #",
       "HEADER_ISSUER": "Nodo emisor",
-      "BTN_LAST": "últimos bloques",
+      "BTN_LAST": "Últimos bloques",
       "DISPLAY_QUERY": "Mostrar la consulta",
       "HIDE_QUERY": "Ocultar la consulta",
       "TX_SEARCH_FILTER": {
@@ -209,17 +267,17 @@
       }
     },
     "ERROR": {
-      "SEARCH_BLOCKS_FAILED": "Fracaso en la búsqueda de los bloques."
+      "SEARCH_BLOCKS_FAILED": "Fallo en la búsqueda de los bloques."
     }
   },
   "GROUP": {
-    "GENERAL_DIVIDER": "Informaciónes generales",
+    "GENERAL_DIVIDER": "Informaciones generales",
     "LOCATION_DIVIDER": "Dirección",
-    "SOCIAL_NETWORKS_DIVIDER": "Redes sociales y sitio web",
-    "TECHNICAL_DIVIDER": "Informaciónes técnicas",
+    "SOCIAL_NETWORKS_DIVIDER": "Redes sociales y página web",
+    "TECHNICAL_DIVIDER": "Informaciones técnicas",
     "CREATED_TIME": "Creada {{creationTime|formatFromNow}}",
     "NOTIFICATIONS": {
-      "TITLE": "Invitaciónes"
+      "TITLE": "Invitaciones"
     },
     "LOOKUP": {
       "TITLE": "Grupos",
@@ -236,7 +294,7 @@
       "OPEN_GROUP": "Grupo abierto",
       "OPEN_GROUP_HELP": "Un grupo abierto es accesible por cualquier miembro de la moneda.",
       "MANAGED_GROUP": "Grupo administrado",
-      "MANAGED_GROUP_HELP": "un grupo administrado es gestionado por administradores y moderadores, que pueden aceptar, rechazar o excluir un miembro en su seno.",
+      "MANAGED_GROUP_HELP": "Un grupo administrado es gestionado por administradores y moderadores, que pueden aceptar, rechazar o excluir un miembro en su seno.",
       "ENUM": {
         "OPEN": "Grupo abierto",
         "MANAGED": "Grupo administrado"
@@ -245,7 +303,7 @@
     "VIEW": {
       "POPOVER_SHARE_TITLE": "{{title}}",
       "MENU_TITLE": "Opciones",
-      "REMOVE_CONFIRMATION" : "Seguro que quieres eliminar este grupo?<br/><br/>Esta operación es irreversible."
+      "REMOVE_CONFIRMATION" : "¿Desea eliminar este grupo?<br/><br/>Esta operación es irreversible."
     },
     "EDIT": {
       "TITLE": "Grupo",
@@ -256,7 +314,7 @@
       "RECORD_DESCRIPTION_HELP": "Descripción"
     },
     "ERROR": {
-      "SEARCH_GROUPS_FAILED": "Fracaso en la búsqueda de grupos",
+      "SEARCH_GROUPS_FAILED": "Fallo en la búsqueda de grupos",
       "REMOVE_RECORD_FAILED": "Error al eliminar el grupo"
     },
     "INFO": {
@@ -265,20 +323,20 @@
   },
   "REGISTRY": {
     "CATEGORY": "Actividad principal",
-    "GENERAL_DIVIDER": "Informaciónes generales",
+    "GENERAL_DIVIDER": "Informaciones generales",
     "LOCATION_DIVIDER": "Dirección",
     "SOCIAL_NETWORKS_DIVIDER": "Redes sociales y sitio web",
-    "TECHNICAL_DIVIDER": "Informaciónes técnicas",
+    "TECHNICAL_DIVIDER": "Informaciones técnicas",
     "BTN_SHOW_WOT": "Personas",
     "BTN_SHOW_WOT_HELP": "Buscar personas",
     "BTN_SHOW_PAGES": "Páginas",
     "BTN_SHOW_PAGES_HELP": "Búsqueda de páginas",
-    "BTN_NEW": "Creer una página",
+    "BTN_NEW": "Crear una página",
     "MY_PAGES": "Mis páginas",
-    "NO_PAGE": "Sin página",
+    "NO_PAGE": "Sin páginas",
     "SEARCH": {
       "TITLE": "Páginas",
-      "SEARCH_HELP": "Qué, Quién : restaurante, Con Marcel, ...",
+      "SEARCH_HELP": "Qué, Quién, ej: peluquería, restaurante Sol.",
       "BTN_ADD": "Nuevo",
       "BTN_LAST_RECORDS": "Páginas recientes",
       "BTN_ADVANCED_SEARCH": "búsqueda avanzada",
@@ -292,16 +350,16 @@
       "LAST_RECORD_COUNT_LOCATION": "{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}, cerca de {{location}}",
       "LAST_RECORD_COUNT": "{{count}} página{{count>0?'s':''}} reciente{{count>0?'s':''}}",
       "POPOVER_FILTERS": {
-        "BTN_ADVANCED_SEARCH": "Opciones avanzadas?"
+        "BTN_ADVANCED_SEARCH": "Opciones avanzadas"
       }
     },
     "VIEW": {
       "TITLE": "Anuario",
       "CATEGORY": "Actividad principal :",
       "LOCATION": "Dirección :",
-      "MENU_TITLE": "Opciónes",
+      "MENU_TITLE": "Opciones",
       "POPOVER_SHARE_TITLE": "{{title}}",
-      "REMOVE_CONFIRMATION" : "Está usted segura/o querer suprimir esta página ?<br/><br/>Esta operación es ireversible."
+      "REMOVE_CONFIRMATION" : "¿ Desea suprimir esta página ?<br/><br/>Esta operación es ireversible."
     },
     "TYPE": {
       "TITLE": "Nueva página",
@@ -322,23 +380,23 @@
       "RECORD_DESCRIPTION": "Descripción",
       "RECORD_DESCRIPTION_HELP": "Descripción de la actividad",
       "RECORD_ADDRESS": "Calle",
-      "RECORD_ADDRESS_HELP": "Calle, edificio...",
+      "RECORD_ADDRESS_HELP": "Calle, edificio…",
       "RECORD_CITY": "Ciudad",
       "RECORD_CITY_HELP": "Ciudad",
       "RECORD_SOCIAL_NETWORKS": "Redes sociales y sitio web",
-      "RECORD_PUBKEY": "Llave pública" ,
-      "RECORD_PUBKEY_HELP": "Llave pública de recepción de los pagos"
+      "RECORD_PUBKEY": "Llave pública",
+      "RECORD_PUBKEY_HELP": "Llave pública para recibir pagos"
     },
     "WALLET": {
-      "REGISTRY_DIVIDER": "Páginas",
-      "REGISTRY_HELP": "Las páginas se refieren a actividades que aceptan dinero o lo favorecen: empresas, negocios, asociaciones, instituciones."
+      "PAGE_DIVIDER": "Páginas",
+      "PAGE_DIVIDER_HELP": "Las páginas se refieren a colectivos que aceptan moneda o la promocionan: tiendas, empresas, negocios, asociaciones, instituciones. Se almacenan fuera de la red de la moneda, en <a ui-sref=\"app.es_network\">la red Cesium+</a>."
     },
     "ERROR": {
-      "LOAD_CATEGORY_FAILED": "Fracaso en la carga de la lista de actividades",
-      "LOAD_RECORD_FAILED": "Fracaso durante la carga de la página",
-      "LOOKUP_RECORDS_FAILED": "Fracaso durante la ejecución de la búsqueda.",
-      "REMOVE_RECORD_FAILED": "Fracaso en la supresión de la página",
-      "SAVE_RECORD_FAILED": "Fracaso durante el respaldo",
+      "LOAD_CATEGORY_FAILED": "Fallo en la carga de la lista de actividades",
+      "LOAD_RECORD_FAILED": "Fallo durante la carga de la página",
+      "LOOKUP_RECORDS_FAILED": "Fallo durante la ejecución de la búsqueda.",
+      "REMOVE_RECORD_FAILED": "Fallo en la supresión de la página",
+      "SAVE_RECORD_FAILED": "Fallo durante el respaldo",
       "RECORD_NOT_EXISTS": "Página inexistente",
       "GEO_LOCATION_NOT_FOUND": "Ciudad o código postal no encontrado"
     },
@@ -349,53 +407,60 @@
   },
   "PROFILE": {
     "PROFILE_DIVIDER": "Perfil Cesium+",
-    "PROFILE_DIVIDER_HELP": "Estos son datos auxiliares, almacenados fuera de la red monetaria.",
+    "PROFILE_DIVIDER_HELP": "Estos son datos auxiliares, almacenados fuera de la red monetaria",
     "NO_PROFILE_DEFINED": "Ningún perfil Cesium+",
     "BTN_ADD": "Ingresar mi perfil",
     "BTN_EDIT": "Editar mi perfil",
     "BTN_DELETE": "Eliminar mi perfil",
     "BTN_REORDER": "Reordenar",
     "UID": "Seudónimo",
-    "TITLE": "Nombre, Apellido",
-    "TITLE_HELP": "Nombre, Apellido",
-    "DESCRIPTION": "A propósito de yo",
-    "DESCRIPTION_HELP": "A propósito de yo...",
+    "TITLE": "Nombre, Apellidos",
+    "TITLE_HELP": "Nombre, Apellidos",
+    "DESCRIPTION": "Sobre mí",
+    "DESCRIPTION_HELP": "Sobre mí…",
     "SOCIAL_HELP": "http://...",
-    "GENERAL_DIVIDER": "Informaciónes generales",
+    "GENERAL_DIVIDER": "Informaciones generales",
     "SOCIAL_NETWORKS_DIVIDER": "Redes sociales, sitios web",
-    "TECHNICAL_DIVIDER": "Informaciónes técnicas",
+    "TECHNICAL_DIVIDER": "Informaciones técnicas",
     "MODAL_AVATAR": {
       "TITLE": "Foto de perfil",
-      "SELECT_FILE_HELP": "Por favor, <b>elige un fichero imagen</b>, haciendo un clic sobre el botón por debajo :",
-      "BTN_SELECT_FILE": "Eligir una foto",
-      "RESIZE_HELP": "<b>Encuadra la imagen</b>, si es necesario. Un clic mantenido sobre la imagen permite desplazarla. Hace un clic sobre la zona abajo a la izquierda para hacer zoom.",
-      "RESULT_HELP": "<b>Aquí está el resultado</b> tal como está visible sobre su perfil :"
+      "SELECT_FILE_HELP": "Por favor, <b>elija una imagen</b>:",
+      "BTN_SELECT_FILE": "Eligir una imagen",
+      "RESIZE_HELP": "<b>Encuadre la imagen</b>, si es necesario. Un clic presionado sobre la imagen permite desplazarla. Haga clic en la zona inferior izquierda para hacer zoom.",
+      "RESULT_HELP": "<b>Aquí está el resultado</b> tal como se verá sobre su perfil :"
     },
     "CONFIRM": {
-      "DELETE": "¿Estás seguro de que quieres <b>eliminar tu perfil Cesium+?</b><br/><br/>Esta operación es irreversible."
+      "DELETE": "¿Desea <b>eliminar su perfil Cesium+?</b><br/><br/>Esta operación es irreversible.",
+      "DELETE_BY_MODERATOR": "¿Desea <b>eliminar este perfil Cesium+?</b><br/><br/>Esta operación es irreversible."
     },
     "ERROR": {
-      "REMOVE_PROFILE_FAILED": "Error de eliminación de perfil",
-      "LOAD_PROFILE_FAILED": "Fracaso en la carga del perfil usuario.",
-      "SAVE_PROFILE_FAILED": "Fracaso durante el respaldo",
-      "INVALID_SOCIAL_NETWORK_FORMAT": "Formato no tomado en cuenta : por favor, indica una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección email (joe@dalton.com)</li></ul>",
-      "IMAGE_RESIZE_FAILED": "Fracaso durante el redimensionamiento de la imagen"
+      "DELETE_PROFILE_FAILED": "Error durante la eliminación del perfil",
+      "REMOVE_PROFILE_FAILED": "Error de eliminación del perfil",
+      "LOAD_PROFILE_FAILED": "Fallo en la carga del perfil usuario.",
+      "SAVE_PROFILE_FAILED": "Fallo durante el respaldo",
+      "INVALID_SOCIAL_NETWORK_FORMAT": "Formato inválido: por favor, indique una dirección válida.<br/><br/>Ejemplos :<ul><li>- Una página Facebook (https://www.facebook.com/user)</li><li>- Una página web (http://www.misitio.es)</li><li>- Una dirección de correo (joe@dalton.com)</li></ul>",
+      "IMAGE_RESIZE_FAILED": "Falló el redimensionado de la imagen"
     },
     "INFO": {
       "PROFILE_REMOVED": "Perfil eliminado",
-      "PROFILE_SAVED": "Perfil respaldado"
+      "PROFILE_SAVED": "Perfil guardado"
     },
     "HELP": {
-      "WARNING_PUBLIC_DATA": "Las informaciónes informadas en su perfil <b>están públicas</b> : visibles también por personas <b>no conectadas</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"
+      "WARNING_PUBLIC_DATA": "La información de su perfil <b>es pública</b>: visible también por personas <b>sin cuenta</b>.<br/>{{'PROFILE.PROFILE_DIVIDER_HELP'|translate}}"
+    }
+  },
+  "LIKE": {
+    "ERROR": {
+        "FAILED_TOGGLE_LIKE": "Imposible ejecutar esta acción."
     }
   },
   "LOCATION": {
     "BTN_GEOLOC_ADDRESS": "Actualizar desde la dirección",
-    "USE_GEO_POINT": "Aparecer en la tarjeta {{'COMMON.APP_NAME'|translate}} ?",
-    "LOADING_LOCATION": "Encontrar la dirección ...",
+    "USE_GEO_POINT": "Aparecer en el mapa {{'COMMON.APP_NAME'|translate}}",
+    "LOADING_LOCATION": "Encontrar la dirección…",
     "LOCATION_DIVIDER": "Dirección",
     "ADDRESS": "Calle",
-    "ADDRESS_HELP": "Calle, complemento de dirección...",
+    "ADDRESS_HELP": "Calle, número, etc…",
     "CITY": "Ciudad",
     "CITY_HELP": "Ciudad, País",
     "DISTANCE": "Distancia máxima alrededor de la ciudad",
@@ -419,7 +484,7 @@
   },
   "SUBSCRIPTION": {
     "SUBSCRIPTION_DIVIDER": "Servicios en línea",
-    "SUBSCRIPTION_DIVIDER_HELP": "Los servicios en línea ofrecen servicios adicionales opcionales, delegados a un tercero.",
+    "SUBSCRIPTION_DIVIDER_HELP": "Los servicios en línea ofrecen servicios adicionales, proporcionados por un tercero.",
     "BTN_ADD": "Agregar un servicio",
     "BTN_EDIT": "Administrar mis servicios",
     "NO_SUBSCRIPTION": "Ningún servicio definido",
@@ -435,7 +500,7 @@
       }
     },
     "CONFIRM": {
-      "DELETE_SUBSCRIPTION": "Deseas <b>eliminar</b> esta suscripción ?"
+      "DELETE_SUBSCRIPTION": "¿ Deseas <b>eliminar</b> esta suscripción ?"
     },
     "ERROR": {
       "LOAD_SUBSCRIPTIONS_FAILED": "Error al cargar servicios en línea",
@@ -445,38 +510,48 @@
     },
     "MODAL_EMAIL": {
       "TITLE" : "Notificación por correo electrónico",
-      "HELP" : "Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará únicamente para que sea visible para el proveedor de servicios.",
-      "EMAIL_LABEL" : "Tu correo electrónico :",
-      "EMAIL_HELP": "carlos@dominio.com",
+      "HELP" : "Rellene este formulario para <b>ser notificado por correo electrónico</b> de los eventos de su cuenta. <br/> Su dirección de correo electrónico se cifrará y únicamente será visible para el proveedor de servicios.",
+      "EMAIL_LABEL" : "Su correo electrónico :",
+      "EMAIL_HELP": "maria@dominio.com",
       "FREQUENCY_LABEL": "Frecuencia de las notificaciones :",
-      "FREQUENCY_DAILY": "Diariamente",
+      "FREQUENCY_DAILY": "Diaria",
       "FREQUENCY_WEEKLY": "Semanal",
       "PROVIDER": "Proveedor de servicio :"
     }
   },
+  "ES_PEER": {
+    "DOCUMENT_COUNT": "Número de documentos",
+    "DOCUMENTS": "Documentos",
+    "EMAIL_SUBSCRIPTION_COUNT": "{{emailSubscription}} suscrito/a{{emailSubscription ? 's' : ''}} a notificaciones por correo",
+    "NAME": "Nombre",
+    "SOFTWARE": "Software"
+  },
   "ES_SETTINGS": {
     "PLUGIN_NAME": "Cesium+",
-    "PLUGIN_NAME_HELP": "Perfiles, notificaciónes, mensajes privados",
-    "ENABLE_TOGGLE": "Activar la extensión ?",
-    "ENABLE_MESSAGE_TOGGLE": "Activar los mensajes privados ?",
-    "ENABLE_SETTINGS_TOGGLE": "Activar el almacenamiento a distancia de las configuraciónes ?",
+    "PLUGIN_NAME_HELP": "Perfiles, notificaciones, mensajes privados",
+    "ENABLE_TOGGLE": "Activar la extensión",
+    "ENABLE_MESSAGE_TOGGLE": "Activar los mensajes privados",
+    "ENABLE_REMOTE_STORAGE": "Activar el almacenamiento remoto",
+    "ENABLE_REMOTE_STORAGE_HELP": "Permite almacenar (con cifrado) sus ajustes en los nodos Cesium+",
     "PEER": "Dirección del nodo de datos",
     "POPUP_PEER": {
       "TITLE" : "Nodo de datos",
-      "HELP" : "Ingresa la dirección del nodo que quiere utilizar :",
+      "HELP" : "Ingrese la dirección del nodo que quiere utilizar:",
       "PEER_HELP": "servidor.dominio.com:puerto"
     },
     "NOTIFICATIONS": {
-      "DIVIDER": "Notificaciónes",
-      "HELP_TEXT": "Activa los tipos de notificaciónes que usted desea recibir :",
-      "ENABLE_TX_SENT": "Notificar la validación de los <b>pagos emitidos</b> ?",
-      "ENABLE_TX_RECEIVED": "Notificar la validación de los <b>pagos recibidos</b> ?",
-      "ENABLE_CERT_SENT": "Notificar la validación de las <b>certificaciónes emitidas</b> ?",
-      "ENABLE_CERT_RECEIVED": "Notificar la validación de las <b>certificaciónes recibidas</b> ?"
+      "DIVIDER": "Notificaciones",
+      "HELP_TEXT": "Active los tipos de notificaciones que desea recibir:",
+      "ENABLE_TX_SENT": "Notificar la validación de los <b>pagos emitidos</b>",
+      "ENABLE_TX_RECEIVED": "Notificar la validación de los <b>pagos recibidos</b>",
+      "ENABLE_CERT_SENT": "Notificar la validación de las <b>certificaciones emitidas</b>",
+      "ENABLE_CERT_RECEIVED": "Notificar la validación de las <b>certificaciones recibidas</b>",
+      "ENABLE_HTML5_NOTIFICATION": "Avisar con cada nueva notificación",
+      "ENABLE_HTML5_NOTIFICATION_HELP": "Abre una pequeña ventana emergente con cada nueva notificación."
     },
     "CONFIRM": {
-      "ASK_ENABLE_TITLE": "Nuevas funcionalidades",
-      "ASK_ENABLE": "Nuevas funcionalidades son disponibles : <ul><li>&nbsp;&nbsp;<b><i class=\"icon ion-person\"></i> Perfiles Cesium+</b>;<li>&nbsp;&nbsp;<b><i class=\"icon ion-android-notifications\"></i> Notificaciónes</b>;<li>&nbsp;&nbsp;<b><i class=\"icon ion-email\"></i> Mensajes privados</b>.</ul><br/>Fueron <b>desactivadas</b> en sus configuraciones.<br/><br/><b>Quiere usted activarlas</b> ?"
+      "ASK_ENABLE_TITLE": "Otras funcionalidades",
+      "ASK_ENABLE": "La extensión de Cesium+ está deshabilitada en sus ajutes, desactivando ciertas funcionalidades: <ul><li>&nbsp;&nbsp;<b><i class=\"icon ion-person\"></i> Perfiles de usuario/a</b>;<li>&nbsp;&nbsp;<b><i class=\"icon ion-android-notifications\"></i> Notificaciones</b>;<li>&nbsp;&nbsp;<b><i class=\"icon ion-email\"></i> Mensajes privados</b>.</ul><br/><br/>¿<b>Desea re-activar</b> la extensión?"
     }
   },
   "ES_WALLET": {
@@ -488,29 +563,47 @@
     "NODE_STARTED": "Su nodo ES API <b>{{params[0]}}</b> es comenzado",
     "NODE_BMA_DOWN": "El nodo <b>{{params[0]}}:{{params[1]}}</b> (utilizado por su nodo ES API) <b>no es localizable</b>.",
     "NODE_BMA_UP": "El nodo <b>{{params[0]}}:{{params[1]}}</b> es de nuevo accesible.",
-    "MEMBER_JOIN": "Ahora usted está <b>miembro</b> de la moneda <b>{{params[0]}}</b> !",
-    "MEMBER_LEAVE": "No está <b>miembro</b> de la moneda <b>{{params[0]}}</b>!",
-    "MEMBER_EXCLUDE": "Usted ya no es un miembro de la moneda <b>{{params[0]}}</b>, la falta de no renovación o la falta de certificaciones.",
-    "MEMBER_REVOKE": "La revocación de su cuenta se ha hecho. Puede que no sea un miembro de la cuenta en moneda <b>{{params[0]}}</b>.",
-    "MEMBER_ACTIVE": "Su renovación de adhesión a la moneda <b>{{params[0]}}</b> fue <b>tomado en cuenta</b>.",
+    "MEMBER_JOIN": "Ahora es <b>miembro</b> de la moneda <b>{{params[0]}}</b> !",
+    "MEMBER_LEAVE": "No es <b>miembro</b> de la moneda <b>{{params[0]}}</b>!",
+    "MEMBER_EXCLUDE": "Usted ya no es miembro de la moneda <b>{{params[0]}}</b>, por falta de renovación o certificaciones.",
+    "MEMBER_REVOKE": "Su membresía ha sido revocada. Ya no es miembro de la moneda <b>{{params[0]}}</b>.",
+    "MEMBER_ACTIVE": "Su membresía a <b>{{params[0]}}</b> ha sido <b>renovada con éxito</b>.",
     "TX_SENT": "Su <b>pago</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuado.",
     "TX_SENT_MULTI": "Su <b>pago</b> a <b>{{params[1]}}</b> fue efectuado.",
     "TX_RECEIVED": "Ha <b>recibido un pago</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",
     "TX_RECEIVED_MULTI": "Ha <b>recibido un pago</b> de <b>{{params[1]}}</b>.",
     "CERT_SENT": "Su <b>certificación</b> a <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\" ><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> fue efectuada.",
     "CERT_RECEIVED": "Ha <b>recibido una certificación</b> de <span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span>.",
+    "USER": {
+        "ABUSE_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su perfil",
+        "DELETION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha reportado un perfil para suprimir : <b>{{params[2]}}</b>",
+        "FOLLOW_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> sigue la actividad de su perfil",
+        "LIKE_RECEIVED": "A <span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> le ha gustado su perfil</b>",
+        "MODERATION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre el perfil : <b>{{params[2]}}</b><br/><b class=\"dark ion-quote\"> </b><span class=\"text-italic\">{{params[3]}}</span>",
+        "STAR_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> os ha puntuado con ({{params[3]}} <b class=\"ion-star\">)"
+    },
     "PAGE": {
+      "ABUSE_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha reportardo su página : <b>{{params[2]}}</b>",
+      "DELETION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha reportado una página para suprimir : <b>{{params[2]}}</b>",
+      "FOLLOW_CLOSE": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha cerrado la página : <b>{{params[2]}}</b>",
+      "FOLLOW_NEW": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha añadido la página : <b>{{params[2]}}</b>",
+      "FOLLOW_NEW_COMMENT": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha comentado la página : <b>{{params[2]}}</b>",
+      "FOLLOW_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> sigue su página : <b>{{params[2]}}</b>",
+      "FOLLOW_UPDATE": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha modificado la página : <b>{{params[2]}}</b>",
+      "FOLLOW_UPDATE_COMMENT": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> ha modificado su comentario en la página : <b>{{params[2]}}</b>",
+      "MODERATION_RECEIVED": "<span class=\"positive\"><i class=\"icon ion-person\"></i>&thinsp;{{name||params[1]}}</span> os pide moderación sobre la página : <b>{{params[2]}}</b><br/><b class=\"dark ion-quote\"> </b><span class=\"text-italic\">{{params[3]}}</span>",
+
       "NEW_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha comentado su referencia : <b>{{params[2]}}</b>",
       "UPDATE_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado su comentario sobre su referencia : <b>{{params[2]}}</b>",
-      "NEW_REPLY_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha contestado a su comentario sobre el referencia : <b>{{params[2]}}</b>",
-      "UPDATE_REPLY_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre el referencia : <b>{{params[2]}}</b>"
+      "NEW_REPLY_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid}\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha contestado a su comentario sobre la referencia : <b>{{params[2]}}</b>",
+      "UPDATE_REPLY_COMMENT": "<span ng-class=\"{'gray': !notification.uid, 'positive':notification.uid }\"><i class=\"icon\" ng-class=\"{'ion-person': notification.uid, 'ion-key': !notification.uid}\"></i>&thinsp;{{name||uid||params[1]}}</span> ha modificado la repuesta a su comentario sobre la referencia : <b>{{params[2]}}</b>"
     }
   },
   "CONFIRM": {
-    "ES_USE_FALLBACK_NODE": "Nodo de datos <b> {{old}} </ b> dirección inalcanzable o no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?"
+    "ES_USE_FALLBACK_NODE": "Nodo de datos <b>{{old}}</b> inalcanzable o dirección no válida.<br/><br/>¿Desea utilizar temporalmente el nodo de datos <b>{{new}}</b>?"
   },
   "ERROR": {
-    "ES_CONNECTION_ERROR": "Nodo de datos <b>{{server}}</b> dirección inalcanzable o no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class=\"positive\" ng-click=\"doQuickFix('settings')\"> configuración de extensión </a>.",
+    "ES_CONNECTION_ERROR": "Nodo de datos <b>{{server}}</b> inalcanzable o dirección no válida.<br/><br/>Cesium continuará funcionando, <b>sin la extensión Cesium+</b> (perfiles de usuario, mensajes privados), mapas y gráficos).<br/><br/>Verifique su conexión a Internet, o cambie el nodo de datos en <a class=\"positive\" ng-click=\"doQuickFix('settings')\"> los ajustes de la extensión </a>.",
     "ES_MAX_UPLOAD_BODY_SIZE": "El volumen de datos a enviar excede el límite establecido por el servidor.<br/><br/>Por favor, inténtelo de nuevo después, por ejemplo, borrando fotos."
   }
 }
diff --git a/www/plugins/es/i18n/locale-fr-FR.json b/www/plugins/es/i18n/locale-fr-FR.json
index 34c22911185e57f43f88e9e3ad0e29a55babae6b..055127de570e2d123c63d1f71693390f9316ec05 100644
--- a/www/plugins/es/i18n/locale-fr-FR.json
+++ b/www/plugins/es/i18n/locale-fr-FR.json
@@ -352,8 +352,8 @@
       "RECORD_PUBKEY_HELP": "Clé publique de réception des paiements"
     },
     "WALLET": {
-      "REGISTRY_DIVIDER": "Pages",
-      "REGISTRY_HELP": "Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions."
+      "PAGE_DIVIDER": "Pages",
+      "PAGE_DIVIDER_HELP": "Les pages référencent des activités acceptant la monnaie ou la favorisant : commerces, entreprises, associations, institutions. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref=\"app.es_network\">le réseau des nœuds Cesium+</a>."
     },
     "ERROR": {
       "LOAD_CATEGORY_FAILED": "Erreur de chargement de la liste des activités",
@@ -371,7 +371,7 @@
   },
   "PROFILE": {
     "PROFILE_DIVIDER": "Profil Cesium+",
-    "PROFILE_DIVIDER_HELP": "Il s'agit de données annexes, stockées en dehors du réseau de la monnaie.",
+    "PROFILE_DIVIDER_HELP": "Il s'agit de données annexes, optionnelles. Elles sont stockées en dehors du réseau de la monnaie, dans <a ui-sref=\"app.es_network\">le réseau Cesium+</a>.",
     "NO_PROFILE_DEFINED": "Aucun profil saisi",
     "BTN_ADD": "Saisir mon profil",
     "BTN_EDIT": "Editer mon profil",
@@ -388,18 +388,20 @@
     "TECHNICAL_DIVIDER": "Informations techniques",
     "MODAL_AVATAR": {
       "TITLE": "Photo de profil",
-      "SELECT_FILE_HELP": "Veuillez <b>choisir un fichier image</b>, en cliquant sur le bouton ci-dessous :",
+      "SELECT_FILE_HELP": "Veuillez <b>choisir le fichier image</b> :",
       "BTN_SELECT_FILE": "Choisir une photo",
       "RESIZE_HELP": "<b>Recadrez l'image</b>, si besoin. Un clic maintenu sur l'image permet de la déplacer. Cliquez sur la zone en bas à gauche pour zoomer.",
       "RESULT_HELP": "<b>Voici le résultat</b> tel que visible sur votre profil :"
     },
     "CONFIRM": {
-      "DELETE": "Êtes-vous sûr de vouloir <b>supprimer votre profil Cesium+ ?</b><br/><br/>Cette opération est irréversible."
+      "DELETE": "Êtes-vous sûr de vouloir <b>supprimer votre profil Cesium+ ?</b><br/><br/>Cette opération est irréversible.",
+      "DELETE_BY_MODERATOR": "Êtes-vous sûr de vouloir <b>supprimer ce profil Cesium+ ?</b><br/><br/>Cette opération est irréversible."
     },
     "ERROR": {
       "REMOVE_PROFILE_FAILED": "Erreur de suppression du profil",
-      "LOAD_PROFILE_FAILED": "Erreur de chargement du profil utilisateur",
+      "LOAD_PROFILE_FAILED": "Erreur de chargement du profil",
       "SAVE_PROFILE_FAILED": "Erreur lors de la sauvegarde",
+      "DELETE_PROFILE_FAILED": "Erreur lors de la suppression du profil",
       "INVALID_SOCIAL_NETWORK_FORMAT": "Format non pris en compte : veuillez indiquer une adresse valide.<br/><br/>Exemples :<ul><li>- Une page Facebook (https://www.facebook.com/user)</li><li>- Une page web (http://www.monsite.fr)</li><li>- Une adresse email (joe@dalton.com)</li></ul>",
       "IMAGE_RESIZE_FAILED": "Erreur lors du redimensionnement de l'image"
     },
@@ -441,7 +443,7 @@
   },
   "SUBSCRIPTION": {
     "SUBSCRIPTION_DIVIDER": "Services en ligne",
-    "SUBSCRIPTION_DIVIDER_HELP": "Les services en ligne offrent des services supplémentaires optionnels, délégués à un tiers.",
+    "SUBSCRIPTION_DIVIDER_HELP": "Les services en ligne offrent des services supplémentaires et optionnels, délégués à un perstataire de votre choix. Par exemple, pour recevoir les notifications de paiement par email.",
     "BTN_ADD": "Ajouter un service",
     "BTN_EDIT": "Gérer mes services",
     "NO_SUBSCRIPTION": "Aucun service utilisé",
@@ -518,7 +520,7 @@
     "ENABLE_REMOTE_STORAGE": "Activer le stockage distant ?",
     "ENABLE_REMOTE_STORAGE_HELP": "Permet de stockage (chiffré) de vos paramètres sur les noeuds Cesium+",
     "ENABLE_MESSAGE_TOGGLE": "Activer les messages privés ?",
-    "PEER": "Adresse du nœud de données",
+    "PEER": "Nœud de données Cesium+",
     "POPUP_PEER": {
       "TITLE" : "Nœud de données",
       "HELP" : "Saisissez l'adresse du nœud que vous voulez utiliser :",
@@ -590,7 +592,7 @@
   },
   "LIKE": {
     "ERROR": {
-      "FAILED_TOGGLE_LIKE": "Impossible d'executer cette action."
+      "FAILED_TOGGLE_LIKE": "Impossible d'exécuter cette action."
     }
   },
   "CONFIRM": {
diff --git a/www/plugins/es/i18n/locale-it-IT.json b/www/plugins/es/i18n/locale-it-IT.json
index e0e79b488dec8cf859c8a95346f28120ddeffa8a..55b27c17b2d6ac911fdfe804f042b6740d285cea 100644
--- a/www/plugins/es/i18n/locale-it-IT.json
+++ b/www/plugins/es/i18n/locale-it-IT.json
@@ -58,7 +58,7 @@
        "SUGGEST_CERTIFICATIONS": "E’ sicuro(a) di voler <b>suggerire queste certificazioni</b> ?",
        "ASK_CERTIFICATION": " E’ sicuro(a) di voler  <b>chiedere una certificazione</b> ?",
        "ASK_CERTIFICATIONS": " E’ sicuro(a) di voler <b>chiedere una certificazione</b> a questi membri ?"
-     },
+     }
    },
   "INVITATION": {
     "TITLE": "Invitazioni",
@@ -326,8 +326,8 @@
        "RECORD_PUBKEY_HELP": "Chiave pubblica per ricevere pagamenti"
      },
      "WALLET": {
-      "REGISTRY_DIVIDER": "Pagine",
-      "REGISTRY_HELP": "Le pagine sono un elenco dei profesionisti che accettano o favoriscono: negozi, aziende, associazioni, istituti..."
+      "PAGE_DIVIDER": "Pagine",
+      "PAGE_DIVIDER_HELP": "Le pagine sono un elenco dei profesionisti che accettano o favoriscono: negozi, aziende, associazioni, istituti..."
     },
      "ERROR": {
        "LOAD_CATEGORY_FAILED": "Errore nel caricamento delle attività principali",
@@ -360,7 +360,7 @@
      "TECHNICAL_DIVIDER": "Dati tecnici",
      "MODAL_AVATAR": {
        "TITLE": "Avatar",
-       "SELECT_FILE_HELP": "<b>Scegliere un'immagine</b>, cliccando sul bottone qui sotto:",
+       "SELECT_FILE_HELP": "<b>Scegliere un'immagine</b>:",
        "BTN_SELECT_FILE": "Scegliere un'immagine",
        "RESIZE_HELP": "<b>Ritagliare l'immagine</b> se necessario. Cliccare sull'immagine permette di spostarla. Cliccando nella zona a basso sinistra permette di fare uno zoom-in.",
        "RESULT_HELP": "<b>Questo è il risultato</b> come visibile sul suo profilo:"
diff --git a/www/plugins/es/js/controllers/common-controllers.js b/www/plugins/es/js/controllers/common-controllers.js
index 415602f8936985b7cc5fdee8a45431b3e9fd0fde..e010969c59721dedb3d5caddc56dad9dcea33fb0 100644
--- a/www/plugins/es/js/controllers/common-controllers.js
+++ b/www/plugins/es/js/controllers/common-controllers.js
@@ -50,22 +50,20 @@ function ESPicturesEditController($scope, UIUtils, $q, Device) {
       .catch(UIUtils.onError('ERROR.TAKE_PICTURE_FAILED'));
   };
 
-  $scope.fileChanged = function(event) {
-    if (!event.target.files || !event.target.files.length) return;
+  $scope.onFileChanged = function(event) {
+    if (!event || !event.file) return;
     UIUtils.loading.show();
-    var file = event.target.files[0];
+    var file = event.file;
     return UIUtils.image.resizeFile(file)
       .then(function(imageData) {
         $scope.pictures.push({
           src: imageData,
           isnew: true // use to prevent visibility hidden (if animation)
         });
-        event.target.value = ""; // reset input[type=file]
         UIUtils.loading.hide(100);
       })
       .catch(function(err) {
         console.error(err);
-        event.target.value = ""; // reset input[type=file]
         UIUtils.loading.hide();
       });
   };
@@ -427,7 +425,7 @@ function ESSocialsViewController($scope)  {
 
 
 
-function ESAvatarModalController($scope) {
+function ESAvatarModalController($scope, $sce) {
 
   $scope.formData = {
     initCrop: false,
@@ -437,36 +435,33 @@ function ESAvatarModalController($scope) {
     resultBlob: undefined
   };
 
-  $scope.openFileSelector = function() {
-    var fileInput = angular.element(document.querySelector('.modal-avatar #fileInput'));
-    if (fileInput && fileInput.length > 0) {
-      fileInput[0].click();
-    }
-  };
-
-  $scope.fileChanged = function(e) {
+  $scope.onFileChanged = function(event) {
+    if (!event || !event.file) return; // Skip
 
-    var files = e.target.files;
     var fileReader = new FileReader();
-    fileReader.readAsDataURL(files[0]);
+    fileReader.readAsDataURL(event.file);
 
     fileReader.onload = function(e) {
       var res = this.result;
       $scope.$applyAsync(function() {
-        $scope.formData.imgSrc = res;
+        $scope.formData.imgSrc = $sce.getTrustedHtml(res);
       });
     };
   };
 
   $scope.doNext = function() {
-    if ($scope.formData.imageCropStep == 2) {
+    if ($scope.formData.imageCropStep === 2) {
       $scope.doCrop();
     }
-    else if ($scope.formData.imageCropStep == 3) {
+    else if ($scope.formData.imageCropStep === 3) {
       $scope.closeModal($scope.formData.result);
     }
   };
 
+  $scope.doPrevious = function() {
+    $scope.formData.imageCropStep -= 1;
+  };
+
   $scope.doCrop = function() {
     $scope.formData.initCrop = true;
   };
@@ -495,6 +490,7 @@ function ESPositionEditController($scope, csConfig, esGeo, ModalUtils) {
     loading: false,
     enable: undefined
   };
+  $scope.searchModalOpened = false;
 
   $scope.tryToLocalize = function() {
     if ($scope.formPosition.loading || loadingCurrentPosition) return;
@@ -603,6 +599,9 @@ function ESPositionEditController($scope, csConfig, esGeo, ModalUtils) {
 
   $scope.openSearchLocationModal = function(options) {
 
+    if ($scope.searchModalOpened) return; // Skip
+
+    $scope.searchModalOpened = true;
     options = options || {};
 
     var parameters = {
@@ -618,10 +617,16 @@ function ESPositionEditController($scope, csConfig, esGeo, ModalUtils) {
       parameters,
       {
         focusFirstInput: true
-        //,scope: $scope
       }
     )
-      .then($scope.updateGeoPoint);
+      .then(function(res) {
+        $scope.searchModalOpened = false;
+        $scope.updateGeoPoint(res);
+      })
+      .catch(function() {
+        console.error(err);
+        $scope.searchModalOpened = false;
+      });
   };
 }
 
diff --git a/www/plugins/es/js/controllers/document-controllers.js b/www/plugins/es/js/controllers/document-controllers.js
index 7605c974af53a7d3b36f8f32401564b6493e061c..cafc4fbaf5cefc17ce6c1357e7e7d0f70a24fabe 100644
--- a/www/plugins/es/js/controllers/document-controllers.js
+++ b/www/plugins/es/js/controllers/document-controllers.js
@@ -356,7 +356,7 @@ function ESLastDocumentsController($scope, $controller, $timeout, $state, $filte
   $scope.selectDocument = function(event, doc) {
     if (!doc || !event || event.defaultPrevented) return;
     event.stopPropagation();
-
+    var anchor;
     if (doc.index === "user" && doc.type === "profile") {
       $state.go('app.wot_identity', {pubkey: doc.pubkey, uid: doc.name});
     }
@@ -364,18 +364,18 @@ function ESLastDocumentsController($scope, $controller, $timeout, $state, $filte
       $state.go('app.view_page', {title: doc.title, id: doc.id});
     }
     else if (doc.index === "page" && doc.type === "comment") {
-      var anchor = $filter('formatHash')(doc.id);
+      anchor = $filter('formatHash')(doc.id);
       $state.go('app.view_page_anchor', {title: doc.title, id: doc.record, anchor: anchor});
     }
     else if (doc.index === "group" && doc.type === "record") {
       $state.go('app.view_group', {title: doc.title, id: doc.id});
     }
     else if (doc.index === "group" && doc.type === "comment") {
-      var anchor = $filter('formatHash')(doc.id);
+      anchor = $filter('formatHash')(doc.id);
       $state.go('app.view_group_anchor', {title: doc.title, id: doc.record, anchor: anchor});
     }
     else {
-      console.warn("Click on this kind of document not implement yet!", doc)
+      console.warn("Click on this kind of document not implement yet!", doc);
     }
   };
 
diff --git a/www/plugins/es/js/controllers/invitation-controllers.js b/www/plugins/es/js/controllers/invitation-controllers.js
index d892791ea0ab3fc8331c36c6db5d840970846710..76064b79d9cf6369bd90a3600b7cba41dfa1c409 100644
--- a/www/plugins/es/js/controllers/invitation-controllers.js
+++ b/www/plugins/es/js/controllers/invitation-controllers.js
@@ -110,7 +110,7 @@ function InvitationsController($scope, $q, $ionicPopover, $state, $timeout, UIUt
         UIUtils.loading.hide();
       })
       .catch(function(err) {
-        if (err == 'CANCELLED') return $scope.cancel();
+        if (err === 'CANCELLED') return $scope.cancel();
         $scope.search.loading = false;
         if (!from) {
           $scope.search.results = [];
@@ -231,7 +231,7 @@ function InvitationsController($scope, $q, $ionicPopover, $state, $timeout, UIUt
     $scope.hideActionsPopover();
 
     return $timeout(function() {
-      return esModals.showNewInvitation({})
+      return esModals.showNewInvitation({});
     }, 500); // Timeout need, to avoid freeze
   };
 
diff --git a/www/plugins/es/js/controllers/like-controllers.js b/www/plugins/es/js/controllers/like-controllers.js
index a29609136cc0f51597039e9dd121867dc6d9f81c..b67a1f358bb8c8c88df5eb13d83aaacafe841ea7 100644
--- a/www/plugins/es/js/controllers/like-controllers.js
+++ b/www/plugins/es/js/controllers/like-controllers.js
@@ -112,6 +112,17 @@ function ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtil
     $scope.initLikes();
     if (!$scope.likeData.id) throw new Error("Missing 'likeData.id' in scope. Cannot apply toggle");
 
+    // Make sure to be auth before continue
+    if (!csWallet.isLogin()) {
+      return csWallet.auth({minData: true})
+        .then(function(data){
+          UIUtils.loading.hide();
+          if (!data) throw new Error('CANCELLED');
+          options.pubkey = options.pubkey || data.pubkey;
+          return $scope.toggleLike(event, options); // loop
+        });
+    }
+
     options = options || {};
     options.kind = options.kind && options.kind.toUpperCase() || 'LIKE';
     var key = options.kind.toLowerCase() + 's';
@@ -124,14 +135,19 @@ function ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtil
       return $q.reject();
     }
 
-    // Select the wallet, if many
     if (!options.pubkey) {
-      return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))
-        .then(function(wallet) {
-          if (!wallet) throw 'CANCELLED';
-          options.pubkey = wallet.data.pubkey;
-          return $scope.toggleLike(event, options); // Loop
-        });
+      if (csWallet.children.count() === 0) {
+        options.pubkey = csWallet.data.pubkey;
+      }
+      // Select the wallet, if many
+      else {
+        return Modals.showSelectWallet({displayBalance: false})
+          .then(function (wallet) {
+            if (!wallet) throw new Error('CANCELLED');
+            options.pubkey = wallet.data.pubkey;
+            return $scope.toggleLike(event, options); // Loop
+          });
+      }
     }
 
     var wallet = csWallet.getByPubkey(options.pubkey);
@@ -170,7 +186,7 @@ function ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtil
       })
       .catch(function(err) {
         $scope.likeData[key].loading = false;
-        if (err === 'CANCELLED') return; // User cancelled
+        if (err === 'CANCELLED') throw 'CANCELLED'; // User cancelled
         console.error(err);
         UIUtils.onError('LIKE.ERROR.FAILED_TOGGLE_LIKE')(err);
         event.preventDefault();
@@ -225,19 +241,36 @@ function ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtil
   };
 
   $scope.reportAbuse = function(event, options) {
+
+    // Make sure to be auth before continue
+    if (!csWallet.isLogin()) {
+      return csWallet.auth({minData: true})
+        .then(function(data){
+          UIUtils.loading.hide();
+          if (!data) throw new Error('CANCELLED');
+          options.pubkey = options.pubkey || data.pubkey;
+          return $scope.reportAbuse(event, options); // loop
+        });
+    }
+
     if (!$scope.likeData || !$scope.likeData.abuses || $scope.likeData.abuses.wasHitCount) return; // skip
     if ($scope.likeData.abuses.wasHitCount) return; // already report
 
     options = options || {};
 
-    // Select the wallet, if many
     if (!options.pubkey) {
-      return (csWallet.children.count() ? Modals.showSelectWallet({displayBalance: false}) : $q.when(csWallet))
-        .then(function(wallet) {
-          if (!wallet) throw 'CANCELLED';
-          options.pubkey = wallet.data.pubkey;
-          return $scope.reportAbuse(event, options); // Loop
-        });
+      if (csWallet.children.count() === 0) {
+        options.pubkey = csWallet.data.pubkey;
+      }
+      // Select the wallet, if many
+      else {
+        return Modals.showSelectWallet({displayBalance: false})
+          .then(function (wallet) {
+            if (!wallet) throw 'CANCELLED';
+            options.pubkey = wallet.data.pubkey;
+            return $scope.reportAbuse(event, options); // Loop
+          });
+      }
     }
 
     var wallet = csWallet.getByPubkey(options.pubkey);
@@ -256,7 +289,7 @@ function ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtil
           if (!res || !res.comment) return; // Empty comment: skip
           options.comment = res.comment;
           options.level = res.level || (res.delete && 5) || undefined;
-          return $scope.reportAbuse(event, options) // Loop, with the comment
+          return $scope.reportAbuse(event, options); // Loop, with the comment
         });
     }
 
@@ -264,8 +297,9 @@ function ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtil
     options.kind = 'ABUSE';
     return $scope.toggleLike(event, options)
       .then(function() {
-        UIUtils.toast.show('COMMON.REPORT_ABUSE.CONFIRM.SENT')
-      })
+        console.log('BEFORE display toast');
+        UIUtils.toast.show('COMMON.REPORT_ABUSE.CONFIRM.SENT');
+      });
   };
 
   csWallet.api.data.on.reset($scope, function() {
@@ -275,7 +309,7 @@ function ESLikesController($scope, $q, $timeout, $translate, $ionicPopup, UIUtil
         $scope.likeData[key].wasHitByPubkey = {};
         $scope.likeData[key].wasHitCount = 0;
       }
-    })
+    });
     $scope.$broadcast('$$rebind::like'); // notify binder
   }, this);
 
diff --git a/www/plugins/es/js/controllers/network-controllers.js b/www/plugins/es/js/controllers/network-controllers.js
index c064829228da02f686ef01a294e66b4929c5fb05..949bb2cb77ed943a07c67f740b6a90ceadee840e 100644
--- a/www/plugins/es/js/controllers/network-controllers.js
+++ b/www/plugins/es/js/controllers/network-controllers.js
@@ -431,7 +431,7 @@ function ESPeerInfoPopoverController($scope, $q, csSettings, csCurrency, csHttp,
 
     return $q.all([
       // get current block
-      csCurrency.blockchain.current()
+      esHttp.blockchain.current()
         .then(function(block) {
           $scope.formData.number = block.number;
           $scope.formData.medianTime = block.medianTime;
diff --git a/www/plugins/es/js/controllers/profile-controllers.js b/www/plugins/es/js/controllers/profile-controllers.js
index 82a6123019bf62ed916cb97880df003ef4ac9452..0a98e7d5e9a591432195466041116c0f1db0beaf 100644
--- a/www/plugins/es/js/controllers/profile-controllers.js
+++ b/www/plugins/es/js/controllers/profile-controllers.js
@@ -224,7 +224,7 @@ function ESViewEditProfileController($scope, $q, $timeout, $state, $focus, $tran
         }
 
         $scope.walletData.profile = angular.copy(formData);
-        $scope.walletData.profile.description = esHttp.util.parseAsHtml(formData.description);
+        $scope.walletData.profile.descriptionHtml = esHttp.util.parseAsHtml(formData.description);
       }
     };
 
diff --git a/www/plugins/es/js/controllers/registry-controllers.js b/www/plugins/es/js/controllers/registry-controllers.js
index 7d1cc4c221d9e7608200d6400eca545a4b0315eb..621387f58a54b74b52dacdf0c914bd7b9bff9a2a 100644
--- a/www/plugins/es/js/controllers/registry-controllers.js
+++ b/www/plugins/es/js/controllers/registry-controllers.js
@@ -1375,8 +1375,6 @@ function ESRegistryRecordEditController($scope, $timeout,  $state, $q, $ionicHis
         if (!$scope.avatar) {
           $scope.avatarClass['cion-page-' + type] = true;
         }
-        $scope.doSearch();
-        $scope.updateLocationHref();
       }
     });
   };
@@ -1392,8 +1390,6 @@ function ESRegistryRecordEditController($scope, $timeout,  $state, $q, $ionicHis
     .then(function(cat){
       if (cat && cat.parent) {
         $scope.formData.category = cat;
-        $scope.doSearch();
-        $scope.updateLocationHref();
       }
     });
   };
diff --git a/www/plugins/es/js/controllers/wot-controllers.js b/www/plugins/es/js/controllers/wot-controllers.js
index fe5ac90c9bf13a9ef8961bf04742e8dfc1975717..24a88f625fa389801f3736129422bf1562d2acd4 100644
--- a/www/plugins/es/js/controllers/wot-controllers.js
+++ b/www/plugins/es/js/controllers/wot-controllers.js
@@ -97,7 +97,7 @@ function ESWotLookupExtendController($scope, $controller, $state) {
   };
 }
 
-function ESWotIdentityViewController($scope, $ionicPopover, $q, $controller, UIUtils, Modals, csWallet,
+function ESWotIdentityViewController($scope, $ionicPopover, $q, $controller, $timeout, UIUtils, Modals, csWallet,
                                      esHttp, esLike, esModals, esWallet, esProfile, esInvitation) {
   'ngInject';
 
@@ -116,7 +116,7 @@ function ESWotIdentityViewController($scope, $ionicPopover, $q, $controller, UIU
   // Initialize the super class and extend it.
   angular.extend(this, $controller('ESExtensionCtrl', {$scope: $scope}));
 
-  $scope.canCertify = false; // disable certity on the popover (by default - override by the wot map controller)
+  $scope.canCertify = false; // disable certify on the popover (by default - override by the wot map controller)
 
   /* -- modals -- */
 
@@ -311,13 +311,57 @@ function ESWotIdentityViewController($scope, $ionicPopover, $q, $controller, UIU
       });
   };
 
-  /* -- likes -- */
+  /**
+   * Delete the user profile (need moderator access, on Cs+ pod)
+   * @param confirm
+   * @returns {*}
+   */
+  $scope.delete = function(confirm) {
 
-  // Load likes, when profile loaded
+    if (!confirm) {
+      $scope.hideActionsPopover();
+      if (!$scope.formData.pubkey) return; // Skip
+
+      return UIUtils.alert.confirm('PROFILE.CONFIRM.DELETE_BY_MODERATOR')
+        .then(function(confirm) {
+          if (confirm) return $scope.delete(confirm); // recursive call
+        });
+    }
+
+    // TODO: ask for deletion of all data ? (e.g. message, comment, likes, etc.)
+    // if (angular.isUndefined(allData)) {
+    //   return UIUtils.alert.confirm(...)
+    //   ...
+    // }
+
+    return UIUtils.loading.show()
+      .then(function() {
+        return esProfile.remove($scope.formData.pubkey);
+      })
+      .then(function() {
+        return $scope.doUpdate();
+      })
+      .then(function() {
+        return $timeout(function() {
+          UIUtils.toast.show('DOCUMENT.INFO.REMOVED'); // toast
+        }, 800);
+      })
+      .catch(UIUtils.onError("PROFILE.ERROR.DELETE_PROFILE_FAILED"));
+  };
+
+  /* -- Load data -- */
+
+  // Watch when profile loaded
   $scope.$watch('formData.pubkey', function(pubkey) {
     if (pubkey) {
+
+      // Load likes,
       $scope.loadLikes(pubkey);
+
+      // Enable deletion, if moderator
+      $scope.canDelete = $scope.formData.profile && csWallet.isLogin() && csWallet.data.moderator === true;
     }
+
   });
 
   /* -- Popover -- */
diff --git a/www/plugins/es/js/entities/notification.js b/www/plugins/es/js/entities/notification.js
index eee62d735428ae7f91a93e26a0e46aaec6cd9ff9..3aefdd5e7e406fdae98ea400f4cc1c5210e14521 100644
--- a/www/plugins/es/js/entities/notification.js
+++ b/www/plugins/es/js/entities/notification.js
@@ -11,14 +11,15 @@ function EsNotification(json, markAsReadCallback) {
   // Avoid undefined errors
   json = json || {};
 
+  that.id = json.id || ('' + Date.now()); // Keep id if exists, otherwise create it from timestamp
   that.type = json.type && json.type.toLowerCase();
   that.time = json.time;
   that.hash = json.hash;
   that.read = json.read_signature ? true : false;
 
-  that.message = json.reference && messagePrefixes[json.reference.index] ?
+  that.message = json.code && (json.reference && messagePrefixes[json.reference.index] ?
   messagePrefixes[json.reference.index] + json.code :
-  'EVENT.' + json.code;
+  'EVENT.' + json.code) || json.message;
   that.params = json.params;
 
   if (markAsReadCallback && (typeof markAsReadCallback === "function") ) {
@@ -165,7 +166,7 @@ function EsNotification(json, markAsReadCallback) {
       that.icon = 'ion-alert-circled energized';
 
       // If deletion has been asked, change the message
-      if (json.code === 'MODERATION_RECEIVED' && level == 5) {
+      if (json.code === 'MODERATION_RECEIVED' && json.level === 5) {
         that.message = 'EVENT.PAGE.DELETION_RECEIVED';
         that.icon = 'ion-trash-a assertive';
       }
diff --git a/www/plugins/es/js/services/blockchain-services.js b/www/plugins/es/js/services/blockchain-services.js
index 9116acf0c87525009aa79a4368e583fbc2a8defd..72fbe80e3595362373e4121d75d7952b9efc6bbc 100644
--- a/www/plugins/es/js/services/blockchain-services.js
+++ b/www/plugins/es/js/services/blockchain-services.js
@@ -1,6 +1,6 @@
 angular.module('cesium.es.blockchain.services', ['cesium.services', 'cesium.es.http.services'])
 
-.factory('esBlockchain', function($rootScope, $q, $timeout, BMA, esHttp) {
+.factory('esBlockchain', function($rootScope, $q, $timeout, BMA, csCache, esHttp) {
   'ngInject';
 
   function EsBlockchain() {
@@ -31,9 +31,9 @@ angular.module('cesium.es.blockchain.services', ['cesium.services', 'cesium.es.h
         block: {},
         raw: {
           block: {
-            search: esHttp.post('/:currency/block/_search', esHttp.cache.SHORT),
+            search: esHttp.post('/:currency/block/_search', csCache.constants.SHORT),
             searchText: esHttp.get('/:currency/block/_search?q=:text'),
-            get: esHttp.get('/:currency/block/:number/_source', esHttp.cache.SHORT)
+            get: esHttp.get('/:currency/block/:number/_source', csCache.constants.SHORT)
           }
         },
         regexp: {
diff --git a/www/plugins/es/js/services/http-services.js b/www/plugins/es/js/services/http-services.js
index a1fa4428985f71cb7225a2563c804d8f35989733..e8e3a1bf88d53109a7aeff602846cf195e201331 100644
--- a/www/plugins/es/js/services/http-services.js
+++ b/www/plugins/es/js/services/http-services.js
@@ -14,7 +14,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
     console.debug('[ES] [https] Enable SSL (forced by config or detected in URL)');
   }
 
-  function EsHttp(host, port, useSsl, useCache) {
+  function EsHttp(host, port, useSsl, enableCache) {
 
     var
       that = this,
@@ -42,15 +42,19 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
     that.data = {
       isFallback: false
     };
-    that.cache = _emptyCache();
+    that.useCache = angular.isDefined(enableCache) ? enableCache : false; // need here because used in get() function
+    that.raw = {
+      getByPath: {},
+      postByPath: {},
+      wsByPath: {}
+    };
     that.api = new Api(this, "esHttp");
     that.started = false;
     that.init = init;
 
-    init(host, port, useSsl, useCache);
-    that.useCache = angular.isDefined(useCache) ? useCache : false; // need here because used in get() function
+    init(host, port, useSsl);
 
-    function init(host, port, useSsl, useCache) {
+    function init(host, port, useSsl) {
       // Use settings as default
       if (!host && csSettings.data) {
         host = host || (csSettings.data.plugins && csSettings.data.plugins.es ? csSettings.data.plugins.es.host : null);
@@ -100,14 +104,6 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
       return new RegExp(regexpContent);
     }
 
-    function _emptyCache() {
-      return {
-        getByPath: {},
-        postByPath: {},
-        wsByPath: {}
-      };
-    }
-
     function onSettingsReset(data, deferred) {
       deferred = deferred || $q.defer();
 
@@ -126,15 +122,25 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
       return deferred.promise;
     }
 
-    that.cleanCache = function() {
-      console.debug('[ES] [http] Cleaning requests cache...');
-      _.keys(that.cache.wsByPath).forEach(function(key) {
-        var sock = that.cache.wsByPath[key];
+    that.closeWs = function() {
+
+      if (!that.raw) return;
+
+      console.warn('[ES] [http] Closing all websockets...');
+      _.keys(that.raw.wsByPath||{}).forEach(function(key) {
+        var sock = that.raw.wsByPath[key];
         sock.close();
       });
-      that.cache = _emptyCache();
+      that.raw.wsByPath = {};
+    };
 
+    that.cleanCache = function() {
+      console.debug("[ES] [http] Cleaning cache {prefix: '{0}'}...".format(cachePrefix));
       csCache.clear(cachePrefix);
+
+      that.raw.getByPath = {};
+      that.raw.postByPath = {};
+      that.raw.wsByPath = {};
     };
 
     that.copy = function(otherNode) {
@@ -159,7 +165,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
     that.get = function (path, cacheTime) {
 
       cacheTime = that.useCache && cacheTime;
-      var cacheKey = path + (cacheTime ? ('#'+cacheTime) : '');
+      var requestKey = path + (cacheTime ? ('#'+cacheTime) : '');
 
       var getRequestFn = function(params) {
         if (!that.started) {
@@ -172,7 +178,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
           });
         }
 
-        var request = that.cache.getByPath[cacheKey];
+        var request = that.raw.getByPath[requestKey];
         if (!request) {
           if (cacheTime) {
             request =  csHttp.getWithCache(that.host, that.port, path, that.useSsl, cacheTime, null, null, cachePrefix);
@@ -180,7 +186,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
           else {
             request =  csHttp.get(that.host, that.port, path, that.useSsl);
           }
-          that.cache.getByPath[cacheKey] = request;
+          that.raw.getByPath[requestKey] = request;
         }
         return request(params);
       };
@@ -200,10 +206,10 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
           });
         }
 
-        var request = that.cache.postByPath[path];
+        var request = that.raw.postByPath[path];
         if (!request) {
           request =  csHttp.post(that.host, that.port, path, that.useSsl);
-          that.cache.postByPath[path] = request;
+          that.raw.postByPath[path] = request;
         }
         return request(obj, params);
       };
@@ -212,16 +218,16 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
 
     that.ws = function(path) {
       return function() {
-        var sock = that.cache.wsByPath[path];
+        var sock = that.raw.wsByPath[path];
         if (!sock || sock.isClosed()) {
           sock =  csHttp.ws(that.host, that.port, path, that.useSsl);
 
           // When close, remove from cache
           sock.onclose = function() {
-            delete that.cache.wsByPath[path];
+            delete that.raw.wsByPath[path];
           };
 
-          that.cache.wsByPath[path] = sock;
+          that.raw.wsByPath[path] = sock;
         }
         return sock;
       };
@@ -344,7 +350,6 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
               console.debug('[ES] [http] Started in '+(Date.now()-now)+'ms');
               that.api.node.raise.start();
 
-
               that.started = true;
               delete that._startPromise;
               fallbackNodeIndex = 0; // reset the fallback node counter
@@ -357,6 +362,8 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
     };
 
     that.stop = function() {
+      if (!that.started && !that._startPromise) return $q.when(); // Skip multiple call
+
       console.debug('[ES] [http] Stopping...');
 
       removeListeners();
@@ -364,6 +371,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
       setIsFallbackNode(false); // will be re-computed during start phase
       delete that._startPromise;
       if (that.alive) {
+        that.closeWs();
         that.cleanCache();
         that.alive = false;
         that.started = false;
@@ -527,8 +535,8 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
         delete params.wallet;
         delete params.walletId;
         delete params.keypair;
-        var params = angular.copy(params);
-        params.pubkey = params.pubkey || wallet.data.pubkey;
+        var postParams = angular.copy(params);
+        postParams.pubkey = postParams.pubkey || wallet.data.pubkey;
 
         return (wallet.isAuth() ? $q.when(wallet.data) : wallet.auth({silent: true, minData: true}))
           .then(function() {
@@ -543,7 +551,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
             var obj = angular.copy(record);
             delete obj.signature;
             delete obj.hash;
-            obj.issuer = params.pubkey; // force keypair pubkey
+            obj.issuer = postParams.pubkey; // force keypair pubkey
             if (!obj.version) {
               obj.version = 2;
             }
@@ -553,6 +561,15 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
               fillRecordTags(obj, options.tagFields);
             }
 
+            // Remove unused fields
+            if (options.ignoreFields) {
+              _.forEach(options.ignoreFields, function(key) {
+                if (angular.isDefined(obj[key])) {
+                  delete obj[key];
+                }
+              });
+            }
+
             var str = JSON.stringify(obj);
 
             return CryptoUtils.util.hash(str)
@@ -562,7 +579,7 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
                     // Prepend hash+signature
                     str = '{"hash":"{0}","signature":"{1}",'.format(hash, signature) + str.substring(1);
                     // Send data
-                    return postRequest(str, params)
+                    return postRequest(str, postParams)
                       .then(function (id){
 
                         // Clear cache
@@ -718,6 +735,38 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
       };
     }
 
+    // Get latest release, of Cesium+ pod
+    function getLatestVersion() {
+      var getRequest = that.raw.getLatestRelease;
+      if (!getRequest) {
+        var url = csHttp.uri.parse(csSettings.data.plugins.es.latestReleaseUrl);
+        var useSsl = (url.port == 443 || url.protocol === 'https:' || forceUseSsl);
+        getRequest = csHttp.getWithCache(url.host, url.port, "/" + url.pathname, useSsl, csCache.constants.LONG);
+        that.raw.getLatestRelease = getRequest;
+      }
+
+      return getRequest()
+        .then(function (json) {
+          if (!json) return;
+          if (json.name && json.html_url) {
+            return {
+              version: json.name,
+              url: json.html_url
+            };
+          }
+          if (json.tag_name && json.html_url) {
+            return {
+              version: json.tag_name.substring(1),
+              url: json.html_url
+            };
+          }
+        })
+        .catch(function(err) {
+          // silent (just log it)
+          console.error('[BMA] Failed to get Duniter latest version', err);
+        });
+    }
+
     function addListeners() {
       // Watch some service events
       listeners = [
@@ -736,15 +785,20 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
     that.api.registerEvent('node', 'start');
     that.api.registerEvent('node', 'stop');
 
+
     var exports = {
       getServer: csHttp.getServer,
       node: {
         summary: that.get('/node/summary'),
+        moderators: that.get('/node/moderators'),
         parseEndPoint: parseEndPoint,
         same: isSameNode,
         sameAsSettings: isSameNodeAsSettings,
         isFallback: isFallbackNode
       },
+      version: {
+        latest: getLatestVersion
+      },
       websocket: {
         changes: that.wsChanges,
         block: that.ws('/ws/block'),
@@ -761,6 +815,9 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
         },
         peers: that.get('/network/peers')
       },
+      blockchain: {
+        current: that.get('/blockchain/current?_source=number,hash,medianTime')
+      },
       record: {
         post: postRecord,
         remove: removeRecord,
@@ -778,7 +835,6 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
         parseAsHtml: parseAsHtml,
         findObjectInTree: findObjectInTree
       },
-      cache: csHttp.cache,
       constants: constants
     };
     exports.constants.regexp = regexp;
@@ -788,8 +844,8 @@ angular.module('cesium.es.http.services', ['ngResource', 'ngApi', 'cesium.servic
 
   var service = new EsHttp(undefined, undefined, undefined, true);
 
-  service.instance = function(host, port, useSsl, useCache) {
-    return new EsHttp(host, port, useSsl, useCache);
+  service.instance = function(host, port, useSsl, enableCache) {
+    return new EsHttp(host, port, useSsl, enableCache);
   };
 
   service.lightInstance = function(host, port, useSsl, timeout) {
diff --git a/www/plugins/es/js/services/invitation-services.js b/www/plugins/es/js/services/invitation-services.js
index befb724efd60b498a31e534a918750b188b704b0..d6e1bc374b87e74e2060433cc0f8a51dd7f9ac8d 100644
--- a/www/plugins/es/js/services/invitation-services.js
+++ b/www/plugins/es/js/services/invitation-services.js
@@ -12,7 +12,7 @@ angular.module('cesium.es.invitation.services', ['cesium.platform',
 
   })
 
-.factory('esInvitation', function($rootScope, $q, CryptoUtils, csPlatform, Api, esHttp, csWallet, esWallet, csWot, esNotification) {
+.factory('esInvitation', function($rootScope, $q, $timeout, CryptoUtils, csPlatform, Api, esHttp, csWallet, esWallet, csWot, esNotification) {
   'ngInject';
 
   var
@@ -51,7 +51,9 @@ angular.module('cesium.es.invitation.services', ['cesium.platform',
   function onWalletLoad(data, deferred) {
     deferred = deferred || $q.defer();
     if (!data || !data.pubkey) {
-      deferred.resolve();
+      $timeout(function() {
+        deferred.resolve(data);
+      });
       return deferred.promise;
     }
 
@@ -61,8 +63,10 @@ angular.module('cesium.es.invitation.services', ['cesium.platform',
     // Skip if loaded less than 1 min ago
     // (This is need to avoid reload on login AND load phases)
     if (data.invitations && data.invitations.time && (time - data.invitations.time < 30 /*=30s*/)) {
-      console.debug('[ES] [invitation] Skipping load (loaded '+(time - data.invitations.time)+'s ago)');
-      deferred.resolve();
+      console.debug('[ES] [invitation] Skipping load (loaded {0}s ago)'.format(time - data.invitations.time));
+      $timeout(function() {
+        deferred.resolve(data);
+      });
       return deferred.promise;
     }
 
diff --git a/www/plugins/es/js/services/like-services.js b/www/plugins/es/js/services/like-services.js
index b622ae722b240a8b1cba8eca4e94dcccab18a456..7666b01f96da1f76f27337e607d5d831ea2ee7d6 100644
--- a/www/plugins/es/js/services/like-services.js
+++ b/www/plugins/es/js/services/like-services.js
@@ -63,7 +63,7 @@ angular.module('cesium.es.like.services', ['ngResource', 'cesium.services',
               // User already like: so remove it
               if (existingLikeIds && existingLikeIds.length) {
                 return $q.all(_.map(existingLikeIds, function(likeId) {
-                  return removeLike(likeId, options)
+                  return removeLike(likeId, options);
                 }))
                   // Return the deletion, as a delta
                   .then(function() {
@@ -129,10 +129,10 @@ angular.module('cesium.es.like.services', ['ngResource', 'cesium.services',
 
               result.wasHitByPubkey[issuer] = issuerHitIndex !== -1 || false;
               result.wasHitCount += issuerHitIndex !== -1 ? 1 : 0;
-            })
+            });
 
             return result;
-          })
+          });
       }
 
       // Expose functions
diff --git a/www/plugins/es/js/services/message-services.js b/www/plugins/es/js/services/message-services.js
index 2009ad1610160e71d3208061e373006bc32732c5..cc54982a56de7e73c03fb67f610254a60f4fec1a 100644
--- a/www/plugins/es/js/services/message-services.js
+++ b/www/plugins/es/js/services/message-services.js
@@ -48,7 +48,9 @@ angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform',
       deferred = deferred || $q.defer();
 
       if (!data || !data.pubkey) {
-        deferred.resolve();
+        $timeout(function() {
+          deferred.resolve(data);
+        });
         return deferred.promise;
       }
 
@@ -59,7 +61,9 @@ angular.module('cesium.es.message.services', ['ngResource', 'cesium.platform',
       // (This is need to avoid reload on login AND load phases)
       if (data.messages && data.messages.time && (time - data.messages.time < 30 /*=30s*/)) {
         console.debug('[ES] [message] Skipping load (loaded '+(time - data.messages.time)+'s ago)');
-        deferred.resolve();
+        $timeout(function() {
+          deferred.resolve(data);
+        });
         return deferred.promise;
       }
 
diff --git a/www/plugins/es/js/services/network-services.js b/www/plugins/es/js/services/network-services.js
index 6b653b1b6fb4fc128ddf807b470242edad086f92..667e8a08fd94c05dd03bd13617e5428e0de8c6ff 100644
--- a/www/plugins/es/js/services/network-services.js
+++ b/www/plugins/es/js/services/network-services.js
@@ -648,7 +648,7 @@ angular.module('cesium.es.network.services', ['ngApi', 'cesium.es.http.services'
       // api extension
       api: api
     };
-  };
+  }
 
   var service = new EsNetwork('default');
 
diff --git a/www/plugins/es/js/services/notification-services.js b/www/plugins/es/js/services/notification-services.js
index 630c0dcf29372b2c16a6c8930f04afa02bf839a2..1b2c7187fdc71bb6de3ef62b1f5566eab1ffe804 100644
--- a/www/plugins/es/js/services/notification-services.js
+++ b/www/plugins/es/js/services/notification-services.js
@@ -118,7 +118,7 @@ angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es
       // Add some wallet events as notifications
       var time = csHttp.date.now() - filterTranslations.MEDIAN_TIME_OFFSET;
       var result = (wallet.data.events || []).reduce(function(res, event) {
-        if (event.type != "warn" && event.type != "error") return res; // Keep only warn and error events
+        if (event.type !== "warn" && event.type !== "error") return res; // Keep only warn and error events
         var notification = new EsNotification({}, function(self) {
           if (!self.read) {
             self.read = true;
@@ -127,12 +127,12 @@ angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es
             }
           }
         });
-        notification.id=event.code;
+        notification.id= event.code;
+        notification.time= time;
         notification.read = false;
         notification.state = 'app.view_wallet';
         notification.avatarIcon = 'ion-alert-circled';
         notification.icon = 'ion-alert-circled assertive';
-        notification.time = time;
         notification.message = event.message;
         notification.messageParams = event.messageParams;
         return res.concat(notification);
@@ -200,6 +200,7 @@ angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es
     }
 
     var notification = new EsNotification(event, markNotificationAsRead);
+    notification.id = event.id || notification.id;
 
     // Extend the notification entity
     return csWot.extendAll([notification])
@@ -326,7 +327,9 @@ angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es
   function onWalletLoad(data, deferred) {
     deferred = deferred || $q.defer();
     if (!data || !data.pubkey || !data.keypair) {
-      deferred.resolve();
+      $timeout(function() {
+        deferred.resolve(data);
+      });
       return deferred.promise;
     }
 
@@ -340,7 +343,9 @@ angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es
       data.notifications.warnCount = countWarnEvents(data);
 
       console.debug('[ES] [notification] Skipping load (loaded '+(time - data.notifications.time)+'s ago)');
-      deferred.resolve();
+      $timeout(function() {
+        deferred.resolve(data);
+      });
       return deferred.promise;
     }
 
@@ -372,7 +377,10 @@ angular.module('cesium.es.notification.services', ['cesium.platform', 'cesium.es
         console.debug('[ES] [notification] Loaded count (' + unreadCount + ') in '+(Date.now()-now)+'ms');
         deferred.resolve(data);
       })
-      .catch(deferred.reject);
+      .catch(function(err){
+        console.error('Error while counting notification: ' + (err.message ? err.message : err));
+        deferred.resolve(data);
+      });
 
     return deferred.promise;
   }
diff --git a/www/plugins/es/js/services/profile-services.js b/www/plugins/es/js/services/profile-services.js
index 95cbe011ea5aeaec3a32c5a5d4a61a8e74627633..b2e0112eee3ec01520a07134242c8e081d111b64 100644
--- a/www/plugins/es/js/services/profile-services.js
+++ b/www/plugins/es/js/services/profile-services.js
@@ -10,7 +10,7 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
 
   })
 
-  .factory('esProfile', function($rootScope, $q, esHttp, SocialUtils, csWot, csWallet, csPlatform, esSettings, esLike) {
+  .factory('esProfile', function($rootScope, $q, esHttp, SocialUtils, csWot, csWallet, csCache, csPlatform, esSettings, esLike) {
     'ngInject';
 
     var
@@ -19,10 +19,11 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
 
     that.raw = {
       getFields: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content&_source=:fields'),
-      get: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content', esHttp.cache.MEDIUM),
-      getAll: esHttp.get('/user/profile/:id', esHttp.cache.MEDIUM),
-      search: esHttp.post('/user/profile/_search', esHttp.cache.MEDIUM),
-      mixedSearch: esHttp.post('/user,page,group/profile,record/_search', esHttp.cache.MEDIUM)
+      get: esHttp.get('/user/profile/:id?&_source_exclude=avatar._content', csCache.constants.MEDIUM),
+      getAll: esHttp.get('/user/profile/:id', csCache.constants.MEDIUM),
+      search: esHttp.post('/user/profile/_search', csCache.constants.MEDIUM),
+      mixedSearch: esHttp.post('/user,page,group/profile,record/_search', csCache.constants.MEDIUM),
+      remove: esHttp.record.remove("user","profile")
     };
 
     function getAvatarAndName(pubkey) {
@@ -69,9 +70,9 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
           // avatar
           profile.avatar = esHttp.image.fromHit(res, 'avatar');
 
-          // description
-          if (!options.raw) {
-            profile.description = esHttp.util.parseAsHtml(profile.source.description);
+          // convert description into html
+          if (!options.raw && profile.source.description) {
+            profile.descriptionHtml = esHttp.util.parseAsHtml(profile.source.description);
           }
 
           // Social url must be unique in socials links - Workaround for issue #306:
@@ -82,9 +83,9 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
           }
 
           if (!csWallet.isLogin()) {
-            // Exclude crypted socials
+            // Exclude encrypted socials items
             profile.source.socials = _.filter(profile.source.socials, function(social) {
-              return social.type != 'curve25519';
+              return social.type !== 'curve25519';
             });
           }
           else {
@@ -319,6 +320,8 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
         return deferred.promise;
       }
 
+      console.debug("[ES] [profile] Extending identity {{0}} ...".format(data.pubkey.substr(0,8)));
+
       $q.all([
         // Load full profile
         getProfile(data.pubkey)
@@ -326,8 +329,13 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
             if (profile) {
               data.name = profile.name;
               data.avatar = profile.avatar;
-              data.profile = profile.source;
-              data.profile.description = profile.description;
+              data.profile = data.profile || {};
+              angular.merge(data.profile, profile.source, {descriptionHtml: profile.descriptionHtml});
+            }
+            else {
+              data.name = null;
+              data.avatar = null;
+              data.profile = null;
             }
             deferred.resolve(data);
           }),
@@ -346,6 +354,15 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
       return deferred.promise;
     }
 
+    function removeProfile(pubkey, options) {
+      return that.raw.remove(pubkey, options)
+        .then(function(res) {
+          csCache.clear('csWot-');
+          csCache.clear('csWot-');
+          return res;
+        });
+    }
+
     function removeListeners() {
       _.forEach(listeners, function(remove){
         remove();
@@ -383,9 +400,9 @@ angular.module('cesium.es.profile.services', ['cesium.services', 'cesium.es.http
     return {
       getAvatarAndName: getAvatarAndName,
       get: getProfile,
-      add: esHttp.record.post('/user/profile', {tagFields: ['title', 'description']}),
-      update: esHttp.record.post('/user/profile/:id/_update', {tagFields: ['title', 'description']}),
-      remove: esHttp.record.remove("user","profile"),
+      add: esHttp.record.post('/user/profile', {tagFields: ['title', 'description'], ignoreFields: ['enableGeoPoint', 'descriptionHtml', 'moderator']}),
+      update: esHttp.record.post('/user/profile/:id/_update', {tagFields: ['title', 'description'], ignoreFields: ['enableGeoPoint', 'descriptionHtml', 'moderator']}),
+      remove: removeProfile,
       avatar: esHttp.get('/user/profile/:id?_source=avatar'),
       fillAvatars: fillAvatars,
       like: esLike.instance('user', 'profile')
diff --git a/www/plugins/es/js/services/settings-services.js b/www/plugins/es/js/services/settings-services.js
index 90f888aedc3dd7a6c2c34ccaa9fdfb3cd7ddefea..b50438fa070a0aac88faea08f1ca0db4758f04a3 100644
--- a/www/plugins/es/js/services/settings-services.js
+++ b/www/plugins/es/js/services/settings-services.js
@@ -41,6 +41,7 @@ angular.module('cesium.es.settings.services', ['cesium.services', 'cesium.es.htt
           es: {
             askEnable: false,
             useRemoteStorage: true,
+            latestReleaseUrl: "https://api.github.com/repos/duniter/cesium-plus-pod/releases/latest",
             notifications: {
               txSent: true,
               txReceived: true,
diff --git a/www/plugins/es/js/services/wallet-services.js b/www/plugins/es/js/services/wallet-services.js
index 66a8a2405a1f8fcd6a3962686b068fd7cff38358..98dafc1862f9db8502cd751e1ae4c2bfe7a95116 100644
--- a/www/plugins/es/js/services/wallet-services.js
+++ b/www/plugins/es/js/services/wallet-services.js
@@ -1,6 +1,6 @@
 angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'cesium.es.http.services', 'cesium.es.crypto.services'])
 
-  .factory('esWallet', function($q, $rootScope, $timeout, CryptoUtils, csPlatform, csWallet, esCrypto, esProfile, esHttp) {
+  .factory('esWallet', function($q, $rootScope, $timeout, CryptoUtils, csPlatform, csWallet, csSettings, esCrypto, esProfile, esHttp) {
     'ngInject';
 
     var
@@ -8,9 +8,10 @@ angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'c
       that = this;
 
     function onWalletReset(data) {
+      data.name = null;
       data.avatar = null;
       data.profile = null;
-      data.name = null;
+      data.moderator = null;
       csWallet.events.cleanByContext('esWallet');
       if (data.keypair) {
         delete data.keypair.boxSk;
@@ -28,7 +29,8 @@ angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'c
           data.keypair.boxPk = res.boxPk;
           console.debug("[ES] [wallet] Box keypair successfully computed");
           deferred.resolve();
-        });
+        })
+        .catch(deferred.reject);
       return deferred.promise;
     }
 
@@ -58,22 +60,40 @@ angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'c
       console.debug('[ES] [wallet] Loading user avatar+name...');
       var now = Date.now();
 
-      esProfile.getAvatarAndName(data.pubkey)
-        .then(function(profile) {
-          if (profile) {
-            data.name = profile.name;
-            data.avatarStyle = profile.avatarStyle;
-            data.avatar = profile.avatar;
-            console.debug('[ES] [wallet] Loaded user avatar+name in '+ (Date.now()-now) +'ms');
-          }
-          else {
-            console.debug('[ES] [wallet] No user avatar+name found');
-          }
-          deferred.resolve(data);
-        })
-        .catch(function(err){
-          deferred.reject(err);
-        });
+      var jobs = [
+        esProfile.getAvatarAndName(data.pubkey)
+          .then(function(profile) {
+            if (profile) {
+              data.name = profile.name;
+              data.avatarStyle = profile.avatarStyle;
+              data.avatar = profile.avatar;
+              console.debug('[ES] [wallet] Loaded user avatar+name in '+ (Date.now()-now) +'ms');
+            }
+            else {
+              console.debug('[ES] [wallet] No user avatar+name found');
+            }
+            deferred.resolve(data);
+          })
+        ];
+
+        // Check if user is a moderators (only if expert mode)
+      if (csSettings.data.expertMode) {
+        jobs.push(esHttp.node.moderators()
+          .then(function(res) {
+            data.moderator = _.contains(res && res.moderators, data.pubkey);
+          })
+          .catch(function(err) {
+            console.error("[ES] [wallet] Cannot check is user is moderator: ", (err && err.message || err));
+            // Continue
+          })
+        );
+      }
+
+      $q.all(jobs)
+      .then(function() {
+        deferred.resolve(data);
+      })
+      .catch(deferred.reject);
 
       return deferred.promise;
     }
@@ -98,12 +118,13 @@ angular.module('cesium.es.wallet.services', ['ngResource', 'cesium.platform', 'c
           if (profile) {
             data.name = profile.name;
             data.avatar = profile.avatar;
-            data.profile = profile.source;
-            data.profile.description = profile.description;
-            console.debug('[ES] [wallet] Loaded full user profile in '+ (Date.now()-now) +'ms');
+            data.profile = data.profile || {};
+            angular.merge(data.profile, profile.source, {descriptionHtml: profile.descriptionHtml});
+            console.debug('[ES] [wallet] Loaded full user profile in {0}ms'.format(Date.now()-now));
           }
-          deferred.resolve();
-        });
+          deferred.resolve(data);
+        })
+      .catch(deferred.reject);
 
       return deferred.promise;
     }
diff --git a/www/plugins/es/js/services/wot-services.js b/www/plugins/es/js/services/wot-services.js
index 9c40566c10712719b42d31ff240603c494df934d..c55741d51b73252a2620a1c1a3c301a5de74f77d 100644
--- a/www/plugins/es/js/services/wot-services.js
+++ b/www/plugins/es/js/services/wot-services.js
@@ -10,81 +10,83 @@ angular.module('cesium.es.wot.services', ['ngResource', 'cesium.es.http.services
           user: {
             event: esHttp.post('/user/event/_search')
           }
-        },
-
+        };
 
-      loadMemberships = function(pubkey, options) {
-        options = options || {};
+    function loadMemberships(pubkey, options) {
+      options = options || {};
 
-        var result = (options.cache !== false) ? membershipsCache.get(pubkey) : null;
-        if (result) return $q.when(result);
+      var result = (options.cache !== false) ? membershipsCache.get(pubkey) : null;
+      if (result) return $q.when(result);
 
-        // Get user events on membership state
-        var request = {
-          "size": 1000,
-          "query": {
-            "bool": {
-              "filter": [
-                {"term": {"recipient" : pubkey }},
-                {"terms": {"code" : ["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"] }}
-              ]
-            }
-          },
-          "sort" : [
-            { "time" : {"order" : "asc"}}
-          ],
-          _source: ["code", "time"]
-        };
-
-        return raw.user.event(request)
+      // Get user events on membership state
+      var request = {
+        "size": 1000,
+        "query": {
+          "bool": {
+            "filter": [
+              {"term": {"recipient" : pubkey }},
+              {"terms": {"code" : ["MEMBER_JOIN","MEMBER_ACTIVE","MEMBER_LEAVE","MEMBER_EXCLUDE","MEMBER_REVOKE"] }}
+            ]
+          }
+        },
+        "sort" : [
+          { "time" : {"order" : "asc"}}
+        ],
+        _source: ["code", "time"]
+      };
 
-          .then(function(res) {
-            if (!res.hits || !res.hits.total) return;
+      return raw.user.event(request)
 
-            // Compute member periods
-            var lastJoinTime;
-            var result = res.hits.hits.reduce(function(res, hit){
-              var isMember = hit._source.code == 'MEMBER_JOIN' || hit._source.code == 'MEMBER_ACTIVE';
-              // If join
-              if (isMember && !lastJoinTime) {
-                lastJoinTime = hit._source.time;
-              }
-              // If leave
-              else if (!isMember && lastJoinTime) {
-                // Add an entry
-                res = res.concat({
-                  joinTime: lastJoinTime,
-                  leaveTime: hit._source.time
-                });
-                lastJoinTime = 0; // reset
-              }
-              return res;
-            }, []);
+        .then(function(res) {
+          if (!res.hits || !res.hits.total) return;
 
-            if (lastJoinTime) {
-              // Add last entry if need
-              result.push({
+          // Compute member periods
+          var lastJoinTime;
+          var result = res.hits.hits.reduce(function(res, hit){
+            var isMember = hit._source.code === 'MEMBER_JOIN' || hit._source.code === 'MEMBER_ACTIVE';
+            // If join
+            if (isMember && !lastJoinTime) {
+              lastJoinTime = hit._source.time;
+            }
+            // If leave
+            else if (!isMember && lastJoinTime) {
+              // Add an entry
+              res = res.concat({
                 joinTime: lastJoinTime,
-                leaveTime: moment().utc().unix()
+                leaveTime: hit._source.time
               });
+              lastJoinTime = 0; // reset
             }
+            return res;
+          }, []);
 
-            // Put in the cache
-            membershipsCache.put(pubkey, result);
+          if (lastJoinTime) {
+            // Add last entry if need
+            result.push({
+              joinTime: lastJoinTime,
+              leaveTime: moment().utc().unix()
+            });
+          }
 
-            return result;
-          });
-      },
+          // Put in the cache
+          membershipsCache.put(pubkey, result);
 
-      cleanCache = function() {
-        console.debug('[ES] [wot] Clean cache...');
-        csCache.clear(cachePrefix);
-      };
+          return result;
+        });
+    }
+
+    function cleanAllCache() {
+      console.debug("[ES] [wot] Cleaning cache {prefix: '{0}'}...".format(cachePrefix));
+      csCache.clear(cachePrefix);
+    }
 
     // Listen if node changed
-    esHttp.api.node.on.stop($rootScope, cleanCache, this);
+    esHttp.api.node.on.stop($rootScope, cleanAllCache, this);
 
     return {
-      memberships: loadMemberships
+      memberships: loadMemberships,
+      cache: {
+        clearAll: cleanAllCache
+      }
     };
   });
diff --git a/www/plugins/es/templates/blockchain/items_blocks.html b/www/plugins/es/templates/blockchain/items_blocks.html
index 8479ab0fd576f280ad4f1f80deaa6f934b3ee5eb..3bb036216007c034678ce5174120742454d7f508 100644
--- a/www/plugins/es/templates/blockchain/items_blocks.html
+++ b/www/plugins/es/templates/blockchain/items_blocks.html
@@ -46,6 +46,6 @@
 <!-- blocks (small screens) -->
 <ng-if ng-if=":rebind:smallscreen">
   <ng-repeat ng-repeat="block in :rebind:search.results track by block.number"
-             ng-include="'templates/blockchain/item_block.html'">
+             ng-include="::'templates/blockchain/item_block.html'">
   </ng-repeat>
 </ng-if>
diff --git a/www/plugins/es/templates/blockchain/lookup.html b/www/plugins/es/templates/blockchain/lookup.html
index 8cef4ff22d2c9484a9d608aa3ea5441f69ade233..45d627f71fc53ff72eb42522dfaffb8e61943e97 100644
--- a/www/plugins/es/templates/blockchain/lookup.html
+++ b/www/plugins/es/templates/blockchain/lookup.html
@@ -21,6 +21,6 @@
   </ion-nav-buttons>
 
   <ion-content class="padding no-padding-xs no-padding-sm" scroll="true">
-    <ng-include src="'plugins/es/templates/blockchain/lookup_form.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/blockchain/lookup_form.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/plugins/es/templates/blockchain/lookup_form.html b/www/plugins/es/templates/blockchain/lookup_form.html
index 4e6ddac2c34878363d8c9a1bf37513a5917d4d7d..5699857a0d0a8d39d3d9102626b66582b9a7c593 100644
--- a/www/plugins/es/templates/blockchain/lookup_form.html
+++ b/www/plugins/es/templates/blockchain/lookup_form.html
@@ -92,7 +92,7 @@
 
   <ion-list class="list list-blocks" ng-class="::motion.ionListClass">
 
-    <ng-include src="'plugins/es/templates/blockchain/items_blocks.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/blockchain/items_blocks.html'"></ng-include>
 
   </ion-list>
 
diff --git a/www/plugins/es/templates/common/edit_pictures.html b/www/plugins/es/templates/common/edit_pictures.html
index 7ad78b621a05c0bec3db441c1fb8f646ac7590a7..3999bef361eb62604934133bbb36511bd5ee175e 100644
--- a/www/plugins/es/templates/common/edit_pictures.html
+++ b/www/plugins/es/templates/common/edit_pictures.html
@@ -26,13 +26,11 @@
 
   <!-- Add picture button -->
   <div class="item card card-gallery card-gallery-new text-center padding ink"
-       ng-click="selectNewPicture('#pictureFile')">
+       file-select="onFileChanged(file)" accept="image/*">
     <i class="ion-image stable" style="font-size:150px"></i>
     <b class="ion-plus gray" style="font-size:80px; position:absolute; top:25px; right: 5px;"></b>
     <p translate>COMMON.BTN_ADD_PICTURE</p>
   </div>
 
-  <input type="file" id="pictureFile" accept="image/*" onchange="angular.element(this).scope().fileChanged(event)"
-         style="visibility:hidden; position:absolute;"/>
 </div>
 
diff --git a/www/plugins/es/templates/common/item_comment.html b/www/plugins/es/templates/common/item_comment.html
index be81709f1be813a3a3b1207966615c9bd31aa089..d04b72b3f071be7dc78a577846107966d724f103 100644
--- a/www/plugins/es/templates/common/item_comment.html
+++ b/www/plugins/es/templates/common/item_comment.html
@@ -35,7 +35,7 @@
       </div>
     </div>
 
-    <ng-include src="'plugins/es/templates/common/item_comment_content.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/common/item_comment_content.html'"></ng-include>
 
     <div class="card-footer gray">
       <small class="underline">
diff --git a/www/plugins/es/templates/common/modal_edit_avatar.html b/www/plugins/es/templates/common/modal_edit_avatar.html
index bfb90472f148bc9be4bdf2c5359190fb38494a8b..32694b3b328bc791c7750efb0e3aeb8b4247621a 100644
--- a/www/plugins/es/templates/common/modal_edit_avatar.html
+++ b/www/plugins/es/templates/common/modal_edit_avatar.html
@@ -22,18 +22,17 @@
 
 
     <div ng-show="formData.imageCropStep == 1">
+
       <p translate>PROFILE.MODAL_AVATAR.SELECT_FILE_HELP</p>
 
-      <!-- Add picture button -->
-      <div class="item card text-center padding ink"
-           ng-click="openFileSelector()">
-        <i class="ion-image stable" style="font-size:150px"></i>
-        <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px;"></b>
-        <p translate>PROFILE.MODAL_AVATAR.BTN_SELECT_FILE</p>
+      <!-- Add picture drop zone -->
+      <div drop-zone="onFileChanged(file)">
+        <div file-select="onFileChanged(file)" accept="image/*">
+          <i class="ion-image stable" style="font-size:150px"></i>
+          <b class="ion-plus gray" style="position:relative; font-size:80px; top:-51px; right: 19px;"></b>
+          <p class="gray" translate>COMMON.CHOOSE_FILE</p>
+        </div>
       </div>
-
-      <input type="file" name="fileInput" accept="image/*" id="fileInput" onchange="angular.element(this).scope().fileChanged(event)"
-             style="visibility:hidden; position:absolute;"/>
     </div>
 
     <div ng-show="formData.imageCropStep == 2">
@@ -73,23 +72,28 @@
 
       <div class="item card padding hero" style="height: 110px;">
         <div class="content">
-          <img class="avatar" ng-src="{{formData.result}}" style="height: 88px; width: 88px;">
+          <img class="avatar" ng-src="{{formData.result|trustAsHtml}}" style="height: 88px; width: 88px;">
         </div>
       </div>
     </div>
 
     <!-- buttons bar -->
     <div class="padding hidden-xs text-right">
-      <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>
+      <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button"
+              ng-if="formData.imageCropStep <= 2" translate>
         COMMON.BTN_CANCEL
       </button>
+      <button class="button button-stable icon-left ion-chevron-left ink" ng-click="doPrevious()" translate
+              ng-if="formData.imageCropStep >= 2">
+        COMMON.BTN_BACK
+      </button>
       <button class="button button-calm icon-right ion-chevron-right ink" ng-click="doCrop()" translate
-              ng-disabled="formData.imageCropStep == 1"
+              ng-disabled="formData.imageCropStep === 1"
               ng-if="formData.imageCropStep <= 2">
         COMMON.BTN_NEXT
       </button>
       <button class="button button-positive ink" ng-click="closeModal(formData.result)" translate
-              ng-if="formData.imageCropStep == 3">
+              ng-if="formData.imageCropStep === 3">
         COMMON.BTN_CONTINUE
       </button>
     </div>
diff --git a/www/plugins/es/templates/common/view_comments.html b/www/plugins/es/templates/common/view_comments.html
index 150dc46fc198e3bd384c4fe824a05e22638f2fc4..57cc919853a43c964ba8550f19a70c68d6bbcf76 100644
--- a/www/plugins/es/templates/common/view_comments.html
+++ b/www/plugins/es/templates/common/view_comments.html
@@ -14,7 +14,7 @@
 
   <div class="padding-right">
     <ng-repeat ng-repeat="comment in comments.result track by comment.id"
-               ng-include="'plugins/es/templates/common/item_comment.html'">
+               ng-include="::'plugins/es/templates/common/item_comment.html'">
     </ng-repeat>
   </div>
 
diff --git a/www/plugins/es/templates/document/list_documents.html b/www/plugins/es/templates/document/list_documents.html
index a161798401396a50ee1e05116f83399196040255..43bcc647fc2f4bf2664335be219eadf0b3927457 100644
--- a/www/plugins/es/templates/document/list_documents.html
+++ b/www/plugins/es/templates/document/list_documents.html
@@ -1,7 +1,7 @@
 
 <ion-list class="list" ng-class="::motion.ionListClass">
 
-  <ng-include src="'plugins/es/templates/document/items_documents.html'"></ng-include>
+  <ng-include src="::'plugins/es/templates/document/items_documents.html'"></ng-include>
 
 </ion-list>
 
diff --git a/www/plugins/es/templates/document/lookup.html b/www/plugins/es/templates/document/lookup.html
index df29fb91332dbc9aa3fe45d0d836a039aebe4d19..1f2a41549915c79ff99e33982e0a5c967151daea 100644
--- a/www/plugins/es/templates/document/lookup.html
+++ b/www/plugins/es/templates/document/lookup.html
@@ -12,6 +12,6 @@
 
   <ion-content class="padding no-padding-xs no-padding-sm" scroll="true">
 
-    <ng-include src="'plugins/es/templates/document/lookup_form.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/document/lookup_form.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/plugins/es/templates/document/lookup_form.html b/www/plugins/es/templates/document/lookup_form.html
index c940bdd646ded8d9a13935fa0946441a275adcfc..dbb5279aaf117daddca11440cc916c4a26f26ef2 100644
--- a/www/plugins/es/templates/document/lookup_form.html
+++ b/www/plugins/es/templates/document/lookup_form.html
@@ -88,7 +88,7 @@
 
   <ion-list class="list" ng-class="::motion.ionListClass">
 
-    <ng-include src="'plugins/es/templates/document/items_documents.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/document/items_documents.html'"></ng-include>
 
   </ion-list>
 
diff --git a/www/plugins/es/templates/group/edit_group.html b/www/plugins/es/templates/group/edit_group.html
index 0f3563489db3ff6f2d2a53c26e27ca44543904b3..50f218a8ab59a82fd08ad4fe3aca4fd3386d5f8d 100644
--- a/www/plugins/es/templates/group/edit_group.html
+++ b/www/plugins/es/templates/group/edit_group.html
@@ -49,7 +49,7 @@
               </div>
 
               <!-- pictures -->
-              <ng-include src="'plugins/es/templates/common/edit_pictures.html'"></ng-include>
+              <ng-include src="::'plugins/es/templates/common/edit_pictures.html'"></ng-include>
 
               <div class="item item-divider" translate>GROUP.GENERAL_DIVIDER</div>
 
@@ -85,7 +85,7 @@
               </div>
 
               <!-- social networks -->
-              <ng-include src="'plugins/es/templates/common/edit_socials.html'" ng-controller="ESSocialsEditCtrl"></ng-include>
+              <ng-include src="::'plugins/es/templates/common/edit_socials.html'" ng-controller="ESSocialsEditCtrl"></ng-include>
 
             </div>
 
diff --git a/www/plugins/es/templates/group/items_groups.html b/www/plugins/es/templates/group/items_groups.html
index b3df8b122220a96d25b98bc294dfa3476dfd5379..96ecedb17e19c7ac3f0a637f596fff5153212160 100644
--- a/www/plugins/es/templates/group/items_groups.html
+++ b/www/plugins/es/templates/group/items_groups.html
@@ -25,5 +25,5 @@
 </div>
 
 <ng-repeat ng-repeat="group in :rebind:search.results"
-           ng-include="'plugins/es/templates/group/item_group.html'">
+           ng-include="::'plugins/es/templates/group/item_group.html'">
 </ng-repeat>
diff --git a/www/plugins/es/templates/group/lookup.html b/www/plugins/es/templates/group/lookup.html
index b676500b2b27baa9be55aad82d62acd55d10b901..e40e5762f6ffe77b9d687371fcaff0505a21fdd9 100644
--- a/www/plugins/es/templates/group/lookup.html
+++ b/www/plugins/es/templates/group/lookup.html
@@ -11,6 +11,6 @@
   </ion-nav-buttons>
 
   <ion-content class="padding no-padding-xs no-padding-sm" scroll="true">
-    <ng-include src="'plugins/es/templates/group/lookup_form.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/group/lookup_form.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/plugins/es/templates/group/lookup_form.html b/www/plugins/es/templates/group/lookup_form.html
index a6e1900c8cc8284de2b8ab17c83be2a1872f2ac1..889b7216f35e8dccd874d54d86a18e896e938d7f 100644
--- a/www/plugins/es/templates/group/lookup_form.html
+++ b/www/plugins/es/templates/group/lookup_form.html
@@ -73,7 +73,7 @@
 
   <div class="list {{::motion.ionListClass}}" ng-if="!$scope.search.loading">
 
-    <ng-include src="'plugins/es/templates/group/items_groups.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/group/items_groups.html'"></ng-include>
 
   </div>
 
diff --git a/www/plugins/es/templates/group/view_record.html b/www/plugins/es/templates/group/view_record.html
index ad628c906a535a9dd08f2996a59ef91c808d2268..af14838bea12773c6570db687531d6d8a3e72008 100644
--- a/www/plugins/es/templates/group/view_record.html
+++ b/www/plugins/es/templates/group/view_record.html
@@ -126,7 +126,7 @@
         <div class="lazy-load">
 
           <!-- pictures -->
-          <ng-include src="'plugins/es/templates/common/view_pictures.html'"></ng-include>
+          <ng-include src="::'plugins/es/templates/common/view_pictures.html'"></ng-include>
 
 
           <span class="item item-divider" ng-if="formData.pubkey">
@@ -143,7 +143,7 @@
           </div>
 
           <!-- comments -->
-          <ng-include src="'plugins/es/templates/common/view_comments.html'"></ng-include>
+          <ng-include src="::'plugins/es/templates/common/view_comments.html'"></ng-include>
         </div>
       </div>
 
diff --git a/www/plugins/es/templates/invitation/modal_new_invitation.html b/www/plugins/es/templates/invitation/modal_new_invitation.html
index 1254a0dae59a30925f2ac4c4156993e66eb474fc..40b13c75ba8f38af474575eb23711c44f6c8bff6 100644
--- a/www/plugins/es/templates/invitation/modal_new_invitation.html
+++ b/www/plugins/es/templates/invitation/modal_new_invitation.html
@@ -8,6 +8,6 @@
   </ion-header-bar>
 
   <ion-content scroll="true">
-      <ng-include src="'plugins/es/templates/invitation/new_invitation_form.html'"></ng-include>
+      <ng-include src="::'plugins/es/templates/invitation/new_invitation_form.html'"></ng-include>
   </ion-content>
 </ion-modal-view>
diff --git a/www/plugins/es/templates/invitation/popover_invitation.html b/www/plugins/es/templates/invitation/popover_invitation.html
index d13accfafcef43d6fb2cb5ad5e44eccafa50f571..475a4bb014030231e390a41c5677e12e4c32012b 100644
--- a/www/plugins/es/templates/invitation/popover_invitation.html
+++ b/www/plugins/es/templates/invitation/popover_invitation.html
@@ -17,7 +17,7 @@
       INVITATION.NO_RESULT
     </div>
 
-    <ng-include src="'plugins/es/templates/invitation/list_invitation.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/invitation/list_invitation.html'"></ng-include>
 
   </ion-content>
 
diff --git a/www/plugins/es/templates/invitation/view_invitations.html b/www/plugins/es/templates/invitation/view_invitations.html
index d2753e360558e4b8e5d909e1a3cf56b09262f89c..9934b8ce0b6cd2f328d2de86ce577b951c52bc7c 100644
--- a/www/plugins/es/templates/invitation/view_invitations.html
+++ b/www/plugins/es/templates/invitation/view_invitations.html
@@ -38,7 +38,7 @@
           INVITATION.NO_RESULT
         </div>
 
-        <ng-include src="'plugins/es/templates/invitation/list_invitation.html'"></ng-include>
+        <ng-include src="::'plugins/es/templates/invitation/list_invitation.html'"></ng-include>
 
       </div>
 
diff --git a/www/plugins/es/templates/join/modal_join_extend.html b/www/plugins/es/templates/join/modal_join_extend.html
index c0aa9749cc76615726193914225576e6bacbc0e4..16dbe7c95b6bbbf87da9c0a055e962d8d291a10a 100644
--- a/www/plugins/es/templates/join/modal_join_extend.html
+++ b/www/plugins/es/templates/join/modal_join_extend.html
@@ -1,6 +1,6 @@
 <ng-if ng-if=":state:enable && extensionPoint === 'select-account-type'">
 
-  <!-- ornigzation wallet -->
+  <!-- organization wallet -->
   <div class="item item-complex card stable-bg item-icon-left item-icon-right ink"
        ng-class="{ activated: accountTypeMember != null && !accountTypeMember }"
        ng-click="selectAccountType('organization')">
diff --git a/www/plugins/es/templates/menu_extend.html b/www/plugins/es/templates/menu_extend.html
index d82eae374c41fc63b0827b9d6a2c8d77f20a4be8..1efa880690f3a10ce2691127ca20d1e8460c14cb 100644
--- a/www/plugins/es/templates/menu_extend.html
+++ b/www/plugins/es/templates/menu_extend.html
@@ -39,7 +39,7 @@
 </div>
 
 <!-- Left menu: User section -->
-<div ng-if=":state:enable && extensionPoint === 'menu-user'" class="visible-xs visible-sm">
+<div ng-if=":state:enable && extensionPoint === 'menu-user' && !$root.config.readonly" class="visible-xs visible-sm">
 
   <a menu-close class="item item-icon-left" active-link="active"
      ng-if="login && walletData.isMember"
diff --git a/www/plugins/es/templates/message/compose.html b/www/plugins/es/templates/message/compose.html
index ad6e0d0cfb4af5effe178b64645d634f145a527c..255f8cb63813a83247abbfc8995ec8cf99ccadf8 100644
--- a/www/plugins/es/templates/message/compose.html
+++ b/www/plugins/es/templates/message/compose.html
@@ -18,7 +18,7 @@
           {{'MESSAGE.COMPOSE.SUB_TITLE'|translate}}
         </h2>
         <h4 class="hidden-xs hidden-sm">&nbsp;</h4>
-        <ng-include src="'plugins/es/templates/message/compose_form.html'"></ng-include>
+        <ng-include src="::'plugins/es/templates/message/compose_form.html'"></ng-include>
       </div>
       <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>
     </div>
diff --git a/www/plugins/es/templates/message/lookup_lg.html b/www/plugins/es/templates/message/lookup_lg.html
index 66349decfb9decc205ff21cfa2bd026209a6a399..e03c9ac2c64920cf61dc7ac1e7b420acd3e0012e 100644
--- a/www/plugins/es/templates/message/lookup_lg.html
+++ b/www/plugins/es/templates/message/lookup_lg.html
@@ -21,9 +21,9 @@
       <button class="button button-stable button-small-padding icon ion-loop" ng-click="load()">
       </button>
 
-      <button class="button button-calm icon ion-compose"
-              ng-click="showNewMessageModal()">
-        {{'MESSAGE.BTN_COMPOSE' | translate}}
+      <button class="button button-calm"
+              ng-click="showNewMessageModal()" translate>
+        MESSAGE.BTN_COMPOSE
       </button>
 
       <button class="button button-stable button-small-padding icon ion-android-more-vertical"
@@ -142,7 +142,7 @@
     </div>
 
     <!-- list -->
-    <ng-include src="'plugins/es/templates/message/list.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/message/list.html'"></ng-include>
 
   </ion-content>
 
diff --git a/www/plugins/es/templates/message/modal_compose.html b/www/plugins/es/templates/message/modal_compose.html
index 5ed1803c054245920a5f38cf1b77c70ed0210724..ae6aa7d022ab32139ef3591e154c00e63efa2dc5 100644
--- a/www/plugins/es/templates/message/modal_compose.html
+++ b/www/plugins/es/templates/message/modal_compose.html
@@ -10,6 +10,6 @@
   </ion-header-bar>
 
   <ion-content scroll="true">
-      <ng-include src="'plugins/es/templates/message/compose_form.html'"></ng-include>
+      <ng-include src="::'plugins/es/templates/message/compose_form.html'"></ng-include>
   </ion-content>
 </ion-modal-view>
diff --git a/www/plugins/es/templates/message/tabs/tab_list.html b/www/plugins/es/templates/message/tabs/tab_list.html
index 073af86260350e036e013e69017f8a609efae988..04c426b1fe3c89b1c3f3feb973edeb1811923a35 100644
--- a/www/plugins/es/templates/message/tabs/tab_list.html
+++ b/www/plugins/es/templates/message/tabs/tab_list.html
@@ -18,7 +18,7 @@
     <cs-extension-point name="buttons"></cs-extension-point>
 
     <!-- list -->
-    <ng-include src="'plugins/es/templates/message/list.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/message/list.html'"></ng-include>
 
   </ion-content>
 
diff --git a/www/plugins/es/templates/network/items_peers.html b/www/plugins/es/templates/network/items_peers.html
index d2c6b6225dde9c29affb2a1fb9bed9626b7b4633..c253f18f005502b845db69f0d38c0b1338951db6 100644
--- a/www/plugins/es/templates/network/items_peers.html
+++ b/www/plugins/es/templates/network/items_peers.html
@@ -30,7 +30,7 @@
        ng-class="::ionItemClass"
        id="{{helptipPrefix}}-peer-{{$index}}"
        ng-click="selectPeer(peer)"
-       ng-include="'plugins/es/templates/network/item_content_peer.html'">
+       ng-include="::'plugins/es/templates/network/item_content_peer.html'">
   </div>
 
 </div>
diff --git a/www/plugins/es/templates/network/modal_network.html b/www/plugins/es/templates/network/modal_network.html
index efe1c1dd3a806631782b8b2767af09a44eff7c03..2e2503a27c0411e45775167a4c6efea7bdcf8c98 100644
--- a/www/plugins/es/templates/network/modal_network.html
+++ b/www/plugins/es/templates/network/modal_network.html
@@ -29,7 +29,7 @@
         </div>
       </div>
 
-      <ng-include src="'plugins/es/templates/network/items_peers.html'"></ng-include>
+      <ng-include src="::'plugins/es/templates/network/items_peers.html'"></ng-include>
 
 	  </div>
   </ion-content>
diff --git a/www/plugins/es/templates/network/popover_network.html b/www/plugins/es/templates/network/popover_network.html
index ce40b91754b9baec9110db07cac15eebfeccdc5b..5172994696641af159087531c00b8b24709bcde4 100644
--- a/www/plugins/es/templates/network/popover_network.html
+++ b/www/plugins/es/templates/network/popover_network.html
@@ -14,7 +14,7 @@
   </ion-header-bar>
   <ion-content  scroll="true">
     <div class="list no-padding">
-      <ng-include src="'plugins/es/templates/network/items_peers.html'"></ng-include>
+      <ng-include src="::'plugins/es/templates/network/items_peers.html'"></ng-include>
     </div>
   </ion-content>
 
diff --git a/www/plugins/es/templates/network/view_es_network.html b/www/plugins/es/templates/network/view_es_network.html
index 907960773c5ccb834496977f7f40e9e81f2c5a3e..744c2d3f9cb52938f2cba49d85e92cb757279180 100644
--- a/www/plugins/es/templates/network/view_es_network.html
+++ b/www/plugins/es/templates/network/view_es_network.html
@@ -43,7 +43,7 @@
 
         <div id="helptip-network-peers" style="display: block"></div>
 
-        <ng-include src="'plugins/es/templates/network/items_peers.html'"></ng-include>
+        <ng-include src="::'plugins/es/templates/network/items_peers.html'"></ng-include>
       </div>
 
       <div class="col col-33 " ng-controller="ESLastDocumentsCtrl">
@@ -72,7 +72,7 @@
           </div>
         </div>
 
-        <ng-include src="'plugins/es/templates/document/list_documents.html'"></ng-include>
+        <ng-include src="::'plugins/es/templates/document/list_documents.html'"></ng-include>
 
       </div>
     </div>
diff --git a/www/plugins/es/templates/network/view_es_peer.html b/www/plugins/es/templates/network/view_es_peer.html
index 882ff8550024a634ed5142215fe17c701bf01e8f..063954fb7a07f7fbf09e1ad803bd8f6330c9dbfd 100644
--- a/www/plugins/es/templates/network/view_es_peer.html
+++ b/www/plugins/es/templates/network/view_es_peer.html
@@ -125,7 +125,7 @@
                class="item item-peer item-icon-left ink"
                ng-class="::ionItemClass"
                ng-click="selectPeer(peer)"
-               ng-include="'plugins/es/templates/network/item_content_peer.html'">
+               ng-include="::'plugins/es/templates/network/item_content_peer.html'">
           </div>
 
         </div>
diff --git a/www/plugins/es/templates/notification/popover_notification.html b/www/plugins/es/templates/notification/popover_notification.html
index e33241d6e8d54dedfbdd60507f87fb47d229d582..468a045f60c2c74f3786c0ac94e7634886bbf5bb 100644
--- a/www/plugins/es/templates/notification/popover_notification.html
+++ b/www/plugins/es/templates/notification/popover_notification.html
@@ -17,7 +17,7 @@
       COMMON.NOTIFICATIONS.NO_RESULT
     </div>
 
-    <ng-include src="'plugins/es/templates/notification/list_notification.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/notification/list_notification.html'"></ng-include>
 
   </ion-content>
 
diff --git a/www/plugins/es/templates/notification/view_notifications.html b/www/plugins/es/templates/notification/view_notifications.html
index 98226cfecd5be975dde4028bf026cc0d07413653..8d350873c52216d5362fef861d2118bd1a00888b 100644
--- a/www/plugins/es/templates/notification/view_notifications.html
+++ b/www/plugins/es/templates/notification/view_notifications.html
@@ -41,7 +41,7 @@
           COMMON.NOTIFICATIONS.NO_RESULT
         </div>
 
-        <ng-include src="'plugins/es/templates/notification/list_notification.html'"></ng-include>
+        <ng-include src="::'plugins/es/templates/notification/list_notification.html'"></ng-include>
 
 
       </div>
diff --git a/www/plugins/es/templates/registry/edit_record.html b/www/plugins/es/templates/registry/edit_record.html
index 204528e579189eea40f4caacfafb51e40c388e21..565a813c9fb01b4fbef77655daf1d89e035679b9 100644
--- a/www/plugins/es/templates/registry/edit_record.html
+++ b/www/plugins/es/templates/registry/edit_record.html
@@ -61,7 +61,7 @@
               </div>
 
               <!-- pictures -->
-              <ng-include src="'plugins/es/templates/common/edit_pictures.html'"></ng-include>
+              <ng-include src="::'plugins/es/templates/common/edit_pictures.html'"></ng-include>
 
               <div class="item item-divider" translate>REGISTRY.GENERAL_DIVIDER</div>
 
@@ -115,10 +115,10 @@
               </div>
 
               <!-- position -->
-              <ng-include src="'plugins/es/templates/common/edit_position.html'"></ng-include>
+              <ng-include src="::'plugins/es/templates/common/edit_position.html'" ng-controller="ESPositionEditCtrl as ctrl"></ng-include>
 
               <!-- social networks -->
-              <ng-include src="'plugins/es/templates/common/edit_socials.html'" ng-controller="ESSocialsEditCtrl"></ng-include>
+              <ng-include src="::'plugins/es/templates/common/edit_socials.html'" ng-controller="ESSocialsEditCtrl"></ng-include>
 
               <div class="item item-divider" translate>REGISTRY.TECHNICAL_DIVIDER</div>
 
diff --git a/www/plugins/es/templates/registry/view_record.html b/www/plugins/es/templates/registry/view_record.html
index 03730c7cb6311890db7001837e7037d6974cb1db..1c2e95c596eef00be53ecb5f49b8ee45697d72bc 100644
--- a/www/plugins/es/templates/registry/view_record.html
+++ b/www/plugins/es/templates/registry/view_record.html
@@ -28,7 +28,7 @@
             <i class="icon ion-location"></i> <span ng-bind-html="formData.city"></span>
           </span>
           <!-- likes -->
-          <small ng-include="'plugins/es/templates/common/view_likes.html'"></small>
+          <small ng-include="::'plugins/es/templates/common/view_likes.html'"></small>
         </h4>
 
       </div>
@@ -174,10 +174,10 @@
         <div class="lazy-load">
 
           <!-- pictures -->
-          <ng-include src="'plugins/es/templates/common/view_pictures.html'"></ng-include>
+          <ng-include src="::'plugins/es/templates/common/view_pictures.html'"></ng-include>
 
           <!-- comments -->
-          <ng-include src="'plugins/es/templates/common/view_comments.html'"></ng-include>
+          <ng-include src="::'plugins/es/templates/common/view_comments.html'"></ng-include>
         </div>
       </div>
 
diff --git a/www/plugins/es/templates/registry/view_wallet_pages.html b/www/plugins/es/templates/registry/view_wallet_pages.html
index 8ed4a938c63f8367020e77d2a778a10901588616..5d9650d47b9f5e6fff3b2700625f3289b0cee5c6 100644
--- a/www/plugins/es/templates/registry/view_wallet_pages.html
+++ b/www/plugins/es/templates/registry/view_wallet_pages.html
@@ -32,7 +32,7 @@
       REGISTRY.NO_PAGE
     </div>
 
-    <ng-include src="'plugins/es/templates/registry/lookup_list.html'"></ng-include>
+    <ng-include src="::'plugins/es/templates/registry/lookup_list.html'"></ng-include>
 
   </ion-content>
 
diff --git a/www/plugins/es/templates/settings/plugin_settings.html b/www/plugins/es/templates/settings/plugin_settings.html
index 57399c58140fac2996c70cc62886ca899ad27a43..288ba6c2f631b0f5bf09c0d7f50f713cfd1b749b 100644
--- a/www/plugins/es/templates/settings/plugin_settings.html
+++ b/www/plugins/es/templates/settings/plugin_settings.html
@@ -14,9 +14,9 @@
       </label>
     </div>
 
-    <span class="item item-divider" translate>SETTINGS.STORAGE_DIVIDER</span>
+    <span class="item item-divider hidden-readonly hidden-demo" translate>SETTINGS.STORAGE_DIVIDER</span>
 
-    <div class="item item-toggle item-text-wrap dark">
+    <div class="item item-toggle item-text-wrap dark hidden-demo hidden-readonly">
       <div class="input-label" ng-class="{'gray': !formData.enable}" class="input-label" translate>ES_SETTINGS.ENABLE_REMOTE_STORAGE</div>
       <h4 class="gray text-wrap" ng-bind-html="'ES_SETTINGS.ENABLE_REMOTE_STORAGE_HELP' | translate"></h4>
       <label class="toggle toggle-royal">
@@ -59,10 +59,10 @@
       <i class="icon ion-ios-arrow-right"></i>
     </ion-item>
 
-    <span class="item item-divider" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>
+    <span class="item item-divider hidden-readonly" translate>ES_SETTINGS.NOTIFICATIONS.DIVIDER</span>
 
     <!-- Enable HTML notifications -->
-    <div class="item item-toggle dark hidden-xs hidden-sm">
+    <div class="item item-toggle dark hidden-xs hidden-sm hidden-readonly">
       <div ng-class="{'gray': !formData.enable}" class="input-label" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION</div>
       <h4 class="gray" ng-bind-html="'ES_SETTINGS.NOTIFICATIONS.ENABLE_HTML5_NOTIFICATION_HELP' | translate"></h4>
       <label class="toggle toggle-royal">
@@ -73,9 +73,9 @@
       </label>
     </div>
 
-    <span class="item gray item-text-wrap" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>
+    <span class="item gray item-text-wrap hidden-readonly" translate>ES_SETTINGS.NOTIFICATIONS.HELP_TEXT</span>
 
-    <label class="item item-toggle dark item-text-wrap">
+    <label class="item item-toggle dark item-text-wrap hidden-readonly">
       <span ng-class="{'gray': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_SENT</span>
       <div class="toggle toggle-royal">
         <input type="checkbox" ng-model="formData.notifications.txSent" ng-disabled="!formData.enable">
@@ -84,7 +84,7 @@
         </div>
       </div>
     </label>
-    <label class="item item-toggle dark item-text-wrap">
+    <label class="item item-toggle dark item-text-wrap hidden-readonly">
       <span ng-class="{'gray': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_TX_RECEIVED</span>
       <label class="toggle toggle-royal">
         <input type="checkbox" ng-model="formData.notifications.txReceived" ng-disabled="!formData.enable">
@@ -93,7 +93,7 @@
         </div>
       </label>
     </label>
-    <label class="item item-toggle dark item-text-wrap">
+    <label class="item item-toggle dark item-text-wrap hidden-readonly">
       <span ng-class="{'gray': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_SENT</span>
       <div class="toggle toggle-royal">
         <input type="checkbox" ng-model="formData.notifications.certSent" ng-disabled="!formData.enable">
@@ -102,7 +102,7 @@
         </div>
       </div>
     </label>
-    <label class="item item-toggle dark item-text-wrap">
+    <label class="item item-toggle dark item-text-wrap hidden-readonly">
       <span ng-class="{'gray': !formData.enable}" translate>ES_SETTINGS.NOTIFICATIONS.ENABLE_CERT_RECEIVED</span>
       <div class="toggle toggle-royal">
         <input type="checkbox" ng-model="formData.notifications.certReceived" ng-disabled="!formData.enable">
diff --git a/www/plugins/es/templates/user/edit_profile.html b/www/plugins/es/templates/user/edit_profile.html
index 1c5e26ee52d9c69498bdcf422148a4b5c44dbdbc..dcf19f97c49e9dd9fbbb3d7f8d547bcb87aebcdc 100644
--- a/www/plugins/es/templates/user/edit_profile.html
+++ b/www/plugins/es/templates/user/edit_profile.html
@@ -52,9 +52,10 @@
       <div class="col">
 
         <!-- Buttons bar-->
-        <div class="hidden-xs hidden-sm padding text-center" ng-if="existing && !saving">
+        <div class="hidden-xs hidden-sm padding text-center  animate-show-hide ng-hide" ng-show="existing">
 
           <button class="button button-stable icon-right ink"
+                  ng-disabled="saving"
                   ng-click="showActionsPopover($event)">
             &nbsp; <i class="icon ion-android-more-vertical"></i>&nbsp;
             {{'COMMON.BTN_OPTIONS' | translate}}
@@ -106,12 +107,12 @@
             </ion-item>
 
             <!-- position -->
-            <ng-include src="'plugins/es/templates/common/edit_position.html'" ng-controller="ESPositionEditCtrl as ctrl"></ng-include>
+            <ng-include src="::'plugins/es/templates/common/edit_position.html'" ng-controller="ESPositionEditCtrl as ctrl"></ng-include>
 
           </div>
 
           <!-- social networks -->
-          <ng-include src="'plugins/es/templates/common/edit_socials.html'" ng-controller="ESSocialsEditCtrl"></ng-include>
+          <ng-include src="::'plugins/es/templates/common/edit_socials.html'" ng-controller="ESSocialsEditCtrl"></ng-include>
 
           <div class="list item-text-wrap {{::motion.ionListClass}}">
 
diff --git a/www/plugins/es/templates/user/items_profile.html b/www/plugins/es/templates/user/items_profile.html
index 4b8adc618a543fd622c6473dc1ee59b8197ab27e..df675554f1af8f14eb16b0228e1cd6939747b923 100644
--- a/www/plugins/es/templates/user/items_profile.html
+++ b/www/plugins/es/templates/user/items_profile.html
@@ -8,13 +8,13 @@
 </div>
 
 <!-- About me -->
-<div class="item item-text-wrap" ng-if="formData.profile.description">
+<div class="item item-text-wrap" ng-if="formData.profile.descriptionHtml">
   <span class="gray" translate>PROFILE.DESCRIPTION</span>
-  <h3 trust-as-html="formData.profile.description"></h3>
+  <h3 trust-as-html="formData.profile.descriptionHtml"></h3>
 </div>
 
 <!-- Localisation -->
-<div class="item" ng-if="formData.profile.address || formData.profile.city"
+<div class="item" ng-if="formData.profile && (formData.profile.address || formData.profile.city)"
      copy-on-click="{{formData.profile.address ? formData.profile.address + '&#10;' : ''}}{{formData.profile.city}}">
   <span class="gray" translate>LOCATION.LOCATION_DIVIDER</span>
   <h3>
@@ -24,7 +24,7 @@
 </div>
 
 <!-- Socials networks -->
-<div class="item" ng-if="formData.profile.socials && formData.profile.socials.length" ng-controller="ESSocialsViewCtrl">
+<div class="item" ng-if="formData.profile && formData.profile.socials && formData.profile.socials.length" ng-controller="ESSocialsViewCtrl">
   <span class="gray" translate>PROFILE.SOCIAL_NETWORKS_DIVIDER</span>
   <div class="list no-padding">
     <ion-item ng-repeat="social in formData.profile.socials | filter:filterFn track by social.url "
diff --git a/www/plugins/es/templates/wallet/view_wallet_extend.html b/www/plugins/es/templates/wallet/view_wallet_extend.html
index ef2db1aa6c4f1b73197c58e5e5cd44554e012c92..64aae561f76ed8317add8430c33440928e1b0b85 100644
--- a/www/plugins/es/templates/wallet/view_wallet_extend.html
+++ b/www/plugins/es/templates/wallet/view_wallet_extend.html
@@ -1,7 +1,7 @@
 <ng-if ng-if=":state:enable && extensionPoint === 'hero'" >
   <!-- likes -->
   <small class="light" style="display: inline-block;"
-         ng-include="'plugins/es/templates/common/view_likes.html'"
+         ng-include="::'plugins/es/templates/common/view_likes.html'"
          ng-init="canEdit=true"></small>
 </ng-if>
 
@@ -33,11 +33,11 @@
   </div>
 
 
-  <div class="item item-text-wrap positive item-small-height" ng-show="showProfileHelp">
-    <small translate>PROFILE.PROFILE_DIVIDER_HELP</small>
+  <div class="item item-text-wrap positive item-small-height item-wallet-help" ng-show="showProfileHelp">
+    <small trust-as-html="'PROFILE.PROFILE_DIVIDER_HELP'|translate"></small>
   </div>
 
-  <ng-include src="'plugins/es/templates/user/items_profile.html'" ng-init="showName=true"></ng-include>
+  <ng-include src="::'plugins/es/templates/user/items_profile.html'" ng-init="showName=true"></ng-include>
 
   <!-- subscriptions -->
   <div class="item item-divider item-divider-top-border">
@@ -92,11 +92,11 @@
   <!-- page -->
   <div class="item item-divider item-divider-top-border">
     <span>
-      {{'REGISTRY.WALLET.REGISTRY_DIVIDER' | translate}}
+      {{'REGISTRY.WALLET.PAGE_DIVIDER' | translate}}
       <i style="font-size: 12pt; cursor: pointer;"
          ng-click="showPagesHelp=!showPagesHelp"
          class="icon positive ion-ios-help-outline"
-         title="{{'REGISTRY.WALLET.REGISTRY_HELP' | translate}}"></i>
+         title="{{'REGISTRY.WALLET.PAGE_DIVIDER_HELP' | translate}}"></i>
     <span>
 
     <a class="badge button button-text button-small button-small-padding "
@@ -107,8 +107,8 @@
     </a>
   </div>
 
-  <div class="item item-text-wrap positive item-small-height" ng-show="showPagesHelp">
-    <small translate>REGISTRY.WALLET.REGISTRY_HELP</small>
+  <div class="item item-text-wrap positive item-small-height item-wallet-help" ng-show="showPagesHelp">
+    <small trust-as-html="'REGISTRY.WALLET.PAGE_DIVIDER_HELP'|translate"></small>
   </div>
 
   <div ng-if="!formData.pages.count"
diff --git a/www/plugins/es/templates/wot/view_certifications_extend.html b/www/plugins/es/templates/wot/view_certifications_extend.html
index 46de8d5d0d64c507112e58f9d01c8f54f0f059c3..ccd9c015d0b9278bd846145de56b90f26ebd805e 100644
--- a/www/plugins/es/templates/wot/view_certifications_extend.html
+++ b/www/plugins/es/templates/wot/view_certifications_extend.html
@@ -1,5 +1,5 @@
 <!-- nav buttons section -->
-<ng-if ng-if=":state:enable && extensionPoint === 'nav-buttons'">
+<ng-if ng-if=":state:enable && extensionPoint === 'nav-buttons' && !$root.config.readonly">
 
   <button class="button button-icon button-clear icon ion-android-more-vertical visible-xs visible-sm" ng-click="showCertificationActionsPopover($event)">
   </button>
@@ -7,7 +7,7 @@
 </ng-if>
 
 <!-- Buttons section -->
-<ng-if ng-if=":state:enable && extensionPoint === 'buttons'">
+<ng-if ng-if=":state:enable && extensionPoint === 'buttons' && !$root.config.readonly">
 
   <button class="button button-stable button-small-padding icon ion-android-more-vertical"
           ng-click="showCertificationActionsPopover($event)"
diff --git a/www/plugins/es/templates/wot/view_identity_extend.html b/www/plugins/es/templates/wot/view_identity_extend.html
index 0c47c382b7258b80a9164ab57079f6dfdfa579ef..f9cb63b914207e7f9eea7dc595926890d89fb6f2 100644
--- a/www/plugins/es/templates/wot/view_identity_extend.html
+++ b/www/plugins/es/templates/wot/view_identity_extend.html
@@ -2,29 +2,30 @@
 <ng-if ng-if=":state:enable && extensionPoint === 'hero'">
   <!-- likes -->
   <small class="light" style="display: inline-block;"
-         ng-include="'plugins/es/templates/common/view_likes.html'"></small>
+         ng-include="::'plugins/es/templates/common/view_likes.html'"></small>
 </ng-if>
 
 <!-- Top fab buttons -->
-<ng-if ng-if=":state:enable && extensionPoint === 'buttons-top-fab'">
+<ng-if ng-if=":state:enable && extensionPoint === 'buttons-top-fab' && !$root.config.readonly">
   <button id="fab-compose-{{:rebind:formData.pubkey}}"
           class="button button-fab button-fab-top-left button-fab-hero mini button-stable spin"
           style="left: 88px;"
           ng-click="showNewMessageModal()">
-    <i class="icon ion-compose"></i>
+    <i class="icon ion-email"></i>
   </button>
 </ng-if>
 
 <!-- Buttons section -->
-<ng-if ng-if=":state:enable && extensionPoint === 'buttons'">
-  <button class="button button-stable button-small-padding icon ion-compose"
+<ng-if ng-if=":state:enable && extensionPoint === 'buttons' && !$root.config.readonly">
+  <button class="button button-stable button-small-padding icon ion-email"
+          ng-disabled="loading"
           ng-click="showNewMessageModal()"
           title="{{'MESSAGE.BTN_WRITE' | translate}}">
   </button>
 </ng-if>
 
 <!-- End of buttons section -->
-<ng-if ng-if=":state:enable && extensionPoint === 'after-buttons'">
+<ng-if ng-if=":state:enable && extensionPoint === 'after-buttons' && !$root.config.readonly">
   <!-- options -->
   <button class="button button-stable button-small-padding icon ion-android-more-vertical"
           ng-click="showActionsPopover($event)">
@@ -48,6 +49,6 @@
     <small translate>PROFILE.PROFILE_DIVIDER_HELP</small>
   </div>
 
-  <ng-include src="'plugins/es/templates/user/items_profile.html'" ng-init="showName=false;"></ng-include>
+  <ng-include src="::'plugins/es/templates/user/items_profile.html'" ng-init="showName=false;"></ng-include>
 
 </ng-if>
diff --git a/www/plugins/es/templates/wot/view_popover_actions.html b/www/plugins/es/templates/wot/view_popover_actions.html
index c3ba6ad5f683a8fba1423dc29d766c1fe35e1a12..b080a58c7a70e56f1705bf9d45b5af79ac045050 100644
--- a/www/plugins/es/templates/wot/view_popover_actions.html
+++ b/www/plugins/es/templates/wot/view_popover_actions.html
@@ -11,12 +11,12 @@
         {{'COMMON.BTN_SHARE' | translate}}
       </a>
 
-      <!--<a class="item item-icon-left assertive ink "
-         ng-if="canEdit"
+      <a class="item item-icon-left assertive ink "
+         ng-if="canDelete"
          ng-click="delete()">
         <i class="icon ion-trash-a"></i>
         {{'COMMON.BTN_DELETE' | translate}}
-      </a>-->
+      </a>
 
       <!-- Like -->
       <a class="item item-icon-left ink"
diff --git a/www/plugins/graph/i18n/locale-es-ES.json b/www/plugins/graph/i18n/locale-es-ES.json
index 1bf03bf2f888671146f31151eb24f874bab59621..37a121acadb17a1006b619ac256a91fcb16ced42 100644
--- a/www/plugins/graph/i18n/locale-es-ES.json
+++ b/www/plugins/graph/i18n/locale-es-ES.json
@@ -10,27 +10,35 @@
       "LOGARITHMIC_SCALE" : "Escala logarítmica",
       "BTN_SHOW_STATS": "Ver estadísticas",
       "BTN_SHOW_DETAILED_STATS": "Estadísticas detalladas",
-      "RANGE_DURATION_DIVIDER": "Unidad de paso:",
+      "RANGE_DURATION_DIVIDER": "Unidad de tiempo:",
       "RANGE_DURATION": {
-        "HOUR": "Grupo por <b>hora</b>",
-        "DAY": "Grupo por <b>día</b>",
-        "MONTH": "Grupo por <b>mes</b>"
+        "HOUR": "Agrupar por <b>horas</b>",
+        "DAY": "Agrupar por <b>días</b>",
+        "MONTH": "Agrupar por <b>meses</b>"
       }
     },
     "ACCOUNT": {
-      "INPUT_CHART_TITLE": "Suma del flujo entrante, por el transmisor:",
-      "OUTPUT_CHART_TITLE": "Suma de las salidas por destino:"
+      "TITLE": "Estadísticas",
+      "BTN_SHOW_STATS": "Ver estadísticas de la cuenta",
+      "BALANCE_DIVIDER": "Balance de la cuenta",
+      "BALANCE_TITLE": "Evolución de la cuenta {{pubkey|formatPubkey}}",
+      "TX_RECEIVED_LABEL": "Recibido",
+      "TX_SENT_LABEL": "Gastado",
+      "UD_LABEL": "DU",
+      "BALANCE_LABEL": "Saldo",
+      "INPUT_CHART_TITLE": "Resumen de lo recibido, por emisor",
+      "OUTPUT_CHART_TITLE": "Resumen de lo gastado, por destinatario"
     },
     "BLOCKCHAIN": {
       "TITLE": "Estadística",
-      "BLOCKS_ISSUERS_DIVIDER": "Bloques escritos por los miembros",
-      "BLOCKS_ISSUERS_HELP": "<b>{{issuerCount|formatInteger}} members</b> has computed <b>{{blockCount|formatInteger}} blocks</b>",
-      "BLOCKS_ISSUERS_TITLE": "Número de bloques miembro calculado",
+      "BLOCKS_ISSUERS_DIVIDER": "Bloques escritos por cada miembro",
+      "BLOCKS_ISSUERS_HELP": "<b>{{issuerCount|formatInteger}} miembros</b> han calculado <b>{{blockCount|formatInteger}} bloques</b>",
+      "BLOCKS_ISSUERS_TITLE": "Número de bloques por miembro",
       "BLOCKS_ISSUERS_LABEL": "Número de bloques",
       "TX_DIVIDER": "Análisis de transacciones",
-      "TX_AMOUNT_TITLE": "El volumen de operaciones",
-      "TX_AMOUNT_PUBKEY_TITLE": "El volumen de operaciones calculado por {{issuer | formatPubkey}}",
-      "TX_AMOUNT_LABEL": "Volumen negociado",
+      "TX_AMOUNT_TITLE": "El volumen de transacciones",
+      "TX_AMOUNT_PUBKEY_TITLE": "El volumen de transacciones calculado por {{issuer | formatPubkey}}",
+      "TX_AMOUNT_LABEL": "Volumen intercambiado",
       "TX_COUNT_TITLE": "Número de transacciones escritas",
       "TX_COUNT_LABEL": "Número de transacciones",
       "TX_AVG_BY_BLOCK": "Promedio por bloque"
diff --git a/www/plugins/graph/i18n/locale-it-IT.json b/www/plugins/graph/i18n/locale-it-IT.json
index 69bd0e1a2973f16c3d703e564375d740b36e05cf..502110391e76ce26561239a1c510156dd06c2491 100644
--- a/www/plugins/graph/i18n/locale-it-IT.json
+++ b/www/plugins/graph/i18n/locale-it-IT.json
@@ -71,7 +71,7 @@
        "USER": {
          "TITLE": "Numero di documenti legati ad un conto",
          "USER_PROFILE": "Profili dell'utente",
-         "USER_SETTINGS": "Impostazioni salvate",
+         "USER_SETTINGS": "Impostazioni salvate"
        },
        "MESSAGE": {
          "TITLE": "Numero di documenti legati alla conversazione",
@@ -83,11 +83,11 @@
          "TITLE": "Numero di pagine o gruppi",
          "PAGE_COMMENT": "Commenti",
          "PAGE_RECORD": "Pagine",
-         "GROUP_RECORD": "Gruppi",
+         "GROUP_RECORD": "Gruppi"
        },
        "OTHER": {
          "TITLE": "Altri documenti",
-         "HISTORY_DELETE": "Cronologia eliminazione documenti",
+         "HISTORY_DELETE": "Cronologia eliminazione documenti"
        }
      },
      "SYNCHRO": {
diff --git a/www/plugins/graph/js/controllers/common-controllers.js b/www/plugins/graph/js/controllers/common-controllers.js
index 79c2969569628d5a4479bc51d36a7be0902881f1..042f35b185e4df76e82c9b9a86849fb80693ba20 100644
--- a/www/plugins/graph/js/controllers/common-controllers.js
+++ b/www/plugins/graph/js/controllers/common-controllers.js
@@ -230,7 +230,7 @@ function GpCurrencyAbstractController($scope, $filter, $ionicPopover, $ionicHist
         return dataset.yAxisID && dataset.yAxisID === meta.yAxisID;
       }).length;
       if (yAxisDatasetCount === 1) {
-        ci.scales[meta.yAxisID].options.display = !(meta.hidden === true);
+        ci.scales[meta.yAxisID].options.display = (meta.hidden !== false);
       }
     }
 
diff --git a/www/plugins/graph/js/controllers/docstats-controllers.js b/www/plugins/graph/js/controllers/docstats-controllers.js
index 3760790ae60a76018627d49e7960ac69e5d9427d..7fe42911d7aab991b0239853586744f84d7dd2b0 100644
--- a/www/plugins/graph/js/controllers/docstats-controllers.js
+++ b/www/plugins/graph/js/controllers/docstats-controllers.js
@@ -352,22 +352,22 @@ function GpDocStatsController($scope, $state, $controller, $q, $translate, gpCol
   $scope.onChartClick = function(data, e, item) {
     if (!item) return;
     var chart = _.find($scope.charts , function(chart) {
-      return ($scope.chartIdPrefix  + chart.id) == item._chart.canvas.id;
+      return ($scope.chartIdPrefix  + chart.id) === item._chart.canvas.id;
     });
 
-    var serie = chart.series[item._datasetIndex];
+    var serie = chart && chart.series[item._datasetIndex];
+    var from = $scope.times[item._index];
+    var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();
 
     if (serie && serie.clickState && serie.clickState.name) {
       var stateParams = serie.clickState.params ? angular.copy(serie.clickState.params) : {};
 
       // Compute query
-      var from = $scope.times[item._index];
-      var to = moment.unix(from).utc().add(1, $scope.formData.rangeDuration).unix();
       stateParams.q = 'time:>={0} AND time:<{1}'.format(from, to);
 
       return $state.go(serie.clickState.name, stateParams);
     }
-    else {
+    else if (serie) {
       console.debug('Click on item index={0} on range [{1},{2}]'.format(item._index, from, to));
     }
   };
diff --git a/www/plugins/graph/js/services/data-services.js b/www/plugins/graph/js/services/data-services.js
index 68b2638ecbf65d5cb86fb2647b89a18679e0f087..8c9ba109c32ab893aa1369939654c8709f4729b5 100644
--- a/www/plugins/graph/js/services/data-services.js
+++ b/www/plugins/graph/js/services/data-services.js
@@ -4,7 +4,8 @@ angular.module('cesium.graph.data.services', ['cesium.wot.services', 'cesium.es.
     'ngInject';
 
     var
-      currencyCache = csCache.get('gpData-currency-', csCache.constants.SHORT),
+      cachePrefix = 'gpData-',
+      currencyCache = csCache.get(cachePrefix + 'currency-', csCache.constants.SHORT),
       exports = {
         node: {},
         wot: {},
@@ -126,9 +127,9 @@ angular.module('cesium.graph.data.services', ['cesium.wot.services', 'cesium.es.
       options = options || {};
       var withCache = angular.isDefined(options.withCache) ? options.withCache : true; // enable by default
 
-      var cachekKey = [currency, JSON.stringify(options)].join('-');
+      var cacheKey = [currency, JSON.stringify(options)].join('-');
       if (withCache) {
-        var result = currencyCache.get(cachekKey);
+        var result = currencyCache.get(cacheKey);
         if (result) {
           // should be already a promise (previous call still running)
           if (!result.blocks) {
@@ -213,10 +214,10 @@ angular.module('cesium.graph.data.services', ['cesium.wot.services', 'cesium.es.
           }, []);
 
           // replace promise in cache, with data
-          currencyCache.put(cachekKey, result);
+          currencyCache.put(cacheKey, result);
           return result;
         });
-      currencyCache.put(cachekKey, promise);
+      currencyCache.put(cacheKey, promise);
 
       return promise;
     };
@@ -277,7 +278,7 @@ angular.module('cesium.graph.data.services', ['cesium.wot.services', 'cesium.es.
           // prepare next loop
           ranges = [];
 
-          if (jobs.length == 10) {
+          if (jobs.length === 10) {
             console.error('Too many parallel jobs!');
             from = moment.unix(options.endTime).utc(); // stop while
           }
@@ -962,9 +963,15 @@ angular.module('cesium.graph.data.services', ['cesium.wot.services', 'cesium.es.
         });
     };
 
-    return exports;
-  })
+    function cleanAllCache() {
+      console.debug("[graph] Cleaning cache {prefix: '{0}'}...".format(cachePrefix));
+      csCache.clear(cachePrefix);
+    }
 
+    // Listen if node changed
+    esHttp.api.node.on.stop($rootScope, cleanAllCache, this);
 
+    return exports;
+  })
 
 ;
diff --git a/www/plugins/graph/templates/account/graph_balance.html b/www/plugins/graph/templates/account/graph_balance.html
index 7939969f663c4fb884147d4536794ceac7cef274..31e4709e198fd741ff75c463612a8ee01ce0da67 100644
--- a/www/plugins/graph/templates/account/graph_balance.html
+++ b/www/plugins/graph/templates/account/graph_balance.html
@@ -21,4 +21,4 @@
       </canvas>
     </div>
 
-    <ng-include src="'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
+    <ng-include src="::'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
diff --git a/www/plugins/graph/templates/account/view_stats.html b/www/plugins/graph/templates/account/view_stats.html
index cac7dec8b067bab9c9a83eab42abd6bd9820d77d..87ff0c0d4b7504091ff8e8691d165df26d1371b7 100644
--- a/www/plugins/graph/templates/account/view_stats.html
+++ b/www/plugins/graph/templates/account/view_stats.html
@@ -23,7 +23,7 @@
 
         <div class="item no-padding-xs"
              ng-if="!loading"
-             ng-include="'plugins/graph/templates/account/graph_balance.html'"
+             ng-include="::'plugins/graph/templates/account/graph_balance.html'"
              ng-init="setSize(350, 1000)">
         </div>
       </ng-controller>
@@ -31,7 +31,7 @@
     </div>
 
     <div class="item no-padding-xs"
-         ng-include="'plugins/graph/templates/account/graph_sum_tx.html'"
+         ng-include="::'plugins/graph/templates/account/graph_sum_tx.html'"
          ng-controller="GpAccountSumTxCtrl">
     </div>
 
@@ -41,7 +41,7 @@
     </div>
 
     <div class="item no-padding-xs"
-         ng-include="'plugins/graph/templates/account/graph_certifications.html'"
+         ng-include="::'plugins/graph/templates/account/graph_certifications.html'"
          ng-controller="GpAccountCertificationCtrl"
          ng-init="setSize(350, 1000)">
     </div>-->
diff --git a/www/plugins/graph/templates/blockchain/graph_tx_count.html b/www/plugins/graph/templates/blockchain/graph_tx_count.html
index def80ecccdd8a248237444117435d4476ed015f0..bef1a313cc6688bb40586f52bb2b4322d6fa922d 100644
--- a/www/plugins/graph/templates/blockchain/graph_tx_count.html
+++ b/www/plugins/graph/templates/blockchain/graph_tx_count.html
@@ -21,4 +21,4 @@
       </canvas>
     </div>
 
-    <ng-include src="'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
+    <ng-include src="::'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
diff --git a/www/plugins/graph/templates/blockchain/view_stats.html b/www/plugins/graph/templates/blockchain/view_stats.html
index 4ec97c1e62ba4ce698557b0b6c14c19d8707431e..a3393e1be780428d30d246e3e26bf7382bc0e873 100644
--- a/www/plugins/graph/templates/blockchain/view_stats.html
+++ b/www/plugins/graph/templates/blockchain/view_stats.html
@@ -26,7 +26,7 @@
 
         <div class="item no-padding-xs no-padding-sm"
              ng-if="!loading"
-             ng-include="'plugins/graph/templates/blockchain/graph_tx_count.html'"
+             ng-include="::'plugins/graph/templates/blockchain/graph_tx_count.html'"
              ng-init="setSize(350, 1000)">
         </div>
       </ng-controller>
@@ -39,7 +39,7 @@
 
         <div class="item no-padding-xs no-padding-sm"
              ng-if="!loading"
-             ng-include="'plugins/graph/templates/blockchain/graph_block_issuers.html'"
+             ng-include="::'plugins/graph/templates/blockchain/graph_block_issuers.html'"
              ng-init="setSize(300, 750)">
         </div>
 
diff --git a/www/plugins/graph/templates/currency/tabs/tab_blocks_stats.html b/www/plugins/graph/templates/currency/tabs/tab_blocks_stats.html
index dfe962a0be6c83205d13e4c35fd9c4e8af4bb016..0183d13f2d051a61676a1eb801cadb583e8a32ad 100644
--- a/www/plugins/graph/templates/currency/tabs/tab_blocks_stats.html
+++ b/www/plugins/graph/templates/currency/tabs/tab_blocks_stats.html
@@ -1,7 +1,7 @@
 <ion-view>
   <ion-content>
     <div
-       ng-include="'plugins/graph/templates/blockchain/graph_tx_count.html'"
+       ng-include="::'plugins/graph/templates/blockchain/graph_tx_count.html'"
        ng-controller="GpBlockchainTxCountCtrl"
        ng-init="setSize(500,700,false)">
       </div>
diff --git a/www/plugins/graph/templates/currency/tabs/tab_network_stats.html b/www/plugins/graph/templates/currency/tabs/tab_network_stats.html
index ffa8acb631345ea85bd35e604ea736c240e15bba..ec8f5c0d6f3b465e2fbf0bd14c0bf32ead818287 100644
--- a/www/plugins/graph/templates/currency/tabs/tab_network_stats.html
+++ b/www/plugins/graph/templates/currency/tabs/tab_network_stats.html
@@ -3,7 +3,7 @@
 
     <div class="list">
       <div class="item"
-         ng-include="'plugins/graph/templates/blockchain/graph_block_issuers.html'"
+         ng-include="::'plugins/graph/templates/blockchain/graph_block_issuers.html'"
          ng-controller="GpBlockchainIssuersCtrl"
            ng-init="setSize(500,700,true)">
       </div>
diff --git a/www/plugins/graph/templates/currency/tabs/tab_parameters_stats.html b/www/plugins/graph/templates/currency/tabs/tab_parameters_stats.html
index 80465c1d432b136bd2f0ef2571e185a5ab42121a..364bdb58752799f34746d66bfc42cc960435cef1 100644
--- a/www/plugins/graph/templates/currency/tabs/tab_parameters_stats.html
+++ b/www/plugins/graph/templates/currency/tabs/tab_parameters_stats.html
@@ -10,7 +10,7 @@
 
         <!-- Monetary mass -->
         <div class="item"
-             ng-include="'plugins/graph/templates/currency/graph_monetary_mass.html'"
+             ng-include="::'plugins/graph/templates/currency/graph_monetary_mass.html'"
              ng-init="setSize(500,700,true)">
         </div>
       </ng-container>
@@ -18,7 +18,7 @@
       <!-- DU -->
       <ng-container ng-controller="GpCurrencyDUCtrl">
         <div class="item"
-             ng-include="'plugins/graph/templates/currency/graph_du.html'"
+             ng-include="::'plugins/graph/templates/currency/graph_du.html'"
              ng-init="setSize(500,700,true)">
         </div>
       </ng-container>
diff --git a/www/plugins/graph/templates/currency/tabs/tab_wot_stats.html b/www/plugins/graph/templates/currency/tabs/tab_wot_stats.html
index c058e990402f35fb43fcb3ca5bdad8ee61060bb5..336648d439f068b50e7f1c945fe53bd218147c89 100644
--- a/www/plugins/graph/templates/currency/tabs/tab_wot_stats.html
+++ b/www/plugins/graph/templates/currency/tabs/tab_wot_stats.html
@@ -6,7 +6,7 @@
 
     <div class="list no-padding">
       <div class="item no-padding-top"
-           ng-include="'plugins/graph/templates/currency/graph_members_count.html'"
+           ng-include="::'plugins/graph/templates/currency/graph_members_count.html'"
            ng-init="setSize(600,700,false)">
       </div>
     </div>
diff --git a/www/plugins/graph/templates/currency/view_currency_extend.html b/www/plugins/graph/templates/currency/view_currency_extend.html
index 5b6317b3710b08d334c83a8f1992f7d1a70e7359..556ed85c2a02b2d7c1894c38c66277b4b1901747 100644
--- a/www/plugins/graph/templates/currency/view_currency_extend.html
+++ b/www/plugins/graph/templates/currency/view_currency_extend.html
@@ -4,7 +4,7 @@
 
   <ng-if ng-if="!smallscreen">
     <div class="item padding-left padding-right no-padding-xs no-padding-sm"
-         ng-include="'plugins/graph/templates/currency/graph_monetary_mass.html'"
+         ng-include="::'plugins/graph/templates/currency/graph_monetary_mass.html'"
          ng-controller="GpCurrencyMonetaryMassCtrl"
          ng-init="displayShareAxis=false;">
     </div>
@@ -30,7 +30,7 @@
 
   <ng-if ng-if="!smallscreen">
     <div class="item padding-left padding-right no-padding-xs no-padding-sm"
-         ng-include="'plugins/graph/templates/currency/graph_members_count.html'"
+         ng-include="::'plugins/graph/templates/currency/graph_members_count.html'"
          ng-controller="GpCurrencyMembersCountCtrl">
     </div>
     <div class="item buttons no-padding-top ">
@@ -55,7 +55,7 @@
 
   <div class="item padding-left padding-right no-padding-xs no-padding-sm"
        ng-if="!smallscreen"
-       ng-include="'plugins/graph/templates/blockchain/graph_block_issuers.html'"
+       ng-include="::'plugins/graph/templates/blockchain/graph_block_issuers.html'"
        ng-controller="GpBlockchainIssuersCtrl">
   </div>
 
diff --git a/www/plugins/graph/templates/currency/view_stats_lg.html b/www/plugins/graph/templates/currency/view_stats_lg.html
index 03abfb8bcdfe7874bef13dc477ff4753e26edfac..bf1c64ca43743e54fd8cf82f92e65c73d4927e34 100644
--- a/www/plugins/graph/templates/currency/view_stats_lg.html
+++ b/www/plugins/graph/templates/currency/view_stats_lg.html
@@ -18,7 +18,7 @@
         </div>
 
         <div class="item no-padding-xs" ng-if="!loading"
-             ng-include="'plugins/graph/templates/currency/graph_monetary_mass.html'"
+             ng-include="::'plugins/graph/templates/currency/graph_monetary_mass.html'"
              ng-init="setSize(250, 1000)">
         </div>
 
@@ -38,7 +38,7 @@
       <ng-controller ng-controller="GpCurrencyDUCtrl" >
         <div class="item no-padding-xs"
              ng-if="!loading"
-             ng-include="'plugins/graph/templates/currency/graph_du.html'"
+             ng-include="::'plugins/graph/templates/currency/graph_du.html'"
              ng-init="setSize(250, 1000)">
         </div>
       </ng-controller>
@@ -47,7 +47,7 @@
       <ng-controller ng-controller="GpCurrencyMembersCountCtrl" >
       <div class="item no-padding-xs"
            ng-if="!loading"
-           ng-include="'plugins/graph/templates/currency/graph_members_count.html'"
+           ng-include="::'plugins/graph/templates/currency/graph_members_count.html'"
            ng-init="setSize(250, 1000)">
       </div>
 
diff --git a/www/plugins/graph/templates/docstats/graph.html b/www/plugins/graph/templates/docstats/graph.html
index 7a9b7939f742949aae250f2096fa1bfc880812f8..1cf0bc404e5686826a34e6b946ded5f7403c5e25 100644
--- a/www/plugins/graph/templates/docstats/graph.html
+++ b/www/plugins/graph/templates/docstats/graph.html
@@ -20,4 +20,4 @@
           chart-click="onChartClick">
   </canvas>
 
-  <ng-include src="'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
+  <ng-include src="::'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
diff --git a/www/plugins/graph/templates/docstats/view_stats.html b/www/plugins/graph/templates/docstats/view_stats.html
index 88fc2cffd84b48596257842d7ae80ae415349ff5..4ea84231d65bdc98e1f527300e4813fa221e02ae 100644
--- a/www/plugins/graph/templates/docstats/view_stats.html
+++ b/www/plugins/graph/templates/docstats/view_stats.html
@@ -15,7 +15,7 @@
 
       <div class="item no-padding-xs no-padding-sm" ng-if="!loading"
            ng-repeat="chart in charts"
-           ng-include="'plugins/graph/templates/docstats/graph.html'"
+           ng-include="::'plugins/graph/templates/docstats/graph.html'"
            ng-init="setSize(250, 1000)">
       </div>
 
diff --git a/www/plugins/graph/templates/network/view_peer_stats.html b/www/plugins/graph/templates/network/view_peer_stats.html
index bc552a2e860218b828db6d97b1bcfc73b70e2a64..92845974ddb9056bf62dfb981e58bff8cb0d0453 100644
--- a/www/plugins/graph/templates/network/view_peer_stats.html
+++ b/www/plugins/graph/templates/network/view_peer_stats.html
@@ -18,7 +18,7 @@
       </div>
 
       <div class="item no-padding-xs"
-           ng-include="'plugins/graph/templates/blockchain/graph_tx_count.html'"
+           ng-include="::'plugins/graph/templates/blockchain/graph_tx_count.html'"
            ng-init="setSize(350, 1000)">
       </div>
 
diff --git a/www/plugins/graph/templates/synchro/graph.html b/www/plugins/graph/templates/synchro/graph.html
index 19ac3b723b553020daf60208a1d88f7541e063f9..cfd3ba8f5caa8446e19f6f004e329da5de53a4ff 100644
--- a/www/plugins/graph/templates/synchro/graph.html
+++ b/www/plugins/graph/templates/synchro/graph.html
@@ -19,4 +19,4 @@
           chart-options="chart.options">
   </canvas>
 
-  <ng-include src="'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
+  <ng-include src="::'plugins/graph/templates/common/graph_range_bar.html'"></ng-include>
diff --git a/www/plugins/graph/templates/synchro/view_stats.html b/www/plugins/graph/templates/synchro/view_stats.html
index e7275137a062e666d4461b4979a84232befc29dd..ac9d18b1d4074f6adf041267803a91b3faf4b2c7 100644
--- a/www/plugins/graph/templates/synchro/view_stats.html
+++ b/www/plugins/graph/templates/synchro/view_stats.html
@@ -14,7 +14,7 @@
 
       <div class="item no-padding-xs" ng-if="!loading"
            ng-repeat="chart in charts"
-           ng-include="'plugins/graph/templates/synchro/graph.html'"
+           ng-include="::'plugins/graph/templates/synchro/graph.html'"
            ng-init="setSize(250, 1000)">
       </div>
 
diff --git a/www/plugins/map/js/controllers/common-controllers.js b/www/plugins/map/js/controllers/common-controllers.js
new file mode 100644
index 0000000000000000000000000000000000000000..cd36c8d1dcddb28cd85d457e7e824d7da4f315da
--- /dev/null
+++ b/www/plugins/map/js/controllers/common-controllers.js
@@ -0,0 +1,109 @@
+
+angular.module('cesium.map.common.controllers', ['cesium.services', 'cesium.map.services'])
+
+  .controller('MapEditPositionAbstractCtrl', MapEditPositionAbstractController)
+
+;
+
+/**
+ * An abstract controller, that allow to edit psotion, using a map view (e.g. used by profile and page edition)
+ * @param $scope
+ * @param $timeout
+ * @param $q
+ * @param MapUtils
+ * @param $translate
+ * @constructor
+ */
+function MapEditPositionAbstractController($scope, $timeout, $q, MapUtils, $translate) {
+  'ngInject';
+
+  var listeners = [];
+  $scope.mapId = 'map-user-profile-' + $scope.$id;
+  $scope.map = MapUtils.map({
+    markers: {},
+    center: {
+      zoom: 13
+    }
+  });
+  $scope.loading = true;
+  $scope.mapId = $scope.mapId || 'map-abstract-' + $scope.$id; // Should have beed override by sub-controllers
+
+  $scope.enter = function(e, state) {
+
+    // Wait parent controller load the profile
+    if (!$scope.formData || (!$scope.formData.title && !$scope.formData.geoPoint)) {
+      return $timeout($scope.enter, 500);
+    }
+
+    $scope.loading = true;
+    return $scope.load();
+  };
+  $scope.$on('$csExtension.enter', $scope.enter);
+  $scope.$on('$ionicParentView.enter', $scope.enter);
+
+  $scope.load = function() {
+
+    // no position define: remove existing listener
+    if (!$scope.formData.geoPoint || !$scope.formData.geoPoint.lat || !$scope.formData.geoPoint.lon) {
+      _.forEach(listeners, function(listener){
+        listener(); // unlisten
+      });
+      listeners = [];
+      delete $scope.map.markers.geoPoint;
+      $scope.loading = false;
+      return $q.when();
+    }
+
+    // If no marker exists on map: create it
+    if (!$scope.map.markers.geoPoint) {
+
+      return $translate('MAP.PROFILE.MARKER_HELP')
+        .then(function(helpText) {
+
+          $scope.map.markers.geoPoint = {
+            message: helpText,
+            lat: parseFloat($scope.formData.geoPoint.lat),
+            lng: parseFloat($scope.formData.geoPoint.lon),
+            draggable: true,
+            focus: true
+          };
+          angular.extend($scope.map.center, {
+            lat: $scope.map.markers.geoPoint.lat,
+            lng: $scope.map.markers.geoPoint.lng
+          });
+
+          // Listening changes
+          var listener = $scope.$watch('map.markers.geoPoint', function() {
+            if ($scope.loading) return;
+            if ($scope.map.markers.geoPoint && $scope.map.markers.geoPoint.lat && $scope.map.markers.geoPoint.lng) {
+              $scope.formData.geoPoint = $scope.formData.geoPoint || {};
+              $scope.formData.geoPoint.lat = $scope.map.markers.geoPoint.lat;
+              $scope.formData.geoPoint.lon = $scope.map.markers.geoPoint.lng;
+            }
+          }, true);
+          listeners.push(listener);
+
+
+          // Make sure map appear, if shown later
+          if (!$scope.ionItemClass) {
+            $scope.ionItemClass = 'done in';
+          }
+
+          $scope.loading = false;
+        });
+    }
+
+    // Marker exists: update lat/lon
+    else {
+      $scope.map.markers.geoPoint.lat = $scope.formData.geoPoint.lat;
+      $scope.map.markers.geoPoint.lng = $scope.formData.geoPoint.lon;
+    }
+  };
+
+
+  $scope.$watch('formData.geoPoint', function() {
+    if ($scope.loading) return;
+    $scope.load();
+  }, true);
+
+}
diff --git a/www/plugins/map/js/controllers/registry-controllers.js b/www/plugins/map/js/controllers/registry-controllers.js
index 562dfe96f344b4f383c0ac5a173d89203c0fb251..d69f35a73e590777f755b1a73f5c253f09ef1b8c 100644
--- a/www/plugins/map/js/controllers/registry-controllers.js
+++ b/www/plugins/map/js/controllers/registry-controllers.js
@@ -1,5 +1,5 @@
 
-angular.module('cesium.map.registry.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.help.controllers'])
+angular.module('cesium.map.registry.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.help.controllers', 'cesium.map.common.controllers'])
 
   .config(function($stateProvider, PluginServiceProvider, csConfig) {
     'ngInject';
@@ -23,6 +23,15 @@ angular.module('cesium.map.registry.controllers', ['cesium.services', 'cesium.ma
               templateUrl: "plugins/map/templates/registry/lookup_lg_extend.html"
             }
           }
+        })
+
+        .extendState('app.registry_edit_record', {
+          points: {
+            'after-position': {
+              templateUrl: 'plugins/map/templates/common/edit_position_extend.html',
+              controller: 'MapPageEditCtrl'
+            }
+          }
         });
 
       $stateProvider
@@ -46,6 +55,7 @@ angular.module('cesium.map.registry.controllers', ['cesium.services', 'cesium.ma
   // Map view of the registry
   .controller('MapRegistryViewCtrl', MapRegistryViewController)
 
+  .controller('MapPageEditCtrl', MapPageEditController)
 ;
 
 
@@ -228,7 +238,7 @@ function MapRegistryViewController($scope, $filter, $templateCache, $interpolate
             var popupMarker = popupMarkerId && _.find(map._layers, function(layer) {
                 return (layer.options && layer.options.id === popupMarkerId);
               });
-            popupMarker && popupMarker.openPopup();
+            if (popupMarker) popupMarker.openPopup();
           }, 400);
         },
         firstTipSubmit: true,
@@ -423,3 +433,13 @@ function MapRegistryViewController($scope, $filter, $templateCache, $interpolate
       });
   };
 }
+
+
+function MapPageEditController($scope, $controller) {
+  'ngInject';
+
+  $scope.mapId = 'map-page-' + $scope.$id;
+
+  // Initialize the super classes and extend it.
+  angular.extend(this, $controller('MapEditPositionAbstractCtrl', { $scope: $scope}));
+}
diff --git a/www/plugins/map/js/controllers/user-controllers.js b/www/plugins/map/js/controllers/user-controllers.js
index 5b429c2e5ed9531fca8050bdfbaca42372a7a01d..15ab5730590c2cd7e372af62ce96097c76944a4c 100644
--- a/www/plugins/map/js/controllers/user-controllers.js
+++ b/www/plugins/map/js/controllers/user-controllers.js
@@ -1,5 +1,5 @@
 
-angular.module('cesium.map.user.controllers', ['cesium.services', 'cesium.map.services'])
+angular.module('cesium.map.user.controllers', ['cesium.services', 'cesium.map.services', 'cesium.map.common.controllers'])
 
   .config(function(PluginServiceProvider, csConfig) {
     'ngInject';
@@ -12,8 +12,8 @@ angular.module('cesium.map.user.controllers', ['cesium.services', 'cesium.map.se
         .extendState('app.edit_profile', {
           points: {
             'after-position': {
-              templateUrl: 'plugins/map/templates/user/edit_profile_extend.html',
-              controller: 'MapEditProfileViewCtrl'
+              templateUrl: 'plugins/map/templates/common/edit_position_extend.html',
+              controller: 'MapProfileEditCtrl'
             }
           }
         })
@@ -21,105 +21,22 @@ angular.module('cesium.map.user.controllers', ['cesium.services', 'cesium.map.se
         .extendState('app.edit_profile_by_id', {
           points: {
             'after-position': {
-              templateUrl: 'plugins/map/templates/user/edit_profile_extend.html',
-              controller: 'MapEditProfileViewCtrl'
+              templateUrl: 'plugins/map/templates/common/edit_position_extend.html',
+              controller: 'MapProfileEditCtrl'
             }
           }
         });
     }
   })
 
-  // [NEW] Manage events from the page #/app/wot/map
-  .controller('MapEditProfileViewCtrl', function($scope, $timeout, $q, MapUtils, $translate) {
-    'ngInject';
-
-    var listeners = [];
-    $scope.mapId = 'map-user-profile-' + $scope.$id;
-    $scope.map = MapUtils.map({
-      markers: {},
-      center: {
-        zoom: 13
-      }
-    });
-    $scope.loading = true;
-    $scope.mapId = 'map-profile-' + $scope.$id;
-
-    $scope.enter = function(e, state) {
-
-      // Wait parent controller load the profile
-      if (!$scope.formData || (!$scope.formData.title && !$scope.formData.geoPoint)) {
-        return $timeout($scope.enter, 500);
-      }
-
-      $scope.loading = true;
-      return $scope.load();
-    };
-    $scope.$on('$csExtension.enter', $scope.enter);
-    $scope.$on('$ionicParentView.enter', $scope.enter);
-
-    $scope.load = function() {
-
-      // no position define: remove existing listener
-      if (!$scope.formData.geoPoint || !$scope.formData.geoPoint.lat || !$scope.formData.geoPoint.lon) {
-        _.forEach(listeners, function(listener){
-          listener(); // unlisten
-        });
-        listeners = [];
-        delete $scope.map.markers.geoPoint;
-        $scope.loading = false;
-        return $q.when();
-      }
-
-      // If no marker exists on map: create it
-      if (!$scope.map.markers.geoPoint) {
-
-        return $translate('MAP.PROFILE.MARKER_HELP')
-          .then(function(helpText) {
-
-            $scope.map.markers.geoPoint = {
-              message: helpText,
-              lat: parseFloat($scope.formData.geoPoint.lat),
-              lng: parseFloat($scope.formData.geoPoint.lon),
-              draggable: true,
-              focus: true
-            };
-            angular.extend($scope.map.center, {
-              lat: $scope.map.markers.geoPoint.lat,
-              lng: $scope.map.markers.geoPoint.lng
-            });
-
-            // Listening changes
-            var listener = $scope.$watch('map.markers.geoPoint', function() {
-              if ($scope.loading) return;
-              if ($scope.map.markers.geoPoint && $scope.map.markers.geoPoint.lat && $scope.map.markers.geoPoint.lng) {
-                $scope.formData.geoPoint = $scope.formData.geoPoint || {};
-                $scope.formData.geoPoint.lat = $scope.map.markers.geoPoint.lat;
-                $scope.formData.geoPoint.lon = $scope.map.markers.geoPoint.lng;
-              }
-            }, true);
-            listeners.push(listener);
-
-
-            // Make sure map appear, if shown later
-            if (!$scope.ionItemClass) {
-              $scope.ionItemClass = 'done in';
-            }
-
-            $scope.loading = false;
-          });
-      }
+  .controller('MapProfileEditCtrl', MapProfileEditController);
 
-      // Marker exists: update lat/lon
-      else {
-        $scope.map.markers.geoPoint.lat = $scope.formData.geoPoint.lat;
-        $scope.map.markers.geoPoint.lng = $scope.formData.geoPoint.lon;
-      }
-    };
 
+function MapProfileEditController($scope, $controller) {
+  'ngInject';
 
-    $scope.$watch('formData.geoPoint', function() {
-      if ($scope.loading) return;
-      $scope.load();
-    }, true);
+  $scope.mapId = 'map-profile-' + $scope.$id;
 
-  });
+  // Initialize the super classes and extend it.
+  angular.extend(this, $controller('MapEditPositionAbstractCtrl', { $scope: $scope}));
+}
diff --git a/www/plugins/map/js/controllers/wot-controllers.js b/www/plugins/map/js/controllers/wot-controllers.js
index c11884f2900195517de2e6ed5bb1c595f507ec65..75e83baa19a3695758d11a9ad40d1887106f3672 100644
--- a/www/plugins/map/js/controllers/wot-controllers.js
+++ b/www/plugins/map/js/controllers/wot-controllers.js
@@ -51,7 +51,7 @@ angular.module('cesium.map.wot.controllers', ['cesium.services', 'cesium.map.ser
 
 
 function MapWotViewController($scope, $filter, $templateCache, $interpolate, $timeout, $location, $translate, $q, $controller,
-                              ionicReady,
+                              ionicReady, $rootScope,
                               leafletData, UIUtils, csSettings, csWallet, MapUtils, mapWot) {
   'ngInject';
 
@@ -60,8 +60,6 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
   angular.extend(this, $controller('ESWotIdentityViewCtrl', {$scope: $scope}));
 
   var
-    // Create a  hidden layer, to hold search markers
-    markersSearchLayer,
     icons= {
       member: {
         type: 'awesomeMarker',
@@ -89,8 +87,6 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
     cache: 'map-wot',
     layers: {
       overlays: {
-
-        // User profile
         member: {
           type: 'featureGroup',
           name: 'MAP.WOT.VIEW.LAYER.MEMBER',
@@ -113,6 +109,25 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
     loading: true
   }, $scope.mapId);
 
+  var layers = {
+    // User profile
+    member: {
+      type: 'featureGroup',
+      name: 'MAP.WOT.VIEW.LAYER.MEMBER',
+      visible: true
+    },
+    pending: {
+      type: 'featureGroup',
+      name: 'MAP.WOT.VIEW.LAYER.PENDING',
+      visible: true
+    },
+    wallet: {
+      type: 'featureGroup',
+      name: 'MAP.WOT.VIEW.LAYER.WALLET',
+      visible: true
+    }
+  };
+
   // Variables for marker
   $scope.showDescription = false;
   ionicReady().then(function() {
@@ -214,38 +229,6 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
         separate: true
       }).addTo(map);
 
-      // Add localize me control
-      MapUtils.control.localizeMe({
-          title: translations['MAP.COMMON.BTN_LOCALIZE_ME']
-        })
-        .addTo(map);
-
-      // Add search control
-      markersSearchLayer = L.layerGroup({visible: false});
-      var searchTip = $interpolate($templateCache.get('plugins/map/templates/wot/item_search_tooltip.html'));
-      MapUtils.control.search({
-        layer: markersSearchLayer,
-        propertyName: 'title',
-        buildTip: function (text, val) {
-          return searchTip(val.layer.options);
-        },
-        moveToLocation: function(lnglat, title, map) {
-          if(this.options.zoom)
-            this._map.setView(lnglat, this.options.zoom);
-          else
-            this._map.panTo(lnglat);
-          var popupMarkerId = lnglat.layer && lnglat.layer.options && lnglat.layer.options.popupMarkerId;
-          $timeout(function(){
-            var popupMarker = popupMarkerId && _.find(map._layers, function(layer) {
-                return (layer.options && layer.options.id === popupMarkerId);
-              });
-            popupMarker && popupMarker.openPopup();
-          }, 400);
-        },
-        firstTipSubmit: true,
-        tooltipLimit: 50
-      }).addTo(map);
-
       // Add marker cluster layer
       var extractMarkerLayer = function(marker) {
         return marker.options && marker.options.layer;
@@ -255,8 +238,8 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
         maxClusterRadius: 65,
         showCoverageOnHover: false,
         iconCreateFunction: function (cluster) {
-          var countByLayer = _.countBy(cluster.getAllChildMarkers(), extractMarkerLayer);
-          var markerColor = countByLayer.member ? 'blue' : (countByLayer.pending ? 'lightgreen' : 'lightgray');
+          //var countByLayer = _.countBy(cluster.getAllChildMarkers(), extractMarkerLayer);
+          var markerColor = 'blue'; //countByLayer.member ? 'blue' : (countByLayer.pending ? 'lightgreen' : 'lightgray');
           var childCount = cluster.getChildCount();
           var className = 'marker-cluster ' + markerColor + ' marker-cluster-';
           if (childCount < 10) {
@@ -269,6 +252,7 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
           return L.divIcon({ html: '<div><span>' + childCount + '</span></div>', className: className, iconSize: new L.Point(40, 40) });
         }
       });
+      //_.forEach(layers, function(layer) {
       map.eachLayer(function(layer) {
         // Add capabilities of 'featureGroup.subgroup', if layer is a group
         if (layer.addLayer){
@@ -318,70 +302,54 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
       .then(function(res) {
         var markers = {};
 
-        // Clean search layer
-        markersSearchLayer.clearLayers();
 
         if (res && res.length) {
 
           var formatPubkey = $filter('formatPubkey');
           var markerTemplate = $templateCache.get('plugins/map/templates/wot/popup_marker.html');
 
+
           _.forEach(res, function (hit) {
             var type = hit.pending ? 'pending' : (hit.uid ? 'member' : 'wallet');
-            var shortPubkey = formatPubkey(hit.pubkey);
             var id = hit.index + '_' + (hit.id || (hit.uid ? (hit.uid + ':' + hit.pubkey) : hit.pubkey)).replace(/-/g, '_');
+            var title = hit.name + ' | ' + formatPubkey(hit.pubkey);
             var marker = {
               layer: type,
               icon: icons[type],
               opacity: hit.uid ? 1 : 0.7,
-              title: hit.name + ' | ' + shortPubkey,
+              title: title,
               lat: hit.geoPoint.lat,
               lng: hit.geoPoint.lon,
               getMessageScope: function () {
-                var scope = $scope.$new();
-                scope.loadingMarker = true;
-                scope.formData = {};
-                scope.$applyAsync(function() {
-                  scope.formData = {
-                    pubkey: hit.pubkey,
+                //console.debug('[map] Loading marker ' + title + "...");
+                var markerScope = $scope.$new();
+                markerScope.loadingMarker = true;
+                markerScope.formData = {};
+                markerScope.$applyAsync(function() {
+                  markerScope.formData = {
+                    pubkey: hit.pubke,
                     uid: hit.uid,
-                    name: hit.name,
+                    name: title,
                     profile: hit
                   };
-                  scope.loadingMarker = false;
+                  markerScope.loadingMarker = false;
                 });
-                return scope;
+                return markerScope;
               },
               focus: false,
               message: markerTemplate,
               id: id
             };
             markers[id] = marker;
-
-            // Create a search marker (will be hide)
-            var searchText = hit.name + ((hit.uid && hit.uid != hit.name) ? (' | ' + hit.uid) : '') + ' | ' + shortPubkey;
-            var searchMarker = angular.merge({
-              type: type,
-              opacity: 0,
-              icon: L.divIcon({
-                className: type + ' ng-hide',
-                iconSize: L.point(0, 0)
-              })
-            }, {title: searchText, pubkey: hit.pubkey, uid: hit.uid, name: hit.name, pending: hit.pending, popupMarkerId: id});
-            markersSearchLayer.addLayer(new L.Marker({
-                lat: hit.geoPoint.lat,
-                lng: hit.geoPoint.lon
-              },
-              searchMarker));
           });
         }
 
         $scope.map.markers = markers;
 
         return $timeout(function(){
-          $scope.loading = false;
 
           // hide loading indicator
+          $scope.loading = false;
           map.fire('dataload');
 
           UIUtils.loading.hide();
@@ -389,7 +357,9 @@ function MapWotViewController($scope, $filter, $templateCache, $interpolate, $ti
       })
       .catch(function(err) {
         $scope.map.markers = {};
+        // hide loading indicator
         $scope.loading = false;
+        map.fire('dataload');
         UIUtils.onError('MAP.WOT.ERROR.LOAD_POSITION_FAILED')(err);
       });
   };
diff --git a/www/plugins/map/js/plugin.js b/www/plugins/map/js/plugin.js
index 9d00f86e9c407e4418e2745bf67dadb25813cd20..b4be381536f80725abfb30faedc209c3d9173645 100644
--- a/www/plugins/map/js/plugin.js
+++ b/www/plugins/map/js/plugin.js
@@ -4,6 +4,7 @@ angular.module('cesium.map.plugin', [
     // Services
     'cesium.map.services',
     // Controllers
+    'cesium.map.common.controllers',
     'cesium.map.wot.controllers',
     'cesium.map.registry.controllers',
     'cesium.map.network.controllers',
diff --git a/www/plugins/map/js/services/wot-services.js b/www/plugins/map/js/services/wot-services.js
index 62c7a885b15e1477fe87abe69764d386117ba342..e34fa9e9ccf4c9b3a7698d5bf10f5721d5ae45aa 100644
--- a/www/plugins/map/js/services/wot-services.js
+++ b/www/plugins/map/js/services/wot-services.js
@@ -100,7 +100,7 @@ angular.module('cesium.map.wot.services', ['cesium.services'])
       .then(function(res) {
         var uids = res[1];
         var memberships = res[2];
-        var res = res[0];
+        res = res[0];
         if (!res.hits || !res.hits.total) return [];
 
         // Transform pending MS into a map by pubkey
@@ -128,12 +128,13 @@ angular.module('cesium.map.wot.services', ['cesium.services'])
 
         // Additional slice requests
         request.from += request.size;
+        var processRequestResultFn = function(subRes) {
+          if (!subRes.hits || !subRes.hits.hits.length) return [];
+          return processLoadHits(options, uids, memberships, subRes);
+        };
         while (request.from < res.hits.total) {
-          jobs.push(search(angular.copy(request))
-            .then(function(res) {
-              if (!res.hits || !res.hits.hits.length) return [];
-              return processLoadHits(options, uids, memberships, res);
-            }));
+          var searchRequest = search(angular.copy(request)).then(processRequestResultFn);
+          jobs.push(searchRequest);
           request.from += request.size;
         }
         return $q.all(jobs)
diff --git a/www/plugins/map/locale-es-ES.json b/www/plugins/map/locale-es-ES.json
new file mode 100644
index 0000000000000000000000000000000000000000..0a46c01aec989ed77ba6d3bbf34146d9b53f20ff
--- /dev/null
+++ b/www/plugins/map/locale-es-ES.json
@@ -0,0 +1,76 @@
+{
+  "MAP": {
+    "COMMON": {
+      "SEARCH_DOTS": "Buscar...",
+      "BTN_LOCALIZE_ME": "Localizarme"
+    },
+    "NETWORK": {
+      "LOOKUP": {
+        "BTN_MAP": "Mapa",
+        "BTN_MAP_HELP": "Abrir mapa de nodos"
+      },
+      "VIEW": {
+        "TITLE": "Mapa de nodos",
+        "LAYER": {
+          "MEMBER": "Nodos miembro",
+          "MIRROR": "Nodos espejo",
+          "OFFLINE": "Nodos fuera de línea"
+        }
+      }
+    },
+    "WOT": {
+      "LOOKUP": {
+        "BTN_MAP": "Mapa",
+        "BTN_MAP_HELP": "Abrir el mapa de miembros"
+      },
+      "VIEW": {
+        "TITLE": "Mapa de miembros",
+        "LAYER": {
+          "MEMBER": "<i class=\"icon ion-person positive\"></i> Miembros",
+          "PENDING": "<i class=\"icon ion-clock energized\"></i> Candidaturas pendientes",
+          "WALLET": "<i class=\"icon ion-card gray\"></i> Cuentas simples"
+        }
+      },
+      "ERROR": {
+        "LOAD_POSITION_FAILED": "No se pudieron cargar las coordenadas a mostrar."
+      }
+    },
+    "REGISTRY": {
+      "LOOKUP": {
+        "BTN_MAP": "Mapa",
+        "BTN_MAP_HELP": "Abrir el mapa de páginas"
+      },
+      "VIEW": {
+        "TITLE": "Mapa de páginas",
+        "LAYER": {
+          "SHOP": "<i class=\"icon ion-page-shop positive\"></i> Tiendas locales",
+          "COMPANY": "<i class=\"icon ion-page-company positive\"></i> Empresas",
+          "ASSOCIATION": "<i class=\"icon ion-page-association energized\"></i> Asociaciones",
+          "INSTITUTION": "<i class=\"icon ion-page-institution gray\"></i> Instituciones"
+        }
+      }
+    },
+    "PROFILE": {
+      "MARKER_HELP": "<b>Arrastre y suelte</b> este marcador para <b>actualizar<br/>su posición</b>, o use los botones<br/>arriba del mapa."
+    },
+    "ERROR": {
+      "LOCALIZE_ME_FAILED": "No se pudo obtener su posición actual"
+    },
+    "SETTINGS": {
+      "MAP_DIVIDER": "Mapas",
+      "ENABLE_GOOGLE_API": "Habilitar los servicios de Google API",
+      "ENABLE_GOOGLE_API_HELP": "Permite en el <b>mapa de miembros</b> mostrar cuentas con una dirección postal pero sin coordenadas introducidas.",
+      "GOOGLE_API_KEY": "Llave de Google API",
+      "BTN_GOOGLE_API": "Obtener una llave",
+      "BTN_GOOGLE_API_WARNING": "Necesita una cuenta de Google",
+      "GOOGLE_API_KEY_PLACEHOLDER": "ej: AIzaqyAgszvWm0tM81x1sMK_ipDHBI7EowLqR7I"
+    },
+    "HELP": {
+      "TIP": {
+        "WOT": "Este mapa muestra <b>perfiles con una posición</b>, tengan miembresía o no.<br/><br/>Solo los perfiles cuya opción &quot;aparecer en el mapa&quot; ha sido habilitada.",
+        "WOT_BTN_LAYERS": "<b>Fitrar los datos mostrados</b>: membresías, candidaturas pendientes, cuentas simples, etc.",
+        "WOT_BTN_SEARCH": "Puede <b>buscar</b> por nombre, llave pública o seudónimo."
+      }
+    }
+  }
+}
diff --git a/www/plugins/map/templates/user/edit_profile_extend.html b/www/plugins/map/templates/common/edit_position_extend.html
similarity index 100%
rename from www/plugins/map/templates/user/edit_profile_extend.html
rename to www/plugins/map/templates/common/edit_position_extend.html
diff --git a/www/plugins/map/templates/wot/popup_marker.html b/www/plugins/map/templates/wot/popup_marker.html
index 633503f07bc9d95856f124fe591b13a70bc7dfb0..e0669e058bc2c31b768303ef088a58fc26804e55 100644
--- a/www/plugins/map/templates/wot/popup_marker.html
+++ b/www/plugins/map/templates/wot/popup_marker.html
@@ -45,7 +45,7 @@
   </div>
 </a>
 <!-- buttons -->
-<div class="item no-border no-padding">
+<div class="item no-border no-padding hidden-xs hidden-sm">
   <div class="pull-left gray">
     <!-- show description -->
     <a class="animate-fade-in animate-show-hide gray ng-hide"
@@ -56,7 +56,7 @@
       &nbsp;
     </a>
   </div>
-  <div style="font-size: 18px;" class="pull-right gray">
+  <div style="font-size: 18px;" class="pull-right gray ">
     <!-- share -->
     <a class="icon ion-android-share-alt "
        ng-click="showSharePopover($event)"
diff --git a/www/templates/api/doc.html b/www/templates/api/doc.html
index 4eb7c6fb6ccaa2f9074e9c3182ad016265af3ebf..0048b71729de92034a20c72f3aec532a8da5d3e6 100644
--- a/www/templates/api/doc.html
+++ b/www/templates/api/doc.html
@@ -142,6 +142,7 @@
               </p>
               <label class="item item-input">
                 <input type="text"
+                       autocomplete="off"
                        ng-model="transferData.pubkey"
                        ng-model-options="{ debounce: 650 }"
                        placeholder="{{'API.DOC.TRANSFER.PARAM_PUBKEY_HELP'|translate}}">
@@ -153,6 +154,7 @@
               </p>
               <label class="item item-input">
                 <input type="text"
+                       autocomplete="off"
                        ng-model="transferData.amount"
                        ng-model-options="{ debounce: 650 }"
                        placeholder="{{'API.DOC.TRANSFER.PARAM_AMOUNT_HELP'|translate}}">
@@ -163,7 +165,9 @@
                 {{'API.DOC.TRANSFER.PARAM_COMMENT' | translate}} :
               </p>
               <label class="item item-input">
-                <input type="text" ng-model="transferData.comment" placeholder="{{'API.DOC.TRANSFER.PARAM_COMMENT'|translate}}">
+                <input type="text"
+                       autocomplete="off"
+                       ng-model="transferData.comment" placeholder="{{'API.DOC.TRANSFER.PARAM_COMMENT'|translate}}">
               </label>
 
               <p class="padding-top">
diff --git a/www/templates/api/home.html b/www/templates/api/home.html
index 852bbf79597429ae39491f639c61101f697b9b7a..59170b661871cef50e93ba88714058b6495ef690 100644
--- a/www/templates/api/home.html
+++ b/www/templates/api/home.html
@@ -5,12 +5,10 @@
 
   <ion-nav-buttons side="right">
     <!-- locales  -->
-    <button class="button button-clear hidden-xs hidden-sm gray"
+    <button class="button button-clear hidden-xs hidden-sm flag"
             ng-click="showLocalesPopover($event)" style="align-content: center">
-      <img ng-if="$root.settings.locale.country"
-           ng-src="https://www.countryflags.io/{{$root.settings.locale.country}}/shiny/32.png">
-      <span ng-if="!$root.settings.locale.country">{{$root.settings.locale.label}}&nbsp;</span>
-      <small class="ion-arrow-down-b"></small>
+      <i class="flag-image" ng-if="$root.settings.locale" style="background-image: url(../img/flag-{{$root.settings.locale.flag}}.png);"></i>
+      <b class="ion-arrow-down-b gray"></b>
     </button>
   </ion-nav-buttons>
 
@@ -31,7 +29,7 @@
 
         <div class="light-bg no-padding">
           <!-- include documentation -->
-          <ng-include src="'templates/api/doc.html'"></ng-include>
+          <ng-include src="::'templates/api/doc.html'"></ng-include>
         </div>
       </div>
 
diff --git a/www/templates/api/locales_popover.html b/www/templates/api/popover_locales.html
similarity index 77%
rename from www/templates/api/locales_popover.html
rename to www/templates/api/popover_locales.html
index db706efc4ed4f62bda8a95440b0cd1585cd1c6f6..4a449f2fc6f85917b8374a98583c5c40215f8e40 100644
--- a/www/templates/api/locales_popover.html
+++ b/www/templates/api/popover_locales.html
@@ -6,7 +6,7 @@
         class="item item-icon-left ink"
          ng-click="changeLanguage(l.id)">
         <i class="item-image avatar"
-           style="border-radius: 0; background-image: url(https://www.countryflags.io/{{l.country}}/shiny/64.png)"></i>
+           style="background-image: url(../img/flag-{{l.flag}}.png)"></i>
         {{l.label | translate}}
       </a>
 
diff --git a/www/templates/api/transfer.html b/www/templates/api/transfer.html
index f0520fcff6102b399b9135b1b14d08af7f823743..4efe4869bba2a800fa24c01eb51d4886183f7052 100644
--- a/www/templates/api/transfer.html
+++ b/www/templates/api/transfer.html
@@ -45,7 +45,14 @@
             </div>
           </div>
 
-          <ng-include src="'templates/login/form_login.html'"></ng-include>
+          <div class="no-padding energized-100-bg" ng-if="$root.config.demo">
+            <div class="item item-icon-left item-text-wrap no-border">
+              <i class="icon ion-android-alert assertive" ></i>
+              <p translate>MODE.DEMO.INSTALL_HELP</p>
+            </div>
+          </div>
+
+          <ng-include src="::'templates/login/form_login.html'"></ng-include>
 
         </div>
         <br class="hidden-xs"/>
diff --git a/www/templates/blockchain/item_block.html b/www/templates/blockchain/item_block.html
index 49714cdc65c47d360100b6e6e377060038b22243..e9eec8709e7101a894aea65a7e9b3720f4ab87cc 100644
--- a/www/templates/blockchain/item_block.html
+++ b/www/templates/blockchain/item_block.html
@@ -1,19 +1,19 @@
-<a name="block-{{:rebind:block.number}}"></a>
-<ion-item id="block-{{:rebind:block.number}}"
+<a name="block-{{::block.number}}"></a>
+<ion-item id="block-{{::block.number}}"
           class="item item-icon-left item-block {{::ionItemClass}}"
-          ng-class="{'ink': !block.empty||!block.compacted, 'item-block-empty': block.empty, 'compacted': block.compacted && compactMode}"
+          ng-class=":rebind:{'ink': !block.empty||!block.compacted, 'item-block-empty': block.empty, 'compacted': block.compacted && compactMode}"
           ng-click="selectBlock(block)">
 
-  <i class="icon ion-cube stable" ng-if=":rebind:(!block.empty && !block.avatar)"></i>
-  <i class="avatar" ng-if=":rebind:!block.empty && block.avatar" style="background-image: url('{{:rebind:block.avatar.src}}')"></i>
+  <i class="icon ion-cube stable" ng-if="(!block.empty && !block.avatar)"></i>
+  <i class="avatar" ng-if="!block.empty && block.avatar" style="background-image: url('{{block.avatar.src}}')"></i>
 
   <div class="row no-padding" ng-if=":rebind:!block.compacted || !compactMode">
     <div class="col" style="min-width: 110px; max-width: 130px;">
-      <h4 ng-class="{'gray': block.compacted, 'dark': !block.compacted}">
+      <h4 ng-class=":rebind:{'gray': block.compacted, 'dark': !block.compacted}">
         <i class="ion-clock"></i>
         {{:rebind:block.medianTime|medianDate}}
       </h4>
-      <h4 ng-if="!block.empty">
+      <h4 ng-if=":rebind:!block.empty">
         <!-- joiners/leavers -->
         <ng-if ng-if=":rebind:block.joinersCount||(block.excludedCount-block.revokedCount)">
           <i class="dark ion-person"></i>
@@ -33,7 +33,7 @@
     </div>
 
     <div class="col col-20">
-      <span class="badge " ng-class="{'badge-balanced': !$index , 'badge-calm': $index && !block.compacted && !block.empty}">{{:rebind:block.number|formatInteger}}</span>
+      <span class="badge " ng-class=":rebind:{'badge-balanced': !$index , 'badge-calm': $index && !block.compacted && !block.empty}">{{::block.number|formatInteger}}</span>
     </div>
 
   </div>
diff --git a/www/templates/blockchain/item_block_empty_lg.html b/www/templates/blockchain/item_block_empty_lg.html
index aa217c2a0927197a2b4375f3497cf1f9354558fe..512e7e13fcd6aaed1ff7e2cc622a683fc06d32c1 100644
--- a/www/templates/blockchain/item_block_empty_lg.html
+++ b/www/templates/blockchain/item_block_empty_lg.html
@@ -1,7 +1,7 @@
 <a name="block-{{::block.number}}"></a>
 <div id="block-{{::block.number}}"
           class="item item-block item-icon-left item-block-empty"
-          ng-class="{'compacted': block.compacted && compactMode}"
+          ng-class=":rebind:{'compacted': block.compacted && compactMode}"
           ng-click="selectBlock(block)"
           >
   <div class="row no-padding" ng-if=":rebind:!block.compacted || !compactMode">
diff --git a/www/templates/blockchain/items_blocks.html b/www/templates/blockchain/items_blocks.html
index 939336dcccce373c4eb0ff03b5b229c6634a285b..2c73f5a70b6a7bd0253225a182eb0169224ccf27 100644
--- a/www/templates/blockchain/items_blocks.html
+++ b/www/templates/blockchain/items_blocks.html
@@ -7,8 +7,8 @@
       BLOCKCHAIN.LOOKUP.NO_BLOCK
     </div>
     <!-- blocks -->
-    <ng-repeat ng-repeat="block in :rebind:search.results track by block.number"
-               ng-include="'templates/blockchain/item_block.html'">
+    <ng-repeat ng-repeat="block in search.results track by block.number"
+               ng-include="::'templates/blockchain/item_block.html'">
     </ng-repeat>
   </ion-list>
 
diff --git a/www/templates/blockchain/list_blocks.html b/www/templates/blockchain/list_blocks.html
index 5721ec6695adbd646e8b009a4a7491abf6a520f4..aa466453358d2b0d98ac8f811557d0525830a7c4 100644
--- a/www/templates/blockchain/list_blocks.html
+++ b/www/templates/blockchain/list_blocks.html
@@ -8,8 +8,8 @@
       BLOCKCHAIN.LOOKUP.NO_BLOCK
     </div>
     <!-- blocks -->
-    <ng-repeat ng-repeat="block in :rebind:search.results track by block.number"
-               ng-include="'templates/blockchain/item_block.html'">
+    <ng-repeat ng-repeat="block in search.results track by block.number"
+               ng-include="::'templates/blockchain/item_block.html'">
     </ng-repeat>
   </ion-list>
 
diff --git a/www/templates/blockchain/list_blocks_lg.html b/www/templates/blockchain/list_blocks_lg.html
index 8d8d1ca97d0161951466502c6c09bc564d836190..3502ff3df2de6568a7be9f3cfa4b56c6c7d57833 100644
--- a/www/templates/blockchain/list_blocks_lg.html
+++ b/www/templates/blockchain/list_blocks_lg.html
@@ -8,7 +8,7 @@
         <i class="icon ion-navicon"></i>
         <b class="ion-arrow-down-b" style="position: absolute; top: -2px; left: 4px; font-size: 8px;"></b>
         <b class="ion-arrow-up-b" style="position: absolute; top: 10px; left: 4px; font-size: 8px;"></b>
-        <span>{{'BLOCKCHAIN.LOOKUP.BTN_COMPACT'|translate}}</span>
+        <span>{{:locale:'BLOCKCHAIN.LOOKUP.BTN_COMPACT'|translate}}</span>
       </a>
     </div>
   </div>
@@ -18,8 +18,8 @@
   </div>
 
   <ion-list class="padding padding-xs list-blocks {{::motion.ionListClass}}">
-    <div class="padding gray" ng-if="!search.loading && !search.results.length" translate>
-      BLOCKCHAIN.LOOKUP.NO_BLOCK
+    <div class="padding gray" ng-if="!search.loading && !search.results.length">
+      {{:locale:'BLOCKCHAIN.LOOKUP.NO_BLOCK'|translate}}
     </div>
     <!-- blocks -->
     <ng-repeat ng-repeat="block in search.results track by block.id"
diff --git a/www/templates/blockchain/lookup.html b/www/templates/blockchain/lookup.html
index 92f845adf53f150b7863e6e8a65028f2bd2c1ab0..6a244ff9bcaf22ed628e7319bb6c8307bd87a3a0 100644
--- a/www/templates/blockchain/lookup.html
+++ b/www/templates/blockchain/lookup.html
@@ -5,6 +5,6 @@
 
 
   <ion-content class="padding no-padding-xs" scroll="true">
-    <ng-include src="'templates/blockchain/list_blocks.html'"></ng-include>
+    <ng-include src="::'templates/blockchain/list_blocks.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/templates/blockchain/lookup_lg.html b/www/templates/blockchain/lookup_lg.html
index 50d70256962ccceb27b4177a26395a99488a0340..6b386d8e39a7b985a767df68766112c5c9fea1c7 100644
--- a/www/templates/blockchain/lookup_lg.html
+++ b/www/templates/blockchain/lookup_lg.html
@@ -4,6 +4,6 @@
   </ion-nav-title>
 
   <ion-content class="padding no-padding-xs no-padding-sm" scroll="true">
-    <ng-include src="'templates/blockchain/list_blocks_lg.html'"></ng-include>
+    <ng-include src="::'templates/blockchain/list_blocks_lg.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/templates/blockchain/view_block.html b/www/templates/blockchain/view_block.html
index 9493a1e2b5bb176956e1fbbb8edb725b7b189b3e..a55030332ca34c04c1da0717bd749b55d9a8c665 100644
--- a/www/templates/blockchain/view_block.html
+++ b/www/templates/blockchain/view_block.html
@@ -150,7 +150,7 @@
             <div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.identitiesCount">
               <ion-item ng-repeat="identity in ::formData.identities"
                         class="item-border-large item-small-height"
-                        ng-include="'templates/blockchain/link_identity.html'">
+                        ng-include="::'templates/blockchain/link_identity.html'">
               </ion-item>
             </div>
           </ng-if>
@@ -167,7 +167,7 @@
             <div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.joinersCount">
               <ion-item ng-repeat="identity in ::formData.joiners"
                         class="item-border-large item-small-height"
-                        ng-include="'templates/blockchain/link_identity.html'">
+                        ng-include="::'templates/blockchain/link_identity.html'">
               </ion-item>
             </div>
           </ng-if>
@@ -186,7 +186,7 @@
             <div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.activesCount">
               <ion-item ng-repeat="identity in ::formData.actives"
                         class="item-border-large item-small-height"
-                        ng-include="'templates/blockchain/link_identity.html'">
+                        ng-include="::'templates/blockchain/link_identity.html'">
               </ion-item>
             </div>
           </ng-if>
@@ -205,7 +205,7 @@
             <div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.excludedCount">
               <ion-item ng-repeat="identity in ::formData.excluded"
                         class="item-border-large item-small-height"
-                        ng-include="'templates/blockchain/link_identity.html'">
+                        ng-include="::'templates/blockchain/link_identity.html'">
               </ion-item>
             </div>
           </ng-if>
@@ -224,7 +224,7 @@
             <div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.leaversCount">
               <ion-item ng-repeat="identity in ::formData.leavers"
                         class="item-border-large item-small-height"
-                        ng-include="'templates/blockchain/link_identity.html'">
+                        ng-include="::'templates/blockchain/link_identity.html'">
               </ion-item>
             </div>
           </ng-if>
@@ -243,7 +243,7 @@
             <div class="padding-bottom item-icon-left-padding item-icon-right-padding" ng-if="formData.revokedCount">
               <ion-item ng-repeat="identity in ::formData.revoked"
                         class="item-border-large item-small-height"
-                        ng-include="'templates/blockchain/link_identity.html'">
+                        ng-include="::'templates/blockchain/link_identity.html'">
               </ion-item>
             </div>
           </ng-if>
@@ -262,7 +262,7 @@
                 <div class="row no-padding">
                   <div class="col col-center no-padding">
                     <ng-repeat ng-repeat="cert in certs">
-                      <ng-include src="'templates/blockchain/link_identity.html'" onload="identity=cert.from"></ng-include>
+                      <ng-include src="::'templates/blockchain/link_identity.html'" onload="identity=cert.from"></ng-include>
                       <br/>
                     </ng-repeat>
                   </div>
@@ -270,7 +270,7 @@
                     <h2><i class="icon ion-arrow-right-a" ></i></h2>
                   </div>
                   <div class="col col-40 col-center no-padding"
-                       ng-include="'templates/blockchain/link_identity.html'"
+                       ng-include="::'templates/blockchain/link_identity.html'"
                        onload="identity=certs[0].to">
                   </div>
                 </div>
diff --git a/www/templates/common/note_feature_not_available.html b/www/templates/common/note_feature_not_available.html
new file mode 100644
index 0000000000000000000000000000000000000000..ce33c9d8d494f7eb5b603226d0ef029e65985966
--- /dev/null
+++ b/www/templates/common/note_feature_not_available.html
@@ -0,0 +1,5 @@
+
+<h4 class="assertive">
+  <b class="ion-android-close"></b>
+  <span translate>MODE.DEMO.FEATURE_NOT_AVAILABLE</span>
+</h4>
diff --git a/www/templates/common/popover_copy.html b/www/templates/common/popover_copy.html
index 297d6213cfbf71cceec0b788521876efd96d6487..7886a7590ef81c8a7838acc94c88686f312efc4a 100644
--- a/www/templates/common/popover_copy.html
+++ b/www/templates/common/popover_copy.html
@@ -3,6 +3,7 @@
     <div class="list">
       <div class="item item-input">
         <input type="text"
+               autocomplete="off"
                ng-if="!rows || rows &lt;= 1"
                ng-model="value">
         <textarea
diff --git a/www/templates/common/popover_locales.html b/www/templates/common/popover_locales.html
new file mode 100644
index 0000000000000000000000000000000000000000..bda9e04de75ee75e18846ea46512d1c357c481e8
--- /dev/null
+++ b/www/templates/common/popover_locales.html
@@ -0,0 +1,15 @@
+<ion-popover-view class="fit popover-locales" style="height: {{locales.length*48}}px;">
+  <ion-content scroll="false">
+    <div class="list item-text-wrap block">
+
+      <a  ng-repeat="l in locales track by l.id"
+        class="item item-icon-left ink"
+         ng-click="changeLanguage(l.id)">
+        <i class="item-image avatar"
+           style="background-image: url(./img/flag-{{l.flag}}.png)"></i>
+        {{l.label | translate}}
+      </a>
+
+    </div>
+  </ion-content>
+</ion-popover-view>
diff --git a/www/templates/common/popover_share.html b/www/templates/common/popover_share.html
index a4c114dca1d88f072d4d82b73c74c47996e34720..5089d0d2823ccdcb277d3b1952a85ac33833364e 100644
--- a/www/templates/common/popover_share.html
+++ b/www/templates/common/popover_share.html
@@ -6,7 +6,7 @@
     </div>
     <div class="list no-margin no-padding has-header has-footer block">
       <div class="item item-input">
-        <input type="text" ng-model="value">
+        <input type="text" autocomplete="off" ng-model="value">
       </div>
     </div>
 
diff --git a/www/templates/common/qrcode.html b/www/templates/common/qrcode.html
new file mode 100644
index 0000000000000000000000000000000000000000..b8c625a288ac6e4a5c06604ff3266a9375583015
--- /dev/null
+++ b/www/templates/common/qrcode.html
@@ -0,0 +1,14 @@
+<a ng-attr-id="{{ qrcodeId }}" ng-show="!loading"
+   class="qrcode fade-in pull-right"
+   ng-class="{'active': toggleQRCode}"
+   ng-click="toggleQRCode = !toggleQRCode">
+  <div class="content"></div>
+  <div class="footer item item-icon-left item-text-wrap ink"
+       on-hold="copy(formData.pubkey)"
+       copy-on-click="{{:rebind:formData.pubkey}}"
+       ng-click="$event.stopPropagation()">
+    <i class="icon ion-key"></i>
+    <span>{{:locale:'COMMON.PUBKEY'|translate}}</span>
+    <h4 id="pubkey" class="dark">{{:rebind:formData.pubkey}}</h4>
+  </div>
+</a>
diff --git a/www/templates/currency/items_network.html b/www/templates/currency/items_network.html
index 42924b37d5d45aa909ab5d8160a756882b516ddb..8f1e36b723ba2af1a69ddabd87c77532b237c5cd 100644
--- a/www/templates/currency/items_network.html
+++ b/www/templates/currency/items_network.html
@@ -53,4 +53,4 @@
       </div>
     </div>
 
-    <ng-include src="'templates/network/items_peers.html'" ></ng-include>
+    <ng-include src="::'templates/network/items_peers.html'" ></ng-include>
diff --git a/www/templates/currency/lookup.html b/www/templates/currency/lookup.html
index 8ba924024b919b5f6107ad5f2d55df0011d599b1..67d776b15d4cd800f7d2121efe9786f6a0e20979 100644
--- a/www/templates/currency/lookup.html
+++ b/www/templates/currency/lookup.html
@@ -2,6 +2,6 @@
   <ion-content class="padding no-padding-xs no-padding-sm">
     <h4 class="content double-padding-x" translate>CURRENCY.SELECT.CURRENCIES</h4>
 
-    <ng-include src="'templates/currency/lookup_form.html'"/>
+    <ng-include src="::'templates/currency/lookup_form.html'"/>
   </ion-content>
 </ion-view>
diff --git a/www/templates/currency/tabs/tab_blocks.html b/www/templates/currency/tabs/tab_blocks.html
index dc7e4c0fada74dbde7efc9ec68213750a17302f7..f97b25fe2cdc9b96337d57e8a57fa260269eff31 100644
--- a/www/templates/currency/tabs/tab_blocks.html
+++ b/www/templates/currency/tabs/tab_blocks.html
@@ -22,6 +22,6 @@
 
     <cs-extension-point name="buttons"></cs-extension-point>
 
-    <ng-include src="'templates/blockchain/list_blocks.html'"></ng-include>
+    <ng-include src="::'templates/blockchain/list_blocks.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/templates/currency/tabs/tab_network.html b/www/templates/currency/tabs/tab_network.html
index 95632439ec38a9ec2636b542171ec45d42f86932..e205ea5454d9e3ff5a4fab5ffb6ded928cf51e30 100644
--- a/www/templates/currency/tabs/tab_network.html
+++ b/www/templates/currency/tabs/tab_network.html
@@ -14,7 +14,7 @@
     </ion-refresher>
 
     <div class="list">
-      <ng-include src="'templates/currency/items_network.html'"></ng-include>
+      <ng-include src="::'templates/currency/items_network.html'"></ng-include>
     </div>
   </ion-content>
 </ion-view>
diff --git a/www/templates/currency/tabs/tab_parameters.html b/www/templates/currency/tabs/tab_parameters.html
index 5c0cbee6512cb2f6d9273210c1d48faf2e3f754f..16ba634fe696197d9a89b9247f74d7e0bbd146b9 100644
--- a/www/templates/currency/tabs/tab_parameters.html
+++ b/www/templates/currency/tabs/tab_parameters.html
@@ -11,7 +11,7 @@
     </ion-refresher>
 
     <div class="list">
-      <ng-include src="'templates/currency/items_parameters.html'"></ng-include>
+      <ng-include src="::'templates/currency/items_parameters.html'"></ng-include>
     </div>
   </ion-content>
 </ion-view>
diff --git a/www/templates/currency/tabs/tab_wot.html b/www/templates/currency/tabs/tab_wot.html
index aa5f02bbb6107b7a20f5e7270e11dd0c96c898d6..b00e9b601f820b1ca839ad1ebd796e2f11e0b82d 100644
--- a/www/templates/currency/tabs/tab_wot.html
+++ b/www/templates/currency/tabs/tab_wot.html
@@ -4,7 +4,7 @@
                    on-refresh="refresh()">
     </ion-refresher>
     <div class="list">
-      <ng-include src="'templates/currency/items_wot.html'"></ng-include>
+      <ng-include src="::'templates/currency/items_wot.html'"></ng-include>
     </div>
   </ion-content>
 </ion-view>
diff --git a/www/templates/currency/view_currency_lg.html b/www/templates/currency/view_currency_lg.html
index a22a266202b65781fde6d91efb7d214ffecc61ed..79940a809dade8194236943f83fd710dc579d43d 100644
--- a/www/templates/currency/view_currency_lg.html
+++ b/www/templates/currency/view_currency_lg.html
@@ -56,7 +56,7 @@
           <div class="item item-divider">
             <span translate>CURRENCY.VIEW.MONEY_DIVIDER</span>
           </div>
-          <ng-include src="'templates/currency/items_parameters.html'"></ng-include>
+          <ng-include src="::'templates/currency/items_parameters.html'"></ng-include>
 
         </div>
 
@@ -65,7 +65,7 @@
           <div class="item item-divider">
             <span translate>CURRENCY.VIEW.WOT_DIVIDER</span>
           </div>
-          <ng-include src="'templates/currency/items_wot.html'"></ng-include>
+          <ng-include src="::'templates/currency/items_wot.html'"></ng-include>
 
         </div>
       </div>
diff --git a/www/templates/help/help.html b/www/templates/help/help.html
index 5571b0c80c988bf11bfb3fd836450539a03eb15b..bf346d74579be22edf0a78c4137c54f22b0a0e26 100644
--- a/www/templates/help/help.html
+++ b/www/templates/help/help.html
@@ -1,4 +1,26 @@
+<a name="demo"></a>
+<div class="row responsive-sm"
+     ng-if="::$root.config.demo"
+     ng-class="itemsClass['demo']">
+  <div class="col col-20" translate>MODE.DEMO.MODE</div>
+  <div class="col">
+    <span translate>MODE.DEMO.MODE_HELP</span><br/>
+    <span translate>MODE.DEMO.INSTALL_HELP</span>
+  </div>
+</div>
+
+<a name="readonly"></a>
+<div class="row responsive-sm"
+     ng-if="::$root.config.readonly"
+     ng-class="itemsClass['readonly']">
+  <div class="col col-20" translate>MODE.READONLY.MODE</div>
+  <div class="col">
+    <span translate>MODE.READONLY.MODE_HELP</span><br/>
+    <span translate>MODE.READONLY.INSTALL_HELP</span>
+  </div>
+</div>
 
+<div class="hidden-readonly">
   <a name="join"></a>
   <h2 translate>HELP.JOIN.SECTION</h2>
 
@@ -22,7 +44,9 @@
       <div class="col col-20" translate>ACCOUNT.NEW.PSEUDO</div>
       <div class="col" translate>HELP.JOIN.PSEUDO</div>
     </div>
+</div>
 
+<div class="hidden-readonly">
   <a name="login"></a>
   <h2 translate>HELP.LOGIN.SECTION</h2>
 
@@ -39,7 +63,9 @@
     <div class="col col-20" translate>HELP.LOGIN.METHOD</div>
     <div class="col" translate>HELP.LOGIN.METHOD_DEF</div>
   </div>
+</div>
 
+<div>
   <a name="glossary"></a>
   <h2 translate>HELP.GLOSSARY.SECTION</h2>
 
@@ -92,3 +118,4 @@
     <div class="col col-20" translate>HELP.GLOSSARY.DISTANCE_RULE</div>
     <div class="col" translate>HELP.GLOSSARY.DISTANCE_RULE_DEF</div>
   </div>
+</div>
diff --git a/www/templates/help/modal_help.html b/www/templates/help/modal_help.html
index c381d1a7c0c52844722ed8bb3708555ea0146529..e885806552f52718d311652354f776d8017f34f5 100644
--- a/www/templates/help/modal_help.html
+++ b/www/templates/help/modal_help.html
@@ -10,7 +10,7 @@
     <ion-content scroll="true" class="padding no-padding-xs">
 
       <div ng-class="listClass">
-        <ng-include src="'templates/help/help.html'"></ng-include>
+        <ng-include src="::'templates/help/help.html'"></ng-include>
       </div>
 
       <div class="padding hidden-xs text-center">
diff --git a/www/templates/help/view_help.html b/www/templates/help/view_help.html
index 4f050ce8eb924a55baa83ccc8211783a8ff3a46f..7adbf3d4b4986eb50cf32a5b629a3e3af6064d93 100644
--- a/www/templates/help/view_help.html
+++ b/www/templates/help/view_help.html
@@ -7,7 +7,7 @@
 
     <h1 class="hidden-xs hidden-sm" translate>HELP.TITLE</h1>
 
-    <ng-include src="'templates/help/help.html'"></ng-include>
+    <ng-include src="::'templates/help/help.html'"></ng-include>
 
   </ion-content>
 </ion-view>
diff --git a/www/templates/home/home.html b/www/templates/home/home.html
index 85811da2f683e96a6aacd3ec39669ff0ab19cb0d..5cdf936cd0d99cf32611a2e6fd0a4377f337b4dc 100644
--- a/www/templates/home/home.html
+++ b/www/templates/home/home.html
@@ -1,30 +1,43 @@
-<ion-view id="home" class="">
+<ion-view id="home">
   <!-- no title -->
   <ion-nav-title></ion-nav-title>
 
   <ion-nav-buttons side="secondary" >
     <!-- locales  -->
-    <button class="button button-clear hidden-xs hidden-sm gray"
+    <button class="button button-clear hidden-xs hidden-sm flag"
             ng-click="showLocalesPopover($event)" style="align-content: center">
-      <img ng-if=":locale:$root.settings.locale.country"
-           ng-src="https://www.countryflags.io/{{:locale:$root.settings.locale.country}}/shiny/32.png">
-      <span ng-if=":locale:!$root.settings.locale.country">{{:locale:$root.settings.locale.label}}&nbsp;</span>
-      <small class="ion-arrow-down-b"></small>
+      <i class="flag-image"
+         ng-if=":locale:$root.settings.locale"
+         style="background-image: url(./img/flag-{{$root.settings.locale.flag}}.png);"></i>
+      <b class="ion-arrow-down-b gray"></b>
     </button>
   </ion-nav-buttons>
 
-  <ion-content class="positive-900-bg circle-bg-dark">
+  <ion-content class="circle-bg-dark positive-900-bg"
+  ng-class="::{'calm-bg': $root.config.readonly}">
 
-    <div class="row no-padding-xs responsive-lg">
-      <div class="col col-30 hidden-xs hidden-sm">&nbsp;</div>
+    <div class="ribbon" ng-if="::$root.config.demo || $root.config.readonly">
+      <a class="badge badge-assertive" ng-if="::$root.config.demo"  ng-click="showHelpModal('demo')">{{:locale:'MODE.DEMO.BADGE'|translate}}</a>
+      <a class="badge badge-balanced" ng-if="::$root.config.readonly" ng-click="showHelpModal('readonly')">{{:locale:'MODE.READONLY.BADGE'|translate}}</a>
+      <a class="badge badge-positive" ng-click="openLink($event, $root.settings.sourceUrl)" title="{{:locale:'HOME.FORK_ME'|translate}}">{{:locale:'HOME.FREE_SOFTWARE'|translate}}</a>
+      <a class="badge badge-stable" ng-click="openLink($event, $root.settings.sourceLicenseUrl)" title="{{:locale:'HOME.SHOW_LICENSE'|translate}}">AGPL-3.0</a>
+    </div>
+
+    <div class="row padding-horizontal no-padding-xxs responsive-lg">
+      <div class="col col-30 no-padding hidden-xs hidden-sm">&nbsp;</div>
       <div class="col text-center no-padding-xs main-container">
 
-        <div id="helptip-home-logo" class="logo"></div>
+        <div id="helptip-home-logo" class="logo">
+        </div>
 
-        <h4>
-          <span class="hidden-xs" translate>HOME.WELCOME</span>
+        <h4 class="welcome" ng-if="::!$root.config.readonly">
+          <p class="hidden-xs" translate>HOME.WELCOME</p>
           <b ng-show="!loading" translate-values=":currency:{currency: $root.currency.name}" translate>HOME.MESSAGE</b>
         </h4>
+        <h4 class="welcome" ng-if="::$root.config.readonly">
+          <p translate>HOME.WELCOME_READONLY</p>
+          <b ng-show="!loading" translate-values=":currency:{currency: $root.currency.name}" translate>HOME.MESSAGE_READONLY</b>
+        </h4>
 
         <div class="center padding" ng-if="loading">
           <ion-spinner icon="android" ></ion-spinner>
@@ -39,7 +52,7 @@
             <!-- Retry -->
             <button type="button"
                     class="button button-positive icon icon-left ion-refresh ink"
-                    ng-click="reload()">{{'COMMON.BTN_REFRESH'|translate}}</button>
+                    ng-click="reload()">{{:locale:'COMMON.BTN_REFRESH'|translate}}</button>
           </div>
         </div>
 
@@ -47,28 +60,50 @@
 
           <!-- Help tour (NOT ready yet for small device) -->
           <button type="button"
-                  class="button button-block button-stable button-raised icon-left icon ion-easel ink-dark hidden-xs"
-                  ng-show="login"
-                  ng-click="startHelpTour()" >
-            {{'COMMON.BTN_HELP_TOUR'|translate}}
+                  class="button button-block button-stable button-raised icon-left icon ion-easel ink-dark"
+                  ng-class="::{'hidden-xs': !$root.config.readonly}"
+                  ng-show="login || $root.config.readonly"
+                  ng-click="startHelpTour($event)" >
+            {{:locale:'COMMON.BTN_HELP_TOUR'|translate}}
+          </button>
+
+          <button type="button"
+                  class="item button button-block button-balanced button-raised icon icon-left ion-ios-world-outline ink-dark "
+                  ui-sref="app.currency" ng-if="::$root.config.readonly">
+            <span translate-values=":currency:{currency: $root.currency.name}" translate>HOME.BTN_CURRENCY</span>
+          </button>
+          <button type="button"
+                  class="item button button-block button-positive button-raised icon icon-left ion-cloud ink-dark "
+                  ui-sref="app.network" ng-if="::$root.config.readonly">
+            {{:locale:'HOME.BTN_NETWORK'|translate}}
           </button>
 
           <button type="button"
                   class="button button-block button-positive button-raised ink-dark"
-                  ng-click="showJoinModal()" ng-if="!login" translate>LOGIN.CREATE_FREE_ACCOUNT</button>
+                  ng-click="showJoinModal()" ng-if="!$root.config.readonly && !login" translate>LOGIN.CREATE_FREE_ACCOUNT</button>
 
           <button type="button"
-                  class="item button button-block button-positive button-raised icon icon-left ion-person ink-dark"
+                  class="item button button-block button-raised icon icon-left ion-person ink-dark"
+                  ng-class="{'button-stable': smallscreen, 'button-positive': !smallscreen}"
                   ui-sref="app.view_wallet" ng-show="login" translate>MENU.ACCOUNT</button>
 
           <button type="button"
-                  class="item button button-block button-positive button-raised icon icon-left ion-card ink-dark visible-xs"
-                  ui-sref="app.view_wallet_tx" ng-if="login" translate>MENU.TRANSACTIONS</button>
+                  class="item button button-block button-stable button-raised icon icon-left ion-card ink-dark visible-xs"
+                  ui-sref="app.view_wallet_tx" ng-if="login">
+            <b class="icon-secondary ion-clock" style="left: 52px; top: -2px; font-size: 10pt; display: block;"></b>
+            {{:locale:'MENU.TRANSACTIONS'|translate}}
+          </button>
+
+          <button type="button"
+                  class="item button button-block button-positive button-raised icon icon-left ion-paper-airplane ink-dark visible-xs"
+                  ng-click="showTransferModal()" ng-if="login" translate>COMMON.BTN_SEND_MONEY</button>
 
           <br class="visible-xs visible-sm"/>
 
           <!-- join link -->
-          <div class="text-center no-padding" ng-show="!login">
+          <div class="text-center no-padding"
+               ng-if="::!$root.config.readonly"
+               ng-show="!login">
             <br class="visible-xs visible-sm"/>
             {{'LOGIN.HAVE_ACCOUNT_QUESTION'|translate}}
             <b>
@@ -84,24 +119,37 @@
             <span ng-bind-html="'HOME.NOT_YOUR_ACCOUNT_QUESTION'|translate:{pubkey: walletData.pubkey}"></span>
             <br/>
             <b>
-              <a class="assertive hidden-xs hidden-sm" ng-click="logout()" translate>
+              <a class="assertive" ng-click="logout({askConfirm: true})" translate>
                 HOME.BTN_CHANGE_ACCOUNT
               </a>
             </b>
           </div>
 
+          <!-- login (small screen) -->
           <button type="button"
                   class="button button-block button-stable button-raised ink visible-xs visible-sm"
-                  ui-sref="app.view_wallet" ng-if="!login" translate>COMMON.BTN_LOGIN</button>
-          <button type="button"
-                  class="button button-block button-assertive button-raised icon icon-left ion-log-out ink-dark visible-xs visible-sm"
-                  ng-click="logout()" ng-if="login" translate>COMMON.BTN_LOGOUT</button>
+                  ui-sref="app.view_wallet" ng-if="!$root.config.readonly && !login" translate>COMMON.BTN_LOGIN</button>
+
+          <!-- Help if readonly or demo mode -->
+          <div class="text-center visible-demo">
+            <br/>
+            <p class="text-center">
+              <span class="light"><i class="icon ion-help-circled" style="font-size: 16pt;"></i></span>
+              <span class="stable" translate>MODE.DEMO.MODE_HELP</span>
+              <a href="#" ng-click="showHelpModal('demo')" translate>HOME.READ_MORE</a>
+            </p>
+          </div>
+          <p class="text-center no-padding visible-readonly">
+            <br/>
+            <span class="light"><i class="icon ion-help-circled " style="font-size: 16pt;"></i></span>
+            <span class="stable" translate>MODE.READONLY.INSTALL_HELP</span>
+          </p>
 
 
           <div class="text-center no-padding visible-xs stable">
             <br/>
             <!-- version -->
-            {{'COMMON.APP_VERSION'|translate:{version: config.version} }}
+            {{:locale:'COMMON.APP_VERSION'|translate:{version: config.version} }}
             |
             <!-- about -->
             <a href="#" ng-click="showAboutModal()" translate>HOME.BTN_ABOUT</a>
@@ -111,10 +159,12 @@
 
 
       </div>
-      <div class="col col-30 no-padding">
+      <div class="col no-padding" ng-class="{'col-30': !feed, 'col-10': feed}">&nbsp;
+      </div>
+      <div class="col col-30 no-padding" ng-if="feed">
 
         <!-- feed -->
-        <div ng-if="feed" class="feed padding padding-top">
+        <div class="feed padding-horizontal no-padding-xs padding-top">
           <h3 class="padding-left">
             <i class="icon ion-speakerphone"></i>
             {{feed.title}}
@@ -127,7 +177,7 @@
           <!-- feed items -->
           <div class="animate-show-hide ng-hide" ng-show="feed">
             <div ng-repeat="item in feed.items"
-               class="card padding ">
+               class="card padding no-margin-xs">
 
               <div class="header ">
                 <!-- author -->
diff --git a/www/templates/join/modal_choose_account_type.html b/www/templates/join/modal_choose_account_type.html
index 76b439b661d9e409ffb18935197170bc8863abaa..b04858316ed08a2a7723daa454e88ca4db3eb3c9 100644
--- a/www/templates/join/modal_choose_account_type.html
+++ b/www/templates/join/modal_choose_account_type.html
@@ -80,29 +80,32 @@
         <ion-content class="has-header padding">
           <p translate>ACCOUNT.NEW.SELECT_ACCOUNT_TYPE</p>
           <div class="list">
+            <!-- simple wallet -->
+            <button class="item item-complex card stable-bg item-icon-left item-icon-right ink"
+                    ng-click="selectAccountTypeAndClose('wallet')">
+              <div class="item-content item-text-wrap">
+                <i class="item-image icon dark ion-card"></i>
+                <h2 translate>ACCOUNT.NEW.WALLET_ACCOUNT</h2>
+                <h4 class="gray" translate>ACCOUNT.NEW.WALLET_ACCOUNT_HELP</h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
+                <i class="icon dark ion-ios-arrow-right"></i>
+              </div>
+            </button>
+
             <!-- member account -->
-            <div class="item item-complex card stable-bg item-icon-left item-icon-right ink"
-               ng-click="selectAccountTypeAndClose('member')">
+            <button class="item item-complex card stable-100-bg item-icon-left item-icon-right ink"
+                 ng-click="selectAccountTypeAndClose('member')">
               <div class="item-content item-text-wrap">
                 <i class="item-image icon dark ion-person"></i>
                 <h2 translate>ACCOUNT.NEW.MEMBER_ACCOUNT</h2>
                 <h4 class="gray" ng-bind-html="'ACCOUNT.NEW.MEMBER_ACCOUNT_HELP'|translate:currency"></h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
                 <i class="icon dark ion-ios-arrow-right"></i>
               </div>
-            </div>
+            </button>
 
             <!-- Allow extension here -->
             <cs-extension-point name="select-account-type"></cs-extension-point>
-
-            <!-- simple wallet -->
-            <div class="item item-complex card stable-bg item-icon-left item-icon-right ink"
-               ng-click="selectAccountTypeAndClose('wallet')">
-              <div class="item-content item-text-wrap">
-                <i class="item-image icon dark ion-card"></i>
-                <h2 translate>ACCOUNT.NEW.WALLET_ACCOUNT</h2>
-                <h4 class="gray" translate>ACCOUNT.NEW.WALLET_ACCOUNT_HELP</h4>
-                <i class="icon dark ion-ios-arrow-right"></i> </div>
-            </div>
           </div>
           <div class="padding hidden-xs text-right">
             <button class="button button-clear button-dark ink" ng-click="closeModal()" type="button" translate>COMMON.BTN_CANCEL
diff --git a/www/templates/join/modal_join_member.html b/www/templates/join/modal_join_member.html
index 26f62707f3712cd79a6f4029cc4560554a967650..0f13db9c89487567c2350ec8b2f123f1d9dac2e8 100644
--- a/www/templates/join/modal_join_member.html
+++ b/www/templates/join/modal_join_member.html
@@ -171,7 +171,6 @@
                        ng-minlength="8"
                        different-to="formData.pseudo"
                        required>
-                <!-- different-to="formData.pseudo" -->
                 <input ng-if="showUsername"
                        name="username" type="text" placeholder="{{'LOGIN.SALT_HELP' | translate}}"
                        ng-change="formDataChanged()"
diff --git a/www/templates/login/form_file_import.html b/www/templates/login/form_file_import.html
index 0008161a4035d56feac05af82f7e7d8c06b7066e..be3018a26a58eb4c9d24e7b3b73729fb1b5ec293 100644
--- a/www/templates/login/form_file_import.html
+++ b/www/templates/login/form_file_import.html
@@ -7,16 +7,13 @@
   <span class="positive" translate>LOGIN.FILE.HELP</span>
 </div>
 
-<div dropzone="onKeyFileDrop(file)">
-  <div ng-if="!formData.file" ng-click="openFileChooser()">
+<div drop-zone="onFileChanged(file)">
+  <div ng-if="!formData.file" file-select="onFileChanged(file)" accept=".dunikey,.yml">
     <h2 class="gray" translate>COMMON.CHOOSE_FILE</h2>
-    <input type="file" id="loginImportFile" accept=".dunikey,.yml"
-           style="visibility:hidden; position:absolute;"
-           onchange="angular.element(this).scope().fileChanged(event)"/>
   </div>
 
   <div class="item item-icon-left item-icon-right stable-bg"
-         ng-if="formData.file" >
+       ng-if="formData.file" >
     <i class="icon ion-document-text dark"></i>
     <div class="item-content row">
       <div class="col">
diff --git a/www/templates/login/form_login.html b/www/templates/login/form_login.html
index 8fe264bc7bc8892e13a89c2512700702b792bbca..084e0746b42c6384cd7b3ca94c1c8827a9fcfd40 100644
--- a/www/templates/login/form_login.html
+++ b/www/templates/login/form_login.html
@@ -26,22 +26,22 @@
 
       <!-- Form content, depending of the login method -->
       <div ng-switch-when="SCRYPT_DEFAULT">
-        <ng-include src="'templates/login/form_scrypt.html'"></ng-include>
+        <ng-include src="::'templates/login/form_scrypt.html'"></ng-include>
       </div>
       <div ng-switch-when="SCRYPT_ADVANCED">
-        <ng-include src="'templates/login/form_scrypt_advanced.html'"></ng-include>
+        <ng-include src="::'templates/login/form_scrypt_advanced.html'"></ng-include>
       </div>
       <div ng-switch-when="PUBKEY">
-        <ng-include src="'templates/login/form_pubkey.html'"></ng-include>
+        <ng-include src="::'templates/login/form_pubkey.html'"></ng-include>
       </div>
       <div ng-switch-when="FILE">
-        <ng-include src="'templates/login/form_file_import.html'"></ng-include>
+        <ng-include src="::'templates/login/form_file_import.html'"></ng-include>
       </div>
        <div ng-switch-when="SCAN">
-         <ng-include src="'templates/login/form_scan.html'"></ng-include>
+         <ng-include src="::'templates/login/form_scan.html'"></ng-include>
        </div>
       <div ng-switch-default>
-        <ng-include src="'templates/login/form_scrypt.html'"></ng-include>
+        <ng-include src="::'templates/login/form_scrypt.html'"></ng-include>
       </div>
     </div>
 
diff --git a/www/templates/login/form_scrypt_advanced.html b/www/templates/login/form_scrypt_advanced.html
index 304993129ed0f93cf38eba08835ccf76e7b1db76..e7f21f3b1b4b6cee87595dd42dcd05c4fbbbfd8a 100644
--- a/www/templates/login/form_scrypt_advanced.html
+++ b/www/templates/login/form_scrypt_advanced.html
@@ -51,5 +51,5 @@
   <span translate>INFO.FEATURES_NOT_IMPLEMENTED</span>
 </p>
 
-<ng-include src="'templates/login/form_scrypt.html'"></ng-include>
+<ng-include src="::'templates/login/form_scrypt.html'"></ng-include>
 
diff --git a/www/templates/login/modal_login.html b/www/templates/login/modal_login.html
index dd3796a354bc174bac0754956025bcb129563831..3fd53fb7b2c79be8a4f8b3138af7ab480aca6e1b 100644
--- a/www/templates/login/modal_login.html
+++ b/www/templates/login/modal_login.html
@@ -17,6 +17,6 @@
   </ion-header-bar>
 
   <ion-content scroll="true">
-    <ng-include src="'templates/login/form_login.html'"></ng-include>
+    <ng-include src="::'templates/login/form_login.html'"></ng-include>
   </ion-content>
 </ion-modal-view>
diff --git a/www/templates/menu.html b/www/templates/menu.html
index 65e5e325ce4593ee31eed8cd23d8915879bb7f1e..a3c126cbd85a211988ad7d3216cabbcae6263a47 100644
--- a/www/templates/menu.html
+++ b/www/templates/menu.html
@@ -1,5 +1,5 @@
 <ion-side-menus enable-menu-with-back-views="true"
-                bind-notifier="{locale:$root.settings.locale.id}">
+                bind-notifier="{locale: $root.settings.locale.id, peer: $root.currency.node.url}">
   <!-- HEADER -->
   <ion-side-menu-content>
     <ion-nav-bar class="bar-dark" title-align="left">
@@ -7,19 +7,24 @@
       </ion-nav-back-button>
 
       <ion-nav-buttons side="left">
-        <button class="button button-icon button-clear icon ion-navicon visible-nomenu" menu-toggle="left" ></button>
+        <button class="button button-clear visible-nomenu " menu-toggle="left" >
+          <i class="icon ion-navicon"></i>
+        </button>
       </ion-nav-buttons>
+
       <ion-nav-buttons side="right" >
 
         <!-- current node info -->
-        <button class="button button-clear hidden-xs hidden-sm gray icon-left"
-                ng-if="$root.settings.expertMode"
+        <button class="button button-clear button-peer hidden-xs hidden-sm gray"
+                ng-if="$root.config.readonly || $root.settings.expertMode"
                 style="max-width: 450px !important;"
                 ng-click="showPeerInfoPopover($event)">
-          <small class="ion-locked" ng-if="$root.currency.node.useSsl">&nbsp;</small>
-          {{$root.currency.node.host}}{{$root.currency.node.port != 80 && $root.currency.node.port != 443 ? ':'+$root.currency.node.port : ''}}
-          <small>&nbsp;</small>
-          <small class="ion-arrow-down-b"></small>
+          <span style="display: inline-flex;">
+            <small class="ion-locked" ng-if=":peer:$root.currency.node.useSsl">&nbsp;</small>
+            {{:peer:$root.currency.node.host}}{{:peer:$root.currency.node.port != 80 && $root.currency.node.port != 443 ? ':'+$root.currency.node.port : ''}}
+            <small>&nbsp;</small>
+            <small class="ion-arrow-down-b"></small>
+          </span>
         </button>
 
         <!-- Allow extension here -->
@@ -28,6 +33,7 @@
         <!-- profile -->
         <a id="helptip-header-bar-btn-profile"
            class="button button-icon button-clear hidden-xs hidden-sm"
+           ng-if="::!$root.config.readonly"
            ng-click="showProfilePopover($event)">
           <i class="avatar avatar-member"
              ng-if="!walletData.avatar"
@@ -56,6 +62,8 @@
         <span class="animate-fade-in animate-show-hide ng-hide" ng-show="$root.currency.name">
           {{:locale:'COMMON.APP_NAME'|translate}} {{$root.currency.name|abbreviate}}
         </span>
+        <a class="badge badge-assertive badge-app-mode left visible-demo" ng-click="showHelpModal('demo')">{{:locale:'MODE.DEMO.BADGE'|translate}}</a>
+        <a class="badge badge-balanced badge-app-mode right visible-readonly" ng-click="showHelpModal('readonly')">{{:locale:'MODE.READONLY.BADGE'|translate}}</a>
       </h1>
 
       <div class="visible-sm visible-xs hero">
@@ -77,10 +85,6 @@
           </h4>
           <cs-extension-point name="menu-profile-user"></cs-extension-point>
         </div>
-        <!-- logout -->
-        <a ng-if="login" class="button-icon" ng-click="logout({askConfirm: true})" style="position: absolute; top: 5px; left: 5px; z-index: 999;">
-          <i class="icon light ion-android-exit"></i>
-        </a>
 
         <!-- removeIf(device) -->
         <!-- Fullscreen button -->
@@ -91,29 +95,61 @@
           <i class="icon ion-arrow-expand dark" ng-class="{'ion-arrow-shrink': fullscreen}"></i>
         </a>
         <!-- endRemoveIf(device) -->
+
+
       </div>
+
+
     </ion-header-bar>
 
+
+
     <ion-content scroll="false" class="scroll-content ionic-scroll" ng-class="{'overflow-scroll': smallscreen, 'scroll-content-false': !smallscreen}">
       <ion-list class="list" ng-class="{'scroll': smallscreen}">
 
-        <!-- Home -->
+        <!-- *************** -->
+        <!-- Actions section -->
+        <!-- *************** -->
+
+        <ion-item menu-close
+                  class="item item-actions item-button-right visible-xs visible-sm hidden-readonly"
+                  ng-if="login"
+                  ng-class="::{'item-button-left': $root.device.barcode.enable}">
+          <!-- transfer -->
+          <button
+            class="button button-positive ink-dark "
+            ng-click="showTransferModal()">
+            <i class="icon ion-paper-airplane"></i>
+          </button>
+
+          <!-- scan QR code -->
+          <button class="button button-stable ink"
+                  ng-if="$root.device.barcode.enable"
+                  ng-click="scanQrCodeAndGo()">
+            <i class="icon ion-qr-scanner"></i>
+          </button>
+        </ion-item>
+
+        <!-- ************ -->
+        <!-- Home section -->
+        <!-- ************ -->
         <ion-item menu-close class="item-icon-left hidden-xs" ui-sref="app.home" active-link="active">
           <i class="icon ion-home"></i>
           {{:locale:'MENU.HOME'|translate}}
         </ion-item>
         <ion-item menu-close
-                  ng-if="!login"
                   class="item-icon-left visible-xs" ui-sref="app.home" active-link="active">
           <i class="icon ion-home"></i>
           {{:locale:'MENU.HOME'|translate}}
         </ion-item>
 
-        <!-- USER Section -->
-        <div class="item item-divider"></div>
+        <!-- ************ -->
+        <!-- User Section -->
+        <!-- ************ -->
+        <div class="item item-divider hidden-readonly"></div>
 
         <a menu-close
-           class="item item-icon-left"
+           class="item item-icon-left hidden-readonly"
            active-link="active"
            active-link-path-prefix="#/app/account"
            ui-sref="app.view_wallet"
@@ -124,79 +160,125 @@
         <a id="helptip-menu-btn-account"></a>
 
         <a menu-close
-           class="item item-icon-left"
+           class="item item-icon-left hidden-readonly"
            active-link="active"
            active-link-path-prefix="#/app/history"
            ui-sref="app.view_wallet_tx"
            ng-class="{'item-menu-disable': !login}">
-          <i class="icon ion-card"></i>
+          <i class="icon ion-clock" style="top: calc(100%/4); left: 25px; font-size: 10pt; display: block;"></i>
+          <b class="icon-secondary ion-card" style="top: calc(100%/2.5); left: 19px; font-size: 17pt; background-color: whitesmoke; width:17px; height: 14px;"></b>
           {{:locale:'MENU.TRANSACTIONS'|translate}}
         </a>
         <a id="helptip-menu-btn-tx"></a>
 
         <a menu-close
-           class="item item-icon-left "
+           class="item item-icon-left hidden-readonly"
            active-link="active"
            active-link-path-prefix="#/app/wallets"
            ui-sref="app.view_wallets"
            ng-class="{'item-menu-disable': !login}">
-          <i class="icon ion-card " style="top: -5px; left: 22px; font-size: 18px;"></i>
-          <i class="icon-secondary ion-card" style="top: 22px; left: 19px; font-size: 20px; background-color: white; width:17px; height: 14px;"></i>
+          <i class="icon ion-card " style="top: calc(100%/5); left: 22px; font-size: 16pt; display: block;"></i>
+          <i class="icon-secondary ion-card" style="top: 20px; left: 19px; font-size: 16pt; background-color: whitesmoke; width:17px; height: 14px;"></i>
           {{:locale:'MENU.WALLETS'|translate}}
         </a>
+        <a id="helptip-menu-btn-wallets"></a>
+
+        <div class="item item-divider visible-xs visible-sm hidden-readonly" ></div>
+
+        <!-- Allow extension here -->
+        <cs-extension-point name="menu-user" ></cs-extension-point>
+
+        <!-- *************** -->
+        <!-- Actions section -->
+        <!-- *************** -->
+
+        <ion-item class="item hidden-xs hidden-sm hidden-readonly">
+          <!-- transfer -->
+          <button class="button button-block button-small button-small-padding  icon-left icon ion-paper-airplane no-margin"
+                  ng-class="{'button-positive': login, 'button-stable': !login}"
+                  ng-click="showTransferModal()">
+            {{:locale:'COMMON.BTN_SEND_MONEY'|translate}}
+          </button>
+        </ion-item>
+
+        <!-- Spacer (large screen only) -->
+        <div class="item-spacer hidden-readonly"></div>
+
+        <!-- ************ -->
+        <!-- Main section -->
+        <!-- ************ -->
+        <div class="item item-divider hidden-readonly"></div>
 
-        <!-- MAIN Section -->
-        <div class="item item-divider"></div>
+        <!-- Help tour (NOT ready yet for small device) -->
+        <a  class="item item-icon-left item-closeable hidden-xs hidden-sm"
+                ng-show="$root.settings.helptip.enable"
+                title="{{:locale:'SETTINGS.DISABLE_HELPTIP'|translate}}"
+                ng-click="startHelpTour($event)">
+          <i class="icon ion-easel"></i>
+          {{:locale:'COMMON.BTN_HELP_TOUR'|translate}}
+
+          <span class="close"
+                ng-click="disableHelpTour($event)"></span>
+        </a>
 
         <a menu-close class="item item-icon-left"
+           id="helptip-menu-btn-wot"
            active-link="active"
            active-link-path-prefix="#/app/wot"
            ui-sref="app.wot_lookup.tab_search">
           <i class="icon ion-person-stalker"></i>
           {{:locale:'MENU.WOT'|translate}}
         </a>
-        <a id="helptip-menu-btn-wot"></a>
 
         <!-- Allow extension here -->
         <cs-extension-point name="menu-main"></cs-extension-point>
 
-        <!-- POWER USER Section -->
-        <div class="item item-divider"></div>
+        <!-- **************** -->
+        <!-- Discover section -->
+        <!-- **************** -->
 
         <a menu-close
            class="item item-icon-left"
+           id="helptip-menu-btn-currency"
            active-link="active"
            active-link-path-prefix="#/app/currency"
            ui-sref="app.currency">
           <i class="icon ion-ios-world-outline"></i>
           {{:locale:'MENU.CURRENCY'|translate}}
         </a>
-        <a id="helptip-menu-btn-currency"></a>
 
         <a menu-close
            class="item item-icon-left hidden-xs hidden-sm"
+           id="helptip-menu-btn-network"
            active-link="active"
            active-link-path-prefix="#/app/network"
            ui-sref="app.network">
           <i class="icon ion-cloud"></i>
           {{:locale:'MENU.NETWORK'|translate}}
         </a>
-        <a id="helptip-menu-btn-network"></a>
 
         <!-- Allow extension here -->
         <cs-extension-point name="menu-discover"></cs-extension-point>
 
 
-
+        <div class="item-spacer visible-readonly"></div>
 
         <div class="item item-divider visible-xs visible-sm"></div>
 
-        <!-- Allow extension here -->
-        <cs-extension-point name="menu-user"></cs-extension-point>
 
         <a menu-close
            class="item item-icon-left visible-xs visible-sm"
            active-link="active"
+           active-link-path-prefix="#/app/help"
+           ui-sref="app.help">
+          <i class="icon ion-ios-help-outline"></i>
+          {{:locale:'HOME.BTN_HELP'|translate}}
+        </a>
+
+        <a menu-close
+           class="item item-icon-left visible-xs visible-sm visible-readonly"
+           active-link="active"
+           id="menu-btn-settings"
            active-link-path-prefix="#/app/settings"
            ui-sref="app.settings">
           <i class="icon ion-android-settings"></i>
@@ -204,28 +286,15 @@
         </a>
         <a id="helptip-menu-btn-settings"></a>
 
-        <!-- actions divider -->
-        <div class="item item-divider" ng-if="login"></div>
-
-
-        <ion-item menu-close class="item  item-button-right" ng-if="login"
-          ng-class="::{'item-button-left': $root.device.barcode.enable}">
-          <!-- transfer -->
-          <button
-            class="button button-positive ink-dark"
-            ng-click="showTransferModal()">
-            <i class="icon ion-paper-airplane"></i>
-          </button>
-
-          <!-- scan QR code -->
-          <button class="button button-stable ink"
-                  ng-if="$root.device.barcode.enable"
-                  ng-click="scanQrCodeAndGo()">
-            <i class="icon ion-qr-scanner"></i>
-          </button>
-        </ion-item>
-
-        <cs-extension-point name="menu-actions"></cs-extension-point>
+        <!-- logout -->
+        <div class="item item-divider visible-xs visible-sm margin-top"  ng-if="login"></div>
+        <a menu-close
+           ng-if="login"
+           class="item item-icon-left visible-xs visible-sm"
+           ng-click="logout({askConfirm: true})">
+          <i class="icon ion-log-out assertive"></i>
+          <span class="assertive" translate> {{:locale:'COMMON.BTN_LOGOUT'|translate}}</span>
+        </a>
 
       </ion-list>
 
diff --git a/www/templates/modal_about.html b/www/templates/modal_about.html
index 425d3c531bdb851ce1232798c808326f46e4a2be..d8113a5a6ccfcf72807dd248a685e8ecfb18ba5d 100644
--- a/www/templates/modal_about.html
+++ b/www/templates/modal_about.html
@@ -11,7 +11,7 @@
       <ion-item class="item-icon-left item-text-wrap">
         <span>{{'COMMON.APP_NAME'|translate}}&nbsp;<b>{{'COMMON.APP_VERSION'|translate:$root.config}}</b> - <a ng-click="openLink($event, 'http://cesium.app')">www.cesium.app</a></span>
         <i ng-if="$root.newRelease" class="assertive ion-alert-circled"></i>
-        <h3 ng-if="$root.config.build" class="gray">{{'COMMON.APP_BUILD'|translate:$root.config}}</h3>
+        <h3 ng-if="buildDate" class="gray">{{'COMMON.APP_BUILD'|translate:{build: buildDate} }}</h3>
         <span translate>ABOUT.LICENSE</span>
       </ion-item>
 
@@ -57,7 +57,7 @@
       <ion-item class="item-icon-left">
         <i class="item-image icon ion-network"></i>
         {{'ABOUT.CODE' | translate}}
-        <h3><a ng-click="openLink($event, 'https://git.duniter.org/clients/cesium-grp/cesium')">https://git.duniter.org/clients/cesium-grp/cesium</a></h3>
+        <h3><a ng-click="openLink($event, $root.settings.sourceUrl)">{{$root.settings.sourceUrl}}</a></h3>
       </ion-item>
 
       <!-- team -->
diff --git a/www/templates/network/item_content_peer.html b/www/templates/network/item_content_peer.html
index 54a79865e2bddd1a92c7bbbf82efeea84b719b0d..5ccee2c5ffbf80e9af9a8ccc3c40e2961aba3f49 100644
--- a/www/templates/network/item_content_peer.html
+++ b/www/templates/network/item_content_peer.html
@@ -5,13 +5,13 @@
     <b class="icon-secondary ion-person" ng-if=":rebind:!peer.avatar"
        ng-class=":rebind:{'balanced': peer.online && peer.hasMainConsensusBlock, 'energized': peer.online && peer.hasConsensusBlock, 'gray': peer.online && !peer.hasConsensusBlock && !peer.hasMainConsensusBlock, 'stable': !peer.online}"
        style="left: 26px; top: -3px;"></b>
-    <i class="avatar" ng-if=":rebind:peer.avatar" style="background-image: url('{{:rebind:peer.avatar.src}}')"></i>
+    <i class="avatar" ng-if="::peer.avatar" style="background-image: url('{{::peer.avatar.src}}')"></i>
     <b class="icon-secondary assertive ion-close-circled" ng-if=":rebind:!peer.online" style="left: 37px; top: -10px;"></b>
 
     <div class="row no-padding">
       <div class="col no-padding">
         <h3 class="dark" ng-if=":rebind:!peer.bma.private">{{:rebind:peer.dns || peer.server}}</h3>
-        <h4 class="gray" ng-if=":rebind:peer.bma.private"><i class="ion-flash"></i> {{'NETWORK.VIEW.PRIVATE_ACCESS'|translate}}</h4>
+        <h4 class="gray" ng-if=":rebind:peer.bma.private"><i class="ion-flash"></i> {{:locale:'NETWORK.VIEW.PRIVATE_ACCESS'|translate}}</h4>
         <h4>
           <span class="gray" ng-if=":rebind:!peer.uid">
             <i class="ion-key"></i> {{:rebind:peer.pubkey|formatPubkey}}
@@ -61,7 +61,7 @@
       <div class="col col-20 no-padding text-center">
         <span id="{{$index === 0 ? helptipPrefix + '-peer-0-block' : ''}}"
             class="badge" ng-class=":rebind:{'badge-balanced': peer.hasMainConsensusBlock, 'badge-energized': peer.hasConsensusBlock, 'ng-hide': !peer.currentNumber && !peer.blockNumber }">
-          {{::!expertMode ? ('COMMON.BLOCK'|translate) : '' }}
+          {{:locale:!expertMode ? ('COMMON.BLOCK'|translate) : '' }}
           {{:rebind:(peer.currentNumber || peer.blockNumber) | formatInteger}}</span>
         <span class="badge badge-secondary" ng-if=":rebind:peer.consensusBlockDelta && expertMode">
           <i class="ion-clock"></i>&nbsp;
diff --git a/www/templates/network/items_peers.html b/www/templates/network/items_peers.html
index 48e4be65d0e852a685277e042d87cbb5d17ea4dd..4a11311ed51524d71a86ebc2eae2c9f711f61ea9 100644
--- a/www/templates/network/items_peers.html
+++ b/www/templates/network/items_peers.html
@@ -1,37 +1,37 @@
 <div class="no-padding {{::motion.ionListClass}}">
 
   <div class="item item-text-wrap no-border done in gray no-padding-top no-padding-bottom inline text-italic" ng-if="::isHttps && expertMode">
-    <small><i class="icon ion-alert-circled"></i> {{'NETWORK.INFO.ONLY_SSL_PEERS'|translate}}</small>
+    <small><i class="icon ion-alert-circled"></i> {{:locale:'NETWORK.INFO.ONLY_SSL_PEERS'|translate}}</small>
   </div>
 
   <div class="item row row-header hidden-xs hidden-sm done in" ng-if="::expertMode">
     <a class="col col-header no-padding dark" ng-click="toggleSort('uid')">
       <cs-sort-icon asc="search.asc" sort="search.sort" toggle="'uid'"></cs-sort-icon>
-      {{'COMMON.UID' | translate}} / {{'COMMON.PUBKEY' | translate}}
+      {{:locale:'COMMON.UID' | translate}} / {{:locale:'COMMON.PUBKEY' | translate}}
     </a>
     <!-- API header -->
     <a class="no-padding dark hidden-md col col-15 col-header"
        ng-click="toggleSort('api')" ng-if=":rebind:!compactMode">
       <cs-sort-icon asc="search.asc" sort="search.sort" toggle="'api'"></cs-sort-icon>
-      {{'PEER.API' | translate}}
+      {{:locale:'PEER.API' | translate}}
     </a>
     <div class="no-padding dark hidden-md col col-15 col-header" ng-if=":rebind:compactMode"></div>
 
     <a class="no-padding dark col col-20 col-header"
        ng-click="toggleSort('difficulty')">
       <cs-sort-icon asc="search.asc" sort="search.sort" toggle="'difficulty'"></cs-sort-icon>
-      {{'PEER.DIFFICULTY' | translate}}
+      {{:locale:'PEER.DIFFICULTY' | translate}}
     </a>
     <a class="col col-20 col-header no-padding dark" ng-click="toggleSort('current_block')">
       <cs-sort-icon asc="search.asc" sort="search.sort" toggle="'current_block'"></cs-sort-icon>
-      {{'PEER.CURRENT_BLOCK' | translate}}
+      {{:locale:'PEER.CURRENT_BLOCK' | translate}}
     </a>
   </div>
 
-  <div ng-repeat="peer in :rebind:search.results track by peer.id"
+  <div ng-repeat="peer in search.results track by peer.id"
        class="item item-peer item-icon-left ink {{::ionItemClass}}"
        ng-class=":rebind:{'compacted': peer.compacted && compactMode}"
-       id="{{::helptipPrefix}}-peer-{{::$index}}"
+       ng-attr-id="{{::($index === 0 ? (helptipPrefix + '-peer-0') : undefined)}}"
        ng-click="selectPeer(peer)"
        ng-include="::'templates/network/item_content_peer.html'">
   </div>
diff --git a/www/templates/network/modal_network.html b/www/templates/network/modal_network.html
index c627cd7029478fc41467868d23cfdd8bd27e9ae4..e64b4d15c3dadcd1e563abf3c9605a1a4974c2f3 100644
--- a/www/templates/network/modal_network.html
+++ b/www/templates/network/modal_network.html
@@ -50,7 +50,7 @@
         </div>
       </div>
 
-      <ng-include src="'templates/network/items_peers.html'"></ng-include>
+      <ng-include src="::'templates/network/items_peers.html'"></ng-include>
 
 	  </div>
   </ion-content>
diff --git a/www/templates/network/popover_network.html b/www/templates/network/popover_network.html
index c62df9e33a043ee1c5b91f0baa4e8d449d15c5ee..04a2e9d7b3db6b9a685be313a6c4ab0aa78bcfba 100644
--- a/www/templates/network/popover_network.html
+++ b/www/templates/network/popover_network.html
@@ -14,7 +14,7 @@
   </ion-header-bar>
   <ion-content  scroll="true">
     <div class="list no-padding">
-      <ng-include src="'templates/network/items_peers.html'"></ng-include>
+      <ng-include src="::'templates/network/items_peers.html'"></ng-include>
     </div>
   </ion-content>
 
diff --git a/www/templates/network/view_network.html b/www/templates/network/view_network.html
index 15c7f6d25a46782e9f673a913f17c7e72a4ec375..98ae3d18188eca2b4dd86ceddd304a8d9f830240 100644
--- a/www/templates/network/view_network.html
+++ b/www/templates/network/view_network.html
@@ -34,12 +34,12 @@
                 <i class="icon ion-navicon"></i>
                 <b class="ion-arrow-down-b" style="position: absolute; top: -2px; left: 4px; font-size: 8px;"></b>
                 <b class="ion-arrow-up-b" style="position: absolute; top: 10px; left: 4px; font-size: 8px;"></b>
-                <span>{{'BLOCKCHAIN.LOOKUP.BTN_COMPACT'|translate}}</span>
+                <span>{{:locale:'BLOCKCHAIN.LOOKUP.BTN_COMPACT'|translate}}</span>
               </a>
 
               <a class="button button-text button-small hidden-xs hidden-sm ink"
                  ng-class="{'button-text-positive': search.type=='member'}"
-                 title="{{'PEER.MEMBER_PEERS'|translate}}"
+                 title="{{:locale:'PEER.MEMBER_PEERS'|translate}}"
                  ng-click="toggleSearchType('member')">
                 <i class="icon ion-person-stalker"></i>
                 {{'PEER.MEMBERS'|translate}}
@@ -50,7 +50,7 @@
                  title="{{'PEER.MIRROR_PEERS'|translate}}"
                  ng-click="toggleSearchType('mirror')" >
                 <i class="icon ion-radio-waves"></i>
-                {{'PEER.MIRRORS'|translate}}
+                {{:locale:'PEER.MIRRORS'|translate}}
               </a>
 
               <a class="button button-text button-small hidden-xs hidden-sm ink"
@@ -58,7 +58,7 @@
                  title="{{'PEER.OFFLINE_PEERS'|translate}}"
                  ng-click="toggleSearchType('offline')" >
                 <i class="icon ion-close-circled light-gray"></i>
-                <span>{{'PEER.OFFLINE'|translate}}</span>
+                <span>{{:locale:'PEER.OFFLINE'|translate}}</span>
               </a>
 
               <!-- Allow extension here -->
@@ -71,7 +71,7 @@
         <div id="helptip-network-blockchain" style="display: block"></div>
         <div id="helptip-network-peers" style="display: block"></div>
 
-        <ng-include src="'templates/network/items_peers.html'"></ng-include>
+        <ng-include src="::'templates/network/items_peers.html'"></ng-include>
       </div>
 
       <div class="col col-33" ng-controller="BlockLookupCtrl">
@@ -86,7 +86,7 @@
               <i class="icon ion-navicon"></i>
               <b class="icon-secondary ion-arrow-down-b" style="top: -8px; left: 5px; font-size: 8px;"></b>
               <b class="icon-secondary ion-arrow-up-b" style="top: 4px; left: 5px; font-size: 8px;"></b>
-              <span>{{'BLOCKCHAIN.LOOKUP.BTN_COMPACT'|translate}}</span>
+              <span>{{:locale:'BLOCKCHAIN.LOOKUP.BTN_COMPACT'|translate}}</span>
             </a>
 
             <!-- Allow extension here -->
@@ -95,7 +95,7 @@
           </div>
         </div>
 
-        <ng-include src="'templates/blockchain/list_blocks.html'"></ng-include>
+        <ng-include src="::'templates/blockchain/list_blocks.html'"></ng-include>
       </div>
     </div>
   </ion-content>
diff --git a/www/templates/network/view_peer.html b/www/templates/network/view_peer.html
index b081f75939d63df63d3250f134743a2f5048d832..aa096e35fbb9e94bedbe3bfa496793af315d05e8 100644
--- a/www/templates/network/view_peer.html
+++ b/www/templates/network/view_peer.html
@@ -123,7 +123,7 @@
           <div ng-repeat="peer in :rebind:peers track by peer.id"
                class="item item-peer item-icon-left ink {{::ionItemClass}}"
                ng-click="selectPeer(peer)"
-               ng-include="'templates/network/item_content_peer.html'">
+               ng-include="::'templates/network/item_content_peer.html'">
           </div>
 
         </div>
diff --git a/www/templates/settings/settings.html b/www/templates/settings/settings.html
index 9c11718cae960999a5685c65225ba8ccca3e3349..9be97a6fd8ada91d7a3a3653baf6fbafc1606201 100644
--- a/www/templates/settings/settings.html
+++ b/www/templates/settings/settings.html
@@ -91,7 +91,7 @@
         </div>
 
         <!-- Persist cache ? -->
-        <div class="item item-text-wrap item-toggle dark hidden-xs hidden-sm">
+        <div class="item item-text-wrap item-toggle dark">
           <div class="input-label" ng-class="{'gray': !formData.useLocalStorage}"
                ng-bind-html="'SETTINGS.PERSIST_CACHE' | translate"></div>
           <h4 class="gray" ng-bind-html="'SETTINGS.PERSIST_CACHE_HELP' | translate"></h4>
@@ -107,11 +107,11 @@
         <!-- Allow extension here -->
         <cs-extension-point name="common"></cs-extension-point>
 
-        <span class="item item-divider">
+        <span class="item item-divider hidden-readonly">
           {{'SETTINGS.AUTHENTICATION_SETTINGS' | translate}}
         </span>
 
-        <div class="item item-toggle item-text-wrap" >
+        <div class="item item-toggle item-text-wrap hidden-readonly" >
           <div class="input-label" ng-class="{'gray': !formData.useLocalStorage}">
             {{'SETTINGS.REMEMBER_ME' | translate}}
           </div>
@@ -126,16 +126,20 @@
           </label>
         </div>
 
-        <label class="item item-input item-select item-text-wrap">
-          <div class="input-label hidden-xs">
+        <label class="item item-input item-select item-text-wrap hidden-readonly"
+               >
+          <div class="input-label hidden-xs" ng-class="::{'gray': $root.config.demo}">
             <span class="hidden-xs" translate>SETTINGS.KEEP_AUTH</span>
             <h4 class="gray text-wrap hidden-xs" ng-bind-html="'SETTINGS.KEEP_AUTH_HELP' | translate"></h4>
+            <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
           </div>
-          <span class="visible-xs" translate>SETTINGS.KEEP_AUTH_SHORT</span>
+          <span class="visible-xs" ng-class="::{'gray': $root.config.demo}" translate>SETTINGS.KEEP_AUTH_SHORT</span>
 
           <select ng-model="formData.keepAuthIdle"
+                  ng-disabled="$root.config.demo"
                   ng-options="i as (keepAuthIdleLabels[i].labelKey | translate:keepAuthIdleLabels[i].labelParams ) for i in keepAuthIdles track by i">
           </select>
+
         </label>
 
         <div class="item item-input hidden-xs hidden-sm" ng-class="{'gray': (!formData.useLocalStorage || !formData.rememberMe)}" ng-if="::$root.device.isDesktop()">
@@ -151,11 +155,11 @@
       <!-- second column  -->
       <div class="col col-50 list item-border-large padding-left padding-right no-padding-xs no-padding-sm no-margin-xs no-margin-sm">
 
-        <span class="item item-divider">
+        <span class="item item-divider hidden-readonly">
           {{'SETTINGS.WALLETS_SETTINGS' | translate}}
         </span>
 
-          <div class="item item-toggle item-text-wrap dark">
+          <div class="item item-toggle item-text-wrap dark hidden-readonly">
             <span class="input-label" ng-class="{'gray': !formData.useLocalStorage}" translate>SETTINGS.USE_WALLETS_ENCRYPTION</span>
             <h4 class="gray text-wrap" ng-bind-html="'SETTINGS.USE_WALLETS_ENCRYPTION_HELP' | translate">
             </h4>
@@ -168,9 +172,9 @@
             </label>
           </div>
 
-        <span class="item item-divider" translate>SETTINGS.HISTORY_SETTINGS</span>
+        <span class="item item-divider hidden-readonly" translate>SETTINGS.HISTORY_SETTINGS</span>
 
-        <div class="item item-toggle item-text-wrap dark">
+        <div class="item item-toggle item-text-wrap dark hidden-readonly">
           <div class="input-label" translate>SETTINGS.DISPLAY_UD_HISTORY</div>
           <label class="toggle toggle-royal">
             <input type="checkbox" ng-model="formData.showUDHistory" >
@@ -180,7 +184,7 @@
           </label>
         </div>
 
-        <div class="item item-toggle dark hidden-xs hidden-sm">
+        <div class="item item-toggle dark hidden-xs hidden-sm hidden-readonly">
           <div class="input-label" translate>SETTINGS.TX_HISTORY_AUTO_REFRESH</div>
           <h4 class="gray text-wrap" ng-bind-html="'SETTINGS.TX_HISTORY_AUTO_REFRESH_HELP' | translate"></h4>
           <label class="toggle toggle-royal">
diff --git a/www/templates/wallet/list/modal_import_file.html b/www/templates/wallet/list/modal_import_file.html
index 9144ade05c660d293d5157224ea2be0478198de6..6dd572e926e5be387b1bc7701875a5ee90170700 100644
--- a/www/templates/wallet/list/modal_import_file.html
+++ b/www/templates/wallet/list/modal_import_file.html
@@ -1,6 +1,6 @@
 <ion-modal-view id="transfer" class="modal-full-height">
   <ion-header-bar class="bar-positive">
-    <button class="button button-clear" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>
+    <button class="button button-clear visible-xs" ng-click="closeModal()" translate>COMMON.BTN_CANCEL</button>
     <h1 class="title" translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.TITLE</h1>
   </ion-header-bar>
 
@@ -8,11 +8,11 @@
 
     <p translate>ACCOUNT.WALLET_LIST.IMPORT_MODAL.HELP</p>
 
-    <div dropzone="importFromFile(file)">
-      <div ng-if="!hasContent" onclick="angular.element(document.querySelector('#walletsImportFile'))[0].click();">
+    <div drop-zone="onFileChanged(file)">
+      <div ng-if="!hasContent"
+           file-select="onFileChanged(file)"
+           accept=".csv,.txt">
         <h2 class="gray" translate>COMMON.CHOOSE_FILE</h2>
-        <input type="file" id="walletsImportFile" accept=".csv,.txt"
-               style="visibility:hidden; position:absolute;" on-read-file="importFromFile(file)"/>
       </div>
 
       <div ng-if="hasContent" class="item item-icon-left item-icon-right stable-bg">
diff --git a/www/templates/wallet/list/modal_wallets.html b/www/templates/wallet/list/modal_wallets.html
index cd2d769a8b6942d91ce6d2d2e525735f5fdb6527..7c5d22160ff5d69100bfa999d69caa0358942c28 100644
--- a/www/templates/wallet/list/modal_wallets.html
+++ b/www/templates/wallet/list/modal_wallets.html
@@ -19,7 +19,7 @@
       </ng-include>
 
       <ng-repeat ng-repeat="wallet in wallets track by wallet.id"
-                 ng-include="'templates/wallet/list/item_wallet_light.html'">
+                 ng-include="::'templates/wallet/list/item_wallet_light.html'">
       </ng-repeat>
     </ion-list>
 
diff --git a/www/templates/wallet/list/popover_wallets.html b/www/templates/wallet/list/popover_wallets.html
index 458d603b401be0f7407a96c8008ea7ecba547b18..d19a89e37404dfb14fdcdd905088ff3e1122a84b 100644
--- a/www/templates/wallet/list/popover_wallets.html
+++ b/www/templates/wallet/list/popover_wallets.html
@@ -24,7 +24,7 @@
       </ng-include>
 
       <ng-repeat ng-repeat="wallet in :rebind:wallets | filter:filterFn(formData) track by wallet.id"
-                 ng-include="'templates/wallet/list/item_wallet_light.html'">
+                 ng-include="::'templates/wallet/list/item_wallet_light.html'">
 
       </ng-repeat>
     </ion-list>
diff --git a/www/templates/wallet/modal_security.html b/www/templates/wallet/modal_security.html
index fc3d7d67ca9e599ea3c6a66a791ca334a2445bbf..814694fcddc73e8a11c32567aa309c6999a31a45 100644
--- a/www/templates/wallet/modal_security.html
+++ b/www/templates/wallet/modal_security.html
@@ -41,12 +41,14 @@
                 <b class="ion-ios-undo icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b>
                 <h2 translate>ACCOUNT.SECURITY.RECOVER_ID</h2>
                 <h4 class="gray" translate>ACCOUNT.SECURITY.RECOVER_ID_HELP</h4>
-                <i class="icon dark ion-ios-arrow-right"></i>
+
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
+                <i class="icon dark ion-ios-arrow-right" ng-if="::!$root.config.demo"></i>
               </div>
             </div>
 
             <div class="item item-complex card stable-bg item-icon-left item-icon-right ink"
-                 ng-click="selectOption('revocation')" ng-if="!login">
+                 ng-click="selectOption('revocation', true)" ng-if="!login">
               <div class="item-content item-text-wrap">
                 <i class="item-image dark icon ion-person"></i>
                 <b class="ion-close icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b>
@@ -64,6 +66,7 @@
                 <b class="ion-locked icon-secondary dark" style="top: 0px; left: 40px; font-size: 8px;"></b>
                 <h2 translate>ACCOUNT.SECURITY.SAVE_ID</h2>
                 <h4 class="gray" translate>ACCOUNT.SECURITY.SAVE_ID_HELP</h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
                 <i class="icon dark ion-ios-arrow-right"></i>
               </div>
             </div>
@@ -76,6 +79,7 @@
                 <b class="ion-key icon-secondary dark" style="top: -8px; left: 42px; font-size: 12px;"></b>
                 <h2 translate>ACCOUNT.SECURITY.GENERATE_KEYFILE</h2>
                 <h4 class="gray" translate>ACCOUNT.SECURITY.GENERATE_KEYFILE_HELP</h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
                 <i class="icon dark ion-ios-arrow-right"></i>
               </div>
             </div>
@@ -88,6 +92,7 @@
                 <b class="ion-close icon-secondary dark" style="top: 0px; left: 40px; font-size: 8px;"></b>
                 <h2 translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE</h2>
                 <h4 class="gray" translate>ACCOUNT.SECURITY.DOWNLOAD_REVOKE_HELP</h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
                 <i class="icon dark ion-android-archive"></i>
               </div>
             </div>
@@ -99,6 +104,7 @@
                 <b class="ion-flag icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b>
                 <h2 translate>ACCOUNT.SECURITY.SEND_IDENTITY</h2>
                 <h4 class="gray" ng-bind-html="::'ACCOUNT.SECURITY.SEND_IDENTITY_HELP' | translate"></h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
               </div>
             </div>
 
@@ -109,6 +115,7 @@
                 <b class="ion-plus icon-secondary dark" style="top: -8px; left: 39px; font-size: 12px;"></b>
                 <h2 translate>ACCOUNT.SECURITY.MEMBERSHIP_IN</h2>
                 <h4 class="gray" ng-bind-html="::'ACCOUNT.SECURITY.MEMBERSHIP_IN_HELP' | translate"></h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
               </div>
             </div>
 
@@ -119,6 +126,7 @@
                 <b class="ion-close icon-secondary assertive-900" style="top: -8px; left: 39px; font-size: 12px;"></b>
                 <h2 translate>ACCOUNT.SECURITY.REVOCATION_WALLET</h2>
                 <h4 class="gray" translate>ACCOUNT.SECURITY.REVOCATION_WALLET_HELP</h4>
+                <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
               </div>
             </div>
           </div>
@@ -132,28 +140,28 @@
       </ion-slide-page>
 
       <ion-slide-page ng-if="option == 'revocation'">
-        <ng-include src="'templates/wallet/slides/slides_revocation_file.html'"></ng-include>
+        <ng-include src="::'templates/wallet/slides/slides_revocation_file.html'"></ng-include>
       </ion-slide-page>
 
       <ion-slide-page ng-if="login && option == 'saveID'">
-        <ng-include src="'templates/wallet/slides/slides_saveID_1.html'"></ng-include>
+        <ng-include src="::'templates/wallet/slides/slides_saveID_1.html'"></ng-include>
       </ion-slide-page>
       <ion-slide-page ng-if="login && option == 'saveID'">
-        <ng-include src="'templates/wallet/slides/slides_saveID_2.html'"></ng-include>
+        <ng-include src="::'templates/wallet/slides/slides_saveID_2.html'"></ng-include>
       </ion-slide-page>
 
       <ion-slide-page ng-if="option == 'recoverID'">
-        <ng-include src="'templates/wallet/slides/slides_recoverID_1.html'"></ng-include>
+        <ng-include src="::'templates/wallet/slides/slides_recoverID_1.html'"></ng-include>
       </ion-slide-page>
       <ion-slide-page ng-if="option == 'recoverID'">
-        <ng-include src="'templates/wallet/slides/slides_recoverID_2.html'"></ng-include>
+        <ng-include src="::'templates/wallet/slides/slides_recoverID_2.html'"></ng-include>
       </ion-slide-page>
       <ion-slide-page ng-if="option == 'recoverID'">
-        <ng-include src="'templates/wallet/slides/slides_recoverID_3.html'"></ng-include>
+        <ng-include src="::'templates/wallet/slides/slides_recoverID_3.html'"></ng-include>
       </ion-slide-page>
 
       <ion-slide-page ng-if="login && option == 'generateKeyfile'">
-        <ng-include src="'templates/wallet/slides/slides_generate_keyfile.html'"></ng-include>
+        <ng-include src="::'templates/wallet/slides/slides_generate_keyfile.html'"></ng-include>
       </ion-slide-page>
 
     </ion-slides>
diff --git a/www/templates/wallet/modal_transfer.html b/www/templates/wallet/modal_transfer.html
index b79a969cf3c6efce396931a440240bb43c9ef4c6..3fe3a3c4609dcabe0362810a7a02613df59112bc 100644
--- a/www/templates/wallet/modal_transfer.html
+++ b/www/templates/wallet/modal_transfer.html
@@ -8,7 +8,7 @@
   </ion-header-bar>
 
   <ion-content>
-    <ng-include src="'templates/wallet/transfer_form.html'"></ng-include>
+    <ng-include src="::'templates/wallet/transfer_form.html'"></ng-include>
   </ion-content>
   <!-- Digit keyboard - fix #30 -->
   <ion-digit-keyboard settings="digitKeyboardSettings" ng-if="digitKeyboardVisible"></ion-digit-keyboard>
diff --git a/www/templates/wallet/new_transfer.html b/www/templates/wallet/new_transfer.html
index d1a6fc1d45f5cfaeb9a9ba7192f1dc911ebf3b98..7e81b08b40c7e6ccd29c5a24fe5966aae9fe55d2 100644
--- a/www/templates/wallet/new_transfer.html
+++ b/www/templates/wallet/new_transfer.html
@@ -17,7 +17,7 @@
           {{(formData.all ? 'TRANSFER.SUB_TITLE_ALL' : 'TRANSFER.SUB_TITLE')|translate}}
         </h2>
         <h4 class="hidden-xs hidden-sm">&nbsp;</h4>
-        <ng-include src="'templates/wallet/transfer_form.html'"></ng-include>
+        <ng-include src="::'templates/wallet/transfer_form.html'"></ng-include>
       </div>
       <div class="col col-20 hidden-xs hidden-sm">&nbsp;</div>
     </div>
diff --git a/www/templates/wallet/slides/slides_generate_keyfile.html b/www/templates/wallet/slides/slides_generate_keyfile.html
index f05c29f4a6def14ff2e8a2f18889c1fce0365894..7f1581123af5c720346ba68854fc684ee13c0a6a 100644
--- a/www/templates/wallet/slides/slides_generate_keyfile.html
+++ b/www/templates/wallet/slides/slides_generate_keyfile.html
@@ -12,6 +12,7 @@
           <b class="ion-ios-redo icon-secondary dark" style="top: -8px; left: 42px; font-size: 12px;"></b>
           <h2 translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT</h2>
           <h4 class="gray" translate>ACCOUNT.SECURITY.KEYFILE.PUBSEC_FORMAT_HELP</h4>
+          <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
           <i class="icon dark ion-ios-arrow-right"></i>
         </div>
       </div>
@@ -23,6 +24,7 @@
           <b class="ion-ios-redo icon-secondary dark" style="top: -8px; left: 42px; font-size: 12px;"></b>
           <h2 translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT</h2>
           <h4 class="gray" translate>ACCOUNT.SECURITY.KEYFILE.WIF_FORMAT_HELP</h4>
+          <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
           <i class="icon dark ion-ios-arrow-right"></i>
         </div>
       </div>
@@ -35,6 +37,7 @@
           <b class="ion-locked icon-secondary dark" style="top: 0px; left: 43px; font-size: 8px;"></b>
           <h2 translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT</h2>
           <h4 class="gray" translate>ACCOUNT.SECURITY.KEYFILE.EWIF_FORMAT_HELP</h4>
+          <ng-if ng-if="::$root.config.demo" ng-include="::'templates/common/note_feature_not_available.html'"></ng-include>
           <i class="icon dark ion-ios-arrow-right"></i>
         </div>
       </div>
diff --git a/www/templates/wallet/slides/slides_recoverID_1.html b/www/templates/wallet/slides/slides_recoverID_1.html
index d2be1194284cb66c31e766b73f83b8504c06cd36..888c00a04b464566a6a8ac97e4c99a6035cf3428 100644
--- a/www/templates/wallet/slides/slides_recoverID_1.html
+++ b/www/templates/wallet/slides/slides_recoverID_1.html
@@ -1,26 +1,27 @@
 <ion-content class="has-header padding" >
-  <h3 translate>ACCOUNT.SECURITY.RECOVER_ID</h3>
+  <p translate>ACCOUNT.SECURITY.RECOVER_ID_SELECT_FILE</p>
 
-  <div dropzone="recoverContent(file)">
-    <div ng-if="!hasContent" onclick="angular.element(document.querySelector('#saveIdFile'))[0].click();">
+  <div drop-zone="onFileChanged(file)">
+    <div ng-if="!hasContent" file-select="onFileChanged(file)" accept=".txt">
       <h2 class="gray" translate>COMMON.CHOOSE_FILE</h2>
-      <input type="file" id="saveIdFile" accept=".txt"
-             style="visibility:hidden; position:absolute;" on-read-file="recoverContent(file)"/>
     </div>
 
-    <div ng-if="hasContent" class="item row item-icon-left no-padding">
-     <i class="icon ion-document-text gray"></i>
-     <div class="col">
-       <span>{{fileData.name}}</span>
-       <br />
-       <small>{{fileData.size}} Ko</small>
-     </div>
-     <div class="col-10">
-       <b ng-class="{'ion-android-done balanced': isValidFile,'ion-close-circled assertive': !isValidFile}"
-          style="font-size: 28px; position: relative; top: 6px;"></b>
-        <button class="button-icon ion-close-round gray pull-right" style="font-size:10px;"
-                ng-click="restore()"></button>
-     </div>
+    <div ng-if="hasContent" class="item item-icon-left item-icon-right">
+     <i class="icon ion-document-text dark"></i>
+      <div class="item-content row">
+         <div class="col ">
+           <span>{{fileData.name}}</span>
+           <br />
+           <small>{{fileData.size}} Ko</small>
+         </div>
+         <div class="col-10">
+           <b ng-class="{'ion-close-circled assertive': !isValidFile}"
+              style="font-size: 28px; position: relative; top: 6px;"></b>
+         </div>
+      </div>
+      <!-- remove file button -->
+      <a class="ion-close-round gray pull-right" style="font-size: 10px; position: absolute; top: 6px; right: 6px;"
+         ng-click="restore()"></a>
    </div>
   </div>
 
diff --git a/www/templates/wallet/slides/slides_recoverID_2.html b/www/templates/wallet/slides/slides_recoverID_2.html
index 417951b76a5588bd11bf2023568a0e8ccc81f464..eadde239d3a8ad9e67f545f69b73f67d77fe5a3a 100644
--- a/www/templates/wallet/slides/slides_recoverID_2.html
+++ b/www/templates/wallet/slides/slides_recoverID_2.html
@@ -7,7 +7,9 @@
           <label class="item item-input {{smallscreen ? 'item-stacked-label' : 'item-floating-label'}}"
                  ng-class="{'item-input-error': recoverForm.$submitted && recoverForm['question{{$index}}'].$invalid}">
             <span class="input-label" style="{{smallscreen ? 'white-space: normal' : ''}}">{{question.value }}</span>
-            <input type="text" name="question{{$index}}" placeholder="{{smallscreen ? '' : question.value }}" ng-model="question.answer" required />
+            <input type="text"
+                   autocomplete="off"
+                   name="question{{$index}}" placeholder="{{smallscreen ? '' : question.value }}" ng-model="question.answer" required />
           </label>
           <div class="form-errors"
                ng-show="recoverForm.$submitted && recoverForm['question{{$index}}'].$error"
diff --git a/www/templates/wallet/slides/slides_revocation_file.html b/www/templates/wallet/slides/slides_revocation_file.html
index dc31d88b3ffe3a848667593aa33b0ef6706762f1..945031dc5fa05d82ad9616da56c2342e2b6af0f1 100644
--- a/www/templates/wallet/slides/slides_revocation_file.html
+++ b/www/templates/wallet/slides/slides_revocation_file.html
@@ -1,26 +1,34 @@
 <ion-content class="has-header padding" >
   <p translate>ACCOUNT.SECURITY.REVOCATION_WITH_FILE_HELP</p>
 
-  <div dropzone="recoverContent(file)">
-    <div ng-if="!hasContent" onclick="angular.element(document.querySelector('#revocationFile'))[0].click();">
+  <div drop-zone="onFileChanged(file)">
+    <div ng-if="!hasContent" file-select="onFileChanged(file)" accept=".txt">
       <h2 class="gray" translate>COMMON.CHOOSE_FILE</h2>
-      <input type="file" id="revocationFile" accept=".txt"
-             style="visibility:hidden; position:absolute;" on-read-file="recoverContent(file)"/>
     </div>
 
-    <div ng-if="hasContent" class="item row item-icon-left no-padding">
-      <i class="icon ion-document-text gray"></i>
-      <div class="col">
-        <span>{{fileData.name}}</span>
-        <br />
-        <small>{{fileData.size}} Ko</small>
-      </div>
-      <div class="col-10">
-        <b ng-class="{'ion-android-done balanced': isValidFile,'ion-close-circled assertive': !isValidFile}"
-           style="font-size: 28px; position: relative; top: 6px;"></b>
-        <button class="button-icon ion-close-round gray pull-right" style="font-size:10px;"
-                ng-click="restore()"></button>
+    <div ng-if="hasContent" class="item item-icon-left item-icon-right">
+      <i class="icon ion-document-text dark"></i>
+      <div class="row">
+        <div class="col">
+          <h2>{{fileData.name}}</h2>
+          <h4 ng-if="fileData.lastModified">
+            <span class="gray" translate>COMMON.FILE.DATE</span> {{fileData.lastModified/1000|formatDate}}
+          </h4>
+          <h5>
+            <span class="gray" translate>COMMON.FILE.SIZE</span> {{fileData.size|formatInteger}} Ko
+          </h5>
+        </div>
+        <div class="col padding-left">
+          <h3 class="assertive animate-show-hide ng-hide" ng-show="!isValidFile"><br/>
+            <i class="ion-close-circled assertive"></i>
+            {{revocationError|translate}}
+          </h3>
+        </div>
       </div>
+
+      <!-- remove file button -->
+      <a class="ion-close-round gray pull-right" style="font-size: 10px; position: absolute; top: 6px; right: 6px;"
+         ng-click="restore()"></a>
     </div>
   </div>
 
diff --git a/www/templates/wallet/slides/slides_saveID_1.html b/www/templates/wallet/slides/slides_saveID_1.html
index 1e75b4ea632d4bfeb1ce793cbe43fe6984c9c1e0..3981bd6e48542485647098f5351c6a3f09dc9171 100644
--- a/www/templates/wallet/slides/slides_saveID_1.html
+++ b/www/templates/wallet/slides/slides_saveID_1.html
@@ -23,7 +23,9 @@
           <a class="dark"><i class="icon ion-android-add" ng-click="addQuestion()"></i></a>
           <div class="list list-inset">
             <label class="item item-input">
-              <input type="text" placeholder="{{'ACCOUNT.SECURITY.ADD_QUESTION' | translate}}" ng-model="formData.addQuestion"/>
+              <input type="text"
+                     autocomplete="off"
+                     placeholder="{{'ACCOUNT.SECURITY.ADD_QUESTION' | translate}}" ng-model="formData.addQuestion"/>
             </label>
           </div>
         </div>
diff --git a/www/templates/wallet/slides/slides_saveID_2.html b/www/templates/wallet/slides/slides_saveID_2.html
index f1acc6d67bfa1b269d96a47b33bd0cafe7808556..f125eb114435e30e8afcd811757cafbc33e5c600 100644
--- a/www/templates/wallet/slides/slides_saveID_2.html
+++ b/www/templates/wallet/slides/slides_saveID_2.html
@@ -7,7 +7,10 @@
           <label class="item item-input item-text-wrap {{smallscreen ? 'item-stacked-label' : 'item-floating-label'}}"
                  ng-class="{'item-input-error': answersForm.$submitted && answersForm['question{{$index}}'].$invalid}">
             <span class="input-label" style="width: 100%; max-width: inherit;">{{question.value | translate}}</span>
-            <input type="text" name="question{{$index}}" placeholder="{{smallscreen ? '' : question.value | translate}}" ng-model="question.answer" required />
+            <input type="text"
+                   autocomplete="off"
+                   name="question{{$index}}" placeholder="{{smallscreen ? '' : question.value | translate}}" ng-model="question.answer"
+                   required/>
           </label>
           <div class="form-errors"
                ng-show="answersForm.$submitted && answersForm['question{{$index}}'].$error"
diff --git a/www/templates/wallet/transfer_form.html b/www/templates/wallet/transfer_form.html
index fac7dc83d33965633a4b5ef8565af61161fc2879..de2c14fb1566b5fa5531ed58cfa643640b8f5b2a 100644
--- a/www/templates/wallet/transfer_form.html
+++ b/www/templates/wallet/transfer_form.html
@@ -30,21 +30,26 @@
               tabindex="2"
               ng-click="showSelectWalletModal()">
       <span class="gray" translate>TRANSFER.FROM</span>
+      <span class="badge item-note" ng-if="loading"><ion-spinner class="ion-spinner-small" icon="android" ></ion-spinner></span>
       <span class="badge animate-fade-in animate-show-hide ng-hide" ng-show="!loading"
-            ng-class="{'badge-assertive': (convertedBalance <= 0 || form.amount.$error.max), 'badge-balanced': (convertedBalance > 0 && (!form.amount.$error.max)) }">
-            <ion-spinner icon="android" ng-show="!walletData.pubkey"></ion-spinner>
-            <span ng-if="walletData.pubkey && !walletData.isMember">
-              <i class="ion-key"></i> {{walletData.pubkey| formatPubkey}}&nbsp;&nbsp;
-            </span>
-            <span ng-if="walletData.isMember">
-              <i class="ion-person"></i> {{walletData.name||walletData.uid}}&nbsp;&nbsp;
-            </span>
-            <span
-              ng-bind-html="walletData.balance|formatAmount:{useRelative: formData.useRelative, currency:currency}"></span>
-        </span>
+          ng-class="{'badge-assertive': (convertedBalance <= 0 || form.amount.$error.max), 'badge-balanced': (convertedBalance > 0 && (!form.amount.$error.max)) }">
 
+          <span ng-if="walletData.pubkey && !walletData.isMember">
+            <i class="ion-key"></i> {{walletData.pubkey| formatPubkey}}&nbsp;&nbsp;
+          </span>
+          <span ng-if="walletData.isMember">
+            <i class="ion-person"></i> {{walletData.name||walletData.uid}}&nbsp;&nbsp;
+          </span>
+          <span
+            ng-bind-html="walletData.balance|formatAmount:{useRelative: formData.useRelative, currency:currency}"></span>
+      </span>
       <i class="gray icon ion-ios-arrow-right" ng-if="enableSelectWallet"></i>
     </ion-item>
+    <div class="form-errors ng-hide" ng-show="!loading && walletData.pubkey && walletData.balance <= 0">
+      <div class="form-error">
+        <span translate="ERROR.NOT_ENOUGH_CREDIT"></span>
+      </div>
+    </div>
 
     <!-- Amount -->
     <ion-item class="item-input item-floating-label item-button-right"
@@ -208,6 +213,7 @@
     <button class="button ink"
             tabindex="8"
             ng-class="{'button-assertive': formData.all, 'button-positive': !formData.all}"
+            ng-disabled="loading"
             type="submit" translate>
       TRANSFER.BTN_SEND
     </button>
diff --git a/www/templates/wallet/view_wallet.html b/www/templates/wallet/view_wallet.html
index 0b1e7d4cb2c100d39fcf1502fd3cb0c9bb1e1d2a..04135d8cf557f01e7ee1e8081b48be7eee13989b 100644
--- a/www/templates/wallet/view_wallet.html
+++ b/www/templates/wallet/view_wallet.html
@@ -22,8 +22,7 @@
     </ion-refresher>
 
     <div class="positive-900-bg hero"
-         style="max-width: 100%; display: block"
-         ng-class="{'hero-qrcode-active': toggleQRCode}">
+         style="max-width: 100%; display: block">
       <div class="content" ng-if="!loading"
            style="max-width: 100%">
 
@@ -74,17 +73,14 @@
 
     </div>
 
-    <a ng-attr-id="{{ qrcodeId }}"
-       class="qrcode spin pull-right"
-       ng-class="{'active': toggleQRCode}"
-       ng-click="toggleQRCode = !toggleQRCode">
-    </a>
+    <ng-include src="::'templates/common/qrcode.html'"></ng-include>
 
     <!-- Buttons bar-->
     <a id="wallet-share-anchor"></a>
     <div class="hidden-xs hidden-sm padding text-center" ng-if="!loading">
 
       <button class="button button-stable button-small-padding icon ion-android-share-alt ink"
+              ng-disabled="loading"
               ng-click="showSharePopover($event)"
               title="{{'COMMON.BTN_SHARE' | translate}}">
       </button>
@@ -115,21 +111,12 @@
       </div>
     </div>
 
-    <div class="visible-xs visible-sm padding text-center" ng-if="!loading">
-      <button class="button button-assertive button-small-padding ink"
-              ng-if="isDefaultWallet"
-              ng-click="logout({askConfirm: true})">
-        <i class="icon ion-log-out"></i>
-        {{'COMMON.BTN_LOGOUT' | translate}}
+    <div class="visible-xs visible-sm padding text-center" ng-if="!loading && formData.requirements.needRenew">
+      <button class="button button-raised icon-left button-stable button-small-padding ink"
+              ng-click="renewMembership()">
+        <i class="icon ion-loop assertive"></i>
+        <span class="assertive">{{:locale:'ACCOUNT.BTN_MEMBERSHIP_RENEW' | translate}}</span>
       </button>
-      <div ng-if="formData.requirements.needRenew">
-        <br/>
-        <button class="button button-raised icon-left button-stable button-small-padding ink"
-                ng-click="renewMembership()">
-          <i class="icon ion-loop assertive"></i>
-          <span class="assertive">{{:locale:'ACCOUNT.BTN_MEMBERSHIP_RENEW' | translate}}</span>
-        </button>
-      </div>
     </div>
 
     <div class="row no-padding">
diff --git a/www/templates/wallet/view_wallet_tx.html b/www/templates/wallet/view_wallet_tx.html
index 190cb36b986469dbcddf2e5f135ea741600cbfaf..1eae937c824b77c34de25d0f27261811356dbd83 100644
--- a/www/templates/wallet/view_wallet_tx.html
+++ b/www/templates/wallet/view_wallet_tx.html
@@ -1,5 +1,4 @@
-<ion-view left-buttons="leftButtons"
-          class="view-wallet-tx">
+<ion-view left-buttons="leftButtons" class="view-wallet-tx">
   <ion-nav-title>
     <!-- no title on large screen-->
     <span class="visible-xs visible-sm" translate>
@@ -68,6 +67,9 @@
       </h2>
     </div>
 
+    <!-- QR code -->
+    <ng-include src="::'templates/common/qrcode.html'"></ng-include>
+
     <!-- Buttons bar-->
     <div class="hidden-xs hidden-sm padding text-center" ng-if="!loading">
 
@@ -120,7 +122,7 @@
             <div class="item item-pending item-tx item-icon-left"
                  ng-repeat="tx in formData.tx.pendings"
                  ng-init="pending=true;"
-                 ng-include="'templates/wallet/item_tx.html'">
+                 ng-include="::'templates/wallet/item_tx.html'">
             </div>
           </ng-if>
 
diff --git a/www/templates/wallet/view_wallet_tx_error.html b/www/templates/wallet/view_wallet_tx_error.html
index 9fd9439338c16be727adefe65ea78d55ef0cd118..f5502ed5078dce5b3de1ceeacf5b43e89e8e0349 100644
--- a/www/templates/wallet/view_wallet_tx_error.html
+++ b/www/templates/wallet/view_wallet_tx_error.html
@@ -51,7 +51,7 @@
         <div class="item item-pending item-tx item-icon-left"
              ng-repeat="tx in formData.tx.errors | filter: filterReceivedTx"
              ng-init="pending=true;"
-             ng-include="'templates/wallet/item_tx.html'">
+             ng-include="::'templates/wallet/item_tx.html'">
         </div>
 
         <!-- Error sent TX -->
@@ -73,7 +73,7 @@
         <div class="item item-pending item-tx item-icon-left"
              ng-repeat="tx in formData.tx.errors | filter: filterSentTx"
              ng-init="error=true;"
-             ng-include="'templates/wallet/item_tx.html'">
+             ng-include="::'templates/wallet/item_tx.html'">
         </div>
 
       </div>
diff --git a/www/templates/wot/items_given_certifications.html b/www/templates/wot/items_given_certifications.html
index 68d37d34a399af15bd2b39ec5418f603905420c1..0cbd0b24c148f4aa05749ea3e49989be414b1ccf 100644
--- a/www/templates/wot/items_given_certifications.html
+++ b/www/templates/wot/items_given_certifications.html
@@ -34,7 +34,7 @@
   <a class="item item-avatar ink"
      ng-repeat="cert in formData.given_cert_pending"
      ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})"
-     ng-include="'templates/wot/item_certification.html'">
+     ng-include="::'templates/wot/item_certification.html'">
   </a>
 
   <!-- validated given certifications -->
@@ -50,6 +50,6 @@
   <a class="item item-avatar ink"
         ng-repeat="cert in formData.given_cert"
         ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})"
-        ng-include="'templates/wot/item_certification.html'">
+        ng-include="::'templates/wot/item_certification.html'">
   </a>
 </div>
diff --git a/www/templates/wot/items_received_certifications.html b/www/templates/wot/items_received_certifications.html
index b09d4864e3efd6f75614a508afc7b28af441fc4b..d4ec0b91c2b56e44cf7239aa388388835f8c262d 100644
--- a/www/templates/wot/items_received_certifications.html
+++ b/www/templates/wot/items_received_certifications.html
@@ -38,7 +38,7 @@
           <a class="item item-avatar ink"
              ng-repeat="cert in formData.received_cert_pending"
              ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})"
-             ng-include="'templates/wot/item_certification.html'">
+             ng-include="::'templates/wot/item_certification.html'">
           </a>
 
           <!-- valid certifications -->
@@ -53,6 +53,6 @@
           <a class="item item-avatar ink"
                 ng-repeat="cert in formData.received_cert"
                 ui-sref="app.wot_identity({pubkey:cert.pubkey, uid:cert.uid})"
-                ng-include="'templates/wot/item_certification.html'">
+                ng-include="::'templates/wot/item_certification.html'">
           </a>
         </div>
diff --git a/www/templates/wot/lookup_form.html b/www/templates/wot/lookup_form.html
index e2686ac67d4358a8aeb9ee39650f8af17a27a339..849b55fadb3235f69a72bcbdcea74d220a45652d 100644
--- a/www/templates/wot/lookup_form.html
+++ b/www/templates/wot/lookup_form.html
@@ -171,7 +171,7 @@
         ng-model="item.checked"
         class="item item-border-large item-avatar ink"
         ng-click="toggleCheck($index, $event)">
-        <ng-include src="'templates/wot/item_content_identity.html'"></ng-include>
+        <ng-include src="::'templates/wot/item_content_identity.html'"></ng-include>
       </ion-checkbox>
     </div>
 
diff --git a/www/templates/wot/lookup_lg.html b/www/templates/wot/lookup_lg.html
index bce9b2b851078936ad4dbbb3bb299bce13fea5f4..b033a6a9d6f36573f53ae54c2c20a2fcd5eabf95 100644
--- a/www/templates/wot/lookup_lg.html
+++ b/www/templates/wot/lookup_lg.html
@@ -19,6 +19,6 @@
     <!-- Allow extension here -->
     <cs-extension-point name="top"></cs-extension-point>
 
-    <ng-include src="'templates/wot/lookup_form.html'"></ng-include>
+    <ng-include src="::'templates/wot/lookup_form.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/templates/wot/modal_lookup.html b/www/templates/wot/modal_lookup.html
index 2331bdf5ac1e0b1aa2aa8c5b28ca0972b903db03..617112e369ad7e3f07b4b92b5b95b48ffdf396f3 100644
--- a/www/templates/wot/modal_lookup.html
+++ b/www/templates/wot/modal_lookup.html
@@ -30,6 +30,6 @@
       </button>
     </div>
 
-    <ng-include src="'templates/wot/lookup_form.html'"></ng-include>
+    <ng-include src="::'templates/wot/lookup_form.html'"></ng-include>
   </ion-content>
 </ion-modal-view>
diff --git a/www/templates/wot/tabs/tab_given_certifications.html b/www/templates/wot/tabs/tab_given_certifications.html
index 5a5c543195aeee4e6cb41d1591eb8d05c477229e..e3b57d0b998fcc502ebf39199747c0b88143b3d5 100644
--- a/www/templates/wot/tabs/tab_given_certifications.html
+++ b/www/templates/wot/tabs/tab_given_certifications.html
@@ -9,7 +9,7 @@
       <ion-spinner icon="android"></ion-spinner>
     </div>
 
-    <ng-include src="'templates/wot/items_given_certifications.html'"></ng-include>
+    <ng-include src="::'templates/wot/items_given_certifications.html'"></ng-include>
   </ion-content>
 
   <!-- fab button -->
diff --git a/www/templates/wot/tabs/tab_lookup.html b/www/templates/wot/tabs/tab_lookup.html
index 4a8f304215a4a8d745eba7019e07e91b6d2c7a52..c377577f1d637d788b7abb9b4cbc63fca0110a72 100644
--- a/www/templates/wot/tabs/tab_lookup.html
+++ b/www/templates/wot/tabs/tab_lookup.html
@@ -18,6 +18,6 @@
 
     <cs-extension-point name="buttons"></cs-extension-point>
 
-    <ng-include src="'templates/wot/lookup_form.html'"></ng-include>
+    <ng-include src="::'templates/wot/lookup_form.html'"></ng-include>
   </ion-content>
 </ion-view>
diff --git a/www/templates/wot/tabs/tab_received_certifications.html b/www/templates/wot/tabs/tab_received_certifications.html
index 98ee69959499aec77b8a88555948630bab189e38..5ffeb616bfe4afee3e27dd3d1ab7463e9981f04a 100644
--- a/www/templates/wot/tabs/tab_received_certifications.html
+++ b/www/templates/wot/tabs/tab_received_certifications.html
@@ -9,7 +9,7 @@
       <ion-spinner icon="android"></ion-spinner>
     </div>
 
-    <ng-include src="'templates/wot/items_received_certifications.html'"></ng-include>
+    <ng-include src="::'templates/wot/items_received_certifications.html'"></ng-include>
   </ion-content>
 
   <!-- fab button -->
diff --git a/www/templates/wot/view_certifications.html b/www/templates/wot/view_certifications.html
index 609d29d16e63c4d6340ba620a81b21027f568832..2981a7d4b7fc5279b370938ed61c5cf5c4783338 100644
--- a/www/templates/wot/view_certifications.html
+++ b/www/templates/wot/view_certifications.html
@@ -50,7 +50,7 @@
     <div class="row responsive-sm responsive-md responsive-lg">
       <!-- Received certifications -->
       <div class="col no-padding" ng-if="motions.receivedCertifications.enable">
-        <ng-include src="'templates/wot/items_received_certifications.html'"></ng-include>
+        <ng-include src="::'templates/wot/items_received_certifications.html'"></ng-include>
       </div>
 
       <!-- Avatar -->
@@ -91,19 +91,19 @@
 
       <!-- Given certifications -->
       <div class="col no-padding" ng-if="motions.givenCertifications.enable">
-        <ng-include src="'templates/wot/items_given_certifications.html'"></ng-include>
+        <ng-include src="::'templates/wot/items_given_certifications.html'"></ng-include>
       </div>
     </div>
   </ion-content>
 
     <!-- fab button -->
   <div class="visible-xs visible-sm">
-    <button id="fab-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin"
+    <button id="fab-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly"
             ng-if="canCertify && !alreadyCertified"
             ng-click="certify()">
       <i class="icon ion-ribbon-b"></i>
     </button>
-    <button id="fab-select-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin"
+    <button id="fab-select-certify" class="button button-fab button-fab-bottom-right button-energized-900 spin hidden-readonly"
             ng-if="canSelectAndCertify"
             ng-click="selectAndCertify()">
       <i class="icon ion-plus"></i>
diff --git a/www/templates/wot/view_identity.html b/www/templates/wot/view_identity.html
index 3a6604907316df6f07cc65535df3dc090b92dc9e..6c1b8328b19e3f9da305eb283e87cdb1fa802867 100644
--- a/www/templates/wot/view_identity.html
+++ b/www/templates/wot/view_identity.html
@@ -9,7 +9,7 @@
                    on-refresh="doUpdate(true)">
     </ion-refresher>
 
-    <div class="hero" ng-class="{'hero-qrcode-active': toggleQRCode}">
+    <div class="hero">
       <div class="content" ng-if="!loading">
         <i class="avatar"
            ng-if=":rebind:!formData.avatar"
@@ -35,18 +35,17 @@
         <ion-spinner icon="android"></ion-spinner>
       </h4>
 
-
     </div>
 
-    <div ng-attr-id="{{ qrcodeId }}"
-         class="qrcode spin"
-         ng-class="{'active': toggleQRCode}"
-         ng-click="toggleQRCode = !toggleQRCode"></div>
+    <!-- QR code -->
+    <ng-include src="::'templates/common/qrcode.html'"></ng-include>
+
 
     <!-- button bar-->
     <a id="wot-share-anchor-{{::formData.pubkey}}"></a>
     <div class="hidden-xs hidden-sm padding text-center">
       <button class="button button-stable button-small-padding icon ion-android-share-alt ink"
+              ng-disabled="loading"
               ng-click="showSharePopover($event)"
               title="{{'COMMON.BTN_SHARE' | translate}}">
       </button>
@@ -54,14 +53,14 @@
       <!-- Allow extension here -->
       <cs-extension-point name="buttons"></cs-extension-point>
 
-      <button class="button button-stable button-small-padding icon ion-ribbon-b ink"
+      <button class="button button-stable button-small-padding icon ion-ribbon-b ink hidden-readonly"
               ng-click="certify()"
               ng-if=":rebind:formData.hasSelf"
               title="{{'WOT.BTN_CERTIFY' | translate}}"
               ng-disabled="disableCertifyButton">
       </button>
 
-      <button class="button button-calm ink"
+      <button class="button button-calm ink hidden-readonly"
               ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.name||formData.uid})">
         {{'COMMON.BTN_SEND_MONEY' | translate}}
       </button>
@@ -70,9 +69,9 @@
     </div>
 
     <!-- fab buttons -->
-    <div class="visible-xs visible-sm">
+    <div class="visible-xs visible-sm ">
       <button id="fab-certify-{{:rebind:formData.uid}}"
-              class="button button-fab button-fab-top-left button-fab-hero button-calm spin"
+              class="button button-fab button-fab-top-left button-fab-hero button-calm spin hidden-readonly"
               ng-if=":rebind:(canCertify && !alreadyCertified)"
               ng-click="certify()">
         <i class="icon ion-ribbon-b"></i>
@@ -173,8 +172,8 @@
   </ion-content>
 
   <!-- fab button -->
-  <div class="visible-xs visible-sm" ng-hide="loading">
-    <button id="fab-transfer" class="button button-fab button-fab-bottom-right button-assertive drop"
+  <div class="visible-xs visible-sm " ng-hide="loading">
+    <button id="fab-transfer" class="button button-fab button-fab-bottom-right button-assertive drop hidden-readonly"
             ng-click="showTransferModal({pubkey:formData.pubkey, uid: formData.uid})">
       <i class="icon ion-android-send"></i>
     </button>
diff --git a/www/templates/wot/view_identity_tx.html b/www/templates/wot/view_identity_tx.html
index b7ec06d985253176a48c5f24e6c9088a7ae3aa5a..9f547f293b8b10fc5034cb851b13b54489614fc8 100644
--- a/www/templates/wot/view_identity_tx.html
+++ b/www/templates/wot/view_identity_tx.html
@@ -1,4 +1,4 @@
-<ion-view left-buttons="leftButtons">
+<ion-view left-buttons="leftButtons" class="view-identity-tx">
   <ion-nav-title>
     <span class="visible-xs visible-sm" ng-if="!loading">
       <span ng-if="formData.name || formData.uid">{{formData.name || formData.uid}} </span>
@@ -37,6 +37,7 @@
       <ion-spinner icon="android"></ion-spinner>
     </div>
 
+
     <div class="list {{motion.ionListClass}}" ng-if="!loading">
 
       <div class="row">
diff --git a/yarn.lock b/yarn.lock
index aa84c6af6f26171f5da50cff4fc8a5d051905a22..a0b1f8b171e5694dbc0673870ed8c7eedcdff834 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,37 +2,84 @@
 # yarn lockfile v1
 
 
-"@bower_components/Leaflet.EasyButton@CliffCloud/Leaflet.EasyButton#^2.4.0":
+"@babel/code-frame@^7.0.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
+  integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+  dependencies:
+    "@babel/highlight" "^7.8.3"
+
+"@babel/helper-validator-identifier@^7.9.0":
+  version "7.9.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
+  integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
+
+"@babel/highlight@^7.8.3":
+  version "7.9.0"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079"
+  integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.9.0"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
+
+"@babel/polyfill@7.7.0":
+  version "7.7.0"
+  resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.7.0.tgz#e1066e251e17606ec7908b05617f9b7f8180d8f3"
+  integrity sha512-/TS23MVvo34dFmf8mwCisCbWGrfhbiWZSwBo6HkADTBhUa2Q/jWltyY/tpofz/b6/RIhqaqQcquptCirqIhOaQ==
+  dependencies:
+    core-js "^2.6.5"
+    regenerator-runtime "^0.13.2"
+
+"@babel/runtime-corejs3@^7.8.3":
+  version "7.9.6"
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.6.tgz#67aded13fffbbc2cb93247388cf84d77a4be9a71"
+  integrity sha512-6toWAfaALQjt3KMZQc6fABqZwUDDuWzz+cAfPhqyEnzxvdWOAkjwPNxgF8xlmo7OWLsSjaKjsskpKHRLaMArOA==
+  dependencies:
+    core-js-pure "^3.0.0"
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime@7.7.7":
+  version "7.7.7"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf"
+  integrity sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==
+  dependencies:
+    regenerator-runtime "^0.13.2"
+
+"@babel/runtime@7.9.2":
+  version "7.9.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
+  integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@bower_components/Leaflet.EasyButton@CliffCloud/Leaflet.EasyButton#v2.4.0":
   version "2.4.0"
   resolved "https://codeload.github.com/CliffCloud/Leaflet.EasyButton/tar.gz/6f4b04751eac9d0d1fc7a3cc5ad384c516f601ee"
   dependencies:
     leaflet "^1.0.1"
 
-"@bower_components/Leaflet.FeatureGroup.SubGroup@VivekKhandre/Leaflet.FeatureGroup.SubGroup#0.1.2":
+"@bower_components/Leaflet.FeatureGroup.SubGroup@ghybs/Leaflet.FeatureGroup.SubGroup#v0.1.2":
   version "0.1.2"
-  resolved "https://codeload.github.com/VivekKhandre/Leaflet.FeatureGroup.SubGroup/tar.gz/2ec699f11e1b6a8fa2596a1bb2b7a144d162c6d6"
+  resolved "https://codeload.github.com/ghybs/Leaflet.FeatureGroup.SubGroup/tar.gz/2ec699f11e1b6a8fa2596a1bb2b7a144d162c6d6"
 
-"@bower_components/Leaflet.awesome-markers@lvoogdt/Leaflet.awesome-markers#2.0.2":
+"@bower_components/Leaflet.awesome-markers@lvoogdt/Leaflet.awesome-markers#v2.0.2":
   version "0.0.0"
   resolved "https://codeload.github.com/lvoogdt/Leaflet.awesome-markers/tar.gz/bfac1eb6f7896072d690bde57c1fb5002961a99a"
 
-"@bower_components/aes-js@ricmoo/aes-js#3.1.2":
+"@bower_components/aes-js@ricmoo/aes-js#v3.1.2":
   version "3.1.2"
   resolved "https://codeload.github.com/ricmoo/aes-js/tar.gz/7c9fad4add4b349dcb89a4e2125f37defaef3bc8"
 
-"@bower_components/angular-animate@angular/bower-angular-animate#~1.5.11":
+"@bower_components/angular-animate@angular/bower-angular-animate#v1.5.11":
   version "1.5.11"
   resolved "https://codeload.github.com/angular/bower-angular-animate/tar.gz/ac17971fdc62d7ea816a079401084e6da2af3e3e"
 
-"@bower_components/angular-api@E-IS/angular-api#0.3.0":
-  version "0.0.0"
-  resolved "https://codeload.github.com/E-IS/angular-api/tar.gz/e2f86be44ddf0641ab3c9587711c0efe06cbcbb6"
-
-"@bower_components/angular-bind-notifier@aeisenberg/angular-bind-notifier#^1.1.11":
+"@bower_components/angular-bind-notifier@aeisenberg/angular-bind-notifier#v1.1.11":
   version "1.1.11"
   resolved "https://codeload.github.com/aeisenberg/angular-bind-notifier/tar.gz/4c3adcdb20a97f541312706046a73ba12e03326d"
 
-"@bower_components/angular-cache@jmdobry/angular-cache#^4.6.0":
+"@bower_components/angular-cache@jmdobry/angular-cache#4.6.0":
   version "4.6.0"
   resolved "https://codeload.github.com/jmdobry/angular-cache/tar.gz/b491ed8361cd092dd82e59eab0031a2e202900a6"
 
@@ -43,66 +90,76 @@
     angular "1.x"
     chart.js "2.3.x"
 
-"@bower_components/angular-file-saver@alferov/angular-file-saver#^1.1.3":
+"@bower_components/angular-expose-api@duniter-cesium/angular-expose-api#0.3.1":
+  version "0.3.1"
+  resolved "https://codeload.github.com/duniter-cesium/angular-expose-api/tar.gz/6fc193c3453b73354f256c816ce098dfd89e7bc8"
+  dependencies:
+    angular "^1.5.11"
+
+"@bower_components/angular-file-saver@alferov/angular-file-saver#1.1.3":
   version "1.1.3"
   resolved "https://codeload.github.com/alferov/angular-file-saver/tar.gz/bdba5fab87f5a9f53c1320421ed789dc219892e9"
   dependencies:
     blob-tmp "^1.0.0"
     file-saver "^1.3.3"
 
-"@bower_components/angular-fullscreen@E-IS/angular-fullscreen#1.0.2":
-  version "1.0.1"
-  resolved "https://codeload.github.com/E-IS/angular-fullscreen/tar.gz/a2a84e034cbb94cf9cbac75684f9dfb78b33d9c5"
+"@bower_components/angular-fullscreen-toggle@duniter-cesium/angular-fullscreen-toggle#1.0.4":
+  version "1.0.4"
+  resolved "https://codeload.github.com/duniter-cesium/angular-fullscreen-toggle/tar.gz/74c7037c508046afdf449f003b3c50190dcd4cf3"
+  dependencies:
+    angular "^1.5.11"
 
-"@bower_components/angular-image-crop@andyshora/angular-image-crop#^2.0.0":
-  version "0.0.0"
-  resolved "https://codeload.github.com/andyshora/angular-image-crop/tar.gz/d8de6ea4f9ff5c3941399f28dc798aa8da884603"
+"@bower_components/angular-image-crop@duniter-cesium/angular-image-crop#v2.0.2":
+  version "2.0.2"
+  resolved "https://codeload.github.com/duniter-cesium/angular-image-crop/tar.gz/4a47439dcb82541f15b0ce6389762522e73445bd"
+  dependencies:
+    angular "^1.5.11"
 
-"@bower_components/angular-leaflet-directive@E-IS/angular-leaflet-directive#0.10.1":
+"@bower_components/angular-leaflet-directive@duniter-cesium/angular-leaflet-directive#0.10.1":
   version "0.10.1"
-  resolved "https://codeload.github.com/E-IS/angular-leaflet-directive/tar.gz/1cfbdf4a7f68bfddddc7472b5799c7b950337b2a"
+  resolved "https://codeload.github.com/duniter-cesium/angular-leaflet-directive/tar.gz/1cfbdf4a7f68bfddddc7472b5799c7b950337b2a"
   dependencies:
     angular "1.x"
     leaflet "0.7.x"
 
-"@bower_components/angular-messages@angular/bower-angular-messages#~1.5.11":
+"@bower_components/angular-messages@angular/bower-angular-messages#v1.5.11":
   version "1.5.11"
   resolved "https://codeload.github.com/angular/bower-angular-messages/tar.gz/4853e43f00243d582b4f6145b6096129ca91fbdf"
 
-"@bower_components/angular-moment@urish/angular-moment#^0.10.3":
-  version "0.10.3"
-  resolved "https://codeload.github.com/urish/angular-moment/tar.gz/07d373b7a2fd17ff25ab927ff7fcb0b53b2d13fd"
+"@bower_components/angular-moment@urish/angular-moment#1.3.0":
+  version "1.3.0"
+  resolved "https://codeload.github.com/urish/angular-moment/tar.gz/aa3e39f77214da5a718755a3582aac517a53a04f"
   dependencies:
-    moment ">=2.8.0 <2.11.0"
+    moment ">=2.8.0 <3.0.0"
 
-"@bower_components/angular-resource@angular/bower-angular-resource#~1.5.11":
+"@bower_components/angular-resource@angular/bower-angular-resource#v1.5.11":
   version "1.5.11"
   resolved "https://codeload.github.com/angular/bower-angular-resource/tar.gz/9c261ab3b6afb7d6ac5b09d0d2191ed7d6c77f80"
 
-"@bower_components/angular-sanitize@angular/bower-angular-sanitize#~1.5.11":
+"@bower_components/angular-sanitize@angular/bower-angular-sanitize#v1.5.11":
   version "1.5.11"
   resolved "https://codeload.github.com/angular/bower-angular-sanitize/tar.gz/84df06c4ec4f1eef7f9d0b849b9fdf5433c2669c"
 
-"@bower_components/angular-screenmatch@bensurman/angular-screenmatch#^1.0.1":
+"@bower_components/angular-screenmatch@bensurman/angular-screenmatch#v1.0.1":
   version "1.0.0"
   resolved "https://codeload.github.com/bensurman/angular-screenmatch/tar.gz/fd5d2f40ed1878ba3eafc108e47eafc2f069810d"
 
-"@bower_components/angular-simple-logger@nmccready/angular-simple-logger#~0.1.4":
+"@bower_components/angular-simple-logger@nmccready/angular-simple-logger#0.1.7":
   version "0.1.7"
   resolved "https://codeload.github.com/nmccready/angular-simple-logger/tar.gz/bd15d5a9875761c9564d0c82698460980bca4c9a"
   dependencies:
     angular "^1.2"
     debug "^2.2.0"
 
-"@bower_components/angular-translate@PascalPrecht/bower-angular-translate#^2.18.1":
+"@bower_components/angular-translate@PascalPrecht/bower-angular-translate#2.18.2":
   version "0.0.0"
-  resolved "https://codeload.github.com/PascalPrecht/bower-angular-translate/tar.gz/a37d868d24a8aee0eabd457773e1d35297e9bd4f"
+  resolved "https://codeload.github.com/PascalPrecht/bower-angular-translate/tar.gz/a0a63185d2f496c388b9c3b021405bd137045673"
 
-"@bower_components/angular-ui-router@angular-ui/angular-ui-router-bower#^0.2.18":
+"@bower_components/angular-ui-router@angular-ui/angular-ui-router-bower#0.2.18":
   version "0.0.0"
   resolved "https://codeload.github.com/angular-ui/angular-ui-router-bower/tar.gz/2b8d5241b4c631ca2aef079bb96690b213eff449"
 
-"@bower_components/angular@angular/bower-angular#~1.5.11":
+"@bower_components/angular@angular/bower-angular#v1.5.11":
   version "1.5.11"
   resolved "https://codeload.github.com/angular/bower-angular/tar.gz/0f57428c3ffe2f486264ab7fbee3968dccc7b720"
 
@@ -110,7 +167,7 @@
   version "1.0.20150320"
   resolved "https://codeload.github.com/bjornstar/blob-polyfill/tar.gz/1ea5fce0ecc5b0efde6506b1e563828f9a489ebd"
 
-"@bower_components/chart.js@chartjs/Chart.js#^2.9.3":
+"@bower_components/chart.js@chartjs/Chart.js#v2.9.3":
   version "2.9.3"
   resolved "https://codeload.github.com/chartjs/Chart.js/tar.gz/06f73dc3590084b2c464bf08189c7aee2b6b92d2"
   dependencies:
@@ -125,7 +182,7 @@
   version "1.0.0"
   resolved "https://codeload.github.com/skol-pro/ion-digit-keyboard/tar.gz/973b90c2fcb80d2ed3c4a36367a3c9a969ed8253"
 
-"@bower_components/ionic-material@zachsoft/Ionic-Material#0.4.2":
+"@bower_components/ionic-material@zachsoft/Ionic-Material#v0.4.2":
   version "0.4.0"
   resolved "https://codeload.github.com/zachsoft/Ionic-Material/tar.gz/bd95a3d8091212cf6df4c46693abf53c5780263e"
   dependencies:
@@ -137,7 +194,7 @@
     gulp-uglify "^0.2.1"
     lodash "^3.9.1"
 
-"@bower_components/ionic@driftyco/ionic-bower#1.3.5":
+"@bower_components/ionic@driftyco/ionic-bower#v1.3.5":
   version "0.0.0"
   resolved "https://codeload.github.com/driftyco/ionic-bower/tar.gz/816a8b26fae3e8305162eefe1114415503391be6"
 
@@ -145,41 +202,41 @@
   version "1.3.2"
   resolved "https://codeload.github.com/tonyg/js-nacl/tar.gz/883f9d3cd9b6bbce84dc489ae4c2d87ffd653a18"
 
-"@bower_components/js-scrypt@tonyg/js-scrypt#1.2.0":
+"@bower_components/js-scrypt@tonyg/js-scrypt#v1.2.0":
   version "0.0.0"
   resolved "https://codeload.github.com/tonyg/js-scrypt/tar.gz/a3c516d6f51713066ef6954ed09e0e66dab23e15"
 
-"@bower_components/leaflet-search@stefanocudini/leaflet-search#2.7.2":
+"@bower_components/leaflet-search@stefanocudini/leaflet-search#v2.7.2":
   version "2.7.2"
   resolved "https://codeload.github.com/stefanocudini/leaflet-search/tar.gz/1b15fad4fdb5be0bdac8aa8883fab864e8675dc5"
   dependencies:
     leaflet "*"
 
-"@bower_components/leaflet.loading@ebrelsford/Leaflet.loading#^0.1.24":
+"@bower_components/leaflet.loading@ebrelsford/Leaflet.loading#v0.1.24":
   version "0.1.24"
   resolved "https://codeload.github.com/ebrelsford/Leaflet.loading/tar.gz/a1329ac02d709e9b63416b5cb09cea861a37fb4a"
 
-"@bower_components/leaflet.markercluster@Leaflet/Leaflet.markercluster#0.5.0":
+"@bower_components/leaflet.markercluster@Leaflet/Leaflet.markercluster#v0.5.0":
   version "0.5.0"
   resolved "https://codeload.github.com/Leaflet/Leaflet.markercluster/tar.gz/232e93ccbe5b70241913f47a4d1a8ceec8c88c30"
   dependencies:
     leaflet "~0.7.1"
 
-"@bower_components/leaflet@Leaflet/Leaflet#0.7.7":
+"@bower_components/leaflet@Leaflet/Leaflet#v0.7.7":
   version "0.7.7"
   resolved "https://codeload.github.com/Leaflet/Leaflet/tar.gz/197f9d43b7bbc73c0492bf62cd666a5a98038098"
 
-"@bower_components/moment@moment/moment#^2.24.0":
+"@bower_components/moment@moment/moment#2.24.0":
   version "2.24.0"
   resolved "https://codeload.github.com/moment/moment/tar.gz/96d0d6791ab495859d09a868803d31a55c917de1"
 
-"@bower_components/ng-idle@HackedByChinese/ng-idle#^1.3.2":
+"@bower_components/ng-idle@HackedByChinese/ng-idle#1.3.2":
   version "1.3.2"
   resolved "https://codeload.github.com/HackedByChinese/ng-idle/tar.gz/7072c91d8c619a1817e7726a0fddaf0c8e525456"
   dependencies:
     angular "^1.2.0"
 
-"@bower_components/ngCordova@driftyco/ng-cordova#0.1.27-alpha":
+"@bower_components/ngCordova@driftyco/ng-cordova#v0.1.27-alpha":
   version "0.1.27-alpha"
   resolved "https://codeload.github.com/driftyco/ng-cordova/tar.gz/6463412ad3d3dc91972db846c005aded841824ba"
   dependencies:
@@ -188,13 +245,13 @@
     gulp-git "^1.2.4"
     q "^1.1.2"
 
-"@bower_components/numeral@adamwdraper/Numeral-js#^1.5.6":
+"@bower_components/numeral@adamwdraper/Numeral-js#1.5.6":
   version "1.5.6"
   resolved "https://codeload.github.com/adamwdraper/Numeral-js/tar.gz/b598d6eeaf7981be55840d5fda5541e598eaf04f"
 
-"@bower_components/qrcode.js@davidshimjs/qrcodejs#*":
+"@bower_components/qrcode-generator@kazuhikoarase/qrcode-generator#js1.4.4":
   version "0.0.0"
-  resolved "https://codeload.github.com/davidshimjs/qrcodejs/tar.gz/04f46c6a0708418cb7b96fc563eacae0fbf77674"
+  resolved "https://codeload.github.com/kazuhikoarase/qrcode-generator/tar.gz/9bd2163ddc1628d1ec8ff22ea288a747275ef442"
 
 "@bower_components/robotodraft@raibutera/robotodraft#1.1.0":
   version "0.0.0"
@@ -228,7 +285,7 @@
     socket.io-client "1.7.4"
     socket.io-parser "2.3.1"
 
-"@bower_components/ui-leaflet@angular-ui/ui-leaflet#^2.0.0":
+"@bower_components/ui-leaflet@angular-ui/ui-leaflet#v2.0.0":
   version "2.0.0"
   resolved "https://codeload.github.com/angular-ui/ui-leaflet/tar.gz/a7b398d989dd3392f84ed2ce75569421444f2c36"
   dependencies:
@@ -236,144 +293,198 @@
     angular-simple-logger "0.1.x"
     leaflet "0.7.x"
 
-"@bower_components/underscore@jashkenas/underscore#^1.8.3":
-  version "1.9.1"
-  resolved "https://codeload.github.com/jashkenas/underscore/tar.gz/ae037f7c41323807ae6f1533c45512e6d31a1574"
+"@bower_components/underscore@jashkenas/underscore#1.10.2":
+  version "1.10.2"
+  resolved "https://codeload.github.com/jashkenas/underscore/tar.gz/2a932470303157072015d5ab7f26d40b9deb4634"
 
-"@bower_components/waves@fians/Waves#0.6":
-  version "0.6.6"
-  resolved "https://codeload.github.com/fians/Waves/tar.gz/7cfc479b8246e6d15e660bc2a69fa5b3a792ce98"
+"@cliqz-oss/firefox-client@0.3.1":
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/@cliqz-oss/firefox-client/-/firefox-client-0.3.1.tgz#86479239f060835608b06584afe5e0a1dd91613c"
+  integrity sha512-RO+Tops/wGnBzWoZYkCraqyh2JqOejqJq5/a4b54HhmjTNSKdUPwAOK17EGg/zPb0nWqkuB7QyZsI9bo+ev8Kw==
+  dependencies:
+    colors "0.5.x"
+    js-select "~0.6.0"
 
-"@ionic/cli-framework-prompts@1.0.4":
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/@ionic/cli-framework-prompts/-/cli-framework-prompts-1.0.4.tgz#c1ddc292bd51a0129fdfd2425eaf16666cb83980"
-  integrity sha512-mII1sPCWDsQYxOSBFjQBPzis2UJuM59T6O1/6EelCQGilHEMZ39bFNb8O2f3Irnx6y6sX/4VVTy2BQwDHMK1yA==
+"@cliqz-oss/node-firefox-connect@1.2.1":
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/@cliqz-oss/node-firefox-connect/-/node-firefox-connect-1.2.1.tgz#1d42cf9a7ddcdde3ff232715d7712662966e2df4"
+  integrity sha512-O/IyiB5pfztCdmxQZg0/xeq5w+YiP3gtJz8d4We2EpLPKzbDVjOrtfLKYgVfm6Ya6mbvDge1uLkSRwaoVCWKnA==
+  dependencies:
+    "@cliqz-oss/firefox-client" "0.3.1"
+    es6-promise "^2.0.1"
+
+"@gulp-sourcemaps/identity-map@1.X":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz#1e6fe5d8027b1f285dc0d31762f566bccd73d5a9"
+  integrity sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==
+  dependencies:
+    acorn "^5.0.3"
+    css "^2.2.1"
+    normalize-path "^2.1.1"
+    source-map "^0.6.0"
+    through2 "^2.0.3"
+
+"@gulp-sourcemaps/map-sources@1.X":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda"
+  integrity sha1-iQrnxdjId/bThIYCFazp1+yUW9o=
   dependencies:
-    "@ionic/utils-terminal" "1.1.2"
+    normalize-path "^2.0.1"
+    through2 "^2.0.3"
+
+"@ionic/cli-framework-prompts@2.1.1":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.1.tgz#42ce126952901c23ce31ac3d6d1ff53ce1949adf"
+  integrity sha512-XyUskbm8hww8d5LxhCwVflKGp6Vucl8IU6oj9ExAvXNqljHWhhtC5HRi2vmIplgRZVAtZq5SKAx/mzbH3u5JcA==
+  dependencies:
+    "@ionic/utils-terminal" "2.1.1"
     debug "^4.0.0"
     inquirer "^7.0.0"
     tslib "^1.9.0"
 
-"@ionic/cli-framework@3.0.5":
-  version "3.0.5"
-  resolved "https://registry.yarnpkg.com/@ionic/cli-framework/-/cli-framework-3.0.5.tgz#283e3e78f692cb84965613e6ee5499ea9a832bdf"
-  integrity sha512-pskdkbWlEM+QO4qN5Oj+SQMEPx1oyFtbqKUsUE3v7StWK1E4ovl6YsG+y4CBnYF2qDj3Vs+Yh52osarN8jM8jg==
-  dependencies:
-    "@ionic/utils-array" "1.2.2"
-    "@ionic/utils-fs" "2.0.9"
-    "@ionic/utils-object" "1.0.6"
-    "@ionic/utils-process" "1.0.8"
-    "@ionic/utils-stream" "2.0.5"
-    "@ionic/utils-subprocess" "1.0.12"
-    "@ionic/utils-terminal" "1.1.2"
-    chalk "^3.0.0"
+"@ionic/cli-framework@4.1.3":
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/@ionic/cli-framework/-/cli-framework-4.1.3.tgz#c1dc008c88fea79433eb96cf9788dec124c35a9b"
+  integrity sha512-I+EDQyjKyWbrMfZ6/+qIPsxLELxQnpbO3p4I0YTg76nOYEjs0PDdCO+4vFue6z0PzxWCLwZATRmxHNKjS+w8gQ==
+  dependencies:
+    "@ionic/utils-array" "2.1.1"
+    "@ionic/utils-fs" "3.1.1"
+    "@ionic/utils-object" "2.1.1"
+    "@ionic/utils-process" "2.1.1"
+    "@ionic/utils-stream" "3.1.1"
+    "@ionic/utils-subprocess" "2.1.1"
+    "@ionic/utils-terminal" "2.1.1"
+    chalk "^4.0.0"
     debug "^4.0.0"
     lodash "^4.17.5"
-    log-update "^3.2.0"
+    log-update "^4.0.0"
     minimist "^1.2.0"
     rimraf "^3.0.0"
-    slice-ansi "^3.0.0"
+    slice-ansi "^4.0.0"
     string-width "^4.1.0"
     strip-ansi "^6.0.0"
     tslib "^1.9.0"
     untildify "^4.0.0"
-    wrap-ansi "^6.0.0"
+    wrap-ansi "^7.0.0"
     write-file-atomic "^3.0.0"
 
-"@ionic/discover@2.0.7":
-  version "2.0.7"
-  resolved "https://registry.yarnpkg.com/@ionic/discover/-/discover-2.0.7.tgz#e938ac2e38f3a49fb5082c576bd303dca6b65854"
-  integrity sha512-2pPhSqzD6tSi2BvQehnXxhlFZ1eTgHlRyS7A5yjZ85c5LMj1GsMxrD69EhhurINCKSmtrr/Bl2erW6mpwsKuUQ==
-  dependencies:
+"@ionic/cli@^6.7.0":
+  version "6.7.0"
+  resolved "https://registry.yarnpkg.com/@ionic/cli/-/cli-6.7.0.tgz#b6a4de347c87e02c71d647b9e1dc5e2dd5829a59"
+  integrity sha512-Q2JC6YZzdUPG83jVeH55vMMVbgqF+TZhGI9OeMeGlyXzPXhz0NP+HTrxXTdvL3ggE6u8GKZbGEWX1R/7cn4bpg==
+  dependencies:
+    "@ionic/cli-framework" "4.1.3"
+    "@ionic/cli-framework-prompts" "2.1.1"
+    "@ionic/utils-array" "2.1.1"
+    "@ionic/utils-fs" "3.1.1"
+    "@ionic/utils-network" "2.1.1"
+    "@ionic/utils-process" "2.1.1"
+    "@ionic/utils-stream" "3.1.1"
+    "@ionic/utils-subprocess" "2.1.1"
+    "@ionic/utils-terminal" "2.1.1"
+    chalk "^4.0.0"
     debug "^4.0.0"
-    netmask "^1.0.6"
+    diff "^4.0.1"
+    elementtree "^0.1.7"
+    leek "0.0.24"
+    lodash "^4.17.5"
+    open "^7.0.0"
+    os-name "^3.1.0"
+    semver "^7.1.1"
+    split2 "^3.0.0"
+    ssh-config "^1.1.1"
+    stream-combiner2 "^1.1.1"
+    superagent "^5.2.1"
+    superagent-proxy "^2.0.0"
+    tar "^6.0.1"
+    through2 "^3.0.0"
     tslib "^1.9.0"
-    ws "^7.0.0"
+    uuid "^7.0.1"
 
-"@ionic/utils-array@1.2.2":
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-array/-/utils-array-1.2.2.tgz#ad838e1782943e748e9370ac2b59543e6fee8716"
-  integrity sha512-t9FkPHw1OfWkbGobvr2z5bMfpQT3WE/LEFGLraNFiygtOrS3JQnjmqgUHQXk+WVf9RAt5pMUKcmNRCd+AUCvwQ==
+"@ionic/utils-array@2.1.1":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-array/-/utils-array-2.1.1.tgz#7579e16a1a3b9c29014532af08ac17cbe542a215"
+  integrity sha512-6tdrg0g/w5I2Xn/YeM8khhcKgphNwt9VJ4qJ//nJQrmlwwyV2ULSIBnhEIWfYdWgkSD24JLQzSsoB0ZltCUbNw==
   dependencies:
     debug "^4.0.0"
     tslib "^1.9.0"
 
-"@ionic/utils-fs@2.0.9":
-  version "2.0.9"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-fs/-/utils-fs-2.0.9.tgz#c9ebb4c6b78b3056d69b692f5c03006fd59c6176"
-  integrity sha512-koOcdQlMHLIncPVZYQ+GkBHFhu7CJd0PdzDf9EfQBpOZwY66muS7UAlzVtoeY6tURYYniJlQsmg3auTIgVy9bQ==
+"@ionic/utils-fs@3.1.1":
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-fs/-/utils-fs-3.1.1.tgz#f108e86e61aafdaf0bfb69f1859927b150f3b089"
+  integrity sha512-LwfziPHkVata/54dcf8sn/LhShUhgdds411M8v4H6+ugQQO9N+a5TDtFtVnnqSy8Q3uxR15SBWMGyII8i730BA==
   dependencies:
     debug "^4.0.0"
     fs-extra "^8.0.1"
     through2 "^3.0.0"
     tslib "^1.9.0"
 
-"@ionic/utils-network@1.0.6":
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-network/-/utils-network-1.0.6.tgz#cae562504b7a06403c41a8b260d7820201098923"
-  integrity sha512-a7W44S+1ACuRAle9o6YuyTtt6MgxcKhK65Qf1M6rVpzfhW/rJ9gpyACbICHXst5jh2k7ngp5CT9Jyw5fByHNlQ==
+"@ionic/utils-network@2.1.1":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-network/-/utils-network-2.1.1.tgz#441f729346d3b34b6ee5b2828f6c20402dc99281"
+  integrity sha512-sJoqmx9GKHurBOGzSKKLUm/tOfu9li4chhsmOYgoAzAOfZ4oyA+Ft4BNXU3AdzdgXTljtH3U9OS413L6o/M7FA==
   dependencies:
     debug "^4.0.0"
     tslib "^1.9.0"
 
-"@ionic/utils-object@1.0.6":
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-object/-/utils-object-1.0.6.tgz#8eff2eaba2e73dbb4f38333c76610410fbbfbf86"
-  integrity sha512-3defzcaHsdZQgQMKIDMki4Klp9hDKVbRfDCet6f6Xpmd8ycgIgW4wBbtcJRkasps2KJYJLs810mvI/1szOYrSA==
+"@ionic/utils-object@2.1.1":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-object/-/utils-object-2.1.1.tgz#60a23d71b0321444268f5889d189b42e506f2977"
+  integrity sha512-d9trsuk7EzlgzcoCB3BVkhqG/AEzGVw3QUmsDf+MaAUXTtmXiy8wkIpDFx4sgfEXDTnmJP2HO7ZnDEusLDOWoA==
   dependencies:
     debug "^4.0.0"
     tslib "^1.9.0"
 
-"@ionic/utils-process@1.0.8":
-  version "1.0.8"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-process/-/utils-process-1.0.8.tgz#f0063e4b39fc342e2ed6f1773adbe824c0c306de"
-  integrity sha512-N6T6fwZczPW0+BAxiE6UgrlSXpb2di02D91aRkTM5aX2mQJ3kHI/O7nJ6uasksyipcwr3ou0HWtRMjcu+demYg==
+"@ionic/utils-process@2.1.1":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-process/-/utils-process-2.1.1.tgz#5ee1ab06e4a0c5ffab28cfeea1a71270619734a3"
+  integrity sha512-cxQHvoqVEdsAzvI1UmiQNBOzEkag9dHU52L1LsC+FPkiNirNM2tYgKNa3tERcZnZBZwqvKveGIJiiBnFQRnDYw==
   dependencies:
-    "@ionic/utils-object" "1.0.6"
-    "@ionic/utils-terminal" "1.1.2"
+    "@ionic/utils-object" "2.1.1"
+    "@ionic/utils-terminal" "2.1.1"
     debug "^4.0.0"
     lodash "^4.17.5"
-    tree-kill "1.2.1"
+    tree-kill "^1.2.2"
     tslib "^1.9.0"
 
-"@ionic/utils-stream@2.0.5":
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-stream/-/utils-stream-2.0.5.tgz#51ea52dcd02fad6094104df8fe4e49d731c2c259"
-  integrity sha512-GOjEsgEyFTpX5Y6MpDDograU7PgPcclKvrhe1Lhft7VSg6RzeEzmZykzkDK89visw2Qb45G0gfyOuxLlq+WetA==
+"@ionic/utils-stream@3.1.1":
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-stream/-/utils-stream-3.1.1.tgz#34ba10f0b588b6b677e20446ee322105fda0d1de"
+  integrity sha512-n2oN+UqQpr0kGFE6JSkQpVyrVFJCSHqhlKMTo4dzuUMgLovmAZkz+qxgNw+8MCkIcdlZURs6arsNVZt9KeZCVg==
   dependencies:
     debug "^4.0.0"
     tslib "^1.9.0"
 
-"@ionic/utils-subprocess@1.0.12":
-  version "1.0.12"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-subprocess/-/utils-subprocess-1.0.12.tgz#cdc5e08580659ffa42ca9dd4adedf995e2d5dbc5"
-  integrity sha512-up+C4u96xJ4Bnr2R8BehnteUZdROxVVOOxcaghbRd2A4xvPe6pEHK9cAmIIO1qMdDWfz2ET28/AgdqRgpA5wOw==
-  dependencies:
-    "@ionic/utils-array" "1.2.2"
-    "@ionic/utils-fs" "2.0.9"
-    "@ionic/utils-process" "1.0.8"
-    "@ionic/utils-stream" "2.0.5"
-    "@ionic/utils-terminal" "1.1.2"
+"@ionic/utils-subprocess@2.1.1":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-subprocess/-/utils-subprocess-2.1.1.tgz#2e96915dd2abe2fb26bfdaa6664f3c92f0ad35fb"
+  integrity sha512-DK/KlRslM5t5ZC7SwOmfqFg53XZklWR79YfpNvKoGjBczJFA83y4QMXqtbi2lVZc9g4ojkYOd0EycmzNSq6Q4A==
+  dependencies:
+    "@ionic/utils-array" "2.1.1"
+    "@ionic/utils-fs" "3.1.1"
+    "@ionic/utils-process" "2.1.1"
+    "@ionic/utils-stream" "3.1.1"
+    "@ionic/utils-terminal" "2.1.1"
     cross-spawn "^7.0.0"
     debug "^4.0.0"
     tslib "^1.9.0"
 
-"@ionic/utils-terminal@1.1.2":
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/@ionic/utils-terminal/-/utils-terminal-1.1.2.tgz#9f88f0920a8302c0a0e6954767ddffc2a3787a2f"
-  integrity sha512-ODXbta2kvFNkMIEGwl7KX5gJTcZZHkzSLoBh3wND2H+EsG0KpIqOZKWMtkj+suuPut85wyLZ7fGfARnrNf7dtA==
+"@ionic/utils-terminal@2.1.1":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ionic/utils-terminal/-/utils-terminal-2.1.1.tgz#0b4e0f8db6a2c74b97f71449736dec12f740d248"
+  integrity sha512-/7fTr5x3MFL/nm8oV73glyFZ4f4qzHUvV3G/pz/JVoTPokXsDATPkrR3MPbwy2UgCs9awYgaoJ5jBX3IDvQ7bQ==
   dependencies:
     debug "^4.0.0"
     tslib "^1.9.0"
 
-"@ionic/v1-toolkit@2.0.18":
-  version "2.0.18"
-  resolved "https://registry.yarnpkg.com/@ionic/v1-toolkit/-/v1-toolkit-2.0.18.tgz#3d0d305fd26ba5c99ccacb65f160fdf8ec0abd3e"
-  integrity sha512-gLRXg4SmsT6XKnCQTJuE5W9qx3Tzlxr4CO8/GmYGQLqn2CfnJzYdJg4ul2bobG3SXQ/VhDyt8Mx6/K186uMY5A==
+"@ionic/v1-toolkit@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@ionic/v1-toolkit/-/v1-toolkit-3.2.0.tgz#64241f2f91949d20322b9a19e9d2daf950840cf2"
+  integrity sha512-N1+RyZbYi1BGFjBKh1Huxx8cQ8oF30q3bTcDxuMxe7BaLsE/OskS0ULybtBmS2MQRhVtz2vV66IkH+ipPKv92Q==
   dependencies:
-    "@ionic/cli-framework" "3.0.5"
-    "@ionic/utils-fs" "2.0.9"
-    chalk "^3.0.0"
+    "@ionic/cli-framework" "4.1.3"
+    "@ionic/utils-fs" "3.1.1"
+    chalk "^4.0.0"
     chokidar "^3.0.1"
     debug "^4.0.0"
     express "^4.16.2"
@@ -383,18 +494,58 @@
     tslib "^1.9.0"
     ws "^7.0.0"
 
-"@mrmlnc/readdir-enhanced@^2.2.1":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
-  integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+"@nodelib/fs.scandir@2.1.3":
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+  integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
   dependencies:
-    call-me-maybe "^1.0.1"
-    glob-to-regexp "^0.3.0"
+    "@nodelib/fs.stat" "2.0.3"
+    run-parallel "^1.1.9"
 
-"@nodelib/fs.stat@^1.1.2":
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
-  integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+  integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+  integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.3"
+    fastq "^1.6.0"
+
+"@prantlf/gulp-jsonlint@^2.4.0":
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/@prantlf/gulp-jsonlint/-/gulp-jsonlint-2.4.0.tgz#282d468c9b067f98202809274619e4b5d22fe30e"
+  integrity sha512-13L1ZZShhETd7m5ZIoG4yBNqlOrcf6hNHMU5XhfWs45pSD259Kw/ycwEi23HcthWZfcyLpkxgvciBFKze/bz1w==
+  dependencies:
+    "@prantlf/jsonlint" "10.2.0"
+    ansi-colors "4.1.1"
+    fancy-log "1.3.3"
+    map-stream "0.0.7"
+    plugin-error "1.0.1"
+    through2 "3.0.1"
+
+"@prantlf/jsonlint@10.2.0":
+  version "10.2.0"
+  resolved "https://registry.yarnpkg.com/@prantlf/jsonlint/-/jsonlint-10.2.0.tgz#0716001895cc5f0407820ffe9887de5e13e6fa47"
+  integrity sha512-KMFfds0peWLLfCu3bhClTiEN0tdj/Z86QJvn1awKHws6r+Sx6T3a44Eadz6OvqN6ZpsRkqaRpZxqddvvDAdDZQ==
+  dependencies:
+    ajv "6.10.2"
+    commander "4.0.1"
+
+"@sindresorhus/is@^0.14.0":
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+  integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
+"@szmarczak/http-timer@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+  integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+  dependencies:
+    defer-to-connect "^1.0.1"
 
 "@types/color-name@^1.1.1":
   version "1.1.1"
@@ -415,15 +566,15 @@
     "@types/minimatch" "*"
     "@types/node" "*"
 
-"@types/minimatch@*":
+"@types/minimatch@*", "@types/minimatch@^3.0.3":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
   integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
 
 "@types/node@*":
-  version "13.1.0"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.1.0.tgz#225cbaac5fdb2b9ac651b02c070d8aa3c37cc812"
-  integrity sha512-zwrxviZS08kRX40nqBrmERElF2vpw4IUTd5khkhBTfFH8AOaeoLVx48EC4+ZzS2/Iga7NevncqnsUSYjM4OWYA==
+  version "13.11.1"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.1.tgz#49a2a83df9d26daacead30d0ccc8762b128d53c7"
+  integrity sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g==
 
 CSSselect@~0.4.0:
   version "0.4.1"
@@ -438,6 +589,19 @@ CSSwhat@0.4:
   resolved "https://registry.yarnpkg.com/CSSwhat/-/CSSwhat-0.4.7.tgz#867da0ff39f778613242c44cfea83f0aa4ebdf9b"
   integrity sha1-hn2g/zn3eGEyQsRM/qg/CqTr35s=
 
+JSONSelect@0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/JSONSelect/-/JSONSelect-0.2.1.tgz#415418a526d33fe31d74b4defa3c836d485ec203"
+  integrity sha1-QVQYpSbTP+MddLTe+jyDbUhewgM=
+
+JSONStream@^1.0.3:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
+  integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
 abbrev@1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -459,6 +623,52 @@ accepts@~1.3.5, accepts@~1.3.7:
     mime-types "~2.1.24"
     negotiator "0.6.2"
 
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
+  dependencies:
+    acorn "^3.0.4"
+
+acorn-jsx@^5.0.0, acorn-jsx@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
+  integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
+
+acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
+  integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
+  dependencies:
+    acorn "^7.0.0"
+    acorn-walk "^7.0.0"
+    xtend "^4.0.2"
+
+acorn-walk@^7.0.0:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e"
+  integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==
+
+acorn@5.X, acorn@^5.0.3, acorn@^5.2.1, acorn@^5.5.0:
+  version "5.7.4"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
+  integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
+
+acorn@^3.0.4:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+  integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
+
+acorn@^6.0.7:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
+  integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
+
+acorn@^7.0.0, acorn@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
+  integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
+
 acorn@~0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-0.11.0.tgz#6e95f0253ad161ff0127db32983e5e2e5352d59a"
@@ -469,10 +679,77 @@ acorn@~2.6.4:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.6.4.tgz#eb1f45b4a43fa31d03701a5ec46f3b52673e90ee"
   integrity sha1-6x9FtKQ/ox0DcBpexG87Umc+kO4=
 
-adm-zip@~0.4.4:
-  version "0.4.13"
-  resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a"
-  integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==
+adbkit-logcat@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/adbkit-logcat/-/adbkit-logcat-1.1.0.tgz#01d7f9b0cef9093a30bcb3b007efff301508962f"
+  integrity sha1-Adf5sM75CTowvLOwB+//MBUIli8=
+
+adbkit-monkey@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/adbkit-monkey/-/adbkit-monkey-1.0.1.tgz#f291be701a2efc567a63fc7aa6afcded31430be1"
+  integrity sha1-8pG+cBou/FZ6Y/x6pq/N7TFDC+E=
+  dependencies:
+    async "~0.2.9"
+
+adbkit@2.11.1:
+  version "2.11.1"
+  resolved "https://registry.yarnpkg.com/adbkit/-/adbkit-2.11.1.tgz#7da847fe561254f3121088947bc1907ef053e894"
+  integrity sha512-hDTiRg9NX3HQt7WoDAPCplUpvzr4ZzQa2lq7BdTTJ/iOZ6O7YNAs6UYD8sFAiBEcYHDRIyq3cm9sZP6uZnhvXw==
+  dependencies:
+    adbkit-logcat "^1.1.0"
+    adbkit-monkey "~1.0.1"
+    bluebird "~2.9.24"
+    commander "^2.3.0"
+    debug "~2.6.3"
+    node-forge "^0.7.1"
+    split "~0.3.3"
+
+addons-linter@1.23.0:
+  version "1.23.0"
+  resolved "https://registry.yarnpkg.com/addons-linter/-/addons-linter-1.23.0.tgz#c887c6c91cabd373878b3da6a13292dd3ada78de"
+  integrity sha512-4ozo5E+KnsU9h94J496WQs6NYSnofxtw5/Sy63PmeB5FJ3KWERx1S9D8A+ixMAIMgaSiexHpp5alp9yjE0t4gg==
+  dependencies:
+    "@babel/runtime" "7.9.2"
+    ajv "6.12.0"
+    ajv-merge-patch "4.1.0"
+    chalk "3.0.0"
+    cheerio "1.0.0-rc.3"
+    columnify "1.5.4"
+    common-tags "1.8.0"
+    deepmerge "4.2.2"
+    dispensary "0.51.2"
+    es6-promisify "6.1.0"
+    eslint "5.16.0"
+    eslint-plugin-no-unsafe-innerhtml "1.0.16"
+    eslint-visitor-keys "1.1.0"
+    espree "6.2.1"
+    esprima "4.0.1"
+    first-chunk-stream "3.0.0"
+    fluent-syntax "0.13.0"
+    glob "7.1.6"
+    is-mergeable-object "1.1.1"
+    jed "1.1.1"
+    mdn-browser-compat-data "1.0.15"
+    os-locale "5.0.0"
+    pino "6.0.0"
+    postcss "7.0.27"
+    probe-image-size "5.0.0"
+    relaxed-json "1.0.3"
+    semver "7.1.3"
+    source-map-support "0.5.16"
+    strip-bom-stream "4.0.0"
+    tosource "1.0.0"
+    upath "1.2.0"
+    whatwg-url "8.0.0"
+    yargs "15.3.1"
+    yauzl "2.10.0"
+  optionalDependencies:
+    fsevents "2.1.2"
+
+adm-zip@~0.4.4, adm-zip@~0.4.x:
+  version "0.4.14"
+  resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.14.tgz#2cf312bcc9f8875df835b0f6040bd89be0a727a9"
+  integrity sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==
 
 after@0.8.2:
   version "0.8.2"
@@ -493,7 +770,28 @@ agent-base@~4.2.1:
   dependencies:
     es6-promisify "^5.0.0"
 
-ajv@^6.5.5:
+aggregate-error@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
+  integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==
+  dependencies:
+    clean-stack "^2.0.0"
+    indent-string "^4.0.0"
+
+ajv-keywords@^1.0.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+  integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw=
+
+ajv-merge-patch@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ajv-merge-patch/-/ajv-merge-patch-4.1.0.tgz#cd580e5860ac53431d6aa901fa3d5e2eb2b74a6c"
+  integrity sha512-0mAYXMSauA8RZ7r+B4+EAOYcZEcO9OK5EiQCR7W7Cv4E44pJj56ZnkKLJ9/PAcOc0dT+LlV9fdDcq2TxVJfOYw==
+  dependencies:
+    fast-json-patch "^2.0.6"
+    json-merge-patch "^0.2.3"
+
+ajv@6.10.2:
   version "6.10.2"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
   integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
@@ -503,14 +801,40 @@ ajv@^6.5.5:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
-align-text@^0.1.1, align-text@^0.1.3:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
-  integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=
+ajv@6.12.0, ajv@^6.5.5:
+  version "6.12.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
+  integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
   dependencies:
-    kind-of "^3.0.2"
-    longest "^1.0.1"
-    repeat-string "^1.5.2"
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ajv@^4.7.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^6.10.2, ajv@^6.9.1:
+  version "6.12.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
+  integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+aliasify@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/aliasify/-/aliasify-2.1.0.tgz#7c30825b9450b9e6185ba27533eaf6e2067d4b42"
+  integrity sha1-fDCCW5RQueYYW6J1M+r24gZ9S0I=
+  dependencies:
+    browserify-transform-tools "~1.7.0"
 
 alter@~0.2.0:
   version "0.2.0"
@@ -524,7 +848,7 @@ amdefine@>=0.0.4:
   resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
   integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
 
-android-versions@^1.2.1:
+android-versions@^1.4.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/android-versions/-/android-versions-1.5.0.tgz#7790bc74e0812aafd69fb1ad0cb4db4474a525d6"
   integrity sha512-/GWUAqa2OJNlDF5VGSe3SR1QMHEPXxx54Ur56r0qQC0H9FlBr7kyBF2SgVEhzFCPbrW4UcYgVuWrq/2Ty3QvXg==
@@ -539,7 +863,7 @@ angular-simple-logger@0.1.x:
     angular "^1.2"
     debug "^2.2.0"
 
-angular@1.x, angular@^1.2, angular@^1.2.0:
+angular@1.x, angular@^1.2, angular@^1.2.0, angular@^1.5.11:
   version "1.7.9"
   resolved "https://registry.yarnpkg.com/angular/-/angular-1.7.9.tgz#e52616e8701c17724c3c238cfe4f9446fd570bc4"
   integrity sha512-5se7ZpcOtu0MBFlzGv5dsM1quQDoDeUTwZrWjGtTNA7O88cD8TEk5IEKCTDa3uECV9XnvKREVUr7du1ACiWGFQ==
@@ -551,6 +875,18 @@ ansi-align@^2.0.0:
   dependencies:
     string-width "^2.0.0"
 
+ansi-align@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
+  integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
+  dependencies:
+    string-width "^3.0.0"
+
+ansi-colors@4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+  integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
 ansi-colors@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
@@ -565,17 +901,22 @@ ansi-cyan@^0.1.1:
   dependencies:
     ansi-wrap "0.1.0"
 
+ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+  integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
+
 ansi-escapes@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
 
-ansi-escapes@^4.2.1:
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d"
-  integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
+  integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
   dependencies:
-    type-fest "^0.8.1"
+    type-fest "^0.11.0"
 
 ansi-gray@^0.1.1:
   version "0.1.1"
@@ -634,9 +975,9 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
     color-convert "^1.9.0"
 
 ansi-styles@^4.0.0, ansi-styles@^4.1.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.0.tgz#5681f0dcf7ae5880a7841d8831c4724ed9cc0172"
-  integrity sha512-7kFQgnEaMdRtwf6uSfUnVr9gSGC7faurn+J/Mv90/W+iTtN0405/nLdopfMWwchyxhbGYl6TC4Sccn9TUkGAgg==
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+  integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
   dependencies:
     "@types/color-name" "^1.1.1"
     color-convert "^2.0.1"
@@ -651,11 +992,24 @@ ansi@^0.3.1:
   resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21"
   integrity sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=
 
+any-promise@^1.0.0, any-promise@^1.1.0, any-promise@~1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+  integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
 any-shell-escape@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/any-shell-escape/-/any-shell-escape-0.1.1.tgz#d55ab972244c71a9a5e1ab0879f30bf110806959"
   integrity sha1-1Vq5ciRMcaml4asIefML8RCAaVk=
 
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
 anymatch@~3.1.1:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
@@ -676,6 +1030,32 @@ aproba@^1.0.3:
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
   integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
 
+archiver-utils@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174"
+  integrity sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=
+  dependencies:
+    glob "^7.0.0"
+    graceful-fs "^4.1.0"
+    lazystream "^1.0.0"
+    lodash "^4.8.0"
+    normalize-path "^2.0.0"
+    readable-stream "^2.0.0"
+
+archiver@~2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/archiver/-/archiver-2.1.1.tgz#ff662b4a78201494a3ee544d3a33fe7496509ebc"
+  integrity sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=
+  dependencies:
+    archiver-utils "^1.3.0"
+    async "^2.0.0"
+    buffer-crc32 "^0.2.1"
+    glob "^7.0.0"
+    lodash "^4.8.0"
+    readable-stream "^2.0.0"
+    tar-stream "^1.5.0"
+    zip-stream "^1.2.0"
+
 archy@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
@@ -709,11 +1089,25 @@ arr-diff@^4.0.0:
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
   integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
 
+arr-filter@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee"
+  integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=
+  dependencies:
+    make-iterator "^1.0.0"
+
 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"
   integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
 
+arr-map@^2.0.0, arr-map@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4"
+  integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ=
+  dependencies:
+    make-iterator "^1.0.0"
+
 arr-union@^2.0.1:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d"
@@ -729,11 +1123,21 @@ array-differ@^1.0.0:
   resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031"
   integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=
 
-array-each@^1.0.1:
+array-differ@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
+  integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
+
+array-each@^1.0.0, array-each@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
   integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
 
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+  integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw=
+
 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"
@@ -744,6 +1148,36 @@ array-flatten@1.1.1:
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
   integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
 
+array-ify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
+  integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=
+
+array-initial@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795"
+  integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U=
+  dependencies:
+    array-slice "^1.0.0"
+    is-number "^4.0.0"
+
+array-last@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336"
+  integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==
+  dependencies:
+    is-number "^4.0.0"
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+  integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+  integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=
+
 array-slice@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
@@ -754,14 +1188,21 @@ array-slice@^1.0.0:
   resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
   integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
 
-array-union@^1.0.1, array-union@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
-  integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+array-sort@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a"
+  integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
   dependencies:
-    array-uniq "^1.0.1"
+    default-compare "^1.0.0"
+    get-value "^2.0.6"
+    kind-of "^5.0.2"
+
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
 
-array-uniq@^1.0.1, array-uniq@^1.0.2:
+array-uniq@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
   integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
@@ -776,10 +1217,19 @@ arraybuffer.slice@0.0.6:
   resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
   integrity sha1-8zshWfBTKj8xB6JywMz70a0peco=
 
-arrify@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
-  integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+arrify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
+  integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
+
+asn1.js@^4.0.0:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
 
 asn1@0.1.11:
   version "0.1.11"
@@ -808,15 +1258,28 @@ assert-plus@^0.2.0:
   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
   integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ=
 
+assert@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+  integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
+  dependencies:
+    object-assign "^4.1.1"
+    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"
   integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
 
 ast-types@0.x.x:
-  version "0.13.2"
-  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48"
-  integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==
+  version "0.13.3"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.3.tgz#50da3f28d17bdbc7969a3a2d83a0e4a72ae755a7"
+  integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==
+
+astral-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+  integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
 
 astral-regex@^2.0.0:
   version "2.0.0"
@@ -828,24 +1291,46 @@ async-array-reduce@^0.2.0:
   resolved "https://registry.yarnpkg.com/async-array-reduce/-/async-array-reduce-0.2.1.tgz#c8be010a2b5cd00dea96c81116034693dfdd82d1"
   integrity sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=
 
+async-done@^1.2.0, async-done@^1.2.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2"
+  integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.2"
+    process-nextick-args "^2.0.0"
+    stream-exhaust "^1.0.1"
+
+async-each@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+  integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+
 async-foreach@^0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
   integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=
 
-async@^1.5.0, async@^1.5.2, async@~1.5.0:
+async-settle@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b"
+  integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=
+  dependencies:
+    async-done "^1.2.2"
+
+async@^1.4.2, async@^1.5.0, async@^1.5.2, async@~1.5.0:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
   integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
 
-async@^2.0.1, async@^2.6.2:
+async@^2.0.0, async@^2.0.1:
   version "2.6.3"
   resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
   integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
   dependencies:
     lodash "^4.17.14"
 
-async@~0.2.10, async@~0.2.6:
+async@~0.2.10, async@~0.2.6, async@~0.2.9:
   version "0.2.10"
   resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1"
   integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E=
@@ -860,16 +1345,33 @@ async@~1.4.2:
   resolved "https://registry.yarnpkg.com/async/-/async-1.4.2.tgz#6c9edcb11ced4f0dd2f2d40db0d49a109c088aab"
   integrity sha1-bJ7csRztTw3S8tQNsNSaEJwIiqs=
 
+async@~2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
+  integrity sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==
+  dependencies:
+    lodash "^4.14.0"
+
+async@~3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
+  integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
+
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
   integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
 
-atob@^2.1.1:
+atob@^2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
   integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
 
+atomic-sleep@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b"
+  integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==
+
 aws-sign2@~0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63"
@@ -886,9 +1388,33 @@ aws-sign2@~0.7.0:
   integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
 
 aws4@^1.2.1, aws4@^1.8.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.0.tgz#24390e6ad61386b0a747265754d2a17219de862c"
-  integrity sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
+  integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
+
+babel-code-frame@^6.16.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+bach@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880"
+  integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=
+  dependencies:
+    arr-filter "^1.1.1"
+    arr-flatten "^1.0.1"
+    arr-map "^2.0.0"
+    array-each "^1.0.0"
+    array-initial "^1.0.0"
+    array-last "^1.1.1"
+    async-done "^1.2.2"
+    async-settle "^1.0.0"
+    now-and-later "^2.0.0"
 
 backo2@1.0.2:
   version "1.0.2"
@@ -905,12 +1431,17 @@ base64-arraybuffer@0.1.5:
   resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
   integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
 
+base64-js@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.1.2.tgz#d6400cac1c4c660976d90d07a04351d89395f5e8"
+  integrity sha1-1kAMrBxMZgl22Q0HoENR2JOV9eg=
+
 base64-js@1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
   integrity sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=
 
-base64-js@^1.2.3:
+base64-js@^1.0.2, base64-js@^1.2.3:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
   integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
@@ -970,15 +1501,35 @@ big-integer@^1.6.44, big-integer@^1.6.7:
   resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e"
   integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==
 
+binary-extensions@^1.0.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+  integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
 binary-extensions@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
   integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
 
-binaryextensions@~1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-1.0.1.tgz#1e637488b35b58bda5f4774bf96a5212a8c90755"
-  integrity sha1-HmN0iLNbWL2l9HdL+WpSEqjJB1U=
+binaryextensions@2:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.2.0.tgz#e7c6ba82d4f5f5758c26078fe8eea28881233311"
+  integrity sha512-bHhs98rj/7i/RZpCSJ3uk55pLXOItjIrh2sRQZSM6OoktScX+LxJzvlU+FELp9j3TdcddTmmYArLSGptCTwjuw==
+
+bindings@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+  integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+  dependencies:
+    file-uri-to-path "1.0.0"
+
+bl@^1.0.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
+  integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
+  dependencies:
+    readable-stream "^2.3.5"
+    safe-buffer "^5.1.1"
 
 bl@~1.0.0:
   version "1.0.3"
@@ -1016,6 +1567,16 @@ bluebird@^3.3.5:
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
   integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
 
+bluebird@~2.9.24:
+  version "2.9.34"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.9.34.tgz#2f7b4ec80216328a9fddebdf69c8d4942feff7d8"
+  integrity sha1-L3tOyAIWMoqf3evfacjUlC/v99g=
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+  integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
 body-parser@1.19.0:
   version "1.19.0"
   resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
@@ -1058,6 +1619,11 @@ body@^5.1.0:
     raw-body "~1.1.0"
     safe-json-parse "~1.0.1"
 
+boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
 boom@0.4.x:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b"
@@ -1072,11 +1638,6 @@ boom@2.x.x:
   dependencies:
     hoek "2.x.x"
 
-bower@^1.8.8:
-  version "1.8.8"
-  resolved "https://registry.yarnpkg.com/bower/-/bower-1.8.8.tgz#82544be34a33aeae7efb8bdf9905247b2cffa985"
-  integrity sha512-1SrJnXnkP9soITHptSO+ahx3QKp3cVzn8poI6ujqc5SeOkg5iqM1pK9H+DSc2OQ8SnO0jC/NG4Ur/UIwy7574A==
-
 boxen@^1.2.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
@@ -1090,6 +1651,27 @@ boxen@^1.2.1:
     term-size "^1.2.0"
     widest-line "^2.0.0"
 
+boxen@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
+  integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==
+  dependencies:
+    ansi-align "^3.0.0"
+    camelcase "^5.3.1"
+    chalk "^3.0.0"
+    cli-boxes "^2.2.0"
+    string-width "^4.1.0"
+    term-size "^2.1.0"
+    type-fest "^0.8.1"
+    widest-line "^3.1.0"
+
+bplist-creator@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45"
+  integrity sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=
+  dependencies:
+    stream-buffers "~2.2.0"
+
 bplist-creator@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.8.tgz#56b2a6e79e9aec3fc33bf831d09347d73794e79c"
@@ -1097,6 +1679,13 @@ bplist-creator@0.0.8:
   dependencies:
     stream-buffers "~2.2.0"
 
+bplist-parser@0.1.1, bplist-parser@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6"
+  integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=
+  dependencies:
+    big-integer "^1.6.7"
+
 bplist-parser@0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e"
@@ -1109,13 +1698,6 @@ bplist-parser@^0.0.6:
   resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.0.6.tgz#38da3471817df9d44ab3892e27707bbbd75a11b9"
   integrity sha1-ONo0cYF9+dRKs4kuJ3B7u9daEbk=
 
-bplist-parser@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6"
-  integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=
-  dependencies:
-    big-integer "^1.6.7"
-
 brace-expansion@^1.0.0, brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -1124,7 +1706,7 @@ brace-expansion@^1.0.0, brace-expansion@^1.1.7:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
-braces@^2.3.1:
+braces@^2.3.1, braces@^2.3.2:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
   integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
@@ -1147,7 +1729,164 @@ braces@^3.0.1, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
-buffer-crc32@~0.2.3:
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+browser-pack@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774"
+  integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.8.0"
+    defined "^1.0.0"
+    safe-buffer "^5.1.1"
+    through2 "^2.0.0"
+    umd "^3.0.0"
+
+browser-resolve@^1.11.0, browser-resolve@^1.7.0:
+  version "1.11.3"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
+  integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
+  dependencies:
+    resolve "1.1.7"
+
+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"
+  integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+  integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-transform-tools@~1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/browserify-transform-tools/-/browserify-transform-tools-1.7.0.tgz#83e277221f63259bed2e7eb2a283a970a501f4c4"
+  integrity sha1-g+J3Ih9jJZvtLn6yooOpcKUB9MQ=
+  dependencies:
+    falafel "^2.0.0"
+    through "^2.3.7"
+
+browserify-zlib@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+  integrity sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=
+  dependencies:
+    pako "~0.2.0"
+
+browserify@14.4.0:
+  version "14.4.0"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.4.0.tgz#089a3463af58d0e48d8cd4070b3f74654d5abca9"
+  integrity sha1-CJo0Y69Y0OSNjNQHCz90ZU1avKk=
+  dependencies:
+    JSONStream "^1.0.3"
+    assert "^1.4.0"
+    browser-pack "^6.0.1"
+    browser-resolve "^1.11.0"
+    browserify-zlib "~0.1.2"
+    buffer "^5.0.2"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.1"
+    console-browserify "^1.1.0"
+    constants-browserify "~1.0.0"
+    crypto-browserify "^3.0.0"
+    defined "^1.0.0"
+    deps-sort "^2.0.0"
+    domain-browser "~1.1.0"
+    duplexer2 "~0.1.2"
+    events "~1.1.0"
+    glob "^7.1.0"
+    has "^1.0.0"
+    htmlescape "^1.1.0"
+    https-browserify "^1.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "^7.0.0"
+    labeled-stream-splicer "^2.0.0"
+    module-deps "^4.0.8"
+    os-browserify "~0.1.1"
+    parents "^1.0.1"
+    path-browserify "~0.0.0"
+    process "~0.11.0"
+    punycode "^1.3.2"
+    querystring-es3 "~0.2.0"
+    read-only-stream "^2.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.4"
+    shasum "^1.0.0"
+    shell-quote "^1.6.1"
+    stream-browserify "^2.0.0"
+    stream-http "^2.0.0"
+    string_decoder "~1.0.0"
+    subarg "^1.0.0"
+    syntax-error "^1.1.1"
+    through2 "^2.0.0"
+    timers-browserify "^1.0.1"
+    tty-browserify "~0.0.0"
+    url "~0.11.0"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^4.0.0"
+
+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"
+  integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
+buffer-crc32@^0.2.1, buffer-crc32@~0.2.3:
   version "0.2.13"
   resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
   integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
@@ -1162,11 +1901,37 @@ buffer-equal@^1.0.0:
   resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
   integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
 
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+  integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
+
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
   integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
 
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+  integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
+
+buffer@^5.0.2:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce"
+  integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
+buffer@^5.1.0:
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
+  integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
 buffers@0.1.1, buffers@^0.1.1, buffers@~0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
@@ -1179,13 +1944,6 @@ bufferstreams@0.0.2:
   dependencies:
     readable-stream "^1.0.26-2"
 
-bufferstreams@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.0.1.tgz#cfb1ad9568d3ba3cfe935ba9abdd952de88aab2a"
-  integrity sha1-z7GtlWjTujz+k1upq92VLeiKqyo=
-  dependencies:
-    readable-stream "^1.0.33"
-
 bufferstreams@^1.1.0:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.3.tgz#a8515ac024fa90e8fa7d58c11b13dea1f28abe72"
@@ -1193,19 +1951,41 @@ bufferstreams@^1.1.0:
   dependencies:
     readable-stream "^2.0.2"
 
+bufferstreams@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-2.0.1.tgz#441b267c2fc3fee02bb1d929289da113903bd5ef"
+  integrity sha512-ZswyIoBfFb3cVDsnZLLj2IDJ/0ppYdil/v2EGlZXvoefO689FokEmFEldhN5dV7R2QBxFneqTJOMIpfqhj+n0g==
+  dependencies:
+    readable-stream "^2.3.6"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+  integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+
 builtins@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
   integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
 
-bump-regex@^2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/bump-regex/-/bump-regex-2.9.0.tgz#b1770cfa62d532f523661246877c16bd0dbbd038"
-  integrity sha512-o4WC1mKw/kM0zScuOxZKi243lc+/h09b41u2A7HlWbxHsEDsTTZtqDZYkQj65l24J8+9Saahn5ep+EyeqpQoCg==
+bump-regex@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/bump-regex/-/bump-regex-3.1.1.tgz#fc2ee36071cbc06959fa68707f2e6b40abe89edf"
+  integrity sha512-NinFibU11G1ad/2Ji3J04lRC9mLpUGr3C0vtt4Yp049cDeW21NRkmUaZZc+snwlL6gE+Ja5cQfe/hf86Ahj+WQ==
   dependencies:
     semver "^5.1.0"
     xtend "^4.0.1"
 
+bunyan@1.8.12:
+  version "1.8.12"
+  resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797"
+  integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=
+  optionalDependencies:
+    dtrace-provider "~0.8"
+    moment "^2.10.6"
+    mv "~2"
+    safe-json-stringify "~1"
+
 bytes@1:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
@@ -1246,22 +2026,47 @@ cache-base@^1.0.1:
     union-value "^1.0.0"
     unset-value "^1.0.0"
 
-call-me-maybe@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
-  integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
+cacheable-request@^6.0.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+  integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+  dependencies:
+    clone-response "^1.0.2"
+    get-stream "^5.1.0"
+    http-cache-semantics "^4.0.0"
+    keyv "^3.0.0"
+    lowercase-keys "^2.0.0"
+    normalize-url "^4.1.0"
+    responselike "^1.0.2"
+
+cached-path-relative@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.2.tgz#a13df4196d26776220cc3356eb147a52dba2c6db"
+  integrity sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
+  dependencies:
+    callsites "^0.2.0"
 
 callsite@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
   integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
 
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+  integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
+
 callsites@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
   integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 
-camel-case@^3.0.0:
+camel-case@3.0.x:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
   integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
@@ -1285,6 +2090,11 @@ camelcase-keys@^2.0.0:
     camelcase "^2.0.0"
     map-obj "^1.0.0"
 
+camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
 camelcase@^1.0.1, camelcase@^1.0.2:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
@@ -1320,13 +2130,13 @@ caseless@~0.12.0:
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
   integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
 
-center-align@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
-  integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60=
+chalk@3.0.0, chalk@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
   dependencies:
-    align-text "^0.1.3"
-    lazy-cache "^1.0.3"
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
 
 chalk@^0.5.0, chalk@^0.5.1:
   version "0.5.1"
@@ -1350,7 +2160,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
-chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1359,38 +2169,14 @@ chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
-chalk@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
-  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+chalk@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72"
+  integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==
   dependencies:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
-change-case@3.0.x:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037"
-  integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==
-  dependencies:
-    camel-case "^3.0.0"
-    constant-case "^2.0.0"
-    dot-case "^2.1.0"
-    header-case "^1.0.0"
-    is-lower-case "^1.1.0"
-    is-upper-case "^1.1.0"
-    lower-case "^1.1.1"
-    lower-case-first "^1.0.0"
-    no-case "^2.3.2"
-    param-case "^2.1.0"
-    pascal-case "^2.0.0"
-    path-case "^2.1.0"
-    sentence-case "^2.1.0"
-    snake-case "^2.1.0"
-    swap-case "^1.1.0"
-    title-case "^2.1.0"
-    upper-case "^1.1.1"
-    upper-case-first "^1.1.0"
-
 chardet@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -1430,6 +2216,37 @@ cheerio@0.18.0:
     htmlparser2 "~3.8.1"
     lodash "~2.4.1"
 
+cheerio@1.0.0-rc.3, cheerio@^1.0.0-rc.3:
+  version "1.0.0-rc.3"
+  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6"
+  integrity sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==
+  dependencies:
+    css-select "~1.2.0"
+    dom-serializer "~0.1.1"
+    entities "~1.1.1"
+    htmlparser2 "^3.9.1"
+    lodash "^4.15.0"
+    parse5 "^3.0.1"
+
+chokidar@^2.0.0, chokidar@^2.1.8:
+  version "2.1.8"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+  integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.1"
+    braces "^2.3.2"
+    glob-parent "^3.1.0"
+    inherits "^2.0.3"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^3.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.2.1"
+    upath "^1.1.1"
+  optionalDependencies:
+    fsevents "^1.2.7"
+
 chokidar@^3.0.1:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
@@ -1445,22 +2262,44 @@ chokidar@^3.0.1:
   optionalDependencies:
     fsevents "~2.1.2"
 
-chownr@^1.1.1:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
-  integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
+chownr@^1.1.3:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+  integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chrome-launcher@0.13.1:
+  version "0.13.1"
+  resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.13.1.tgz#cd5ed4952b630b9fccf2037b211cba81e5aae044"
+  integrity sha512-q8UiCNAknw6kCUvCVBTAEw1BwT0vaxabCrSjN3B/NWohp12YBD9+DalymYElSoKRD4KpVSu4CCl0us4v/J81Sg==
+  dependencies:
+    "@types/node" "*"
+    is-wsl "^2.1.0"
+    lighthouse-logger "^1.0.0"
+    mkdirp "^0.5.3"
+    rimraf "^3.0.2"
 
 ci-info@^1.5.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
   integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
 
-clap@^1.0.9:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
-  integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==
+ci-info@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+  integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
   dependencies:
-    chalk "^1.1.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+  integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
 
 class-utils@^0.3.5:
   version "0.3.6"
@@ -1472,14 +2311,6 @@ class-utils@^0.3.5:
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
-clean-css@3.4.x:
-  version "3.4.28"
-  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff"
-  integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=
-  dependencies:
-    commander "2.8.x"
-    source-map "0.4.x"
-
 clean-css@4.2.1:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
@@ -1487,6 +2318,13 @@ clean-css@4.2.1:
   dependencies:
     source-map "~0.6.0"
 
+clean-css@4.2.3, clean-css@4.2.x:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
+  integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
+  dependencies:
+    source-map "~0.6.0"
+
 clean-css@~3.0.4:
   version "3.0.10"
   resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.0.10.tgz#d477b381baa41f759a829d51f9cb380db90d626e"
@@ -1495,11 +2333,28 @@ clean-css@~3.0.4:
     commander "2.5.x"
     source-map ">=0.1.43 <0.2"
 
+clean-stack@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
 cli-boxes@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
   integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
 
+cli-boxes@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
+  integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
+
+cli-cursor@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=
+  dependencies:
+    restore-cursor "^1.0.1"
+
 cli-cursor@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -1514,6 +2369,11 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
+cli-width@^1.0.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d"
+  integrity sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=
+
 cli-width@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
@@ -1527,15 +2387,6 @@ cli@~1.0.0:
     exit "0.1.2"
     glob "^7.1.1"
 
-cliui@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
-  integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=
-  dependencies:
-    center-align "^0.1.1"
-    right-align "^0.1.1"
-    wordwrap "0.0.2"
-
 cliui@^3.0.3, cliui@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
@@ -1545,11 +2396,27 @@ cliui@^3.0.3, cliui@^3.2.0:
     strip-ansi "^3.0.1"
     wrap-ansi "^2.0.0"
 
+cliui@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+  integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^6.2.0"
+
 clone-buffer@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
   integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
 
+clone-response@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+  integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+  dependencies:
+    mimic-response "^1.0.0"
+
 clone-stats@^0.0.1, clone-stats@~0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
@@ -1594,6 +2461,15 @@ code-point-at@^1.0.0:
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
   integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
 
+collection-map@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c"
+  integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=
+  dependencies:
+    arr-map "^2.0.2"
+    for-own "^1.0.0"
+    make-iterator "^1.0.0"
+
 collection-visit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
@@ -1631,7 +2507,30 @@ color-support@^1.1.3:
   resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
   integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
 
-combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6:
+colors@0.5.x:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-0.5.1.tgz#7d0023eaeb154e8ee9fce75dcb923d0ed1667774"
+  integrity sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=
+
+columnify@1.5.4:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
+  integrity sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=
+  dependencies:
+    strip-ansi "^3.0.0"
+    wcwidth "^1.0.0"
+
+combine-source-map@^0.8.0, combine-source-map@~0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b"
+  integrity sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.5, combined-stream@~1.0.6:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
   integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -1645,26 +2544,29 @@ combined-stream@~0.0.4:
   dependencies:
     delayed-stream "0.0.5"
 
+commander@2.17.x:
+  version "2.17.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+  integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
+
 commander@2.5.x:
   version "2.5.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.5.1.tgz#23c61f6e47be143cc02e7ad4bb1c47f5cd5a2883"
   integrity sha1-I8Yfbke+FDzALnrUuxxH9c1aKIM=
 
-commander@2.8.x:
-  version "2.8.1"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
-  integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
-  dependencies:
-    graceful-readlink ">= 1.0.0"
-
-commander@2.9.x:
+commander@2.9.0:
   version "2.9.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
   integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
   dependencies:
     graceful-readlink ">= 1.0.0"
 
-commander@^2.20.0, commander@^2.9.0:
+commander@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c"
+  integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==
+
+commander@^2.20.0, commander@^2.3.0, commander@^2.6.0, commander@^2.9.0:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1674,6 +2576,24 @@ commander@~2.15.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
   integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
 
+commander@~2.19.0:
+  version "2.19.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+  integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+
+common-tags@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
+  integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
+
+compare-func@^1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648"
+  integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=
+  dependencies:
+    array-ify "^1.0.0"
+    dot-prop "^3.0.0"
+
 component-bind@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
@@ -1689,7 +2609,7 @@ component-emitter@1.2.1:
   resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
   integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=
 
-component-emitter@^1.2.0, component-emitter@^1.2.1:
+component-emitter@^1.2.1, component-emitter@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
   integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
@@ -1699,12 +2619,22 @@ component-inherit@0.0.3:
   resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
   integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=
 
+compress-commons@^1.2.0:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f"
+  integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=
+  dependencies:
+    buffer-crc32 "^0.2.1"
+    crc32-stream "^2.0.0"
+    normalize-path "^2.0.0"
+    readable-stream "^2.0.0"
+
 compressible@~2.0.16:
-  version "2.0.17"
-  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1"
-  integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==
+  version "2.0.18"
+  resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+  integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
   dependencies:
-    mime-db ">= 1.40.0 < 2"
+    mime-db ">= 1.43.0 < 2"
 
 compression@^1.6.0:
   version "1.7.4"
@@ -1724,7 +2654,7 @@ concat-map@0.0.1:
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-concat-stream@^1.4.7:
+concat-stream@^1.4.7, concat-stream@^1.5.2, concat-stream@^1.6.0, concat-stream@^1.6.1:
   version "1.6.2"
   resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
   integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
@@ -1743,6 +2673,15 @@ concat-stream@~1.4.7:
     readable-stream "~1.1.9"
     typedarray "~0.0.5"
 
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+  integrity sha1-cIl4Yk2FavQaWnQd790mHadSwmY=
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
 concat-with-sourcemaps@^1.0.0, concat-with-sourcemaps@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e"
@@ -1750,18 +2689,21 @@ concat-with-sourcemaps@^1.0.0, concat-with-sourcemaps@^1.1.0:
   dependencies:
     source-map "^0.6.1"
 
-conf@^1.4.0:
+configstore@^1.0.0:
   version "1.4.0"
-  resolved "https://registry.yarnpkg.com/conf/-/conf-1.4.0.tgz#1ea66c9d7a9b601674a5bb9d2b8dc3c726625e67"
-  integrity sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==
+  resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021"
+  integrity sha1-w1eB0FAdJowlxUuLF/YkDopPsCE=
   dependencies:
-    dot-prop "^4.1.0"
-    env-paths "^1.0.0"
-    make-dir "^1.0.0"
-    pkg-up "^2.0.0"
-    write-file-atomic "^2.3.0"
+    graceful-fs "^4.1.2"
+    mkdirp "^0.5.0"
+    object-assign "^4.0.1"
+    os-tmpdir "^1.0.0"
+    osenv "^0.1.0"
+    uuid "^2.0.1"
+    write-file-atomic "^1.1.2"
+    xdg-basedir "^2.0.0"
 
-configstore@^3.0.0:
+configstore@^3.0.0, configstore@^3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
   integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==
@@ -1773,17 +2715,17 @@ configstore@^3.0.0:
     write-file-atomic "^2.0.0"
     xdg-basedir "^3.0.0"
 
-configstore@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7"
-  integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==
+configstore@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
+  integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
   dependencies:
-    dot-prop "^4.1.0"
+    dot-prop "^5.2.0"
     graceful-fs "^4.1.2"
-    make-dir "^1.0.0"
-    unique-string "^1.0.0"
-    write-file-atomic "^2.0.0"
-    xdg-basedir "^3.0.0"
+    make-dir "^3.0.0"
+    unique-string "^2.0.0"
+    write-file-atomic "^3.0.0"
+    xdg-basedir "^4.0.0"
 
 console-browserify@1.1.x:
   version "1.1.0"
@@ -1792,18 +2734,20 @@ console-browserify@1.1.x:
   dependencies:
     date-now "^0.1.4"
 
+console-browserify@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+  integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+
 console-control-strings@^1.0.0, console-control-strings@~1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
   integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
 
-constant-case@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46"
-  integrity sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=
-  dependencies:
-    snake-case "^2.1.0"
-    upper-case "^1.1.1"
+constants-browserify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+  integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
 
 content-disposition@0.5.3:
   version "0.5.3"
@@ -1830,7 +2774,7 @@ conventional-changelog@0.0.11:
     event-stream "~3.1.0"
     lodash.assign "~2.4.1"
 
-convert-source-map@^1.5.0:
+convert-source-map@1.X, convert-source-map@^1.5.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
   integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
@@ -1842,7 +2786,7 @@ convert-source-map@~0.4.1:
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.4.1.tgz#f919a0099fe31f80fc5a1d0eb303161b394070c7"
   integrity sha1-+RmgCZ/jH4D8Wh0OswMWGzlAcMc=
 
-convert-source-map@~1.1.2:
+convert-source-map@~1.1.0, convert-source-map@~1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
   integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=
@@ -1872,30 +2816,38 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-cordova-android@^6.4.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/cordova-android/-/cordova-android-6.4.0.tgz#54ae8da5728a8d7e5efcc6172d3dcca17bc7fe7d"
-  integrity sha1-VK6NpXKKjX5e/MYXLT3MoXvH/n0=
+copy-props@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe"
+  integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==
   dependencies:
-    android-versions "^1.2.1"
-    cordova-common "^2.1.0"
-    elementtree "0.1.6"
-    nopt "^3.0.1"
-    properties-parser "^0.2.3"
-    q "^1.4.1"
+    each-props "^1.3.0"
+    is-plain-object "^2.0.1"
+
+cordova-android@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/cordova-android/-/cordova-android-8.1.0.tgz#d9aea62bbe4a4c8d22fdf21616869439cd1c95a0"
+  integrity sha512-eAY6g9q3raJ4P03wNdSWC5MOW1EfxoomWNXsPhi7T6Q9yAqmxqn0sLEUjLL1Ib0LCH3nKQWBXdxapQ5LgbHu+g==
+  dependencies:
+    android-versions "^1.4.0"
+    compare-func "^1.3.2"
+    cordova-common "^3.2.0"
+    nopt "^4.0.1"
+    properties-parser "^0.3.1"
+    q "^1.5.1"
     shelljs "^0.5.3"
 
-cordova-app-hello-world@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/cordova-app-hello-world/-/cordova-app-hello-world-4.0.0.tgz#a30e896b210787332337069c50845e1802dabcff"
-  integrity sha512-hTNYHUJT5YyMa1cQQE1naGyU6Eh5D5Jl33sMnCh3+q15ZwWTL/TOy3k8+mUvjTp8bwhO5eECGKULYoVO+fp9ZA==
+cordova-app-hello-world@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/cordova-app-hello-world/-/cordova-app-hello-world-3.12.0.tgz#270e06b67b2ae94bcfee6592ed39eb42303d186f"
+  integrity sha1-Jw4Gtnsq6UvP7mWS7TnrQjA9GG8=
 
 cordova-clipboard@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/cordova-clipboard/-/cordova-clipboard-1.3.0.tgz#0911da4cbdea5df2e3a769f5b3aab00e0be0e679"
   integrity sha512-IGk4LZm/DJ0Xk/jgakHm4wa+A/lrRP3QfzMAHDG7oWLJS4ISOpfI32Wez4ndnENItRslGyBVyJyKD83CxELCAw==
 
-cordova-common@^2.1.0:
+cordova-common@^2.2.0, cordova-common@^2.2.5:
   version "2.2.5"
   resolved "https://registry.yarnpkg.com/cordova-common/-/cordova-common-2.2.5.tgz#f93cef2ad494cfcbf56c46e3d612aaa9cb5fcc32"
   integrity sha1-+TzvKtSUz8v1bEbj1hKqqctfzDI=
@@ -1912,7 +2864,7 @@ cordova-common@^2.1.0:
     underscore "^1.8.3"
     unorm "^1.3.3"
 
-cordova-common@^3.1.0:
+cordova-common@^3.1.0, cordova-common@^3.2.0:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/cordova-common/-/cordova-common-3.2.1.tgz#f4fdbeb40d9049fe28a09fa901756ed66d246661"
   integrity sha512-xg0EnjnA6EipxXG8cupdlYQYeDA6+ghbN+Pjq88xN1LInwP6Bo7IyGBdSV5QnfjOvzShF9BBwSxBAv0FOO0C2Q==
@@ -1931,38 +2883,34 @@ cordova-common@^3.1.0:
     underscore "^1.8.3"
     which "^1.3.0"
 
-cordova-create@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/cordova-create/-/cordova-create-2.0.0.tgz#4195cf01cbbdacfe8abebd7eaf4764f69c53f28b"
-  integrity sha512-72CaGg/7x+tiZlzeXKQXLTc8Jh4tbwLdu4Ib97kJ6+R3bcew/Yv/l2cVA2E0CaCuOCtouTqwi+YLcA2I4dPFTQ==
+cordova-create@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/cordova-create/-/cordova-create-1.1.2.tgz#83b09271b378d1c03bc7d9a786fedd60485c3ccf"
+  integrity sha1-g7CScbN40cA7x9mnhv7dYEhcPM8=
   dependencies:
-    cordova-app-hello-world "^4.0.0"
-    cordova-common "^3.1.0"
-    cordova-fetch "^2.0.0"
-    fs-extra "^7.0.1"
-    import-fresh "^3.0.0"
-    is-url "^1.2.4"
-    isobject "^3.0.1"
-    path-is-inside "^1.0.2"
-    tmp "0.0.33"
-    valid-identifier "0.0.2"
+    cordova-app-hello-world "^3.11.0"
+    cordova-common "^2.2.0"
+    cordova-fetch "^1.3.0"
+    q "1.0.1"
+    shelljs "0.3.0"
+    valid-identifier "0.0.1"
 
-cordova-fetch@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/cordova-fetch/-/cordova-fetch-2.0.1.tgz#5c04b7cc6f9bf8e1ffeed233dcefb64cde108cc3"
-  integrity sha512-q21PeobERzE3Drli5htcl5X9Mtfvodih5VkqIwdRUsjDBCPv+I6ZonRjYGbNnXhYrYx7dm0m0j/7/Smf6Av3hg==
-  dependencies:
-    cordova-common "^3.1.0"
-    fs-extra "^7.0.1"
-    npm-package-arg "^6.1.0"
-    pify "^4.0.1"
-    resolve "^1.10.0"
-    semver "^5.6.0"
-    which "^1.3.1"
+cordova-fetch@^1.3.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/cordova-fetch/-/cordova-fetch-1.3.1.tgz#a3303861c50a6779c25acdae8253e4bb70d01352"
+  integrity sha512-/0PNQUPxHvVcjlzVQcydD5BQtfx1XdCfzQ2KigdtZma5oVVUtR4IxfnYB15RuT/GVb/SGRLvR5AIi2Gd5Gb+mg==
+  dependencies:
+    cordova-common "^2.2.5"
+    dependency-ls "^1.1.0"
+    hosted-git-info "^2.5.0"
+    is-git-url "^1.0.0"
+    is-url "^1.2.1"
+    q "^1.4.1"
+    shelljs "^0.7.0"
 
-"cordova-ios@git+https://github.com/bpresles/cordova-ios.git#5.1.0":
+"cordova-ios@git+https://github.com/duniter-cesium/cordova-ios.git#5.1.0":
   version "5.1.0-dev"
-  resolved "git+https://github.com/bpresles/cordova-ios.git#ba29c4ff59f0db3c54f3c0214c294e9b56614e85"
+  resolved "git+https://github.com/duniter-cesium/cordova-ios.git#ba29c4ff59f0db3c54f3c0214c294e9b56614e85"
   dependencies:
     cordova-common "^3.1.0"
     ios-sim "^8.0.1"
@@ -1974,27 +2922,46 @@ cordova-fetch@^2.0.0:
     xcode "^2.0.0"
     xml-escape "^1.1.0"
 
-cordova-lib@^9.0.0:
-  version "9.0.1"
-  resolved "https://registry.yarnpkg.com/cordova-lib/-/cordova-lib-9.0.1.tgz#7a6853b6a58538ad414ceae2380dda78ea74301a"
-  integrity sha512-P9nQhq91gLOyKZkamvKNzzK89gLDpq8rKue/Vu7NUSgNzhPkiWW0w+6VRTbj/9QGVM9w2uDVhB9c9f6rrTXzCw==
+cordova-js@^4.2.2:
+  version "4.2.4"
+  resolved "https://registry.yarnpkg.com/cordova-js/-/cordova-js-4.2.4.tgz#8ecaf03ffe5abf1fe1294eaef1cfbb7b0576e1c1"
+  integrity sha512-Qy0O3w/gwbIqIJzlyCy60nPwJlF1c74ELpsfDIGXB92/uST5nQSSUDVDP4UOfb/c6OU7yPqxhCWOGROyTYKPDw==
   dependencies:
-    cordova-common "^3.1.0"
-    cordova-create "^2.0.0"
-    cordova-fetch "^2.0.0"
-    cordova-serve "^3.0.0"
+    browserify "14.4.0"
+
+cordova-lib@8.1.1:
+  version "8.1.1"
+  resolved "https://registry.yarnpkg.com/cordova-lib/-/cordova-lib-8.1.1.tgz#d22b65d19b0206af1954061be826938d39334aa2"
+  integrity sha512-PcrlEGRGubV2c9ThcSwoVtN/1hKQ0qtwRopl4188rD10gjtt8K+NSKrnRqh6Ia5PouVUUOZBrlhBxDd5BRbfeg==
+  dependencies:
+    aliasify "^2.1.0"
+    cordova-common "^2.2.0"
+    cordova-create "^1.1.0"
+    cordova-fetch "^1.3.0"
+    cordova-js "^4.2.2"
+    cordova-serve "^2.0.0"
     dep-graph "1.1.0"
+    dependency-ls "^1.1.1"
     detect-indent "^5.0.0"
     elementtree "^0.1.7"
-    fs-extra "^7.0.1"
-    globby "^9.1.0"
-    indent-string "^3.2.0"
-    init-package-json "^1.10.3"
-    md5-file "^4.0.0"
-    read-chunk "^3.1.0"
-    semver "^5.6.0"
+    glob "^7.1.2"
+    init-package-json "^1.2.0"
+    nopt "4.0.1"
+    opener "^1.4.3"
+    plist "2.0.1"
+    properties-parser "0.3.1"
+    q "^1.5.1"
+    read-chunk "^2.1.0"
+    request "^2.88.0"
+    semver "^5.3.0"
     shebang-command "^1.2.0"
-    underscore "^1.9.1"
+    shelljs "0.3.0"
+    tar "^2.2.1"
+    underscore "^1.9.0"
+    unorm "^1.4.1"
+    valid-identifier "0.0.1"
+    which "^1.3.1"
+    xcode "^1.0.0"
 
 cordova-osx@^5.0.0:
   version "5.0.0"
@@ -2010,6 +2977,22 @@ cordova-osx@^5.0.0:
     unorm "^1.4.1"
     xcode "^2.0.0"
 
+cordova-plugin-androidx-adapter@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/cordova-plugin-androidx-adapter/-/cordova-plugin-androidx-adapter-1.1.0.tgz#5696f0c972242ded2ecbd73bd6dadfdb42d6e274"
+  integrity sha512-V09W27ViYnh54fR2eilswXt10DrQ1P23fo+3JdbrHqU5HkNfufWojK9dWPzDYQ6xKQkOkUJcEh6tLWxg5hQdgg==
+  dependencies:
+    performance-now "^2.1.0"
+    q "^1.4.1"
+    recursive-readdir "^2.2.2"
+
+cordova-plugin-androidx@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cordova-plugin-androidx/-/cordova-plugin-androidx-1.0.2.tgz#a48d3fabf20beb4273171fdece0b524362b2643f"
+  integrity sha512-gA0Ugz3xXRndZ5+QV+T2BjigNt5YraC+uDA/gOEM6p4m4ofwqFAPoHA4Q17VIHnRtn9++OYoa1Gi44+l6blGhA==
+  dependencies:
+    q "^1.4.1"
+
 cordova-plugin-camera@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/cordova-plugin-camera/-/cordova-plugin-camera-4.1.0.tgz#6474a3e080c4662aa00fd7425705d301c693ddc0"
@@ -2035,6 +3018,11 @@ cordova-plugin-dialogs@^2.0.2:
   resolved "https://registry.yarnpkg.com/cordova-plugin-dialogs/-/cordova-plugin-dialogs-2.0.2.tgz#ac3ce8b73bc885ff847078d5b533e7a4ed418a2f"
   integrity sha512-FUHI6eEVeoz2VkxbF0P56QlUQLGzXcvw3i4xuXyM9gEct6Y+FA3Xzgl2pJTZcTg5wRqLWzN08kgNoHPkom15pw==
 
+cordova-plugin-file@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/cordova-plugin-file/-/cordova-plugin-file-6.0.2.tgz#f3911479f8357e9aacb5576674f8d95b31a1fb20"
+  integrity sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA==
+
 cordova-plugin-ionic-keyboard@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.2.0.tgz#53ba9ccd5e765165446a094cfe042a2ddd87d81d"
@@ -2045,15 +3033,13 @@ cordova-plugin-ionic-webview@^4.1.3:
   resolved "https://registry.yarnpkg.com/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-4.1.3.tgz#7f3963208708951fedd975c0808a5d27382812a7"
   integrity sha512-hlrUF0kLjjEkZmpYlLJO0NnXmVjMmQ3MOZVXm1ytDihLPKHklYCOpCvjA5Wz3hJrPD1shFEsqi/SPnp873AsdQ==
 
-cordova-plugin-minisodium@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/cordova-plugin-minisodium/-/cordova-plugin-minisodium-1.0.0.tgz#ad6aec73c2595022f5a901545715d2a1be6665dd"
-  integrity sha1-rWrsc8JZUCL1qQFUVxXSob5mZd0=
+"cordova-plugin-minisodium@git+https://github.com/duniter-cesium/cordova-plugin-minisodium#v1.0.1":
+  version "1.0.1"
+  resolved "git+https://github.com/duniter-cesium/cordova-plugin-minisodium#507256bc140c4c45442f38a510637cda8915f9a9"
 
-cordova-plugin-secure-storage@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/cordova-plugin-secure-storage/-/cordova-plugin-secure-storage-3.0.2.tgz#20e51072c2fc86bf3e6238896436080aba1b283c"
-  integrity sha512-ZwVSPuw+SRObjH51nV/8eNR6OujSfJGZEobpR4SyKyaUy+hTy5nyAJAHNf5CSm+a8Yp+hN9TW34ztpia9kT7Ig==
+"cordova-plugin-secure-storage-android10@git+https://github.com/duniter-cesium/cordova-plugin-secure-storage-android10.git#6.0.4":
+  version "6.0.4"
+  resolved "git+https://github.com/duniter-cesium/cordova-plugin-secure-storage-android10.git#7aa41aaea5d7fd2c78d3ca9ad9c799cf9de4c9a0"
 
 cordova-plugin-splashscreen@^5.0.3:
   version "5.0.3"
@@ -2090,16 +3076,16 @@ cordova-registry-mapper@^1.1.8:
   resolved "https://registry.yarnpkg.com/cordova-registry-mapper/-/cordova-registry-mapper-1.1.15.tgz#e244b9185b8175473bff6079324905115f83dc7c"
   integrity sha1-4kS5GFuBdUc7/2B5MkkFEV+D3Hw=
 
-cordova-serve@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/cordova-serve/-/cordova-serve-3.0.0.tgz#974d695f75a9f2b3e487604be6f539a39dba8390"
-  integrity sha512-h479g/5a0PXn//yiFuMrD5MDEbB+mtihNkWcE6uD/aCh/6z0FRZ9sWH3NfZbHDB+Bp1yGLYsjbH8LZBL8KOQ0w==
+cordova-serve@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/cordova-serve/-/cordova-serve-2.0.1.tgz#79e384b9da0d45fb3bd6ea46bd69120dbfda3971"
+  integrity sha512-3Xl1D5eyiQlY5ow6Kn/say0us2TqSw/zgQmyTLxbewTngQZ1CIqxmqD7EFGoCNBrB4HsdPmpiSpFCitybKQN9g==
   dependencies:
-    chalk "^2.4.1"
+    chalk "^1.1.1"
     compression "^1.6.0"
     express "^4.13.3"
     opn "^5.3.0"
-    which "^1.3.0"
+    shelljs "^0.5.3"
 
 cordova-uglify@^0.3.4:
   version "0.3.4"
@@ -2111,25 +3097,63 @@ cordova-uglify@^0.3.4:
     shelljs "^0.7.0"
     uglify-js "3.3.16"
 
-cordova@^9.0.0:
-  version "9.0.0"
-  resolved "https://registry.yarnpkg.com/cordova/-/cordova-9.0.0.tgz#2bba968d9e3339f9c8dace443a77f4d37ed1fe46"
-  integrity sha512-zWEPo9uGj9KNcEhU2Lpo3r4HYK21tL+at496N2LLnuCWuWVndv6QWed8+EYl/08rrcNshrEtfzXj9Ux6vQm2PQ==
-  dependencies:
-    configstore "^4.0.0"
-    cordova-common "^3.1.0"
-    cordova-lib "^9.0.0"
-    editor "^1.0.0"
-    insight "^0.10.1"
-    loud-rejection "^2.0.0"
+cordova@^8.1.2:
+  version "8.1.2"
+  resolved "https://registry.yarnpkg.com/cordova/-/cordova-8.1.2.tgz#4eda99a88a56dbcf2cfca85ea72207d40c3b8835"
+  integrity sha512-IfslM3MP42CA/ebVJVlit6FhQ2P6Fercwx9NNQjkVs0wahEwqamL4bcqh1gKiTti7+/ZsDtBRSVmRv+y7LcTbg==
+  dependencies:
+    configstore "^3.1.2"
+    cordova-common "^2.2.0"
+    cordova-lib "8.1.1"
+    editor "1.0.0"
+    insight "^0.8.4"
+    loud-rejection "^1.6.0"
     nopt "^4.0.1"
     update-notifier "^2.5.0"
 
+core-js-pure@^3.0.0:
+  version "3.6.5"
+  resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
+  integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
+
+core-js@3.6.4:
+  version "3.6.4"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647"
+  integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==
+
+core-js@^2.6.5:
+  version "2.6.11"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
+  integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
+
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
+crc32-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4"
+  integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ=
+  dependencies:
+    crc "^3.4.4"
+    readable-stream "^2.0.0"
+
+crc@^3.4.4:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
+  integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==
+  dependencies:
+    buffer "^5.1.0"
+
+create-ecdh@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+  integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
 create-error-class@^3.0.0:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
@@ -2137,6 +3161,29 @@ create-error-class@^3.0.0:
   dependencies:
     capture-stack-trace "^1.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"
+  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    md5.js "^1.3.4"
+    ripemd160 "^2.0.1"
+    sha.js "^2.4.0"
+
+create-hmac@^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"
+  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
 cross-spawn@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
@@ -2166,9 +3213,9 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
     which "^1.2.9"
 
 cross-spawn@^7.0.0:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
-  integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6"
+  integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==
   dependencies:
     path-key "^3.1.0"
     shebang-command "^2.0.0"
@@ -2188,18 +3235,72 @@ cryptiles@2.x.x:
   dependencies:
     boom "2.x.x"
 
+crypto-browserify@^3.0.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
 crypto-random-string@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
   integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
 
-csso@^2.0.0:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
-  integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=
+crypto-random-string@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
+  integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+
+css-select@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+  integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
   dependencies:
-    clap "^1.0.9"
-    source-map "^0.5.3"
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
+css-tree@1.0.0-alpha.39:
+  version "1.0.0-alpha.39"
+  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
+  integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
+  dependencies:
+    mdn-data "2.0.6"
+    source-map "^0.6.1"
+
+css-what@2.1:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+  integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
+
+css@2.X, css@^2.2.1:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
+  integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
+  dependencies:
+    inherits "^2.0.3"
+    source-map "^0.6.1"
+    source-map-resolve "^0.5.2"
+    urix "^0.1.0"
+
+csso@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903"
+  integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==
+  dependencies:
+    css-tree "1.0.0-alpha.39"
 
 ctype@0.5.3:
   version "0.5.3"
@@ -2213,6 +3314,19 @@ currently-unhandled@^0.4.1:
   dependencies:
     array-find-index "^1.0.1"
 
+d@1, d@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+  dependencies:
+    es5-ext "^0.10.50"
+    type "^1.0.1"
+
+dash-ast@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37"
+  integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==
+
 dashdash@^1.12.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -2243,7 +3357,21 @@ dateformat@^2.0.0:
   resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
   integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=
 
-debug@2, debug@2.6.9, debug@^2.1.0, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3:
+debounce@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131"
+  integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==
+
+debug-fabulous@1.X:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-1.1.0.tgz#af8a08632465224ef4174a9f06308c3c2a1ebc8e"
+  integrity sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==
+  dependencies:
+    debug "3.X"
+    memoizee "0.4.X"
+    object-assign "4.X"
+
+debug@2, debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@~2.6.3:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -2271,26 +3399,33 @@ debug@3.1.0:
   dependencies:
     ms "2.0.0"
 
-debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
-  integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
-  dependencies:
-    ms "^2.1.1"
-
-debug@^3.0.0, debug@^3.1.0:
+debug@3.X, debug@^3.0.0, debug@^3.1.0:
   version "3.2.6"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
   integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
   dependencies:
     ms "^2.1.1"
 
+debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+  integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+  dependencies:
+    ms "^2.1.1"
+
 debug@~0.7.4:
   version "0.7.4"
   resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
   integrity sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=
 
-decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+decamelize@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-3.2.0.tgz#84b8e8f4f8c579f938e35e2cc7024907e0090851"
+  integrity sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==
+  dependencies:
+    xregexp "^4.2.4"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
@@ -2300,12 +3435,19 @@ decode-uri-component@^0.2.0:
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
   integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
 
+decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+  dependencies:
+    mimic-response "^1.0.0"
+
 dedent@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
   integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
 
-deep-equal@~1.1.1:
+deep-equal@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
   integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
@@ -2327,18 +3469,47 @@ deep-is@~0.1.3:
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
+deepcopy@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/deepcopy/-/deepcopy-2.0.0.tgz#2acb9b7645f9f54d815eee991455e790e72e2252"
+  integrity sha512-d5ZK7pJw7F3k6M5vqDjGiiUS9xliIyWkdzBjnPhnSeRGjkYOGZMCFkdKVwV/WiHOe0NwzB8q+iDo7afvSf0arA==
+  dependencies:
+    type-detect "^4.0.8"
+
+deepmerge@4.2.2, deepmerge@^4.0.0:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+  integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
 deepmerge@~0.2.7:
   version "0.2.10"
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-0.2.10.tgz#8906bf9e525a4fbf1b203b2afcb4640249821219"
   integrity sha1-iQa/nlJaT78bIDsq/LRkAkmCEhk=
 
-defaults@^1.0.0:
+default-compare@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f"
+  integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==
+  dependencies:
+    kind-of "^5.0.2"
+
+default-resolution@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684"
+  integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=
+
+defaults@^1.0.0, defaults@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
   integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=
   dependencies:
     clone "^1.0.2"
 
+defer-to-connect@^1.0.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+  integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
 define-properties@^1.1.2, define-properties@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -2368,7 +3539,7 @@ define-property@^2.0.2:
     is-descriptor "^1.0.2"
     isobject "^3.0.1"
 
-defined@~1.0.0:
+defined@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
   integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
@@ -2382,17 +3553,19 @@ degenerator@^1.0.4:
     escodegen "1.x.x"
     esprima "3.x.x"
 
-del@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
-  integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=
+del@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7"
+  integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==
   dependencies:
-    globby "^6.1.0"
-    is-path-cwd "^1.0.0"
-    is-path-in-cwd "^1.0.0"
-    p-map "^1.1.1"
-    pify "^3.0.0"
-    rimraf "^2.2.8"
+    globby "^10.0.1"
+    graceful-fs "^4.2.2"
+    is-glob "^4.0.1"
+    is-path-cwd "^2.2.0"
+    is-path-inside "^3.0.1"
+    p-map "^3.0.0"
+    rimraf "^3.0.0"
+    slash "^3.0.0"
 
 delayed-stream@0.0.5:
   version "0.0.5"
@@ -2443,11 +3616,36 @@ depd@~1.1.0, depd@~1.1.2:
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
   integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
 
+dependency-ls@^1.1.0, dependency-ls@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/dependency-ls/-/dependency-ls-1.1.1.tgz#0481b07f023d74ce311192e5c690d13e18600054"
+  integrity sha1-BIGwfwI9dM4xEZLlxpDRPhhgAFQ=
+  dependencies:
+    q "1.4.1"
+
 deprecated@^0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
   integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=
 
+deps-sort@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d"
+  integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==
+  dependencies:
+    JSONStream "^1.0.3"
+    shasum-object "^1.0.0"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+
+des.js@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+  integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
 destroy@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
@@ -2463,17 +3661,66 @@ detect-indent@^5.0.0:
   resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
   integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
 
+detect-newline@2.X:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+  integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
+
+detective@^4.0.0:
+  version "4.7.1"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
+  integrity sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==
+  dependencies:
+    acorn "^5.2.1"
+    defined "^1.0.0"
+
 diff@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff"
-  integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
 
-dir-glob@^2.2.2:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
-  integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+diffie-hellman@^5.0.0:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
   dependencies:
-    path-type "^3.0.0"
+    path-type "^4.0.0"
+
+dispensary@0.51.2:
+  version "0.51.2"
+  resolved "https://registry.yarnpkg.com/dispensary/-/dispensary-0.51.2.tgz#c3628826d76f4ac391deb0ae81123b9b94dbd9ee"
+  integrity sha512-liUDx/g1xFEBFoOL6308Vr0aYAZlGAyXGcOvuXVa/6qVBZT4QZrv4pVNeb5QOeD5C/Flta+A+qTnLkLnhgs40g==
+  dependencies:
+    async "~3.2.0"
+    natural-compare-lite "~1.4.0"
+    pino "~6.0.0"
+    request "~2.88.0"
+    sha.js "~2.4.4"
+    source-map-support "~0.5.4"
+    yargs "~15.3.0"
+
+doctrine@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+  dependencies:
+    esutils "^2.0.2"
+
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+  dependencies:
+    esutils "^2.0.2"
 
 dom-serializer@0:
   version "0.2.2"
@@ -2491,7 +3738,20 @@ dom-serializer@~0.0.0:
     domelementtype "~1.1.1"
     entities "~1.1.1"
 
-domelementtype@1:
+dom-serializer@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
+  integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
+  dependencies:
+    domelementtype "^1.3.0"
+    entities "^1.1.1"
+
+domain-browser@~1.1.0:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+  integrity sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=
+
+domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
   integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
@@ -2513,6 +3773,13 @@ domhandler@2.3:
   dependencies:
     domelementtype "1"
 
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+  dependencies:
+    domelementtype "1"
+
 domutils@1.4:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f"
@@ -2520,7 +3787,7 @@ domutils@1.4:
   dependencies:
     domelementtype "1"
 
-domutils@1.5:
+domutils@1.5, domutils@1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
   integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
@@ -2528,19 +3795,41 @@ domutils@1.5:
     dom-serializer "0"
     domelementtype "1"
 
-dot-case@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee"
-  integrity sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
   dependencies:
-    no-case "^2.2.0"
+    dom-serializer "0"
+    domelementtype "1"
+
+dot-prop@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
+  integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc=
+  dependencies:
+    is-obj "^1.0.0"
 
 dot-prop@^4.1.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
   integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
   dependencies:
-    is-obj "^1.0.0"
+    is-obj "^1.0.0"
+
+dot-prop@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
+  integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
+  dependencies:
+    is-obj "^2.0.0"
+
+dtrace-provider@~0.8:
+  version "0.8.8"
+  resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.8.tgz#2996d5490c37e1347be263b423ed7b297fb0d97e"
+  integrity sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==
+  dependencies:
+    nan "^2.14.0"
 
 duplexer2@0.0.2:
   version "0.0.2"
@@ -2549,7 +3838,7 @@ duplexer2@0.0.2:
   dependencies:
     readable-stream "~1.1.9"
 
-duplexer2@~0.1.0:
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
   integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=
@@ -2566,7 +3855,7 @@ duplexer@^0.1.1, duplexer@~0.1.1:
   resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
   integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
 
-duplexify@^3.5.0, duplexify@^3.6.0:
+duplexify@^3.6.0:
   version "3.7.1"
   resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
   integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
@@ -2576,6 +3865,24 @@ duplexify@^3.5.0, duplexify@^3.6.0:
     readable-stream "^2.0.0"
     stream-shift "^1.0.0"
 
+duplexify@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.1.tgz#7027dc374f157b122a8ae08c2d3ea4d2d953aa61"
+  integrity sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==
+  dependencies:
+    end-of-stream "^1.4.1"
+    inherits "^2.0.3"
+    readable-stream "^3.1.1"
+    stream-shift "^1.0.0"
+
+each-props@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333"
+  integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==
+  dependencies:
+    is-plain-object "^2.0.1"
+    object.defaults "^1.1.0"
+
 ecc-jsbn@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -2591,7 +3898,12 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.0:
   dependencies:
     safe-buffer "^5.0.1"
 
-editor@^1.0.0:
+editions@^1.3.3:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b"
+  integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==
+
+editor@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
   integrity sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=
@@ -2615,6 +3927,19 @@ elementtree@0.1.7, elementtree@^0.1.7:
   dependencies:
     sax "1.1.4"
 
+elliptic@^6.0.0:
+  version "6.5.2"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
+  integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
 emoji-regex@^7.0.1:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@@ -2630,7 +3955,7 @@ encodeurl@~1.0.2:
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
   version "1.4.4"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
   integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -2644,14 +3969,21 @@ end-of-stream@~0.1.5:
   dependencies:
     once "~1.3.0"
 
+end-of-stream@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07"
+  integrity sha1-6TUyWLqpEIll78QcsO+K3i88+wc=
+  dependencies:
+    once "~1.3.0"
+
 endent@^1.1.1:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/endent/-/endent-1.3.0.tgz#ea86b583d7b7caff5cbee5ad2c7c322eb1900c76"
-  integrity sha512-C8AryqPPwtydqcpO5AF6k9Bd1EpFkQtvsefJqS3y3n8TG13Jy63MascDxTOULZYqrUde+dK6BjNc6LIMr3iI2A==
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/endent/-/endent-1.4.1.tgz#c58cc13dfc432d0b2c7faf74c13ffdca60b2d1c8"
+  integrity sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ==
   dependencies:
     dedent "^0.7.0"
     fast-json-parse "^1.0.3"
-    objectorarray "^1.0.3"
+    objectorarray "^1.0.4"
 
 engine.io-client@~1.8.4:
   version "1.8.5"
@@ -2700,22 +4032,17 @@ entities@1.0:
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
   integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=
 
-entities@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
-  integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
-
-entities@~1.1.1:
+entities@^1.1.1, entities@~1.1.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
   integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
 
-env-paths@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
-  integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=
+entities@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
+  integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
 
-error-ex@^1.2.0:
+error-ex@^1.2.0, error-ex@^1.3.1:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
   integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
@@ -2729,10 +4056,10 @@ error@^7.0.0:
   dependencies:
     string-template "~0.2.1"
 
-es-abstract@^1.17.0-next.1:
-  version "1.17.0"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0.tgz#f42a517d0036a5591dbb2c463591dc8bb50309b1"
-  integrity sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==
+es-abstract@^1.17.0-next.1, es-abstract@^1.17.5:
+  version "1.17.5"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
+  integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
   dependencies:
     es-to-primitive "^1.2.1"
     function-bind "^1.1.1"
@@ -2755,11 +4082,61 @@ es-to-primitive@^1.2.1:
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
+es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
+  version "0.10.53"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1"
+  integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.3"
+    next-tick "~1.0.0"
+
+es6-error@4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+  integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
+es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-promise@^2.0.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-2.3.0.tgz#96edb9f2fdb01995822b263dd8aadab6748181bc"
+  integrity sha1-lu258v2wGZWCKyY92KratnSBgbw=
+
 es6-promise@^4.0.3:
   version "4.2.8"
   resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
   integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
 
+es6-promisify@6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.0.2.tgz#525c23725b8510f5f1f2feb5a1fbad93a93e29b4"
+  integrity sha512-eO6vFm0JvqGzjWIQA6QVKjxpmELfhWbDUWHm1rPfIbn55mhKPiAa5xpLmQWJrNa629ZIeQ8ZvMAi13kvrjK6Mg==
+
+es6-promisify@6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.0.tgz#32e3e7e796f924a6723f09ded24e71100ea57472"
+  integrity sha512-jCsk2fpfEFusVv1MDkF4Uf0hAzIKNDMgR6LyOIw6a3jwkN1sCgWzuwgnsHY9YSQ8n8P31HoncvE0LC44cpWTrw==
+
 es6-promisify@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
@@ -2767,43 +4144,245 @@ es6-promisify@^5.0.0:
   dependencies:
     es6-promise "^4.0.3"
 
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+  integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
+es6-symbol@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+  dependencies:
+    d "^1.0.1"
+    ext "^1.1.2"
+
+es6-weak-map@^2.0.1, es6-weak-map@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
+  integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
+  dependencies:
+    d "1"
+    es5-ext "^0.10.46"
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.1"
+
 escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
   integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
 
-escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5:
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
 escodegen@1.x.x:
-  version "1.12.0"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.12.0.tgz#f763daf840af172bb3a2b6dd7219c0e17f7ff541"
-  integrity sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
+  integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
   dependencies:
-    esprima "^3.1.3"
+    esprima "^4.0.1"
     estraverse "^4.2.0"
     esutils "^2.0.2"
     optionator "^0.8.1"
   optionalDependencies:
     source-map "~0.6.1"
 
-esprima@3.x.x, esprima@^3.1.3:
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+  integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-plugin-no-unsafe-innerhtml@1.0.16:
+  version "1.0.16"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-no-unsafe-innerhtml/-/eslint-plugin-no-unsafe-innerhtml-1.0.16.tgz#7d02878c8e9bf7916b88836d5ac122b42f151932"
+  integrity sha1-fQKHjI6b95FriINtWsEitC8VGTI=
+  dependencies:
+    eslint "^3.7.1"
+
+eslint-scope@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-utils@^1.3.1:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
+  integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+  dependencies:
+    eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@1.1.0, eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
+  integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
+
+eslint@5.16.0:
+  version "5.16.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
+  integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    ajv "^6.9.1"
+    chalk "^2.1.0"
+    cross-spawn "^6.0.5"
+    debug "^4.0.1"
+    doctrine "^3.0.0"
+    eslint-scope "^4.0.3"
+    eslint-utils "^1.3.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^5.0.1"
+    esquery "^1.0.1"
+    esutils "^2.0.2"
+    file-entry-cache "^5.0.1"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.7.0"
+    ignore "^4.0.6"
+    import-fresh "^3.0.0"
+    imurmurhash "^0.1.4"
+    inquirer "^6.2.2"
+    js-yaml "^3.13.0"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.11"
+    minimatch "^3.0.4"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    progress "^2.0.0"
+    regexpp "^2.0.1"
+    semver "^5.5.1"
+    strip-ansi "^4.0.0"
+    strip-json-comments "^2.0.1"
+    table "^5.2.3"
+    text-table "^0.2.0"
+
+eslint@^3.7.1:
+  version "3.19.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc"
+  integrity sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=
+  dependencies:
+    babel-code-frame "^6.16.0"
+    chalk "^1.1.3"
+    concat-stream "^1.5.2"
+    debug "^2.1.1"
+    doctrine "^2.0.0"
+    escope "^3.6.0"
+    espree "^3.4.0"
+    esquery "^1.0.0"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    glob "^7.0.3"
+    globals "^9.14.0"
+    ignore "^3.2.0"
+    imurmurhash "^0.1.4"
+    inquirer "^0.12.0"
+    is-my-json-valid "^2.10.0"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.5.1"
+    json-stable-stringify "^1.0.0"
+    levn "^0.3.0"
+    lodash "^4.0.0"
+    mkdirp "^0.5.0"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.1"
+    pluralize "^1.2.1"
+    progress "^1.1.8"
+    require-uncached "^1.0.2"
+    shelljs "^0.7.5"
+    strip-bom "^3.0.0"
+    strip-json-comments "~2.0.1"
+    table "^3.7.8"
+    text-table "~0.2.0"
+    user-home "^2.0.0"
+
+espree@6.2.1:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
+  integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
+  dependencies:
+    acorn "^7.1.1"
+    acorn-jsx "^5.2.0"
+    eslint-visitor-keys "^1.1.0"
+
+espree@^3.4.0:
+  version "3.5.4"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+  integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
+  dependencies:
+    acorn "^5.5.0"
+    acorn-jsx "^3.0.0"
+
+espree@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
+  integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
+  dependencies:
+    acorn "^6.0.7"
+    acorn-jsx "^5.0.0"
+    eslint-visitor-keys "^1.0.0"
+
+esprima@3.x.x:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
   integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
 
-esprima@^4.0.0:
+esprima@4.0.1, esprima@^4.0.0, esprima@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
-estraverse@^4.2.0:
+esquery@^1.0.0, esquery@^1.0.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+  integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+  dependencies:
+    estraverse "^5.1.0"
+
+esrecurse@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
+  dependencies:
+    estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
   integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
 
+estraverse@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+  integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+
 esutils@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
@@ -2814,6 +4393,14 @@ etag@~1.8.1:
   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
   integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
 
+event-emitter@^0.3.5, event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
 event-stream@3.2.2:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.2.2.tgz#f79f9984c07ee3fd9b44ffb3cd0422b13e24084d"
@@ -2840,7 +4427,7 @@ event-stream@3.3.4:
     stream-combiner "~0.0.4"
     through "~2.3.1"
 
-event-stream@^3.1.7, event-stream@^3.3.0:
+event-stream@^3.1.7:
   version "3.3.5"
   resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.5.tgz#e5dd8989543630d94c6cf4d657120341fa31636b"
   integrity sha512-vyibDcu5JL20Me1fP734QBH/kenBGLZap2n0+XXM7mvuUPzJ20Ydqj1aKcIeMdri1p+PU+4yAKugjN8KCVst+g==
@@ -2879,11 +4466,29 @@ event-stream@~3.1.0:
     stream-combiner "~0.0.4"
     through "~2.3.1"
 
+event-to-promise@0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/event-to-promise/-/event-to-promise-0.8.0.tgz#4b84f11772b6f25f7752fc74d971531ac6f5b626"
+  integrity sha1-S4TxF3K28l93Uvx02XFTGsb1tiY=
+
 eventemitter3@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb"
   integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==
 
+events@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+  integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
 execa@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
@@ -2910,6 +4515,26 @@ execa@^1.0.0:
     signal-exit "^3.0.0"
     strip-eof "^1.0.0"
 
+execa@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.0.tgz#7f37d6ec17f09e6b8fc53288611695b6d12b9daf"
+  integrity sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==
+  dependencies:
+    cross-spawn "^7.0.0"
+    get-stream "^5.0.0"
+    human-signals "^1.1.1"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.0"
+    onetime "^5.1.0"
+    signal-exit "^3.0.2"
+    strip-final-newline "^2.0.0"
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+  integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=
+
 exit@0.1.2, exit@0.1.x:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
@@ -2978,6 +4603,13 @@ express@^4.13.3, express@^4.16.2:
     utils-merge "1.0.1"
     vary "~1.1.2"
 
+ext@^1.1.2:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244"
+  integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==
+  dependencies:
+    type "^2.0.0"
+
 extend-shallow@^1.1.2:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071"
@@ -3043,7 +4675,17 @@ extsprintf@^1.2.0:
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
   integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
 
-fancy-log@^1.1.0:
+falafel@^2.0.0:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819"
+  integrity sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==
+  dependencies:
+    acorn "^7.1.1"
+    foreach "^2.0.5"
+    isarray "^2.0.1"
+    object-keys "^1.0.6"
+
+fancy-log@1.3.3, fancy-log@^1.1.0, fancy-log@^1.3.2:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
   integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
@@ -3058,23 +4700,35 @@ fast-deep-equal@^2.0.1:
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
   integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
 
-fast-glob@^2.2.6:
-  version "2.2.7"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
-  integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+fast-deep-equal@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
+  integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
+
+fast-glob@^3.0.3:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
+  integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
   dependencies:
-    "@mrmlnc/readdir-enhanced" "^2.2.1"
-    "@nodelib/fs.stat" "^1.1.2"
-    glob-parent "^3.1.0"
-    is-glob "^4.0.0"
-    merge2 "^1.2.3"
-    micromatch "^3.1.10"
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
+    micromatch "^4.0.2"
+    picomatch "^2.2.1"
 
 fast-json-parse@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d"
   integrity sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==
 
+fast-json-patch@^2.0.6:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-2.2.1.tgz#18150d36c9ab65c7209e7d4eb113f4f8eaabe6d9"
+  integrity sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==
+  dependencies:
+    fast-deep-equal "^2.0.1"
+
 fast-json-stable-stringify@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -3085,6 +4739,23 @@ fast-levenshtein@~2.0.6:
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
+fast-redact@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-2.0.0.tgz#17bb8f5e1f56ecf4a38c8455985e5eab4c478431"
+  integrity sha512-zxpkULI9W9MNTK2sJ3BpPQrTEXFNESd2X6O1tXMFpK/XM0G5c5Rll2EVYZH2TqI3xRGK/VaJ+eEOt7pnENJpeA==
+
+fast-safe-stringify@^2.0.7:
+  version "2.0.7"
+  resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
+  integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
+
+fastq@^1.6.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801"
+  integrity sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==
+  dependencies:
+    reusify "^1.0.4"
+
 faye-websocket@~0.10.0:
   version "0.10.0"
   resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
@@ -3099,6 +4770,21 @@ faye-websocket@~0.7.2:
   dependencies:
     websocket-driver ">=0.3.6"
 
+fd-slicer@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+  integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
+  dependencies:
+    pend "~1.2.0"
+
+figures@^1.3.5:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
 figures@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
@@ -3107,18 +4793,33 @@ figures@^2.0.0:
     escape-string-regexp "^1.0.5"
 
 figures@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec"
-  integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+  integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
   dependencies:
     escape-string-regexp "^1.0.5"
 
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-entry-cache@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+  dependencies:
+    flat-cache "^2.0.1"
+
 file-saver@^1.3.3:
   version "1.3.8"
   resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.8.tgz#e68a30c7cb044e2fb362b428469feb291c2e09d8"
   integrity sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==
 
-file-uri-to-path@1:
+file-uri-to-path@1, file-uri-to-path@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
   integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
@@ -3166,12 +4867,13 @@ find-up@^1.0.0:
     path-exists "^2.0.0"
     pinkie-promise "^2.0.0"
 
-find-up@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
-  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
+find-up@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
   dependencies:
-    locate-path "^2.0.0"
+    locate-path "^5.0.0"
+    path-exists "^4.0.0"
 
 findup-sync@^2.0.0:
   version "2.0.0"
@@ -3183,6 +4885,16 @@ findup-sync@^2.0.0:
     micromatch "^3.0.4"
     resolve-dir "^1.0.1"
 
+findup-sync@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1"
+  integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==
+  dependencies:
+    detect-file "^1.0.0"
+    is-glob "^4.0.0"
+    micromatch "^3.0.4"
+    resolve-dir "^1.0.1"
+
 fined@^1.0.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
@@ -3194,6 +4906,28 @@ fined@^1.0.1:
     object.pick "^1.2.0"
     parse-filepath "^1.0.1"
 
+firefox-profile@1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/firefox-profile/-/firefox-profile-1.3.1.tgz#1418d36b79c191984d6117bd772d3cbf9675a92b"
+  integrity sha512-8q7DnwVIXvuJuBm1shr5ivRh0Ih2ytWwOIMwHInDSlVyrjQVXy7Ik0frItDdWb/P5CIpQFcMk9fPsUwNqi2lyQ==
+  dependencies:
+    adm-zip "~0.4.x"
+    archiver "~2.1.0"
+    async "~2.5.0"
+    fs-extra "~4.0.2"
+    ini "~1.3.3"
+    jetpack-id "1.0.0"
+    lazystream "~1.0.0"
+    lodash "~4.17.2"
+    minimist "^1.1.1"
+    uuid "^3.0.0"
+    xml2js "~0.4.4"
+
+first-chunk-stream@3.0.0, first-chunk-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-3.0.0.tgz#06972a66263505ed82b2c4db93c1b5e078a6576a"
+  integrity sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==
+
 first-chunk-stream@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e"
@@ -3204,6 +4938,40 @@ flagged-respawn@^1.0.0:
   resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
   integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
 
+flat-cache@^1.2.1:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
+  integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
+  dependencies:
+    circular-json "^0.3.1"
+    graceful-fs "^4.1.2"
+    rimraf "~2.6.2"
+    write "^0.2.1"
+
+flat-cache@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+  dependencies:
+    flatted "^2.0.0"
+    rimraf "2.6.3"
+    write "1.0.3"
+
+flatstr@^1.0.12:
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931"
+  integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==
+
+flatted@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
+  integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+
+fluent-syntax@0.13.0:
+  version "0.13.0"
+  resolved "https://registry.yarnpkg.com/fluent-syntax/-/fluent-syntax-0.13.0.tgz#417144d99cba94ff474c422b3e6623d5a842855a"
+  integrity sha512-0Bk1AsliuYB550zr4JV9AYhsETsD3ELXUQzdXGJfIc1Ni/ukAfBdQInDhVMYJUaT2QxoamNslwkYF7MlOrPUwg==
+
 flush-write-stream@^1.0.2:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
@@ -3213,19 +4981,12 @@ flush-write-stream@^1.0.2:
     readable-stream "^2.3.6"
 
 follow-redirects@^1.0.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f"
-  integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb"
+  integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==
   dependencies:
     debug "^3.0.0"
 
-for-each@~0.3.3:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
-  integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
-  dependencies:
-    is-callable "^1.1.3"
-
 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"
@@ -3238,6 +4999,11 @@ for-own@^1.0.0:
   dependencies:
     for-in "^1.0.1"
 
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+  integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
+
 forever-agent@~0.5.0:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130"
@@ -3253,13 +5019,13 @@ fork-stream@^0.0.4:
   resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70"
   integrity sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=
 
-form-data@^2.3.3:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4"
-  integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==
+form-data@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682"
+  integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==
   dependencies:
     asynckit "^0.4.0"
-    combined-stream "^1.0.6"
+    combined-stream "^1.0.8"
     mime-types "^2.1.12"
 
 form-data@~0.1.0:
@@ -3289,10 +5055,10 @@ form-data@~2.3.2:
     combined-stream "^1.0.6"
     mime-types "^2.1.12"
 
-formidable@^1.2.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659"
-  integrity sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==
+formidable@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
+  integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
 
 forwarded@~0.1.2:
   version "0.1.2"
@@ -3316,20 +5082,16 @@ from@^0.1.7, from@~0:
   resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
   integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
 
+fs-constants@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+  integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
 fs-exists-sync@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
   integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=
 
-fs-extra@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
-  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
-  dependencies:
-    graceful-fs "^4.1.2"
-    jsonfile "^4.0.0"
-    universalify "^0.1.0"
-
 fs-extra@^8.0.0, fs-extra@^8.0.1:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -3339,12 +5101,21 @@ fs-extra@^8.0.0, fs-extra@^8.0.1:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
-fs-minipass@^1.2.5:
-  version "1.2.7"
-  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
-  integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
+fs-extra@~4.0.2:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+  integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
   dependencies:
-    minipass "^2.6.0"
+    minipass "^3.0.0"
 
 fs-mkdirp-stream@^1.0.0:
   version "1.0.0"
@@ -3364,11 +5135,19 @@ fs@0.0.2:
   resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.2.tgz#e1f244ef3933c1b2a64bd4799136060d0f5914f8"
   integrity sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=
 
-fsevents@~2.1.2:
+fsevents@2.1.2, fsevents@~2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
   integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
 
+fsevents@^1.2.7:
+  version "1.2.12"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c"
+  integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==
+  dependencies:
+    bindings "^1.5.0"
+    nan "^2.12.1"
+
 fstream@^1.0.0, fstream@^1.0.12:
   version "1.0.12"
   resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
@@ -3387,11 +5166,28 @@ ftp@~0.3.10:
     readable-stream "1.1.x"
     xregexp "2.0.0"
 
-function-bind@^1.1.1, function-bind@~1.1.1:
+function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 
+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"
+  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+
+fx-runner@1.0.11:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fx-runner/-/fx-runner-1.0.11.tgz#528d2d0c3dc8bb05570b506728c4f62e0b0ef095"
+  integrity sha512-igHogHf5wTqqaPPTOav18MMTVq/eoeTJiw/PvPUuwnzU8vbyZInFPgR66G9ZBwvwxC7e611nbtB4xSMcYVhlvg==
+  dependencies:
+    commander "2.9.0"
+    shell-quote "1.6.1"
+    spawn-sync "1.0.15"
+    when "3.7.7"
+    which "1.2.4"
+    winreg "0.0.12"
+
 gapitoken@~0.1.2:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/gapitoken/-/gapitoken-0.1.5.tgz#3577fcfb5426be3a7b8ebada92671229d8cc81ce"
@@ -3442,11 +5238,21 @@ generate-object-property@^1.1.0:
   dependencies:
     is-property "^1.0.0"
 
+get-assigned-identifiers@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1"
+  integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==
+
 get-caller-file@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
   integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
 
+get-caller-file@^2.0.1:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
 get-stdin@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@@ -3457,13 +5263,20 @@ get-stream@^3.0.0:
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
   integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=
 
-get-stream@^4.0.0:
+get-stream@^4.0.0, get-stream@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
   integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
   dependencies:
     pump "^3.0.0"
 
+get-stream@^5.0.0, get-stream@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
+  integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
+  dependencies:
+    pump "^3.0.0"
+
 get-uri@^2.0.0:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-2.0.4.tgz#d4937ab819e218d4cb5ae18e4f5962bef169cc6a"
@@ -3488,6 +5301,15 @@ getpass@^0.1.1:
   dependencies:
     assert-plus "^1.0.0"
 
+git-rev-sync@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/git-rev-sync/-/git-rev-sync-2.0.0.tgz#82fb77d9281efe7e7947569380dda4d1c19f4cb3"
+  integrity sha512-vnHFv2eocTmt/wHqZm3ksxtVshK4vptT0cEoumk6hAYRFx3do6Qo7xHBTBCv29+r3ZZCQOQ1i328MUCsYF7AUw==
+  dependencies:
+    escape-string-regexp "1.0.5"
+    graceful-fs "4.1.15"
+    shelljs "0.7.7"
+
 glob-parent@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -3496,10 +5318,10 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob-parent@~5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2"
-  integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==
+glob-parent@^5.1.0, glob-parent@~5.1.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+  integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
   dependencies:
     is-glob "^4.0.1"
 
@@ -3531,11 +5353,6 @@ glob-stream@^6.1.0:
     to-absolute-glob "^2.0.0"
     unique-stream "^2.0.2"
 
-glob-to-regexp@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
-  integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-
 glob-watcher@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b"
@@ -3543,12 +5360,36 @@ glob-watcher@^0.0.6:
   dependencies:
     gaze "^0.5.1"
 
+glob-watcher@^5.0.3:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626"
+  integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==
+  dependencies:
+    anymatch "^2.0.0"
+    async-done "^1.2.0"
+    chokidar "^2.0.0"
+    is-negated-glob "^1.0.0"
+    just-debounce "^1.0.0"
+    object.defaults "^1.1.0"
+
 glob2base@^0.0.12:
   version "0.0.12"
   resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
   integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=
   dependencies:
-    find-index "^0.1.1"
+    find-index "^0.1.1"
+
+glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.1:
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
 
 glob@^4.3.1:
   version "4.5.3"
@@ -3582,18 +5423,6 @@ glob@^6.0.1:
     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, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1, glob@~7.1.6:
-  version "7.1.6"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
-  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.4"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
 glob@~3.1.21:
   version "3.1.21"
   resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd"
@@ -3610,6 +5439,13 @@ global-dirs@^0.1.0:
   dependencies:
     ini "^1.3.4"
 
+global-dirs@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
+  integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==
+  dependencies:
+    ini "^1.3.5"
+
 global-modules@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d"
@@ -3648,38 +5484,37 @@ global-prefix@^1.0.1:
     is-windows "^1.0.1"
     which "^1.2.14"
 
-globby@^6.1.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
-  integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
-  dependencies:
-    array-union "^1.0.1"
-    glob "^7.0.3"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
+globals@^11.7.0:
+  version "11.12.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
-globby@^9.1.0:
-  version "9.2.0"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
-  integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
+globals@^9.14.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+  integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+globby@^10.0.1:
+  version "10.0.2"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+  integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
   dependencies:
     "@types/glob" "^7.1.1"
-    array-union "^1.0.2"
-    dir-glob "^2.2.2"
-    fast-glob "^2.2.6"
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.0.3"
     glob "^7.1.3"
-    ignore "^4.0.3"
-    pify "^4.0.1"
-    slash "^2.0.0"
+    ignore "^5.1.1"
+    merge2 "^1.2.3"
+    slash "^3.0.0"
 
 globule@^1.0.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.0.tgz#41d0e9fb44afd4b80d93a23263714f90b3dec904"
-  integrity sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9"
+  integrity sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==
   dependencies:
     glob "~7.1.1"
-    lodash "~4.17.10"
+    lodash "~4.17.12"
     minimatch "~3.0.2"
 
 globule@~0.1.0:
@@ -3745,6 +5580,33 @@ got@^6.7.1:
     unzip-response "^2.0.1"
     url-parse-lax "^1.0.0"
 
+got@^9.6.0:
+  version "9.6.0"
+  resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+  integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+  dependencies:
+    "@sindresorhus/is" "^0.14.0"
+    "@szmarczak/http-timer" "^1.1.2"
+    cacheable-request "^6.0.0"
+    decompress-response "^3.3.0"
+    duplexer3 "^0.1.4"
+    get-stream "^4.1.0"
+    lowercase-keys "^1.0.1"
+    mimic-response "^1.0.1"
+    p-cancelable "^1.0.0"
+    to-readable-stream "^1.0.0"
+    url-parse-lax "^3.0.0"
+
+graceful-fs@4.1.15:
+  version "4.1.15"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
+  integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
+
+graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
+  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
+
 graceful-fs@^3.0.0:
   version "3.0.12"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.12.tgz#0034947ce9ed695ec8ab0b854bc919e82b1ffaef"
@@ -3752,10 +5614,10 @@ graceful-fs@^3.0.0:
   dependencies:
     natives "^1.1.3"
 
-graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3:
-  version "4.2.3"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
-  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
+graceful-fs@^4.1.0, graceful-fs@^4.2.2:
+  version "4.2.4"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+  integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
 
 graceful-fs@~1.2.0:
   version "1.2.3"
@@ -3767,6 +5629,11 @@ graceful-fs@~1.2.0:
   resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
   integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
 
+growly@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+  integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
+
 gtoken@^1.1.0:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.3.tgz#5509571b8afd4322e124cf66cf68115284c476d8"
@@ -3777,19 +5644,19 @@ gtoken@^1.1.0:
     mime "^1.4.1"
     request "^2.72.0"
 
-gulp-angular-templatecache@^2.2.7:
-  version "2.2.7"
-  resolved "https://registry.yarnpkg.com/gulp-angular-templatecache/-/gulp-angular-templatecache-2.2.7.tgz#d71ed65b5280e8623a313d23c4d3f138d62eaba9"
-  integrity sha512-Tc+amGWfc2W8BxfCSikhQHWlaZdJppPyhSFFafwln2ExNOFuHCNdwT7HCf54cpHcXdzzFuC7c/rI/075CejmaQ==
+gulp-angular-templatecache@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-angular-templatecache/-/gulp-angular-templatecache-3.0.0.tgz#d6cec931e452917343341c99af5c3d66eea122f4"
+  integrity sha512-76/Zpb7gx0p02nMU/80B+sGFYKw6hXw3r8lH3xbmYBG3dNoXLVvPrPiDdAA+157FbrfzRtpTS1YMQpkYovKHYg==
   dependencies:
     gulp-concat "2.6.1"
     gulp-footer "2.0.2"
     gulp-header "2.0.7"
-    jsesc "2.5.1"
+    jsesc "2.5.2"
     lodash.template "^4.4.0"
     map-stream "0.0.7"
     stream-combiner "0.2.2"
-    through2 "^2.0.3"
+    through2 "^3.0.1"
 
 gulp-angular-translate@^0.1.4:
   version "0.1.4"
@@ -3824,35 +5691,61 @@ gulp-base64@^0.1.3:
     request "~2.33.0"
     through2 "~0.4.1"
 
-gulp-bump@^2.1.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/gulp-bump/-/gulp-bump-2.9.0.tgz#6222e6e08b45261a5a60140b297fca45c1b41421"
-  integrity sha512-Cu+QOhwb2Jr2K6yo2u2mh4GWQRpSAMZD/z0v8FStlrOGaqML9u1On7XcyR1pS/PN3HQ9wsd/Ks6AcCQb+j3BgA==
+gulp-bump@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/gulp-bump/-/gulp-bump-3.1.3.tgz#a9e4b4691e46faeb6759140c21ece40b0a3f9e76"
+  integrity sha512-mhu6IvwMl2lHU2EUSkcgYG+Gd0Hwzn2B5ve4OXwaIg4SgmtVLTJ1graKD4t82ExhkU+TGoK/DHAdMJJ5isFe9g==
   dependencies:
-    bump-regex "^2.9.0"
-    plugin-error "^0.1.2"
+    bump-regex "^3.1.1"
+    plugin-error "^1.0.1"
     plugin-log "^0.1.0"
     semver "^5.3.0"
     through2 "^2.0.1"
 
-gulp-clean-css@^3.7.0:
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-3.10.0.tgz#bccd4605eff104bfa4980014cc4b3c24c571736d"
-  integrity sha512-7Isf9Y690o/Q5MVjEylH1H7L8WeZ89woW7DnhD5unTintOdZb67KdOayRgp9trUFo+f9UyJtuatV42e/+kghPg==
+gulp-clean-css@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz#5b1e73f2fca46703eb636014cdd4553cea65146d"
+  integrity sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==
   dependencies:
-    clean-css "4.2.1"
+    clean-css "4.2.3"
     plugin-error "1.0.1"
-    through2 "2.0.3"
+    through2 "3.0.1"
     vinyl-sourcemaps-apply "0.2.1"
 
-gulp-clean@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.3.2.tgz#a347d473acea40182f935587a451941671928102"
-  integrity sha1-o0fUc6zqQBgvk1WHpFGUFnGSgQI=
+gulp-clean@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/gulp-clean/-/gulp-clean-0.4.0.tgz#3bc25e7084e641bbd7bde057cf90c01c50d95950"
+  integrity sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ==
+  dependencies:
+    fancy-log "^1.3.2"
+    plugin-error "^0.1.2"
+    rimraf "^2.6.2"
+    through2 "^2.0.3"
+    vinyl "^2.1.0"
+
+gulp-cli@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.2.0.tgz#5533126eeb7fe415a7e3e84a297d334d5cf70ebc"
+  integrity sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==
   dependencies:
-    gulp-util "^2.2.14"
-    rimraf "^2.2.8"
-    through2 "^0.4.2"
+    ansi-colors "^1.0.1"
+    archy "^1.0.0"
+    array-sort "^1.0.0"
+    color-support "^1.1.3"
+    concat-stream "^1.6.0"
+    copy-props "^2.0.1"
+    fancy-log "^1.3.2"
+    gulplog "^1.0.0"
+    interpret "^1.1.0"
+    isobject "^3.0.1"
+    liftoff "^3.1.0"
+    matchdep "^2.0.0"
+    mute-stdout "^1.0.0"
+    pretty-hrtime "^1.0.0"
+    replace-homedir "^1.0.0"
+    semver-greatest-satisfied-range "^1.1.0"
+    v8flags "^3.0.1"
+    yargs "^7.1.0"
 
 gulp-concat@2.4.3:
   version "2.4.3"
@@ -3885,23 +5778,23 @@ gulp-css-base64@^1.3.4:
     request "^2.67.0"
     through2 "^2.0.0"
 
-gulp-csso@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/gulp-csso/-/gulp-csso-2.0.0.tgz#3237bc949736cd6704c929ca3952ce071021ed84"
-  integrity sha1-Mje8lJc2zWcEySnKOVLOBxAh7YQ=
+gulp-csso@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/gulp-csso/-/gulp-csso-4.0.1.tgz#c2ac2b5f7138ed04073ed8f7cf89c12f716580d0"
+  integrity sha512-Kg8gqmd6XcUlMTdBbqdCEcpHumc8ytc4khgm9AXeCjl8eHx7b6tC11y8haizFI+Zw/cSHL6HCj7GwGLwxxBUFQ==
   dependencies:
-    csso "^2.0.0"
-    gulp-util "^3.0.6"
+    csso "^4.0.0"
+    plugin-error "^1.0.0"
     vinyl-sourcemaps-apply "^0.2.1"
 
-gulp-filter@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-4.0.0.tgz#395f58a256c559cdb9e0d157f1caaf5248a38dcb"
-  integrity sha1-OV9YolbFWc254NFX8cqvUkijjcs=
+gulp-filter@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-6.0.0.tgz#9d69a408f1a9f60534264fb14464841f1b1746c2"
+  integrity sha512-veQFW93kf6jBdWdF/RxMEIlDK2mkjHyPftM381DID2C9ImTVngwYpyyThxm4/EpgcNOT37BLefzMOjEKbyYg0Q==
   dependencies:
-    gulp-util "^3.0.6"
-    multimatch "^2.0.0"
-    streamfilter "^1.0.5"
+    multimatch "^4.0.0"
+    plugin-error "^1.0.1"
+    streamfilter "^3.0.0"
 
 gulp-footer@2.0.2, gulp-footer@^2.0.2:
   version "2.0.2"
@@ -3934,7 +5827,7 @@ gulp-header@2.0.7:
     map-stream "0.0.7"
     through2 "^2.0.0"
 
-gulp-header@^2.0.7:
+gulp-header@^2.0.9:
   version "2.0.9"
   resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.9.tgz#8b432c4d4379dee6788845b16785b09c7675af84"
   integrity sha512-LMGiBx+qH8giwrOuuZXSGvswcIUh0OiioNkUpLhNyvaC6/Ga8X6cfAeme2L5PqsbXMhL8o8b/OmVqIQdxprhcQ==
@@ -3954,26 +5847,23 @@ gulp-html-remove@^0.1.1:
     lodash "2.4.1"
     through2 "0.6.1"
 
-gulp-htmlmin@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-2.0.0.tgz#12ca63576437aadfc859d2addfa41c38efcea869"
-  integrity sha1-EspjV2Q3qt/IWdKt36QcOO/OqGk=
+gulp-htmlmin@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-5.0.1.tgz#90fc5e8ad0425a9e86d5d521427184e7276365e7"
+  integrity sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA==
   dependencies:
-    bufferstreams "^1.1.0"
-    gulp-util "^3.0.7"
-    html-minifier "^2.1.0"
-    object-assign "^4.0.1"
-    readable-stream "^2.0.2"
-    tryit "^1.0.1"
+    html-minifier "^3.5.20"
+    plugin-error "^1.0.1"
+    through2 "^2.0.3"
 
-gulp-if@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-2.0.2.tgz#a497b7e7573005041caa2bc8b7dda3c80444d629"
-  integrity sha1-pJe351cwBQQcqivIt92jyARE1ik=
+gulp-if@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-if/-/gulp-if-3.0.0.tgz#6c3e7edc8bafadc34f2ebecb314bf43324ba1e40"
+  integrity sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==
   dependencies:
-    gulp-match "^1.0.3"
-    ternary-stream "^2.0.1"
-    through2 "^2.0.1"
+    gulp-match "^1.1.0"
+    ternary-stream "^3.0.0"
+    through2 "^3.0.1"
 
 gulp-jshint@^2.1.0:
   version "2.1.0"
@@ -3998,16 +5888,16 @@ gulp-livereload@^3.0.0:
     lodash.assign "^3.0.0"
     mini-lr "^0.1.8"
 
-gulp-markdown@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/gulp-markdown/-/gulp-markdown-1.2.0.tgz#37cdc61379fb039841fa6cab4984a8e79128a772"
-  integrity sha1-N83GE3n7A5hB+myrSYSo55Eop3I=
+gulp-markdown@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/gulp-markdown/-/gulp-markdown-5.0.1.tgz#9a98893baf39bbd707e6fddc027c29de1bf407b1"
+  integrity sha512-Wv6VdgSQKOfgRLR69OogYpqkudHkwV3keVxwRQh600cJTDYx7Yq4TA5m5EnXzLpa7qfyiW/fFdRiObaN5Wkkcg==
   dependencies:
-    gulp-util "^3.0.0"
-    marked "^0.3.2"
-    through2 "^2.0.0"
+    marked "^0.7.0"
+    plugin-error "^1.0.1"
+    through2 "^3.0.1"
 
-gulp-match@^1.0.3:
+gulp-match@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/gulp-match/-/gulp-match-1.1.0.tgz#552b7080fc006ee752c90563f9fec9d61aafdf4f"
   integrity sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==
@@ -4026,7 +5916,7 @@ gulp-minify-css@^0.3.0:
     through2 "^0.6.1"
     vinyl-sourcemaps-apply "^0.1.4"
 
-gulp-ng-annotate@^2.0.0:
+gulp-ng-annotate@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/gulp-ng-annotate/-/gulp-ng-annotate-2.1.0.tgz#50bd207b4403bbc8f0efd01bcedb2cc8c04a928b"
   integrity sha512-wjazOa5qE83akCih+lK2a0LFvkLbIMeblxr54ofmc3WKJ3Ipx/BM98ZCtCDfQW/008EVUSRqwfEjFKEEGI0QbA==
@@ -4038,7 +5928,7 @@ gulp-ng-annotate@^2.0.0:
     through2 "^2.0.1"
     vinyl-sourcemaps-apply "^0.2.1"
 
-gulp-ng-constant@^1.1.0:
+gulp-ng-constant@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/gulp-ng-constant/-/gulp-ng-constant-1.2.0.tgz#5dfb6e9ce02f4328bc26bcb6bd41a0828e000c6a"
   integrity sha512-Ig0nnyJEeyd9RqQwNkE1uUeldo6UcZ+HMs6qNYvztcTbj0do2GC99sK10pqThMLpiQ51ENwVlR5t4PKuVAd0fQ==
@@ -4050,58 +5940,43 @@ gulp-ng-constant@^1.1.0:
     through2 "^2.0.0"
     vinyl "^2.1.0"
 
-gulp-remove-code@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/gulp-remove-code/-/gulp-remove-code-1.0.2.tgz#a05df4d87af6bc0821aa5fa6e24ceb4fd59d0256"
-  integrity sha1-oF302Hr2vAghql+m4kzrT9WdAlY=
+gulp-remove-code@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/gulp-remove-code/-/gulp-remove-code-3.0.4.tgz#29330984667c61195eb626c1203fb779280c0cfd"
+  integrity sha512-nfGXuE2ra/o008t+XPzd3/dbkgmO4XNLEUibCFlv4KS5+V2cLGU0m9Rmdd4L9ZkduwC1+/AuSEyySt7CZhcLzw==
   dependencies:
-    bufferstreams "1.0.1"
-    event-stream "^3.3.0"
-    gulp-util "^3.0.4"
+    bufferstreams "^2.0.1"
+    escape-string-regexp "^1.0.5"
+    object.entries "^1.0.4"
+    plugin-error "^1.0.1"
+    through2 "^2.0.3"
 
-gulp-rename@^1.1.0, gulp-rename@^1.2.0:
+gulp-rename@^1.1.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.4.0.tgz#de1c718e7c4095ae861f7296ef4f3248648240bd"
   integrity sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==
 
-gulp-replace@^0.5.4:
-  version "0.5.4"
-  resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-0.5.4.tgz#69a67914bbd13c562bff14f504a403796aa0daa9"
-  integrity sha1-aaZ5FLvRPFYr/xT1BKQDeWqg2qk=
+gulp-rename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-2.0.0.tgz#9bbc3962b0c0f52fc67cd5eaff6c223ec5b9cf6c"
+  integrity sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==
+
+gulp-replace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-replace/-/gulp-replace-1.0.0.tgz#b32bd61654d97b8d78430a67b3e8ce067b7c9143"
+  integrity sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==
   dependencies:
-    istextorbinary "1.0.2"
+    istextorbinary "2.2.1"
     readable-stream "^2.0.1"
     replacestream "^4.0.0"
 
-gulp-rev-replace@^0.4.3:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/gulp-rev-replace/-/gulp-rev-replace-0.4.4.tgz#9696854131024baf264010b1f51ff8a1382ab94a"
-  integrity sha512-2yiDel/TGamn/HgHyo8H1rYEEL2zLsOYODerItoX8batOo0gPAe7uX7t6NlaqB7FEHpS5tGzUr5CKUEmrgdHyQ==
-  dependencies:
-    plugin-error "^0.1.2"
-    through2 "^2.0.0"
-
-gulp-rev@^7.0.0:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/gulp-rev/-/gulp-rev-7.1.2.tgz#5e17cc229f6b45c74256f88ad3f2d3e9a3305829"
-  integrity sha1-XhfMIp9rRcdCVviK0/LT6aMwWCk=
-  dependencies:
-    gulp-util "^3.0.0"
-    modify-filename "^1.1.0"
-    object-assign "^4.0.1"
-    rev-hash "^1.0.0"
-    rev-path "^1.0.0"
-    sort-keys "^1.0.0"
-    through2 "^2.0.0"
-    vinyl-file "^1.1.0"
-
-gulp-sass@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.0.2.tgz#cfb1e3eff2bd9852431c7ce87f43880807d8d505"
-  integrity sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg==
+gulp-sass@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.1.0.tgz#486d7443c32d42bf31a6b1573ebbdaa361de7427"
+  integrity sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA==
   dependencies:
     chalk "^2.3.0"
-    lodash.clonedeep "^4.3.2"
+    lodash "^4.17.11"
     node-sass "^4.8.3"
     plugin-error "^1.0.1"
     replace-ext "^1.0.0"
@@ -4109,6 +5984,39 @@ gulp-sass@^4.0.2:
     through2 "^2.0.0"
     vinyl-sourcemaps-apply "^0.2.0"
 
+gulp-sort@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-sort/-/gulp-sort-2.0.0.tgz#c6762a2f1f0de0a3fc595a21599d3fac8dba1aca"
+  integrity sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso=
+  dependencies:
+    through2 "^2.0.1"
+
+gulp-sourcemaps@^2.6.5:
+  version "2.6.5"
+  resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz#a3f002d87346d2c0f3aec36af7eb873f23de8ae6"
+  integrity sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==
+  dependencies:
+    "@gulp-sourcemaps/identity-map" "1.X"
+    "@gulp-sourcemaps/map-sources" "1.X"
+    acorn "5.X"
+    convert-source-map "1.X"
+    css "2.X"
+    debug-fabulous "1.X"
+    detect-newline "2.X"
+    graceful-fs "4.X"
+    source-map "~0.6.0"
+    strip-bom-string "1.X"
+    through2 "2.X"
+
+gulp-sri-hash@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/gulp-sri-hash/-/gulp-sri-hash-2.2.1.tgz#1b83c6a511a34e7b3d88903335fa9ddeecd94b81"
+  integrity sha512-nPcrs3lUBKZeC6E2Fi0Qz8WzP4hUlX3qraTfpCcKNJ49QpchBMu73xFRYtXqXBvhJPwDcIswAQQuVi6NhKh5JQ==
+  dependencies:
+    cheerio "^1.0.0-rc.3"
+    plugin-error "^1.0.1"
+    through2 "^3.0.1"
+
 gulp-uglify-es@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/gulp-uglify-es/-/gulp-uglify-es-2.0.0.tgz#0a48d9f352393397e78cf2be44bf0fb66a353031"
@@ -4131,20 +6039,19 @@ gulp-uglify@^0.2.1:
     uglify-js "~2.4.6"
     vinyl "~0.2.3"
 
-gulp-useref@^3.1.0:
-  version "3.1.6"
-  resolved "https://registry.yarnpkg.com/gulp-useref/-/gulp-useref-3.1.6.tgz#67721f0ba6747bcfdf40e8bbebaf3cf9330e29da"
-  integrity sha512-CMntxNp9LSk0F7itgOgqGqrO5pQL7eyQt6zhWi533VMFyMch8MNrSqjR7JyxEbPkts38s++W4ZmFVjx0NLMv8g==
+gulp-useref@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/gulp-useref/-/gulp-useref-4.0.1.tgz#8495c3c085c25587263a7722cd438092da057e85"
+  integrity sha512-+FjOGvvlCiUTbIjDQ0CAz8sQC3zkq3n1FqG6HR3njvcKQ9rNPIsHhcE5nUah4IHthKOHMPsnUBtE71nZp+dHAg==
   dependencies:
     event-stream "^4.0.1"
     extend "^3.0.2"
-    glob "^7.1.3"
+    glob "^7.1.6"
     gulp-concat "^2.6.1"
-    gulp-if "^2.0.2"
-    is-relative-url "1.0.0"
+    gulp-if "^3.0.0"
     plugin-error "^1.0.1"
-    through2 "^2.0.3"
-    useref "^1.4.1"
+    through2 "^3.0.1"
+    useref "^1.4.3"
     vinyl-fs "^3.0.3"
 
 gulp-util@3.0.1:
@@ -4183,21 +6090,7 @@ gulp-util@3.0.3:
     through2 "^0.6.3"
     vinyl "^0.4.3"
 
-gulp-util@^2.2.14, gulp-util@~2.2.14:
-  version "2.2.20"
-  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c"
-  integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=
-  dependencies:
-    chalk "^0.5.0"
-    dateformat "^1.0.7-1.2.3"
-    lodash._reinterpolate "^2.4.1"
-    lodash.template "^2.4.1"
-    minimist "^0.2.0"
-    multipipe "^0.1.0"
-    through2 "^0.5.0"
-    vinyl "^0.2.1"
-
-gulp-util@^3.0.0, gulp-util@^3.0.1, gulp-util@^3.0.2, gulp-util@^3.0.3, gulp-util@^3.0.4, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@~3.0.1:
+gulp-util@^3.0.0, gulp-util@^3.0.1, gulp-util@^3.0.2, gulp-util@^3.0.3, gulp-util@^3.0.6, gulp-util@~3.0.1:
   version "3.0.8"
   resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f"
   integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08=
@@ -4221,16 +6114,40 @@ gulp-util@^3.0.0, gulp-util@^3.0.1, gulp-util@^3.0.2, gulp-util@^3.0.3, gulp-uti
     through2 "^2.0.0"
     vinyl "^0.5.0"
 
-gulp-zip@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-3.2.0.tgz#ebd198dae6dc2d5f44d814569c8ec42118a93ef9"
-  integrity sha1-69GY2ubcLV9E2BRWnI7EIRipPvk=
+gulp-util@~2.2.14:
+  version "2.2.20"
+  resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c"
+  integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=
   dependencies:
-    chalk "^1.0.0"
-    concat-stream "^1.4.7"
-    gulp-util "^3.0.0"
-    through2 "^2.0.1"
-    yazl "^2.1.0"
+    chalk "^0.5.0"
+    dateformat "^1.0.7-1.2.3"
+    lodash._reinterpolate "^2.4.1"
+    lodash.template "^2.4.1"
+    minimist "^0.2.0"
+    multipipe "^0.1.0"
+    through2 "^0.5.0"
+    vinyl "^0.2.1"
+
+gulp-zip@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/gulp-zip/-/gulp-zip-5.0.1.tgz#0dba5094901b0d91bcc8b53b3f6ff797c0f2002d"
+  integrity sha512-M/IWLh9RvOpuofDZkgDirtiyz9J3yIqnDOJ3muzk2D/XnZ1ruqPlPLRIpXnl/aZU+xXwKPdOIxjRzkUcVEQyZQ==
+  dependencies:
+    get-stream "^5.1.0"
+    plugin-error "^1.0.1"
+    through2 "^3.0.1"
+    vinyl "^2.1.0"
+    yazl "^2.5.1"
+
+gulp@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.2.tgz#543651070fd0f6ab0a0650c6a3e6ff5a7cb09caa"
+  integrity sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==
+  dependencies:
+    glob-watcher "^5.0.3"
+    gulp-cli "^2.2.0"
+    undertaker "^1.2.1"
+    vinyl-fs "^3.0.0"
 
 gulp@^3.7.0, gulp@^3.9.1:
   version "3.9.1"
@@ -4273,7 +6190,7 @@ har-validator@~2.0.2, har-validator@~2.0.6:
     is-my-json-valid "^2.12.4"
     pinkie-promise "^2.0.0"
 
-har-validator@~5.1.0:
+har-validator@~5.1.0, har-validator@~5.1.3:
   version "5.1.3"
   resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
   integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
@@ -4372,13 +6289,34 @@ has-values@^1.0.0:
     is-number "^3.0.0"
     kind-of "^4.0.0"
 
-has@^1.0.3, has@~1.0.3:
+has-yarn@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
+  integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
+
+has@^1.0.0, has@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
   integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
   dependencies:
     function-bind "^1.1.1"
 
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.1"
+
 hawk@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.0.0.tgz#b90bb169807285411da7ffcb8dd2598502d3b52d"
@@ -4399,18 +6337,19 @@ hawk@~3.1.0, hawk@~3.1.3:
     hoek "2.x.x"
     sntp "1.x.x"
 
-he@1.1.x:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
-  integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
+he@1.2.x:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
 
-header-case@^1.0.0:
+hmac-drbg@^1.0.0:
   version "1.0.1"
-  resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d"
-  integrity sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
   dependencies:
-    no-case "^2.2.0"
-    upper-case "^1.1.3"
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
 
 hoek@0.9.x:
   version "0.9.1"
@@ -4429,23 +6368,28 @@ homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1:
   dependencies:
     parse-passwd "^1.0.0"
 
-hosted-git-info@^2.1.4, hosted-git-info@^2.7.1:
-  version "2.8.5"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c"
-  integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==
-
-html-minifier@^2.1.0:
-  version "2.1.7"
-  resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-2.1.7.tgz#9051d6fcbbcf214ed307e1ad74f432bb9ad655cc"
-  integrity sha1-kFHW/LvPIU7TB+GtdPQyu5rWVcw=
-  dependencies:
-    change-case "3.0.x"
-    clean-css "3.4.x"
-    commander "2.9.x"
-    he "1.1.x"
-    ncname "1.0.x"
+hosted-git-info@^2.1.4, hosted-git-info@^2.5.0, hosted-git-info@^2.7.1:
+  version "2.8.8"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
+  integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
+
+html-minifier@^3.5.20:
+  version "3.5.21"
+  resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
+  integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
+  dependencies:
+    camel-case "3.0.x"
+    clean-css "4.2.x"
+    commander "2.17.x"
+    he "1.2.x"
+    param-case "2.1.x"
     relateurl "0.2.x"
-    uglify-js "2.6.x"
+    uglify-js "3.4.x"
+
+htmlescape@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+  integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=
 
 htmlparser2@3.8.x, htmlparser2@~3.8.1:
   version "3.8.3"
@@ -4458,6 +6402,23 @@ htmlparser2@3.8.x, htmlparser2@~3.8.1:
     entities "1.0"
     readable-stream "1.1"
 
+htmlparser2@^3.9.1:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+  integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+  dependencies:
+    domelementtype "^1.3.1"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^3.1.1"
+
+http-cache-semantics@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
+  integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
+
 http-errors@1.7.2:
   version "1.7.2"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
@@ -4556,6 +6517,11 @@ http-signature@~1.2.0:
     jsprim "^1.2.2"
     sshpk "^1.7.0"
 
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+  integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
+
 https-proxy-agent@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#b8c286433e87602311b01c8ea34413d856a4af81"
@@ -4564,6 +6530,11 @@ https-proxy-agent@^3.0.0:
     agent-base "^4.3.0"
     debug "^3.1.0"
 
+human-signals@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+  integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
 iconv-lite@0.4.13:
   version "0.4.13"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2"
@@ -4576,12 +6547,27 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-ignore@^4.0.3:
+ieee754@^1.1.4:
+  version "1.1.13"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
+
+ignore@^3.2.0:
+  version "3.3.10"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+  integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
+ignore@^4.0.6:
   version "4.0.6"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-import-fresh@^3.0.0:
+ignore@^5.1.1:
+  version "5.1.4"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
+  integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
+
+import-fresh@3.2.1, import-fresh@^3.0.0:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
   integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
@@ -4600,9 +6586,9 @@ imurmurhash@^0.1.4:
   integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
 
 in-publish@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
-  integrity sha1-4g/146KvwmkDILbcVSaCqcf631E=
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c"
+  integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
 
 indent-string@^1.1.0:
   version "1.2.2"
@@ -4620,10 +6606,10 @@ indent-string@^2.1.0:
   dependencies:
     repeating "^2.0.0"
 
-indent-string@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
-  integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
 
 indexof@0.0.1:
   version "0.0.1"
@@ -4643,22 +6629,27 @@ inherits@1:
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b"
   integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=
 
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+  integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
+
 inherits@2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
   integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
 
-ini@^1.3.4, ini@~1.3.0:
+ini@^1.3.4, ini@^1.3.5, ini@~1.3.0, ini@~1.3.3:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
   integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
 
-init-package-json@^1.10.3:
+init-package-json@^1.2.0:
   version "1.10.3"
   resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
   integrity sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==
@@ -4672,7 +6663,51 @@ init-package-json@^1.10.3:
     validate-npm-package-license "^3.0.1"
     validate-npm-package-name "^3.0.0"
 
-inquirer@^6.3.1:
+inline-source-map@~0.6.0:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+  integrity sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=
+  dependencies:
+    source-map "~0.5.3"
+
+inquirer@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.10.1.tgz#ea25e4ce69ca145e05c99e46dcfec05e4012594a"
+  integrity sha1-6iXkzmnKFF4FyZ5G3P7AXkASWUo=
+  dependencies:
+    ansi-escapes "^1.1.0"
+    ansi-regex "^2.0.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^1.0.1"
+    figures "^1.3.5"
+    lodash "^3.3.1"
+    readline2 "^1.0.1"
+    run-async "^0.1.0"
+    rx-lite "^3.1.2"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+inquirer@^0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+  integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=
+  dependencies:
+    ansi-escapes "^1.1.0"
+    ansi-regex "^2.0.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^2.0.0"
+    figures "^1.3.5"
+    lodash "^4.3.0"
+    readline2 "^1.0.1"
+    run-async "^0.1.0"
+    rx-lite "^3.1.2"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+inquirer@^6.2.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
   integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
@@ -4692,40 +6727,57 @@ inquirer@^6.3.1:
     through "^2.3.6"
 
 inquirer@^7.0.0:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.1.tgz#13f7980eedc73c689feff3994b109c4e799c6ebb"
-  integrity sha512-V1FFQ3TIO15det8PijPLFR9M9baSlnRs9nL7zWu1MNVA2T9YVl9ZbrHJhYs7e9X8jeMZ3lr2JH/rdHFgNCBdYw==
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
+  integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
   dependencies:
     ansi-escapes "^4.2.1"
-    chalk "^2.4.2"
+    chalk "^3.0.0"
     cli-cursor "^3.1.0"
     cli-width "^2.0.0"
     external-editor "^3.0.3"
     figures "^3.0.0"
     lodash "^4.17.15"
     mute-stream "0.0.8"
-    run-async "^2.2.0"
+    run-async "^2.4.0"
     rxjs "^6.5.3"
     string-width "^4.1.0"
-    strip-ansi "^5.1.0"
+    strip-ansi "^6.0.0"
     through "^2.3.6"
 
-insight@^0.10.1:
-  version "0.10.3"
-  resolved "https://registry.yarnpkg.com/insight/-/insight-0.10.3.tgz#e7fa6593fd11323d227154cc8ce5f8bff638bf02"
-  integrity sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw==
+insert-module-globals@^7.0.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.0.tgz#ec87e5b42728479e327bd5c5c71611ddfb4752ba"
+  integrity sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==
+  dependencies:
+    JSONStream "^1.0.3"
+    acorn-node "^1.5.2"
+    combine-source-map "^0.8.0"
+    concat-stream "^1.6.1"
+    is-buffer "^1.1.0"
+    path-is-absolute "^1.0.1"
+    process "~0.11.0"
+    through2 "^2.0.0"
+    undeclared-identifiers "^1.1.2"
+    xtend "^4.0.0"
+
+insight@^0.8.4:
+  version "0.8.4"
+  resolved "https://registry.yarnpkg.com/insight/-/insight-0.8.4.tgz#671caf65b47c9fe8c3d1b3206cf45bb211b75884"
+  integrity sha1-ZxyvZbR8n+jD0bMgbPRbshG3WIQ=
   dependencies:
-    async "^2.6.2"
-    chalk "^2.4.2"
-    conf "^1.4.0"
-    inquirer "^6.3.1"
-    lodash.debounce "^4.0.8"
-    os-name "^3.1.0"
-    request "^2.88.0"
-    tough-cookie "^3.0.1"
-    uuid "^3.3.2"
+    async "^1.4.2"
+    chalk "^1.0.0"
+    configstore "^1.0.0"
+    inquirer "^0.10.0"
+    lodash.debounce "^3.0.1"
+    object-assign "^4.0.1"
+    os-name "^1.0.0"
+    request "^2.74.0"
+    tough-cookie "^2.0.0"
+    uuid "^3.0.0"
 
-interpret@^1.0.0:
+interpret@^1.0.0, interpret@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
   integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
@@ -4735,45 +6787,16 @@ invert-kv@^1.0.0:
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
   integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
 
+invert-kv@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-3.0.0.tgz#9db0c4817a1ec754df8067df6acf6828286f6a84"
+  integrity sha512-JzF8q2BeZA1ZkE3XROwRpoMQ9ObMgTtp0JH8EXewlbkikuOj2GPLIpUipdO+VL8QsTr2teAJD02EFGGL5cO7uw==
+
 ionic-plugin-keyboard@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ionic-plugin-keyboard/-/ionic-plugin-keyboard-2.2.1.tgz#f2a9e169bbe9b5522400347c9fd6d3467ee3fa12"
   integrity sha1-8qnhabvptVIkADR8n9bTRn7j+hI=
 
-ionic@^5.4.13:
-  version "5.4.13"
-  resolved "https://registry.yarnpkg.com/ionic/-/ionic-5.4.13.tgz#f88ba909057441f331f91261a78e2320f822a7eb"
-  integrity sha512-PtE2juZMaa/ycwwlcEt62UonpPPB0bMJaqRvYOIrVVWL1/yAcHtdDvTVvyumz3RS8cIi2f5NX4GIIvwgYIvVsA==
-  dependencies:
-    "@ionic/cli-framework" "3.0.5"
-    "@ionic/cli-framework-prompts" "1.0.4"
-    "@ionic/discover" "2.0.7"
-    "@ionic/utils-array" "1.2.2"
-    "@ionic/utils-fs" "2.0.9"
-    "@ionic/utils-network" "1.0.6"
-    "@ionic/utils-process" "1.0.8"
-    "@ionic/utils-stream" "2.0.5"
-    "@ionic/utils-subprocess" "1.0.12"
-    "@ionic/utils-terminal" "1.1.2"
-    chalk "^3.0.0"
-    debug "^4.0.0"
-    diff "^4.0.1"
-    elementtree "^0.1.7"
-    leek "0.0.24"
-    lodash "^4.17.5"
-    open "^7.0.0"
-    os-name "^3.1.0"
-    semver "^6.0.0"
-    split2 "^3.0.0"
-    ssh-config "^1.1.1"
-    stream-combiner2 "^1.1.1"
-    superagent "^4.1.0"
-    superagent-proxy "^2.0.0"
-    tar "^4.3.0"
-    through2 "^3.0.0"
-    tslib "^1.9.0"
-    uuid "^3.2.1"
-
 ios-sim@^8.0.1:
   version "8.0.2"
   resolved "https://registry.yarnpkg.com/ios-sim/-/ios-sim-8.0.2.tgz#e2394acb6db4378f75f4c3ff8610bbf4f4795c43"
@@ -4784,25 +6807,22 @@ ios-sim@^8.0.1:
     plist "^3.0.1"
     simctl "^2"
 
-ip-regex@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
-  integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
-
 ip@1.1.5, ip@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
   integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
 
-ipaddr.js@1.9.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
-  integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
+ipaddr.js@1.9.1:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
 
-is-absolute-url@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-1.0.0.tgz#2d7ef0fd0bb2a88dac7e92253c6808a0ace24bfb"
-  integrity sha1-LX7w/QuyqI2sfpIlPGgIoKziS/s=
+is-absolute@^0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f"
+  integrity sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=
+  dependencies:
+    is-relative "^0.1.0"
 
 is-absolute@^1.0.0:
   version "1.0.0"
@@ -4836,6 +6856,13 @@ is-arrayish@^0.2.1:
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
   integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
 
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
+  dependencies:
+    binary-extensions "^1.0.0"
+
 is-binary-path@~2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@@ -4843,12 +6870,12 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
-is-buffer@^1.1.5:
+is-buffer@^1.1.0, is-buffer@^1.1.5:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
   integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
 
-is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5:
+is-callable@^1.1.4, is-callable@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
   integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
@@ -4860,6 +6887,13 @@ is-ci@^1.0.10:
   dependencies:
     ci-info "^1.5.0"
 
+is-ci@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+  integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+  dependencies:
+    ci-info "^2.0.0"
+
 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"
@@ -4897,6 +6931,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
     is-data-descriptor "^1.0.0"
     kind-of "^6.0.2"
 
+is-docker@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b"
+  integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==
+
 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"
@@ -4920,11 +6959,9 @@ is-extglob@^2.1.0, is-extglob@^2.1.1:
   integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
 
 is-finite@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
-  integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=
-  dependencies:
-    number-is-nan "^1.0.0"
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+  integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
 
 is-fullwidth-code-point@^1.0.0:
   version "1.0.0"
@@ -4943,6 +6980,11 @@ is-fullwidth-code-point@^3.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
+is-git-url@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-git-url/-/is-git-url-1.0.0.tgz#53f684cd143285b52c3244b4e6f28253527af66b"
+  integrity sha1-U/aEzRQyhbUsMkS05vKCU1J69ms=
+
 is-glob@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -4972,19 +7014,25 @@ is-installed-globally@^0.1.0:
     global-dirs "^0.1.0"
     is-path-inside "^1.0.0"
 
-is-lower-case@^1.1.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393"
-  integrity sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=
+is-installed-globally@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
+  integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
   dependencies:
-    lower-case "^1.1.0"
+    global-dirs "^2.0.1"
+    is-path-inside "^3.0.1"
+
+is-mergeable-object@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/is-mergeable-object/-/is-mergeable-object-1.1.1.tgz#faaa3ed1cfce87d6f7d2f5885e92cc30af3e2ebf"
+  integrity sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==
 
 is-my-ip-valid@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824"
   integrity sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==
 
-is-my-json-valid@^2.12.4:
+is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
   version "2.20.0"
   resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz#1345a6fca3e8daefc10d0fa77067f54cedafd59a"
   integrity sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==
@@ -5005,6 +7053,11 @@ is-npm@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
   integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
 
+is-npm@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
+  integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
+
 is-number@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@@ -5012,6 +7065,11 @@ is-number@^3.0.0:
   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"
+  integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -5022,17 +7080,15 @@ is-obj@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
   integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
 
-is-path-cwd@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
-  integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=
+is-obj@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+  integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
 
-is-path-in-cwd@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
-  integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==
-  dependencies:
-    is-path-inside "^1.0.0"
+is-path-cwd@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
+  integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
 
 is-path-inside@^1.0.0:
   version "1.0.1"
@@ -5041,19 +7097,19 @@ is-path-inside@^1.0.0:
   dependencies:
     path-is-inside "^1.0.1"
 
-is-plain-obj@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
-  integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
+is-path-inside@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
+  integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
 
-is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+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"
   integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
   dependencies:
     isobject "^3.0.1"
 
-is-promise@^2.1.0:
+is-promise@^2.1, is-promise@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
   integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
@@ -5073,19 +7129,17 @@ is-redirect@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
   integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
 
-is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5:
+is-regex@^1.0.4, is-regex@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
   integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
   dependencies:
     has "^1.0.3"
 
-is-relative-url@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-1.0.0.tgz#87a9d35e8a789b49e079b4d7d69d64612e8e0e1f"
-  integrity sha1-h6nTXop4m0ngebTX1p1kYS6ODh8=
-  dependencies:
-    is-absolute-url "^1.0.0"
+is-relative@^0.1.0:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82"
+  integrity sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=
 
 is-relative@^1.0.0:
   version "1.0.0"
@@ -5094,6 +7148,11 @@ is-relative@^1.0.0:
   dependencies:
     is-unc-path "^1.0.0"
 
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+  integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
 is-retry-allowed@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
@@ -5104,6 +7163,11 @@ is-stream@^1.0.0, is-stream@^1.1.0:
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
   integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
 
+is-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+  integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
 is-symbol@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
@@ -5123,14 +7187,7 @@ is-unc-path@^1.0.0:
   dependencies:
     unc-path-regex "^0.1.2"
 
-is-upper-case@^1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f"
-  integrity sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=
-  dependencies:
-    upper-case "^1.1.0"
-
-is-url@^1.2.4:
+is-url@^1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
   integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
@@ -5166,10 +7223,22 @@ is-wsl@^1.1.0:
   integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
 
 is-wsl@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
+
+is-wsl@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d"
   integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==
 
+is-yarn-global@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
+  integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
+
 isarray@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -5180,6 +7249,16 @@ isarray@1.0.0, isarray@~1.0.0:
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
   integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
 
+isarray@^2.0.1:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+  integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0"
+  integrity sha1-NvPiLmB1CSD15yQaR2qMakInWtA=
+
 isexe@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -5202,20 +7281,49 @@ isstream@~0.1.2:
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
-istextorbinary@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-1.0.2.tgz#ace19354d1a9a0173efeb1084ce0f87b0ad7decf"
-  integrity sha1-rOGTVNGpoBc+/rEITOD4ewrX3s8=
+istextorbinary@2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53"
+  integrity sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==
   dependencies:
-    binaryextensions "~1.0.0"
-    textextensions "~1.0.0"
+    binaryextensions "2"
+    editions "^1.3.3"
+    textextensions "2"
+
+jed@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/jed/-/jed-1.1.1.tgz#7a549bbd9ffe1585b0cd0a191e203055bee574b4"
+  integrity sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=
+
+jetpack-id@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/jetpack-id/-/jetpack-id-1.0.0.tgz#2cf9fbae46d8074fc16b7de0071c8efebca473a6"
+  integrity sha1-LPn7rkbYB0/Ba33gBxyO/rykc6Y=
 
 js-base64@^2.1.8:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
-  integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.2.tgz#313b6274dda718f714d00b3330bbae6e38e90209"
+  integrity sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==
+
+js-select@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/js-select/-/js-select-0.6.0.tgz#c284e22824d5927aec962dcdf247174aefb0d190"
+  integrity sha1-woTiKCTVknrsli3N8kcXSu+w0ZA=
+  dependencies:
+    JSONSelect "0.2.1"
+    traverse "0.4.x"
+
+js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+  integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-yaml@^3.2.7:
+js-yaml@^3.13.0, js-yaml@^3.2.7, js-yaml@^3.5.1:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
   integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -5228,15 +7336,15 @@ jsbn@~0.1.0:
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
-jsesc@2.5.1:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
-  integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=
+jsesc@2.5.2:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
 
 jshint@^2.10.3:
-  version "2.10.3"
-  resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.10.3.tgz#98dc765bf6920b41bc2719f76b8739d6f6e93a9c"
-  integrity sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ==
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.11.0.tgz#7f3d99820b8b653eaaec7015a563b2d8101cbbc8"
+  integrity sha512-ooaD/hrBPhu35xXW4gn+o3SOuzht73gdBuffgJzrZBJZPGgGiiTvJEgTyxFvBO2nz0+X1G6etF8SzUODTlLY6Q==
   dependencies:
     cli "~1.0.0"
     console-browserify "1.1.x"
@@ -5247,6 +7355,18 @@ jshint@^2.10.3:
     shelljs "0.3.x"
     strip-json-comments "1.0.x"
 
+json-buffer@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+  integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
+json-merge-patch@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-merge-patch/-/json-merge-patch-0.2.3.tgz#fa2c6b5af87da77bae2966a589d52e23ed81fe40"
+  integrity sha1-+ixrWvh9p3uuKWalidUuI+2B/kA=
+  dependencies:
+    deep-equal "^1.0.0"
+
 json-parse-better-errors@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
@@ -5267,6 +7387,20 @@ json-stable-stringify-without-jsonify@^1.0.1:
   resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
   integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
 
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+  integrity sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=
+  dependencies:
+    jsonify "~0.0.0"
+
 json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
@@ -5284,11 +7418,37 @@ jsonfile@^4.0.0:
   optionalDependencies:
     graceful-fs "^4.1.6"
 
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+  integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+  integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
+
 jsonpointer@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
   integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk=
 
+jsonwebtoken@8.5.1:
+  version "8.5.1"
+  resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
+  integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
+  dependencies:
+    jws "^3.2.2"
+    lodash.includes "^4.3.0"
+    lodash.isboolean "^3.0.3"
+    lodash.isinteger "^4.0.4"
+    lodash.isnumber "^3.0.3"
+    lodash.isplainobject "^4.0.6"
+    lodash.isstring "^4.0.1"
+    lodash.once "^4.0.0"
+    ms "^2.1.1"
+    semver "^5.6.0"
+
 jsprim@^1.2.2:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@@ -5299,6 +7459,18 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
+jszip@^2.4.0:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/jszip/-/jszip-2.6.1.tgz#b88f3a7b2e67a2a048152982c7a3756d9c4828f0"
+  integrity sha1-uI86ey5noqBIFSmCx6N1bZxIKPA=
+  dependencies:
+    pako "~1.0.2"
+
+just-debounce@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea"
+  integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=
+
 jwa@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
@@ -5317,7 +7489,7 @@ jwa@~1.0.0:
     buffer-equal-constant-time "^1.0.1"
     ecdsa-sig-formatter "^1.0.0"
 
-jws@^3.0.0:
+jws@^3.0.0, jws@^3.2.2:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
   integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
@@ -5333,6 +7505,13 @@ jws@~3.0.0:
     base64url "~1.0.4"
     jwa "~1.0.0"
 
+keyv@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+  integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+  dependencies:
+    json-buffer "3.0.0"
+
 kind-of@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44"
@@ -5352,15 +7531,31 @@ kind-of@^4.0.0:
   dependencies:
     is-buffer "^1.1.5"
 
-kind-of@^5.0.0:
+kind-of@^5.0.0, kind-of@^5.0.2:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
   integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
 
 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"
-  integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+  integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+labeled-stream-splicer@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21"
+  integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==
+  dependencies:
+    inherits "^2.0.1"
+    stream-splicer "^2.0.0"
+
+last-run@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b"
+  integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls=
+  dependencies:
+    default-resolution "^2.0.0"
+    es6-weak-map "^2.0.1"
 
 latest-version@^3.0.0:
   version "3.1.0"
@@ -5369,7 +7564,14 @@ latest-version@^3.0.0:
   dependencies:
     package-json "^4.0.0"
 
-lazy-cache@^1.0.3, lazy-cache@^1.0.4:
+latest-version@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
+  integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
+  dependencies:
+    package-json "^6.3.0"
+
+lazy-cache@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
   integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=
@@ -5381,7 +7583,14 @@ lazy-cache@^2.0.1:
   dependencies:
     set-getter "^0.1.0"
 
-lazystream@^1.0.0:
+lazypipe@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/lazypipe/-/lazypipe-1.0.2.tgz#b66f64ed7fd8b04869f1f1bcb795dbbaa80e418c"
+  integrity sha512-CrU+NYdFHW8ElaeXCWz5IbmetiYVYq1fOCmpdAeZ8L+khbv1e7EnshyjlKqkO+pJbVPrsJQnHbVxEiLujG6qhQ==
+  dependencies:
+    stream-combiner "*"
+
+lazystream@^1.0.0, lazystream@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
   integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
@@ -5395,6 +7604,13 @@ lcid@^1.0.0:
   dependencies:
     invert-kv "^1.0.0"
 
+lcid@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0"
+  integrity sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==
+  dependencies:
+    invert-kv "^3.0.0"
+
 lead@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
@@ -5421,7 +7637,7 @@ leek@0.0.24:
     lodash.assign "^3.2.0"
     rsvp "^3.0.21"
 
-levn@~0.3.0:
+levn@^0.3.0, levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
   integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
@@ -5443,6 +7659,33 @@ liftoff@^2.1.0:
     rechoir "^0.6.2"
     resolve "^1.1.7"
 
+liftoff@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3"
+  integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==
+  dependencies:
+    extend "^3.0.0"
+    findup-sync "^3.0.0"
+    fined "^1.0.1"
+    flagged-respawn "^1.0.0"
+    is-plain-object "^2.0.4"
+    object.map "^1.0.0"
+    rechoir "^0.6.2"
+    resolve "^1.1.7"
+
+lighthouse-logger@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz#b76d56935e9c137e86a04741f6bb9b2776e886ca"
+  integrity sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==
+  dependencies:
+    debug "^2.6.8"
+    marky "^1.2.0"
+
+lines-and-columns@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+  integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
 livereload-js@^2.2.0, livereload-js@^2.3.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c"
@@ -5459,13 +7702,12 @@ load-json-file@^1.0.0:
     pinkie-promise "^2.0.0"
     strip-bom "^2.0.0"
 
-locate-path@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
-  integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
+locate-path@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+  integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
   dependencies:
-    p-locate "^2.0.0"
-    path-exists "^3.0.0"
+    p-locate "^4.1.0"
 
 lodash._baseassign@^3.0.0:
   version "3.2.0"
@@ -5679,10 +7921,12 @@ lodash.clonedeep@^4.3.2:
   resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
   integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
 
-lodash.debounce@^4.0.8:
-  version "4.0.8"
-  resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
-  integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+lodash.debounce@^3.0.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-3.1.1.tgz#812211c378a94cc29d5aa4e3346cf0bfce3a7df5"
+  integrity sha1-gSIRw3ipTMKdWqTjNGzwv846ffU=
+  dependencies:
+    lodash._getnative "^3.0.0"
 
 lodash.defaults@~2.4.1:
   version "2.4.1"
@@ -5713,6 +7957,11 @@ lodash.identity@~2.4.1:
   resolved "https://registry.yarnpkg.com/lodash.identity/-/lodash.identity-2.4.1.tgz#6694cffa65fef931f7c31ce86c74597cf560f4f1"
   integrity sha1-ZpTP+mX++TH3wxzobHRZfPVg9PE=
 
+lodash.includes@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
+  integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
+
 lodash.isarguments@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
@@ -5723,11 +7972,26 @@ lodash.isarray@^3.0.0:
   resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
   integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=
 
+lodash.isboolean@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
+  integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
+
 lodash.isfunction@~2.4.1:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz#2cfd575c73e498ab57e319b77fa02adef13a94d1"
   integrity sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE=
 
+lodash.isinteger@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+  integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
+
+lodash.isnumber@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
+  integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
+
 lodash.isobject@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d"
@@ -5740,6 +8004,16 @@ lodash.isobject@~2.4.1:
   dependencies:
     lodash._objecttypes "~2.4.1"
 
+lodash.isplainobject@^4.0.6:
+  version "4.0.6"
+  resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+  integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
+
+lodash.isstring@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+  integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
+
 lodash.keys@^3.0.0:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
@@ -5758,6 +8032,11 @@ lodash.keys@~2.4.1:
     lodash._shimkeys "~2.4.1"
     lodash.isobject "~2.4.1"
 
+lodash.memoize@~3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+  integrity sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=
+
 lodash.merge@^4.6.0:
   version "4.6.2"
   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -5773,6 +8052,11 @@ lodash.noop@~3.0.0:
   resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c"
   integrity sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=
 
+lodash.once@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+  integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
+
 lodash.reescape@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/lodash.reescape/-/lodash.reescape-3.0.1.tgz#16d27d4591a839a10b13cdff61dc9624ed237a23"
@@ -5799,6 +8083,11 @@ lodash.restparam@^3.0.0:
   resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
   integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
 
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+  integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
+
 lodash.support@~2.4.1:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/lodash.support/-/lodash.support-2.4.1.tgz#320e0b67031673c28d7a2bb5d9e0331a45240515"
@@ -5882,12 +8171,12 @@ lodash@^2.4.1, lodash@~2.4.1:
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e"
   integrity sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=
 
-lodash@^3.9.1:
+lodash@^3.3.1, lodash@^3.9.1:
   version "3.10.1"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
   integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=
 
-lodash@^4.0.0, lodash@^4.12.0, lodash@^4.14.1, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@~4.17.10, lodash@~4.17.11:
+lodash@^4.0.0, lodash@^4.12.0, lodash@^4.14.0, lodash@^4.14.1, lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.11, lodash@~4.17.12, lodash@~4.17.2:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -5897,21 +8186,17 @@ lodash@~1.0.1:
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551"
   integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=
 
-log-update@^3.2.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/log-update/-/log-update-3.3.0.tgz#3b0501815123f66cb33f300e3dac2a2b6ad3fdf5"
-  integrity sha512-YSKm5n+YjZoGZT5lfmOqasVH1fIH9xQA9A81Y48nZ99PxAP62vdCCtua+Gcu6oTn0nqtZd/LwRV+Vflo53ZDWA==
+log-update@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
+  integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
   dependencies:
-    ansi-escapes "^3.2.0"
-    cli-cursor "^2.1.0"
-    wrap-ansi "^5.0.0"
-
-longest@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
-  integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
+    ansi-escapes "^4.3.0"
+    cli-cursor "^3.1.0"
+    slice-ansi "^4.0.0"
+    wrap-ansi "^6.2.0"
 
-loud-rejection@^1.0.0:
+loud-rejection@^1.0.0, loud-rejection@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
   integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=
@@ -5919,31 +8204,21 @@ loud-rejection@^1.0.0:
     currently-unhandled "^0.4.1"
     signal-exit "^3.0.0"
 
-loud-rejection@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-2.2.0.tgz#4255eb6e9c74045b0edc021fa7397ab655a8517c"
-  integrity sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==
-  dependencies:
-    currently-unhandled "^0.4.1"
-    signal-exit "^3.0.2"
-
-lower-case-first@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1"
-  integrity sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=
-  dependencies:
-    lower-case "^1.1.2"
-
-lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2:
+lower-case@^1.1.1:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
   integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
 
-lowercase-keys@^1.0.0:
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
   integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
 
+lowercase-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+  integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
 lru-cache@2:
   version "2.7.3"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
@@ -5964,6 +8239,13 @@ lru-cache@^5.1.1:
   dependencies:
     yallist "^3.0.2"
 
+lru-queue@0.1:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+  integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
+  dependencies:
+    es5-ext "~0.10.2"
+
 macos-release@^2.2.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f"
@@ -5976,6 +8258,13 @@ make-dir@^1.0.0:
   dependencies:
     pify "^3.0.0"
 
+make-dir@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+  dependencies:
+    semver "^6.0.0"
+
 make-iterator@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
@@ -5983,6 +8272,13 @@ make-iterator@^1.0.0:
   dependencies:
     kind-of "^6.0.2"
 
+map-age-cleaner@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
+  integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
+  dependencies:
+    p-defer "^1.0.0"
+
 map-cache@^0.2.0, map-cache@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@@ -6010,10 +8306,25 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
-marked@^0.3.2:
-  version "0.3.19"
-  resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
-  integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==
+marked@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
+  integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
+
+marky@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz#a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02"
+  integrity sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==
+
+matchdep@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e"
+  integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4=
+  dependencies:
+    findup-sync "^2.0.0"
+    micromatch "^3.0.4"
+    resolve "^1.4.0"
+    stack-trace "0.0.10"
 
 matched@^0.4.1:
   version "0.4.4"
@@ -6030,16 +8341,55 @@ matched@^0.4.1:
     lazy-cache "^2.0.1"
     resolve-dir "^0.1.0"
 
-md5-file@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-4.0.0.tgz#f3f7ba1e2dd1144d5bf1de698d0e5f44a4409584"
-  integrity sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==
+md5.js@^1.3.4:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+  integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+mdn-browser-compat-data@1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.15.tgz#2f22145debdb4c337e06fa3017bd923c51a8fcf7"
+  integrity sha512-0jxT4ZqqCzJJfktX9d4NKgfRENy60kFzhVNV0mXNHvlnw8KrMe2cKOlEKs/Bz+odlgO0rRZAxU0OKiptqVhAXg==
+  dependencies:
+    extend "3.0.2"
+
+mdn-data@2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
+  integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
 
 media-typer@0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
   integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
 
+mem@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-5.1.1.tgz#7059b67bf9ac2c924c9f1cff7155a064394adfb3"
+  integrity sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==
+  dependencies:
+    map-age-cleaner "^0.1.3"
+    mimic-fn "^2.1.0"
+    p-is-promise "^2.1.0"
+
+memoizee@0.4.X:
+  version "0.4.14"
+  resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57"
+  integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==
+  dependencies:
+    d "1"
+    es5-ext "^0.10.45"
+    es6-weak-map "^2.0.2"
+    event-emitter "^0.3.5"
+    is-promise "^2.1"
+    lru-queue "0.1"
+    next-tick "1"
+    timers-ext "^0.1.5"
+
 memory-cache@0.0.5:
   version "0.0.5"
   resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.0.5.tgz#dbf99a56d7362c43eccaf39f0ba6f97f31a06786"
@@ -6076,12 +8426,10 @@ merge-descriptors@1.0.1:
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
   integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
 
-merge-stream@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
-  integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=
-  dependencies:
-    readable-stream "^2.0.1"
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
 
 merge2@^1.2.3, merge2@^1.3.0:
   version "1.3.0"
@@ -6093,12 +8441,12 @@ merge@^1.2.0:
   resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
   integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
 
-methods@^1.1.1, methods@~1.1.2:
+methods@^1.1.2, methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
   integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
 
-micromatch@^3.0.4, micromatch@^3.1.10:
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
   integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -6125,24 +8473,32 @@ micromatch@^4.0.2:
     braces "^3.0.1"
     picomatch "^2.0.5"
 
-mime-db@1.42.0, "mime-db@>= 1.40.0 < 2":
-  version "1.42.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.42.0.tgz#3e252907b4c7adb906597b4b65636272cf9e7bac"
-  integrity sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@1.43.0, "mime-db@>= 1.43.0 < 2":
+  version "1.43.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
+  integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
 
 mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.7:
-  version "2.1.25"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.25.tgz#39772d46621f93e2a80a856c53b86a62156a6437"
-  integrity sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==
+  version "2.1.26"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
+  integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
   dependencies:
-    mime-db "1.42.0"
+    mime-db "1.43.0"
 
 mime@1.6.0, mime@^1.3.4, mime@^1.4.1:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
   integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
 
-mime@2.4.4, mime@^2.4.0:
+mime@2.4.4, mime@^2.4.4:
   version "2.4.4"
   resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
   integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
@@ -6162,6 +8518,11 @@ mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
+mimic-response@^1.0.0, mimic-response@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+  integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
 mini-lr@^0.1.8:
   version "0.1.9"
   resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6"
@@ -6174,7 +8535,17 @@ mini-lr@^0.1.8:
     parseurl "~1.3.0"
     qs "~2.2.3"
 
-"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
+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"
+  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -6196,40 +8567,35 @@ minimatch@~0.2.11:
     lru-cache "2"
     sigmund "~1.0.0"
 
-minimist@0.0.8:
-  version "0.0.8"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-  integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
-
 minimist@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce"
-  integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784=
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.1.tgz#827ba4e7593464e7c221e8c5bed930904ee2c455"
+  integrity sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==
 
-minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-  integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
 
 minimist@~0.0.1:
   version "0.0.10"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
   integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
 
-minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
-  integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
+minipass@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
+  integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==
   dependencies:
-    safe-buffer "^5.1.2"
-    yallist "^3.0.0"
+    yallist "^4.0.0"
 
-minizlib@^1.2.1:
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
-  integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
+minizlib@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3"
+  integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==
   dependencies:
-    minipass "^2.9.0"
+    minipass "^3.0.0"
+    yallist "^4.0.0"
 
 mixin-deep@^1.2.0:
   version "1.3.2"
@@ -6239,24 +8605,45 @@ mixin-deep@^1.2.0:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
-  integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+mkdirp@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.3.tgz#4cf2e30ad45959dddea53ad97d518b6c8205e1ea"
+  integrity sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+  integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
   dependencies:
-    minimist "0.0.8"
+    minimist "^1.2.5"
 
-modify-filename@^1.0.0, modify-filename@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz#9a2dec83806fbb2d975f22beec859ca26b393aa1"
-  integrity sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=
+mkdirp@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
 
-"moment@>=2.8.0 <2.11.0":
-  version "2.10.6"
-  resolved "https://registry.yarnpkg.com/moment/-/moment-2.10.6.tgz#6cb21967c79cba7b0ca5e66644f173662b3efa77"
-  integrity sha1-bLIZZ8ecunsMpeZmRPFzZis++nc=
+module-deps@^4.0.8:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
+  integrity sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=
+  dependencies:
+    JSONStream "^1.0.3"
+    browser-resolve "^1.7.0"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.0"
+    defined "^1.0.0"
+    detective "^4.0.0"
+    duplexer2 "^0.1.2"
+    inherits "^2.0.1"
+    parents "^1.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.3"
+    stream-combiner2 "^1.1.1"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
 
-moment@^2.10.2, moment@^2.10.6:
+"moment@>=2.8.0 <3.0.0", moment@^2.10.2, moment@^2.10.6:
   version "2.24.0"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
   integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
@@ -6286,15 +8673,16 @@ ms@^2.1.1:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
-multimatch@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
-  integrity sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=
+multimatch@4.0.0, multimatch@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
+  integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
   dependencies:
-    array-differ "^1.0.0"
-    array-union "^1.0.1"
-    arrify "^1.0.0"
-    minimatch "^3.0.0"
+    "@types/minimatch" "^3.0.3"
+    array-differ "^3.0.0"
+    array-union "^2.1.0"
+    arrify "^2.0.1"
+    minimatch "^3.0.4"
 
 multipipe@^0.1.0, multipipe@^0.1.2:
   version "0.1.2"
@@ -6303,6 +8691,16 @@ multipipe@^0.1.0, multipipe@^0.1.2:
   dependencies:
     duplexer2 "0.0.2"
 
+mute-stdout@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331"
+  integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==
+
+mute-stream@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+  integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=
+
 mute-stream@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@@ -6313,7 +8711,7 @@ mute-stream@0.0.8, mute-stream@~0.0.4:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
-mv@^2.1.1:
+mv@^2.1.1, mv@~2:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2"
   integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=
@@ -6322,6 +8720,20 @@ mv@^2.1.1:
     ncp "~2.0.0"
     rimraf "~2.4.0"
 
+mz@2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+  integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+  dependencies:
+    any-promise "^1.0.0"
+    object-assign "^4.0.1"
+    thenify-all "^1.0.0"
+
+nan@^2.12.1, nan@^2.14.0:
+  version "2.14.1"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
+  integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
+
 nan@^2.13.2:
   version "2.14.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
@@ -6349,12 +8761,15 @@ natives@^1.1.3:
   resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.6.tgz#a603b4a498ab77173612b9ea1acdec4d980f00bb"
   integrity sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==
 
-ncname@1.0.x:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c"
-  integrity sha1-W1etGLHKCShk72Kwse2BlPODtxw=
-  dependencies:
-    xml-char-classes "^1.0.0"
+natural-compare-lite@~1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
+  integrity sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q=
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
 ncp@~2.0.0:
   version "2.0.0"
@@ -6371,11 +8786,26 @@ negotiator@0.6.2:
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
   integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 
+neo-async@^2.5.0:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
+  integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
+
 netmask@^1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/netmask/-/netmask-1.0.6.tgz#20297e89d86f6f6400f250d9f4f6b4c1945fcd35"
   integrity sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=
 
+next-tick@1, next-tick@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+next-tick@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+  integrity sha1-yobR/ogoFpsBICCOPchCS524NCw=
+
 ng-annotate@0.15.4:
   version "0.15.4"
   resolved "https://registry.yarnpkg.com/ng-annotate/-/ng-annotate-0.15.4.tgz#6507525c8f2f28f8787bcdb898f56d9b31066e93"
@@ -6417,7 +8847,7 @@ nice-try@^1.0.4:
   resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
   integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 
-no-case@^2.2.0, no-case@^2.3.2:
+no-case@^2.2.0:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
   integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
@@ -6455,10 +8885,44 @@ node-gyp@^3.8.0:
     tar "^2.0.0"
     which "1"
 
-node-sass@^4.13.0, node-sass@^4.8.3:
-  version "4.13.0"
-  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.0.tgz#b647288babdd6a1cb726de4545516b31f90da066"
-  integrity sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==
+node-notifier@6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12"
+  integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==
+  dependencies:
+    growly "^1.3.0"
+    is-wsl "^2.1.1"
+    semver "^6.3.0"
+    shellwords "^0.1.1"
+    which "^1.3.1"
+
+node-sass@^4.14.0:
+  version "4.14.0"
+  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.0.tgz#a8e9d7720f8e15b4a1072719dcf04006f5648eeb"
+  integrity sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==
+  dependencies:
+    async-foreach "^0.1.3"
+    chalk "^1.1.1"
+    cross-spawn "^3.0.0"
+    gaze "^1.0.0"
+    get-stdin "^4.0.1"
+    glob "^7.0.3"
+    in-publish "^2.0.0"
+    lodash "^4.17.15"
+    meow "^3.7.0"
+    mkdirp "^0.5.1"
+    nan "^2.13.2"
+    node-gyp "^3.8.0"
+    npmlog "^4.0.0"
+    request "^2.88.0"
+    sass-graph "^2.2.4"
+    stdout-stream "^1.4.0"
+    "true-case-path" "^1.0.2"
+
+node-sass@^4.8.3:
+  version "4.13.1"
+  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3"
+  integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==
   dependencies:
     async-foreach "^0.1.3"
     chalk "^1.1.1"
@@ -6498,14 +8962,14 @@ nopt@1.0.9:
   dependencies:
     abbrev "1"
 
-"nopt@2 || 3", nopt@^3.0.1:
+"nopt@2 || 3":
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
   integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
   dependencies:
     abbrev "1"
 
-nopt@^4.0.1:
+nopt@4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
   integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
@@ -6513,6 +8977,14 @@ nopt@^4.0.1:
     abbrev "1"
     osenv "^0.1.4"
 
+nopt@^4.0.1:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
+  integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
 normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -6523,7 +8995,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-
     semver "2 || 3 || 4 || 5"
     validate-npm-package-license "^3.0.1"
 
-normalize-path@^2.1.1:
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
   integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
@@ -6535,6 +9007,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0:
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
   integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
 
+normalize-url@^4.1.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
+  integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+
 now-and-later@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.1.tgz#8e579c8685764a7cc02cb680380e94f43ccb1f7c"
@@ -6547,7 +9024,7 @@ npm-normalize-package-bin@^1.0.0:
   resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
   integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
 
-"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.1.0:
+"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0":
   version "6.1.1"
   resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7"
   integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==
@@ -6564,6 +9041,13 @@ npm-run-path@^2.0.0:
   dependencies:
     path-key "^2.0.0"
 
+npm-run-path@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+  dependencies:
+    path-key "^3.0.0"
+
 "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
@@ -6574,6 +9058,13 @@ npm-run-path@^2.0.0:
     gauge "~2.7.3"
     set-blocking "~2.0.0"
 
+nth-check@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+  integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+  dependencies:
+    boolbase "~1.0.0"
+
 number-is-nan@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
@@ -6604,6 +9095,11 @@ object-assign@4.1.0:
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
   integrity sha1-ejs9DpgGPUP0wD8uiubNUahog6A=
 
+object-assign@4.X, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
 object-assign@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-1.0.0.tgz#e65dc8766d3b47b4b8307465c8311da030b070a6"
@@ -6619,11 +9115,6 @@ object-assign@^3.0.0:
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
   integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=
 
-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"
-  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
 object-component@0.0.3:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
@@ -6638,17 +9129,20 @@ object-copy@^0.1.0:
     define-property "^0.2.5"
     kind-of "^3.0.3"
 
-object-inspect@^1.7.0, object-inspect@~1.7.0:
+object-inspect@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
   integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
 
 object-is@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4"
-  integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6"
+  integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
 
-object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
   integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -6675,7 +9169,7 @@ object.assign@^4.0.4, object.assign@^4.1.0:
     has-symbols "^1.0.0"
     object-keys "^1.0.11"
 
-object.defaults@^1.1.0:
+object.defaults@^1.0.0, object.defaults@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
   integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
@@ -6685,6 +9179,16 @@ object.defaults@^1.1.0:
     for-own "^1.0.0"
     isobject "^3.0.0"
 
+object.entries@^1.0.4:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b"
+  integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0-next.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+
 object.map@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
@@ -6700,12 +9204,18 @@ object.pick@^1.2.0, object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-objectorarray@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.3.tgz#d2a2de9097c06a48d7d77264fd71406519e7c772"
-  integrity sha512-kPoflSYkAf/Onvjr4ZLaq37vDuOXjVzfwLCRuORRzYGdXkHa/vacPT0RgR+KmtkwOYFcxTMM62BRrZk8GGKHjw==
+object.reduce@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad"
+  integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=
   dependencies:
-    tape "^4.8.0"
+    for-own "^1.0.0"
+    make-iterator "^1.0.0"
+
+objectorarray@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/objectorarray/-/objectorarray-1.0.4.tgz#d69b2f0ff7dc2701903d308bb85882f4ddb49483"
+  integrity sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w==
 
 on-finished@~2.3.0:
   version "2.3.0"
@@ -6733,6 +9243,11 @@ once@~1.3.0:
   dependencies:
     wrappy "1"
 
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+  integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=
+
 onetime@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
@@ -6747,13 +9262,26 @@ onetime@^5.1.0:
   dependencies:
     mimic-fn "^2.1.0"
 
-open@^7.0.0:
+open@7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/open/-/open-7.0.0.tgz#7e52999b14eb73f90f0f0807fe93897c4ae73ec9"
   integrity sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==
   dependencies:
     is-wsl "^2.1.0"
 
+open@^7.0.0:
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48"
+  integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==
+  dependencies:
+    is-docker "^2.0.0"
+    is-wsl "^2.1.1"
+
+opener@^1.4.3:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
+  integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
+
 opn@^5.3.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
@@ -6769,7 +9297,7 @@ optimist@~0.6.1:
     minimist "~0.0.1"
     wordwrap "~0.0.2"
 
-optionator@^0.8.1:
+optionator@^0.8.1, optionator@^0.8.2:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
   integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -6819,11 +9347,25 @@ ordered-read-streams@^1.0.0:
   dependencies:
     readable-stream "^2.0.1"
 
+os-browserify@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54"
+  integrity sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=
+
 os-homedir@^1.0.0, os-homedir@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
   integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
 
+os-locale@5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0"
+  integrity sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==
+  dependencies:
+    execa "^4.0.0"
+    lcid "^3.0.0"
+    mem "^5.0.0"
+
 os-locale@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
@@ -6831,6 +9373,14 @@ os-locale@^1.4.0:
   dependencies:
     lcid "^1.0.0"
 
+os-name@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/os-name/-/os-name-1.0.3.tgz#1b379f64835af7c5a7f498b357cb95215c159edf"
+  integrity sha1-GzefZINa98Wn9JizV8uVIVwVnt8=
+  dependencies:
+    osx-release "^1.0.0"
+    win-release "^1.0.0"
+
 os-name@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801"
@@ -6839,12 +9389,17 @@ os-name@^3.1.0:
     macos-release "^2.2.0"
     windows-release "^3.1.0"
 
+os-shim@^0.1.2:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+  integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=
+
 os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
   integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
 
-osenv@0, osenv@^0.1.4, osenv@^0.1.5:
+osenv@0, osenv@^0.1.0, osenv@^0.1.4, osenv@^0.1.5:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
   integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
@@ -6852,36 +9407,55 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5:
     os-homedir "^1.0.0"
     os-tmpdir "^1.0.0"
 
+osx-release@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/osx-release/-/osx-release-1.1.0.tgz#f217911a28136949af1bf9308b241e2737d3cd6c"
+  integrity sha1-8heRGigTaUmvG/kwiyQeJzfTzWw=
+  dependencies:
+    minimist "^1.1.0"
+
+p-cancelable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+  integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
+p-defer@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+  integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
+
 p-finally@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
   integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
 
-p-limit@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
-  integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
-  dependencies:
-    p-try "^1.0.0"
+p-is-promise@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
+  integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
 
-p-locate@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
-  integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
+p-limit@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
   dependencies:
-    p-limit "^1.1.0"
+    p-try "^2.0.0"
 
-p-map@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
-  integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==
+p-locate@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+  integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+  dependencies:
+    p-limit "^2.2.0"
 
-p-try@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
-  integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
+p-map@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
+  integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+  dependencies:
+    aggregate-error "^3.0.0"
 
-p-try@^2.1.0:
+p-try@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
   integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
@@ -6921,7 +9495,27 @@ package-json@^4.0.0:
     registry-url "^3.0.3"
     semver "^5.1.0"
 
-param-case@^2.1.0:
+package-json@^6.3.0:
+  version "6.5.0"
+  resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
+  integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
+  dependencies:
+    got "^9.6.0"
+    registry-auth-token "^4.0.0"
+    registry-url "^5.0.0"
+    semver "^6.2.0"
+
+pako@~0.2.0:
+  version "0.2.9"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+  integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=
+
+pako@~1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+param-case@2.1.x:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
   integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
@@ -6935,6 +9529,25 @@ parent-module@^1.0.0:
   dependencies:
     callsites "^3.0.0"
 
+parents@^1.0.0, parents@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+  integrity sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=
+  dependencies:
+    path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+  version "5.1.5"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
+  integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+    safe-buffer "^5.1.1"
+
 parse-filepath@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
@@ -6944,6 +9557,16 @@ parse-filepath@^1.0.1:
     map-cache "^0.2.0"
     path-root "^0.1.1"
 
+parse-json@5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f"
+  integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+    lines-and-columns "^1.1.6"
+
 parse-json@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@@ -6961,6 +9584,13 @@ parse-passwd@^1.0.0:
   resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
   integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
 
+parse5@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+  integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==
+  dependencies:
+    "@types/node" "*"
+
 parsejson@0.0.3:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
@@ -6987,25 +9617,15 @@ parseurl@~1.3.0, parseurl@~1.3.3:
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
   integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
 
-pascal-case@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e"
-  integrity sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=
-  dependencies:
-    camel-case "^3.0.0"
-    upper-case-first "^1.1.0"
-
 pascalcase@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
   integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
 
-path-case@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5"
-  integrity sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=
-  dependencies:
-    no-case "^2.2.0"
+path-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+  integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
 
 path-dirname@^1.0.0:
   version "1.0.2"
@@ -7019,12 +9639,12 @@ path-exists@^2.0.0:
   dependencies:
     pinkie-promise "^2.0.0"
 
-path-exists@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
-  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+path-exists@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
 
-path-is-absolute@^1.0.0:
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
@@ -7039,7 +9659,7 @@ path-key@^2.0.0, path-key@^2.0.1:
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
   integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
 
-path-key@^3.1.0:
+path-key@^3.0.0, path-key@^3.1.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -7049,6 +9669,11 @@ path-parse@^1.0.6:
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
   integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
 
+path-platform@~0.11.15:
+  version "0.11.15"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+  integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=
+
 path-root-regex@^0.1.0:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
@@ -7075,12 +9700,10 @@ path-type@^1.0.0:
     pify "^2.0.0"
     pinkie-promise "^2.0.0"
 
-path-type@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
-  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
-  dependencies:
-    pify "^3.0.0"
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
 pause-stream@0.0.11, pause-stream@^0.0.11:
   version "0.0.11"
@@ -7089,6 +9712,22 @@ pause-stream@0.0.11, pause-stream@^0.0.11:
   dependencies:
     through "~2.3"
 
+pbkdf2@^3.0.3:
+  version "3.0.17"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
+  integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+  integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
+
 performance-now@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
@@ -7102,10 +9741,10 @@ phonegap-plugin-barcodescanner@^8.1.0:
     nopt "^4.0.1"
     shelljs "^0.8.3"
 
-picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5"
-  integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==
+picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+  integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
 
 pify@^2.0.0:
   version "2.3.0"
@@ -7117,11 +9756,6 @@ pify@^3.0.0:
   resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
   integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
 
-pify@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
-  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
-
 pinkie-promise@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
@@ -7134,12 +9768,22 @@ pinkie@^2.0.0:
   resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
   integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
 
-pkg-up@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
-  integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
+pino-std-serializers@^2.4.2:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz#cb5e3e58c358b26f88969d7e619ae54bdfcc1ae1"
+  integrity sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ==
+
+pino@6.0.0, pino@~6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/pino/-/pino-6.0.0.tgz#047746220dd20c2c44b7d54ae34656da51f36036"
+  integrity sha512-3RfX2L76o7v230FP1fZ3Fo/WX7Su+P1Ld+pvBm2j+MyUjtA/KqDYxMkzBqzcX3R00zbC7Gf/HqIzyuu3tgvi9Q==
   dependencies:
-    find-up "^2.1.0"
+    fast-redact "^2.0.0"
+    fast-safe-stringify "^2.0.7"
+    flatstr "^1.0.12"
+    pino-std-serializers "^2.4.2"
+    quick-format-unescaped "^4.0.1"
+    sonic-boom "^1.0.0"
 
 playup@^1.1.0:
   version "1.1.0"
@@ -7152,6 +9796,15 @@ playup@^1.1.0:
     nodeify "^1.0.0"
     yargs "^3.7.2"
 
+plist@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/plist/-/plist-2.0.1.tgz#0a32ca9481b1c364e92e18dc55c876de9d01da8b"
+  integrity sha1-CjLKlIGxw2TpLhjcVch23p0B2os=
+  dependencies:
+    base64-js "1.1.2"
+    xmlbuilder "8.2.2"
+    xmldom "0.1.x"
+
 plist@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025"
@@ -7170,7 +9823,7 @@ plist@^3.0.1:
     xmlbuilder "^9.0.7"
     xmldom "0.1.x"
 
-plugin-error@1.0.1, plugin-error@^1.0.1:
+plugin-error@1.0.1, plugin-error@^1.0.0, plugin-error@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
   integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
@@ -7199,11 +9852,25 @@ plugin-log@^0.1.0:
     chalk "^1.1.1"
     dateformat "^1.0.11"
 
+pluralize@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+  integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=
+
 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"
   integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
 
+postcss@7.0.27:
+  version "7.0.27"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9"
+  integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==
+  dependencies:
+    chalk "^2.4.2"
+    source-map "^0.6.1"
+    supports-color "^6.1.0"
+
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -7214,11 +9881,27 @@ prepend-http@^1.0.1:
   resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
   integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
 
+prepend-http@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+  integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
 pretty-hrtime@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1"
   integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
 
+probe-image-size@5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/probe-image-size/-/probe-image-size-5.0.0.tgz#1b87d20340ab8fcdb4324ec77fbc8a5f53419878"
+  integrity sha512-V6uBYw5eBc5UVIE7MUZD6Nxg0RYuGDWLDenEn0B1WC6PcTvn1xdQ6HLDDuznefsiExC6rNrCz7mFRBo0f3Xekg==
+  dependencies:
+    deepmerge "^4.0.0"
+    inherits "^2.0.3"
+    next-tick "^1.0.0"
+    request "^2.83.0"
+    stream-parser "~0.3.1"
+
 process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
@@ -7229,6 +9912,21 @@ process-nextick-args@~1.0.6:
   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
   integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=
 
+process@~0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
+progress@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+  integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=
+
+progress@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
 promise@~1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175"
@@ -7243,18 +9941,20 @@ promzard@^0.3.0:
   dependencies:
     read "1"
 
-properties-parser@^0.2.3:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/properties-parser/-/properties-parser-0.2.3.tgz#f7591255f707abbff227c7b56b637dbb0373a10f"
-  integrity sha1-91kSVfcHq7/yJ8e1a2N9uwNzoQ8=
+properties-parser@0.3.1, properties-parser@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/properties-parser/-/properties-parser-0.3.1.tgz#1316e9539ffbfd93845e369b211022abd478771a"
+  integrity sha1-ExbpU5/7/ZOEXjabIRAiq9R4dxo=
+  dependencies:
+    string.prototype.codepointat "^0.2.0"
 
 proxy-addr@~2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
-  integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
+  integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
   dependencies:
     forwarded "~0.1.2"
-    ipaddr.js "1.9.0"
+    ipaddr.js "1.9.1"
 
 proxy-agent@3:
   version "3.1.1"
@@ -7271,19 +9971,31 @@ proxy-agent@3:
     socks-proxy-agent "^4.0.1"
 
 proxy-from-env@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee"
-  integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
 
 pseudomap@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
   integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
 
-psl@^1.1.24, psl@^1.1.28:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110"
-  integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==
+psl@^1.1.24, psl@^1.1.28, psl@^1.1.33:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+  integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+public-encrypt@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+  integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+  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"
 
 pump@^2.0.0:
   version "2.0.1"
@@ -7310,7 +10022,12 @@ pumpify@^1.3.5:
     inherits "^2.0.3"
     pump "^2.0.0"
 
-punycode@^1.4.1:
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+  integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
+
+punycode@^1.3.2, punycode@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
   integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
@@ -7320,6 +10037,16 @@ punycode@^2.1.0, punycode@^2.1.1:
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
+q@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.0.1.tgz#11872aeedee89268110b10a718448ffb10112a14"
+  integrity sha1-EYcq7t7okmgRCxCnGESP+xARKhQ=
+
+q@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+  integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=
+
 q@^1.1.2, q@^1.4.1, q@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -7335,10 +10062,10 @@ qs@6.7.0:
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
   integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
 
-qs@^6.4.0, qs@^6.6.0:
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9"
-  integrity sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==
+qs@^6.4.0, qs@^6.9.1:
+  version "6.9.3"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e"
+  integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==
 
 qs@~0.6.0:
   version "0.6.6"
@@ -7365,6 +10092,36 @@ qs@~6.5.2:
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
   integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
 
+querystring-es3@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+  integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+  integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
+
+quick-format-unescaped@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz#437a5ea1a0b61deb7605f8ab6a8fd3858dbeb701"
+  integrity sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
 range-parser@~1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
@@ -7407,7 +10164,7 @@ raw-body@~2.1.5:
     iconv-lite "0.4.13"
     unpipe "1.0.0"
 
-rc@^1.0.1, rc@^1.1.6:
+rc@^1.0.1, rc@^1.1.6, rc@^1.2.8:
   version "1.2.8"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
   integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@@ -7434,13 +10191,20 @@ rcloader@^0.2.2:
     lodash.merge "^4.6.0"
     rcfinder "^0.1.6"
 
-read-chunk@^3.1.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz#2984afe78ca9bfbbdb74b19387bf9e86289c16ca"
-  integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==
+read-chunk@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-2.1.0.tgz#6a04c0928005ed9d42e1a6ac5600e19cbc7ff655"
+  integrity sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=
+  dependencies:
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+
+read-only-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+  integrity sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=
   dependencies:
-    pify "^4.0.1"
-    with-open-file "^0.1.6"
+    readable-stream "^2.0.2"
 
 "read-package-json@1 || 2":
   version "2.1.1"
@@ -7488,7 +10252,7 @@ readable-stream@1.1:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@1.1.x, readable-stream@^1.0.26-2, readable-stream@^1.0.33, readable-stream@~1.1.9:
+readable-stream@1.1.x, readable-stream@^1.0.26-2, readable-stream@~1.1.9:
   version "1.1.14"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
   integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
@@ -7498,10 +10262,10 @@ readable-stream@1.1.x, readable-stream@^1.0.26-2, readable-stream@^1.0.33, reada
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
-  version "2.3.6"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
-  integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
+readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
+  version "2.3.7"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
   dependencies:
     core-util-is "~1.0.0"
     inherits "~2.0.3"
@@ -7511,10 +10275,10 @@ readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stre
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.6:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc"
-  integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==
+"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
   dependencies:
     inherits "^2.0.3"
     string_decoder "^1.1.1"
@@ -7530,7 +10294,7 @@ readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stre
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@~2.0.5:
+readable-stream@~2.0.0, readable-stream@~2.0.5:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
   integrity sha1-j5A0HmilPMySh4jaz80Rs265t44=
@@ -7542,6 +10306,15 @@ readable-stream@~2.0.5:
     string_decoder "~0.10.x"
     util-deprecate "~1.0.1"
 
+readdirp@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+  integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+  dependencies:
+    graceful-fs "^4.1.11"
+    micromatch "^3.1.10"
+    readable-stream "^2.0.2"
+
 readdirp@~3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17"
@@ -7549,6 +10322,15 @@ readdirp@~3.3.0:
   dependencies:
     picomatch "^2.0.7"
 
+readline2@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+  integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    mute-stream "0.0.5"
+
 rechoir@^0.6.2:
   version "0.6.2"
   resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
@@ -7556,6 +10338,13 @@ rechoir@^0.6.2:
   dependencies:
     resolve "^1.1.6"
 
+recursive-readdir@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f"
+  integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==
+  dependencies:
+    minimatch "3.0.4"
+
 redent@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
@@ -7564,6 +10353,11 @@ redent@^1.0.0:
     indent-string "^2.1.0"
     strip-indent "^1.0.1"
 
+regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4:
+  version "0.13.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
+  integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
+
 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"
@@ -7580,6 +10374,11 @@ regexp.prototype.flags@^1.2.0:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
 
+regexpp@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+  integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+
 registry-auth-token@^3.0.1:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
@@ -7588,6 +10387,13 @@ registry-auth-token@^3.0.1:
     rc "^1.1.6"
     safe-buffer "^5.0.1"
 
+registry-auth-token@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479"
+  integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==
+  dependencies:
+    rc "^1.2.8"
+
 registry-url@^3.0.3:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
@@ -7595,11 +10401,26 @@ registry-url@^3.0.3:
   dependencies:
     rc "^1.0.1"
 
+registry-url@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
+  integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
+  dependencies:
+    rc "^1.2.8"
+
 relateurl@0.2.x:
   version "0.2.7"
   resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
   integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
 
+relaxed-json@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/relaxed-json/-/relaxed-json-1.0.3.tgz#eb2101ae0ee60e82267d95ed0ddf19a3604b8c1e"
+  integrity sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==
+  dependencies:
+    chalk "^2.4.2"
+    commander "^2.6.0"
+
 remove-bom-buffer@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
@@ -7617,7 +10438,7 @@ remove-bom-stream@^1.2.0:
     safe-buffer "^5.1.0"
     through2 "^2.0.3"
 
-remove-trailing-separator@^1.0.1:
+remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
   integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
@@ -7627,7 +10448,7 @@ repeat-element@^1.1.2:
   resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
   integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
 
-repeat-string@^1.5.2, repeat-string@^1.6.1:
+repeat-string@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
   integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
@@ -7656,6 +10477,15 @@ replace-ext@^1.0.0:
   resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
   integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
 
+replace-homedir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c"
+  integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=
+  dependencies:
+    homedir-polyfill "^1.0.1"
+    is-absolute "^1.0.0"
+    remove-trailing-separator "^1.1.0"
+
 replacestream@^4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36"
@@ -7665,7 +10495,7 @@ replacestream@^4.0.0:
     object-assign "^4.0.1"
     readable-stream "^2.0.2"
 
-request@2.88.0, request@^2.54.0, request@^2.67.0, request@^2.72.0, request@^2.87.0, request@^2.88.0:
+request@2.88.0:
   version "2.88.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
   integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
@@ -7691,6 +10521,32 @@ request@2.88.0, request@^2.54.0, request@^2.67.0, request@^2.72.0, request@^2.87
     tunnel-agent "^0.6.0"
     uuid "^3.3.2"
 
+request@^2.54.0, request@^2.67.0, request@^2.72.0, request@^2.74.0, request@^2.83.0, request@^2.87.0, request@^2.88.0, request@~2.88.0:
+  version "2.88.2"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+  integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.8.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.6"
+    extend "~3.0.2"
+    forever-agent "~0.6.1"
+    form-data "~2.3.2"
+    har-validator "~5.1.3"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.19"
+    oauth-sign "~0.9.0"
+    performance-now "^2.1.0"
+    qs "~6.5.2"
+    safe-buffer "^5.1.2"
+    tough-cookie "~2.5.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.3.2"
+
 request@~2.33.0:
   version "2.33.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.33.0.tgz#5167878131726070ec633752ea230a2379dc65ff"
@@ -7777,6 +10633,19 @@ require-main-filename@^1.0.1:
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
   integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
 
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+require-uncached@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
 requires-port@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@@ -7798,6 +10667,11 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1:
     expand-tilde "^2.0.0"
     global-modules "^1.0.0"
 
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+  integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
+
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -7815,13 +10689,40 @@ resolve-url@^0.2.1:
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
   integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
 
-resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@~1.14.1:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.1.tgz#9e018c540fcf0c427d678b9931cbf45e984bcaff"
-  integrity sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==
+resolve@1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+  integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
+
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0:
+  version "1.15.1"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
+  integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
+  dependencies:
+    path-parse "^1.0.6"
+
+resolve@^1.4.0:
+  version "1.17.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+  integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
   dependencies:
     path-parse "^1.0.6"
 
+responselike@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+  integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+  dependencies:
+    lowercase-keys "^1.0.0"
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
 restore-cursor@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@@ -7838,48 +10739,34 @@ restore-cursor@^3.1.0:
     onetime "^5.1.0"
     signal-exit "^3.0.2"
 
-resumer@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759"
-  integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=
-  dependencies:
-    through "~2.3.4"
-
 ret@~0.1.10:
   version "0.1.15"
   resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
   integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
 
-rev-hash@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/rev-hash/-/rev-hash-1.0.0.tgz#96993959ea9bfb1c59b13adf02ac2e34bb373603"
-  integrity sha1-lpk5Weqb+xxZsTrfAqwuNLs3NgM=
-
-rev-path@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/rev-path/-/rev-path-1.0.0.tgz#d4ccb436ac3370c4607175ce88eafc5c65c5d653"
-  integrity sha1-1My0NqwzcMRgcXXOiOr8XGXF1lM=
-  dependencies:
-    modify-filename "^1.0.0"
-
-right-align@^0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
-  integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8=
-  dependencies:
-    align-text "^0.1.1"
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2:
+rimraf@2, rimraf@^2.5.2, rimraf@^2.6.2, rimraf@^2.6.3:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
   integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
   dependencies:
     glob "^7.1.3"
 
-rimraf@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.0.tgz#614176d4b3010b75e5c390eb0ee96f6dc0cebb9b"
-  integrity sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==
+rimraf@2.6.3, rimraf@~2.6.2:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+  dependencies:
+    glob "^7.1.3"
+
+rimraf@^3.0.0, rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
   dependencies:
     glob "^7.1.3"
 
@@ -7890,29 +10777,52 @@ rimraf@~2.4.0:
   dependencies:
     glob "^6.0.1"
 
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
 rsvp@^3.0.21:
   version "3.6.2"
   resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a"
   integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==
 
+run-async@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+  integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=
+  dependencies:
+    once "^1.3.0"
+
 run-async@^2.2.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
-  integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+  integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+run-async@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8"
+  integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==
   dependencies:
     is-promise "^2.1.0"
 
-rxjs@^6.4.0:
-  version "6.5.3"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a"
-  integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==
-  dependencies:
-    tslib "^1.9.0"
+run-parallel@^1.1.9:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+  integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
+rx-lite@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+  integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=
 
-rxjs@^6.5.3:
-  version "6.5.4"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
-  integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
+rxjs@^6.4.0, rxjs@^6.5.3:
+  version "6.5.5"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
+  integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
   dependencies:
     tslib "^1.9.0"
 
@@ -7921,7 +10831,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
-safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
   integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
@@ -7931,6 +10841,11 @@ safe-json-parse@~1.0.1:
   resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57"
   integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=
 
+safe-json-stringify@~1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd"
+  integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==
+
 safe-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -7963,6 +10878,11 @@ sax@1.1.4:
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.4.tgz#74b6d33c9ae1e001510f179a91168588f1aedaa9"
   integrity sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=
 
+sax@>=0.6.0:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
 scss-tokenizer@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
@@ -7978,21 +10898,45 @@ semver-diff@^2.0.0:
   dependencies:
     semver "^5.0.3"
 
-"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
+semver-diff@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
+  integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
+  dependencies:
+    semver "^6.3.0"
+
+semver-greatest-satisfied-range@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b"
+  integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els=
+  dependencies:
+    sver-compat "^1.5.0"
+
+"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 
+semver@7.1.3:
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6"
+  integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==
+
 semver@^4.1.0:
   version "4.3.6"
   resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
   integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=
 
-semver@^6.0.0:
+semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
+semver@^7.1.1:
+  version "7.2.2"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.2.2.tgz#d01432d74ed3010a20ffaf909d63a691520521cd"
+  integrity sha512-Zo84u6o2PebMSK3zjJ6Zp5wi8VnQZnEaCP13Ul/lt1ANsLACxnJxq4EEm1PY94/por1Hm9+7xpIswdS5AkieMA==
+
 semver@~5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -8017,14 +10961,6 @@ send@0.17.1:
     range-parser "~1.2.1"
     statuses "~1.5.0"
 
-sentence-case@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4"
-  integrity sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=
-  dependencies:
-    no-case "^2.2.0"
-    upper-case-first "^1.1.2"
-
 sequencify@~0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c"
@@ -8067,6 +11003,29 @@ setprototypeof@1.1.1:
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
   integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
 
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+  version "2.4.11"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shasum-object@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e"
+  integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==
+  dependencies:
+    fast-safe-stringify "^2.0.7"
+
+shasum@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+  integrity sha1-5wEjENj0F/TetXEhUOVni4euVl8=
+  dependencies:
+    json-stable-stringify "~0.0.0"
+    sha.js "~2.4.4"
+
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -8091,11 +11050,35 @@ shebang-regex@^3.0.0:
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
   integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
 
-shelljs@0.3.x:
+shell-quote@1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+  integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shell-quote@^1.6.1:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
+  integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
+
+shelljs@0.3.0, shelljs@0.3.x:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
   integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=
 
+shelljs@0.7.7:
+  version "0.7.7"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1"
+  integrity sha1-svXHfvlxSPS09uImguELuoZnz/E=
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
 shelljs@^0.2.6:
   version "0.2.6"
   resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.2.6.tgz#90492d72ffcc8159976baba62fb0f6884f0c3378"
@@ -8106,7 +11089,7 @@ shelljs@^0.5.3:
   resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113"
   integrity sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=
 
-shelljs@^0.7.0:
+shelljs@^0.7.0, shelljs@^0.7.5:
   version "0.7.8"
   resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
   integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM=
@@ -8124,15 +11107,36 @@ shelljs@^0.8.3:
     interpret "^1.0.0"
     rechoir "^0.6.2"
 
+shellwords@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+  integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
+
 sigmund@~1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
   integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
 
+sign-addon@2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/sign-addon/-/sign-addon-2.0.5.tgz#bfb1033bd77436c2f7c49168c6ea794f65c01b44"
+  integrity sha512-dVjIWe1VJ2VQCdScREWXWECmJhgjpJMqwPKkW+L78PPx2Jyr/t+//kNHqG1hYrmIsvQN7vGjAjv9s7ix0vw0zA==
+  dependencies:
+    common-tags "1.8.0"
+    core-js "3.6.4"
+    deepcopy "2.0.0"
+    es6-error "4.1.1"
+    es6-promisify "6.0.2"
+    jsonwebtoken "8.5.1"
+    mz "2.7.0"
+    request "2.88.0"
+    source-map-support "0.5.16"
+    stream-to-promise "2.2.0"
+
 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"
-  integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+  integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
 
 simctl@^2:
   version "2.0.0"
@@ -8142,6 +11146,11 @@ simctl@^2:
     shelljs "^0.2.6"
     tail "^0.4.0"
 
+simple-concat@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
+  integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
+
 simple-fmt@~0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b"
@@ -8152,6 +11161,15 @@ simple-is@~0.2.0:
   resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0"
   integrity sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=
 
+simple-plist@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-0.2.1.tgz#71766db352326928cf3a807242ba762322636723"
+  integrity sha1-cXZts1IyaSjPOoByQrp2IyJjZyM=
+  dependencies:
+    bplist-creator "0.0.7"
+    bplist-parser "0.1.1"
+    plist "2.0.1"
+
 simple-plist@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.1.0.tgz#8354ab63eb3922a054c78ce96c209c532e907a23"
@@ -8161,32 +11179,44 @@ simple-plist@^1.0.0:
     bplist-parser "0.2.0"
     plist "^3.0.1"
 
-slash@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
-  integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
-
-slice-ansi@^3.0.0:
+slash@^3.0.0:
   version "3.0.0"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
-  integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+  resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+  integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=
+
+slice-ansi@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+  dependencies:
+    ansi-styles "^3.2.0"
+    astral-regex "^1.0.0"
+    is-fullwidth-code-point "^2.0.0"
+
+slice-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+  integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
   dependencies:
     ansi-styles "^4.0.0"
     astral-regex "^2.0.0"
     is-fullwidth-code-point "^3.0.0"
 
+slide@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+  integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=
+
 smart-buffer@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"
   integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==
 
-snake-case@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f"
-  integrity sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=
-  dependencies:
-    no-case "^2.2.0"
-
 snapdragon-node@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -8282,25 +11312,26 @@ socks@~2.3.2:
     ip "1.1.5"
     smart-buffer "^4.1.0"
 
-sort-keys@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
-  integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
+sonic-boom@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.0.1.tgz#a5fdfcab1ddea31732ce9c7c054f3a5751eee089"
+  integrity sha512-o9tx+bonVEXSaPtptyXQXpP8l6UV9Bi3im2geZskvWw2a/o/hrbWI7EBbbv+rOx6Hubnzun9GgH4WfbgEA3MFQ==
   dependencies:
-    is-plain-obj "^1.0.0"
+    atomic-sleep "^1.0.0"
+    flatstr "^1.0.12"
 
-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"
-  integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
+source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
+  version "0.5.3"
+  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
   dependencies:
-    atob "^2.1.1"
+    atob "^2.1.2"
     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.5.12:
+source-map-support@0.5.16, source-map-support@~0.5.12:
   version "0.5.16"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
   integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
@@ -8308,6 +11339,14 @@ source-map-support@~0.5.12:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
+source-map-support@~0.5.4:
+  version "0.5.19"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
 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"
@@ -8320,13 +11359,6 @@ source-map@0.1.34:
   dependencies:
     amdefine ">=0.0.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"
-  integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
-  dependencies:
-    amdefine ">=0.0.4"
-
 "source-map@>=0.1.43 <0.2", source-map@^0.1.39, source-map@~0.1.43:
   version "0.1.43"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
@@ -8334,7 +11366,14 @@ source-map@0.4.x, source-map@^0.4.2:
   dependencies:
     amdefine ">=0.0.4"
 
-source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
+source-map@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.3:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
@@ -8349,6 +11388,14 @@ sparkles@^1.0.0:
   resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c"
   integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==
 
+spawn-sync@1.0.15:
+  version "1.0.15"
+  resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476"
+  integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY=
+  dependencies:
+    concat-stream "^1.4.7"
+    os-shim "^0.1.2"
+
 spdx-correct@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
@@ -8396,7 +11443,7 @@ split@0.2:
   dependencies:
     through "2"
 
-split@0.3:
+split@0.3, split@~0.3.3:
   version "0.3.3"
   resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
   integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=
@@ -8440,6 +11487,11 @@ stable@~0.1.3, stable@~0.1.5:
   resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
   integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
 
+stack-trace@0.0.10:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+  integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
+
 static-extend@^0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -8460,6 +11512,14 @@ stdout-stream@^1.4.0:
   dependencies:
     readable-stream "^2.0.1"
 
+stream-browserify@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+  integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
 stream-buffers@~2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
@@ -8473,7 +11533,7 @@ stream-combiner2@^1.1.1:
     duplexer2 "~0.1.0"
     readable-stream "^2.0.2"
 
-stream-combiner@0.2.2, stream-combiner@^0.2.2:
+stream-combiner@*, stream-combiner@0.2.2, stream-combiner@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858"
   integrity sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=
@@ -8493,18 +11553,65 @@ stream-consume@~0.1.0:
   resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48"
   integrity sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==
 
+stream-exhaust@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d"
+  integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==
+
+stream-http@^2.0.0:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-parser@~0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773"
+  integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=
+  dependencies:
+    debug "2"
+
 stream-shift@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
   integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
 
-streamfilter@^1.0.5:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.7.tgz#ae3e64522aa5a35c061fd17f67620c7653c643c9"
-  integrity sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==
+stream-splicer@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd"
+  integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==
   dependencies:
+    inherits "^2.0.1"
     readable-stream "^2.0.2"
 
+stream-to-array@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353"
+  integrity sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=
+  dependencies:
+    any-promise "^1.1.0"
+
+stream-to-promise@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/stream-to-promise/-/stream-to-promise-2.2.0.tgz#b1edb2e1c8cb11289d1b503c08d3f2aef51e650f"
+  integrity sha1-se2y4cjLESidG1A8CNPyrvUeZQ8=
+  dependencies:
+    any-promise "~1.3.0"
+    end-of-stream "~1.1.0"
+    stream-to-array "~2.3.0"
+
+streamfilter@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-3.0.0.tgz#8c61b08179a6c336c6efccc5df30861b7a9675e7"
+  integrity sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==
+  dependencies:
+    readable-stream "^3.0.6"
+
 string-template@~0.2.0, string-template@~0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
@@ -8536,7 +11643,7 @@ string-width@^3.0.0:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^5.1.0"
 
-string-width@^4.1.0:
+string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
   integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
@@ -8545,30 +11652,44 @@ string-width@^4.1.0:
     is-fullwidth-code-point "^3.0.0"
     strip-ansi "^6.0.0"
 
-string.prototype.trim@~1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782"
-  integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==
+string.prototype.codepointat@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc"
+  integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==
+
+string.prototype.trimend@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
+  integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
   dependencies:
     define-properties "^1.1.3"
-    es-abstract "^1.17.0-next.1"
-    function-bind "^1.1.1"
+    es-abstract "^1.17.5"
 
 string.prototype.trimleft@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74"
-  integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
+  integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
   dependencies:
     define-properties "^1.1.3"
-    function-bind "^1.1.1"
+    es-abstract "^1.17.5"
+    string.prototype.trimstart "^1.0.0"
 
 string.prototype.trimright@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9"
-  integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
+  integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
   dependencies:
     define-properties "^1.1.3"
-    function-bind "^1.1.1"
+    es-abstract "^1.17.5"
+    string.prototype.trimend "^1.0.0"
+
+string.prototype.trimstart@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
+  integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
 
 string_decoder@0.10, string_decoder@~0.10.x:
   version "0.10.31"
@@ -8582,6 +11703,13 @@ string_decoder@^1.1.1:
   dependencies:
     safe-buffer "~5.2.0"
 
+string_decoder@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  integrity sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==
+  dependencies:
+    safe-buffer "~5.1.0"
+
 string_decoder@~1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@@ -8625,7 +11753,7 @@ strip-ansi@^4.0.0:
   dependencies:
     ansi-regex "^3.0.0"
 
-strip-ansi@^5.0.0, strip-ansi@^5.1.0:
+strip-ansi@^5.1.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
   integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
@@ -8639,13 +11767,30 @@ strip-ansi@^6.0.0:
   dependencies:
     ansi-regex "^5.0.0"
 
-strip-bom-stream@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
-  integrity sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=
+strip-bom-buf@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz#ff9c223937f8e7154b77e9de9bde094186885c15"
+  integrity sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==
   dependencies:
-    first-chunk-stream "^1.0.0"
-    strip-bom "^2.0.0"
+    is-utf8 "^0.2.1"
+
+strip-bom-stream@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-4.0.0.tgz#4d21a651e723ef743a0a8b0d4534471805330cbb"
+  integrity sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==
+  dependencies:
+    first-chunk-stream "^3.0.0"
+    strip-bom-buf "^2.0.0"
+
+strip-bom-string@1.X:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92"
+  integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=
+
+strip-bom@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+  integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
 
 strip-bom@^1.0.0:
   version "1.0.0"
@@ -8672,6 +11817,11 @@ strip-eof@^1.0.0:
   resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
   integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
 
+strip-final-newline@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
 strip-indent@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
@@ -8684,11 +11834,23 @@ strip-json-comments@1.0.x:
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91"
   integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=
 
-strip-json-comments@~2.0.1:
+strip-json-comments@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
+  integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==
+
+strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
   integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
 
+subarg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+  integrity sha1-9izxdYHplrSPyWVpn1TAauJouNI=
+  dependencies:
+    minimist "^1.1.0"
+
 superagent-proxy@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/superagent-proxy/-/superagent-proxy-2.0.0.tgz#9f57515cd660e2e9ce55c0e6bd70f92eb07c3ee0"
@@ -8697,20 +11859,22 @@ superagent-proxy@^2.0.0:
     debug "^3.1.0"
     proxy-agent "3"
 
-superagent@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/superagent/-/superagent-4.1.0.tgz#c465c2de41df2b8d05c165cbe403e280790cdfd5"
-  integrity sha512-FT3QLMasz0YyCd4uIi5HNe+3t/onxMyEho7C3PSqmti3Twgy2rXT4fmkTz6wRL6bTF4uzPcfkUCa8u4JWHw8Ag==
+superagent@^5.2.1:
+  version "5.2.2"
+  resolved "https://registry.yarnpkg.com/superagent/-/superagent-5.2.2.tgz#6ff726c5642795b2c27009e92687c8e69a6bb07d"
+  integrity sha512-pMWBUnIllK4ZTw7p/UaobiQPwAO5w/1NRRTDpV0FTVNmECztsxKspj3ZWEordVEaqpZtmOQJJna4yTLyC/q7PQ==
   dependencies:
-    component-emitter "^1.2.0"
+    component-emitter "^1.3.0"
     cookiejar "^2.1.2"
-    debug "^4.1.0"
-    form-data "^2.3.3"
-    formidable "^1.2.0"
-    methods "^1.1.1"
-    mime "^2.4.0"
-    qs "^6.6.0"
-    readable-stream "^3.0.6"
+    debug "^4.1.1"
+    fast-safe-stringify "^2.0.7"
+    form-data "^3.0.0"
+    formidable "^1.2.1"
+    methods "^1.1.2"
+    mime "^2.4.4"
+    qs "^6.9.1"
+    readable-stream "^3.4.0"
+    semver "^6.3.0"
 
 supports-color@^0.2.0:
   version "0.2.0"
@@ -8729,6 +11893,13 @@ supports-color@^5.3.0:
   dependencies:
     has-flag "^3.0.0"
 
+supports-color@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+  integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+  dependencies:
+    has-flag "^3.0.0"
+
 supports-color@^7.1.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
@@ -8736,40 +11907,62 @@ supports-color@^7.1.0:
   dependencies:
     has-flag "^4.0.0"
 
-swap-case@^1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3"
-  integrity sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=
+sver-compat@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8"
+  integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=
   dependencies:
-    lower-case "^1.1.1"
-    upper-case "^1.1.1"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+syntax-error@^1.1.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c"
+  integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==
+  dependencies:
+    acorn-node "^1.2.0"
+
+table@^3.7.8:
+  version "3.8.3"
+  resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
+  integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=
+  dependencies:
+    ajv "^4.7.0"
+    ajv-keywords "^1.0.0"
+    chalk "^1.1.1"
+    lodash "^4.0.0"
+    slice-ansi "0.0.4"
+    string-width "^2.0.0"
+
+table@^5.2.3:
+  version "5.4.6"
+  resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+  integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+  dependencies:
+    ajv "^6.10.2"
+    lodash "^4.17.14"
+    slice-ansi "^2.1.0"
+    string-width "^3.0.0"
 
 tail@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/tail/-/tail-0.4.0.tgz#d29de72750cc99db1e053aff13c359ecfb713002"
   integrity sha1-0p3nJ1DMmdseBTr/E8NZ7PtxMAI=
 
-tape@^4.8.0:
-  version "4.12.1"
-  resolved "https://registry.yarnpkg.com/tape/-/tape-4.12.1.tgz#5fe2f0e2ef09ff0ec6f6d37f38300a6016082d91"
-  integrity sha512-xoK2ariLmdGxqyXhhxfIZlr0czNB8hNJeVQmHN4D7ZyBn30GUoa4q2oM4cX8jNhnj1mtILXn1ugbfxc0tTDKtA==
-  dependencies:
-    deep-equal "~1.1.1"
-    defined "~1.0.0"
-    for-each "~0.3.3"
-    function-bind "~1.1.1"
-    glob "~7.1.6"
-    has "~1.0.3"
-    inherits "~2.0.4"
-    is-regex "~1.0.5"
-    minimist "~1.2.0"
-    object-inspect "~1.7.0"
-    resolve "~1.14.1"
-    resumer "~0.0.0"
-    string.prototype.trim "~1.2.1"
-    through "~2.3.8"
-
-tar@^2.0.0:
+tar-stream@^1.5.0:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+  integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+  dependencies:
+    bl "^1.0.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.1"
+    xtend "^4.0.0"
+
+tar@^2.0.0, tar@^2.2.1:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
   integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
@@ -8778,18 +11971,17 @@ tar@^2.0.0:
     fstream "^1.0.12"
     inherits "2"
 
-tar@^4.3.0:
-  version "4.4.13"
-  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
-  integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
+tar@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.1.tgz#7b3bd6c313cb6e0153770108f8d70ac298607efa"
+  integrity sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==
   dependencies:
-    chownr "^1.1.1"
-    fs-minipass "^1.2.5"
-    minipass "^2.8.6"
-    minizlib "^1.2.1"
-    mkdirp "^0.5.0"
-    safe-buffer "^5.1.2"
-    yallist "^3.0.3"
+    chownr "^1.1.3"
+    fs-minipass "^2.0.0"
+    minipass "^3.0.0"
+    minizlib "^2.1.0"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
 
 term-size@^1.2.0:
   version "1.2.0"
@@ -8798,29 +11990,53 @@ term-size@^1.2.0:
   dependencies:
     execa "^0.7.0"
 
-ternary-stream@^2.0.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-2.1.1.tgz#4ad64b98668d796a085af2c493885a435a8a8bfc"
-  integrity sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw==
+term-size@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
+  integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==
+
+ternary-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-3.0.0.tgz#7951930ea9e823924d956f03d516151a2d516253"
+  integrity sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==
   dependencies:
-    duplexify "^3.5.0"
+    duplexify "^4.1.1"
     fork-stream "^0.0.4"
-    merge-stream "^1.0.0"
-    through2 "^2.0.1"
+    merge-stream "^2.0.0"
+    through2 "^3.0.1"
 
 terser@^4.3.9:
-  version "4.4.3"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.3.tgz#401abc52b88869cf904412503b1eb7da093ae2f0"
-  integrity sha512-0ikKraVtRDKGzHrzkCv5rUNDzqlhmhowOBqC0XqUHFpW+vJ45+20/IFBcebwKfiS2Z9fJin6Eo+F1zLZsxi8RA==
+  version "4.6.11"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.11.tgz#12ff99fdd62a26de2a82f508515407eb6ccd8a9f"
+  integrity sha512-76Ynm7OXUG5xhOpblhytE7X58oeNSmC8xnNhjWVo8CksHit0U0kO4hfNbPrrYwowLWFgM2n9L176VNx2QaHmtA==
   dependencies:
     commander "^2.20.0"
     source-map "~0.6.1"
     source-map-support "~0.5.12"
 
-textextensions@~1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-1.0.2.tgz#65486393ee1f2bb039a60cbba05b0b68bd9501d2"
-  integrity sha1-ZUhjk+4fK7A5pgy7oFsLaL2VAdI=
+text-table@^0.2.0, text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+  integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+
+textextensions@2:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.6.0.tgz#d7e4ab13fe54e32e08873be40d51b74229b00fc4"
+  integrity sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==
+
+thenify-all@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+  integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
+  dependencies:
+    thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
+  integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=
+  dependencies:
+    any-promise "^1.0.0"
 
 through2-filter@^3.0.0:
   version "3.0.0"
@@ -8838,29 +12054,21 @@ through2@0.6.1:
     readable-stream ">=1.0.27-1 <1.1.0-0"
     xtend ">=4.0.0 <4.1.0-0"
 
-through2@2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
-  integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=
+through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
   dependencies:
-    readable-stream "^2.1.5"
+    readable-stream "~2.3.6"
     xtend "~4.0.1"
 
-through2@3.0.1, through2@^3.0.0:
+through2@3.0.1, through2@^3.0.0, through2@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a"
   integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==
   dependencies:
     readable-stream "2 || 3"
 
-through2@^0.4.2, through2@~0.4.0, through2@~0.4.1:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
-  integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=
-  dependencies:
-    readable-stream "~1.0.17"
-    xtend "~2.1.1"
-
 through2@^0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7"
@@ -8877,15 +12085,15 @@ through2@^0.6.1, through2@^0.6.3, through2@^0.6.5:
     readable-stream ">=1.0.33-1 <1.1.0-0"
     xtend ">=4.0.0 <4.1.0-0"
 
-through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
-  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+through2@~0.4.0, through2@~0.4.1:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
+  integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=
   dependencies:
-    readable-stream "~2.3.6"
-    xtend "~4.0.1"
+    readable-stream "~1.0.17"
+    xtend "~2.1.1"
 
-through@2, through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8:
+through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.7, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4:
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@@ -8912,6 +12120,21 @@ timed-out@^4.0.0:
   resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
   integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
 
+timers-browserify@^1.0.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+  integrity sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=
+  dependencies:
+    process "~0.11.0"
+
+timers-ext@^0.1.5:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6"
+  integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
+  dependencies:
+    es5-ext "~0.10.46"
+    next-tick "1"
+
 tiny-lr@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab"
@@ -8924,15 +12147,14 @@ tiny-lr@^1.1.0:
     object-assign "^4.1.0"
     qs "^6.4.0"
 
-title-case@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa"
-  integrity sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=
+tmp@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877"
+  integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==
   dependencies:
-    no-case "^2.2.0"
-    upper-case "^1.0.3"
+    rimraf "^2.6.3"
 
-tmp@0.0.33, tmp@^0.0.33:
+tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
   integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
@@ -8952,6 +12174,16 @@ to-array@0.1.4:
   resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
   integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA=
 
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+  integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
+
+to-buffer@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+  integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
 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"
@@ -8959,6 +12191,11 @@ to-object-path@^0.3.0:
   dependencies:
     kind-of "^3.0.2"
 
+to-readable-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+  integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
 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"
@@ -8996,12 +12233,25 @@ toidentifier@1.0.0:
   resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
   integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
 
-tough-cookie@>=0.12.0, tough-cookie@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2"
-  integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==
+tosource@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/tosource/-/tosource-1.0.0.tgz#42d88dd116618bcf00d6106dd5446f3427902ff1"
+  integrity sha1-QtiN0RZhi88A1hBt1URvNCeQL/E=
+
+tough-cookie@>=0.12.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+  integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+  dependencies:
+    psl "^1.1.33"
+    punycode "^2.1.1"
+    universalify "^0.1.2"
+
+tough-cookie@^2.0.0, tough-cookie@~2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+  integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
   dependencies:
-    ip-regex "^2.1.0"
     psl "^1.1.28"
     punycode "^2.1.1"
 
@@ -9025,10 +12275,22 @@ tough-cookie@~2.4.3:
     psl "^1.1.24"
     punycode "^1.4.1"
 
-tree-kill@1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a"
-  integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==
+tr46@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479"
+  integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==
+  dependencies:
+    punycode "^2.1.1"
+
+traverse@0.4.x:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.4.6.tgz#d04b2280e4c792a5815429ef7b8b60c64c9ccc34"
+  integrity sha1-0EsigOTHkqWBVCnve4tgxkyczDQ=
+
+tree-kill@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+  integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
 
 trim-newlines@^1.0.0:
   version "1.0.0"
@@ -9042,20 +12304,20 @@ trim-newlines@^1.0.0:
   dependencies:
     glob "^7.1.2"
 
-tryit@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
-  integrity sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=
-
 tryor@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b"
   integrity sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=
 
 tslib@^1.9.0:
-  version "1.10.0"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
-  integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35"
+  integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
+
+tty-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
+  integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==
 
 tunnel-agent@^0.6.0:
   version "0.6.0"
@@ -9086,6 +12348,16 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
+type-detect@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+  integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+  integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
 type-fest@^0.8.1:
   version "0.8.1"
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
@@ -9099,6 +12371,16 @@ type-is@~1.6.10, type-is@~1.6.17, type-is@~1.6.18:
     media-typer "0.3.0"
     mime-types "~2.1.24"
 
+type@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3"
+  integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==
+
 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"
@@ -9111,16 +12393,6 @@ typedarray@^0.0.6, typedarray@~0.0.5:
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
 
-uglify-js@2.6.x:
-  version "2.6.4"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.6.4.tgz#65ea2fb3059c9394692f15fed87c2b36c16b9adf"
-  integrity sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=
-  dependencies:
-    async "~0.2.6"
-    source-map "~0.5.1"
-    uglify-to-browserify "~1.0.0"
-    yargs "~3.10.0"
-
 uglify-js@3.3.16:
   version "3.3.16"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.16.tgz#23ba13efa27aa00885be7417819e8a9787f94028"
@@ -9129,6 +12401,14 @@ uglify-js@3.3.16:
     commander "~2.15.0"
     source-map "~0.6.1"
 
+uglify-js@3.4.x:
+  version "3.4.10"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
+  integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==
+  dependencies:
+    commander "~2.19.0"
+    source-map "~0.6.1"
+
 uglify-js@~2.4.6:
   version "2.4.24"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.24.tgz#fad5755c1e1577658bb06ff9ab6e548c95bebd6e"
@@ -9149,20 +12429,56 @@ ultron@1.0.x:
   resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
   integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=
 
+umd@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf"
+  integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==
+
 unc-path-regex@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
   integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
 
+undeclared-identifiers@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f"
+  integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==
+  dependencies:
+    acorn-node "^1.3.0"
+    dash-ast "^1.0.0"
+    get-assigned-identifiers "^1.2.0"
+    simple-concat "^1.0.0"
+    xtend "^4.0.1"
+
 underscore@1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.2.1.tgz#fc5c6b0765673d92a2d4ac8b4dc0aa88702e2bd4"
   integrity sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q=
 
-underscore@^1.8.3, underscore@^1.9.1:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
-  integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+underscore@^1.8.3, underscore@^1.9.0, underscore@^1.9.1:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf"
+  integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==
+
+undertaker-registry@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50"
+  integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=
+
+undertaker@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.1.tgz#701662ff8ce358715324dfd492a4f036055dfe4b"
+  integrity sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==
+  dependencies:
+    arr-flatten "^1.0.1"
+    arr-map "^2.0.0"
+    bach "^1.0.0"
+    collection-map "^1.0.0"
+    es6-weak-map "^2.0.1"
+    last-run "^1.1.0"
+    object.defaults "^1.0.0"
+    object.reduce "^1.0.0"
+    undertaker-registry "^1.0.0"
 
 union-value@^1.0.0:
   version "1.0.1"
@@ -9194,7 +12510,14 @@ unique-string@^1.0.0:
   dependencies:
     crypto-random-string "^1.0.0"
 
-universalify@^0.1.0:
+unique-string@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
+  integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
+  dependencies:
+    crypto-random-string "^2.0.0"
+
+universalify@^0.1.0, universalify@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
   integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
@@ -9227,6 +12550,29 @@ unzip-response@^2.0.1:
   resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
   integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
 
+upath@1.2.0, upath@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+  integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+update-notifier@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.0.0.tgz#f344a6f8b03e00e31b323d632a0e632e9f0e0654"
+  integrity sha512-p9zf71hWt5GVXM4iEBujpUgx8mK9AWiCCapEJm/O1z5ntCim83Z1ATqzZFBHFYqx03laMqv8LiDgs/7ikXjf/g==
+  dependencies:
+    boxen "^4.2.0"
+    chalk "^3.0.0"
+    configstore "^5.0.0"
+    has-yarn "^2.1.0"
+    import-lazy "^2.1.0"
+    is-ci "^2.0.0"
+    is-installed-globally "^0.3.1"
+    is-npm "^4.0.0"
+    is-yarn-global "^0.3.0"
+    latest-version "^5.0.0"
+    semver-diff "^3.1.1"
+    xdg-basedir "^4.0.0"
+
 update-notifier@^2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
@@ -9243,14 +12589,7 @@ update-notifier@^2.5.0:
     semver-diff "^2.0.0"
     xdg-basedir "^3.0.0"
 
-upper-case-first@^1.1.0, upper-case-first@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115"
-  integrity sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=
-  dependencies:
-    upper-case "^1.1.1"
-
-upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3:
+upper-case@^1.1.1:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
   integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
@@ -9274,6 +12613,21 @@ url-parse-lax@^1.0.0:
   dependencies:
     prepend-http "^1.0.1"
 
+url-parse-lax@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+  integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+  dependencies:
+    prepend-http "^2.0.0"
+
+url@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
+  dependencies:
+    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"
@@ -9284,25 +12638,61 @@ user-home@^1.1.1:
   resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
   integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA=
 
-useref@^1.4.1:
-  version "1.4.2"
-  resolved "https://registry.yarnpkg.com/useref/-/useref-1.4.2.tgz#542396fe7fa11a1b9fe982feb7ae3428f0e535b4"
-  integrity sha512-RpyHxbZANGkh/y+E8sLR/2SmXLI11a71GLhtMa4pU7Y8cX10wCBKfu5AYxerRf0fJ8TTNpOAJfE7QIsQJNlEmQ==
+user-home@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
+  integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8=
+  dependencies:
+    os-homedir "^1.0.0"
+
+useref@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/useref/-/useref-1.4.3.tgz#0859f9d55b205b7d5639810c34d1cdd37d254e88"
+  integrity sha512-hX0qTEaDdzO3WfFl2KHQnSdaPSk8KqRaQ/nXXjBPrXzanew+12U/gm/Jt7zR978wtKMryOMXGoF0+qhYL2oseQ==
 
 util-deprecate@^1.0.1, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
 
+util@0.10.3:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
+  dependencies:
+    inherits "2.0.1"
+
+util@~0.10.1:
+  version "0.10.4"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+  integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
+  dependencies:
+    inherits "2.0.3"
+
 utils-merge@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
   integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
 
-uuid@^3.2.1, uuid@^3.3.2:
-  version "3.3.3"
-  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866"
-  integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==
+uuid@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+  integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
+
+uuid@^2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+  integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=
+
+uuid@^3.0.0, uuid@^3.3.2:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^7.0.1:
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
+  integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
 
 v8flags@^2.0.2:
   version "2.1.1"
@@ -9311,10 +12701,17 @@ v8flags@^2.0.2:
   dependencies:
     user-home "^1.1.1"
 
-valid-identifier@0.0.2:
-  version "0.0.2"
-  resolved "https://registry.yarnpkg.com/valid-identifier/-/valid-identifier-0.0.2.tgz#4814dff0c1b7d5ef3d7f4b678aeb26841b5b0e69"
-  integrity sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g==
+v8flags@^3.0.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.3.tgz#fc9dc23521ca20c5433f81cc4eb9b3033bb105d8"
+  integrity sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==
+  dependencies:
+    homedir-polyfill "^1.0.1"
+
+valid-identifier@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/valid-identifier/-/valid-identifier-0.0.1.tgz#ef1d7093a9d3287e3fce92df916f8616b23f90b4"
+  integrity sha1-7x1wk6nTKH4/zpLfkW+GFrI/kLQ=
 
 validate-npm-package-license@^3.0.1:
   version "3.0.4"
@@ -9350,16 +12747,6 @@ verror@1.10.0:
     core-util-is "1.0.2"
     extsprintf "^1.2.0"
 
-vinyl-file@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-1.3.0.tgz#aa05634d3a867ba91447bedbb34afcb26f44f6e7"
-  integrity sha1-qgVjTTqGe6kUR77bs0r8sm9E9uc=
-  dependencies:
-    graceful-fs "^4.1.2"
-    strip-bom "^2.0.0"
-    strip-bom-stream "^1.0.0"
-    vinyl "^1.1.0"
-
 vinyl-fs@^0.3.0:
   version "0.3.14"
   resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6"
@@ -9374,7 +12761,7 @@ vinyl-fs@^0.3.0:
     through2 "^0.6.1"
     vinyl "^0.4.0"
 
-vinyl-fs@^3.0.3:
+vinyl-fs@^3.0.0, vinyl-fs@^3.0.3:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
   integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==
@@ -9448,15 +12835,6 @@ vinyl@^0.5.0:
     clone-stats "^0.0.1"
     replace-ext "0.0.1"
 
-vinyl@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
-  integrity sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=
-  dependencies:
-    clone "^1.0.0"
-    clone-stats "^0.0.1"
-    replace-ext "0.0.1"
-
 vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86"
@@ -9469,6 +12847,74 @@ vinyl@^2.0.0, vinyl@^2.1.0, vinyl@^2.2.0:
     remove-trailing-separator "^1.0.1"
     replace-ext "^1.0.0"
 
+vm-browserify@~0.0.1:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=
+  dependencies:
+    indexof "0.0.1"
+
+watchpack@1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2"
+  integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==
+  dependencies:
+    chokidar "^2.1.8"
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+
+wcwidth@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+  integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+  dependencies:
+    defaults "^1.0.3"
+
+web-ext@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/web-ext/-/web-ext-4.2.0.tgz#04a1d2a6dec1a621b9feca48e8fd75bb1ffe14e9"
+  integrity sha512-WM03BEeC7CVw4PV8lwXKO6ag00MYdwMMe1SAJJfxz0uNMbTu7cYoH6Ia+e2DnAzpeOJLKCeL1IXvgxZSwVp4/Q==
+  dependencies:
+    "@babel/polyfill" "7.7.0"
+    "@babel/runtime" "7.7.7"
+    "@cliqz-oss/firefox-client" "0.3.1"
+    "@cliqz-oss/node-firefox-connect" "1.2.1"
+    adbkit "2.11.1"
+    addons-linter "1.23.0"
+    bunyan "1.8.12"
+    camelcase "5.3.1"
+    chrome-launcher "0.13.1"
+    debounce "1.2.0"
+    decamelize "3.2.0"
+    es6-error "4.1.1"
+    event-to-promise "0.8.0"
+    firefox-profile "1.3.1"
+    fx-runner "1.0.11"
+    git-rev-sync "2.0.0"
+    import-fresh "3.2.1"
+    mkdirp "1.0.3"
+    multimatch "4.0.0"
+    mz "2.7.0"
+    node-notifier "6.0.0"
+    open "7.0.0"
+    parse-json "5.0.0"
+    sign-addon "2.0.5"
+    source-map-support "0.5.16"
+    stream-to-promise "2.2.0"
+    strip-bom "4.0.0"
+    strip-json-comments "3.0.1"
+    tmp "0.1.0"
+    update-notifier "4.0.0"
+    watchpack "1.6.1"
+    ws "7.2.3"
+    yargs "15.1.0"
+    zip-dir "1.0.2"
+
+webidl-conversions@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+  integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
 websocket-driver@>=0.3.6, websocket-driver@>=0.5.1:
   version "0.7.3"
   resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9"
@@ -9483,11 +12929,30 @@ websocket-extensions@>=0.1.1:
   resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
   integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
 
+whatwg-url@8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871"
+  integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^2.0.0"
+    webidl-conversions "^5.0.0"
+
+when@3.7.7:
+  version "3.7.7"
+  resolved "https://registry.yarnpkg.com/when/-/when-3.7.7.tgz#aba03fc3bb736d6c88b091d013d8a8e590d84718"
+  integrity sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=
+
 which-module@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
   integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
 
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+  integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
 which@1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
@@ -9495,6 +12960,14 @@ which@1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1:
   dependencies:
     isexe "^2.0.0"
 
+which@1.2.4:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.2.4.tgz#1557f96080604e5b11b3599eb9f45b50a9efd722"
+  integrity sha1-FVf5YIBgTlsRs1meufRbUKnv1yI=
+  dependencies:
+    is-absolute "^0.1.7"
+    isexe "^1.1.1"
+
 which@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
@@ -9516,6 +12989,20 @@ widest-line@^2.0.0:
   dependencies:
     string-width "^2.1.1"
 
+widest-line@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
+  integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
+  dependencies:
+    string-width "^4.0.0"
+
+win-release@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/win-release/-/win-release-1.1.1.tgz#5fa55e02be7ca934edfc12665632e849b72e5209"
+  integrity sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=
+  dependencies:
+    semver "^5.0.1"
+
 window-size@0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
@@ -9532,20 +13019,16 @@ window-size@^0.2.0:
   integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=
 
 windows-release@^3.1.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f"
-  integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0"
+  integrity sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==
   dependencies:
     execa "^1.0.0"
 
-with-open-file@^0.1.6:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.7.tgz#e2de8d974e8a8ae6e58886be4fe8e7465b58a729"
-  integrity sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==
-  dependencies:
-    p-finally "^1.0.0"
-    p-try "^2.1.0"
-    pify "^4.0.1"
+winreg@0.0.12:
+  version "0.0.12"
+  resolved "https://registry.yarnpkg.com/winreg/-/winreg-0.0.12.tgz#07105554ba1a9d08979251d129475bffae3006b7"
+  integrity sha1-BxBVVLoanQiXklHRKUdb/64wBrc=
 
 word-wrap@~1.2.3:
   version "1.2.3"
@@ -9570,16 +13053,7 @@ wrap-ansi@^2.0.0:
     string-width "^1.0.1"
     strip-ansi "^3.0.1"
 
-wrap-ansi@^5.0.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
-  integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
-  dependencies:
-    ansi-styles "^3.2.0"
-    string-width "^3.0.0"
-    strip-ansi "^5.0.0"
-
-wrap-ansi@^6.0.0:
+wrap-ansi@^6.2.0:
   version "6.2.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
   integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
@@ -9588,12 +13062,30 @@ wrap-ansi@^6.0.0:
     string-width "^4.1.0"
     strip-ansi "^6.0.0"
 
+wrap-ansi@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
+write-file-atomic@^1.1.2:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
+  integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    slide "^1.1.5"
+
+write-file-atomic@^2.0.0:
   version "2.4.3"
   resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
   integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
@@ -9603,19 +13095,33 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
     signal-exit "^3.0.2"
 
 write-file-atomic@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.1.tgz#558328352e673b5bb192cf86500d60b230667d4b"
-  integrity sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+  integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
   dependencies:
     imurmurhash "^0.1.4"
     is-typedarray "^1.0.0"
     signal-exit "^3.0.2"
     typedarray-to-buffer "^3.1.5"
 
-ws@^7.0.0:
-  version "7.2.1"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.1.tgz#03ed52423cd744084b2cf42ed197c8b65a936b8e"
-  integrity sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==
+write@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+  dependencies:
+    mkdirp "^0.5.1"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
+  dependencies:
+    mkdirp "^0.5.1"
+
+ws@7.2.3, ws@^7.0.0:
+  version "7.2.3"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46"
+  integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==
 
 ws@~1.1.5:
   version "1.1.5"
@@ -9630,6 +13136,14 @@ wtf-8@1.0.0:
   resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
   integrity sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=
 
+xcode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/xcode/-/xcode-1.1.0.tgz#9fcb63f417a9af377bfb743a5c22afce4e1da964"
+  integrity sha512-hllHFtfsNu5WbVzj8KbGNdI3NgOYmTLZqyF4a9c9J1aGMhAdxmLLsXlpG0Bz8fEtKh6I3pyargRXN0ZlLpcF5w==
+  dependencies:
+    simple-plist "^0.2.1"
+    uuid "^3.3.2"
+
 xcode@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.1.0.tgz#bab64a7e954bb50ca8d19da7e09531c65a43ecfe"
@@ -9638,21 +13152,36 @@ xcode@^2.0.0:
     simple-plist "^1.0.0"
     uuid "^3.3.2"
 
+xdg-basedir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2"
+  integrity sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=
+  dependencies:
+    os-homedir "^1.0.0"
+
 xdg-basedir@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
   integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
 
-xml-char-classes@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d"
-  integrity sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=
+xdg-basedir@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
+  integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
 
 xml-escape@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/xml-escape/-/xml-escape-1.1.0.tgz#3904c143fa8eb3a0030ec646d2902a2f1b706c44"
   integrity sha1-OQTBQ/qOs6ADDsZG0pAqLxtwbEQ=
 
+xml2js@~0.4.4:
+  version "0.4.23"
+  resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
+  integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
+  dependencies:
+    sax ">=0.6.0"
+    xmlbuilder "~11.0.0"
+
 xmlbuilder@8.2.2:
   version "8.2.2"
   resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
@@ -9663,6 +13192,11 @@ xmlbuilder@^9.0.7:
   resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
   integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
 
+xmlbuilder@~11.0.0:
+  version "11.0.1"
+  resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+  integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
 xmldom@0.1.x:
   version "0.1.31"
   resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff"
@@ -9678,7 +13212,14 @@ xregexp@2.0.0:
   resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
   integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
 
-"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
+xregexp@^4.2.4:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"
+  integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
+  dependencies:
+    "@babel/runtime-corejs3" "^7.8.3"
+
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
   integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -9700,16 +13241,42 @@ y18n@^3.2.0, y18n@^3.2.1:
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
   integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
 
+y18n@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+  integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
+
 yallist@^2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
   integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
 
-yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
+yallist@^3.0.2:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
 
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^16.1.0:
+  version "16.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1"
+  integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
+yargs-parser@^18.1.1:
+  version "18.1.3"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+  integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f"
@@ -9725,6 +13292,40 @@ yargs-parser@^5.0.0:
   dependencies:
     camelcase "^3.0.0"
 
+yargs@15.1.0:
+  version "15.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219"
+  integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==
+  dependencies:
+    cliui "^6.0.0"
+    decamelize "^1.2.0"
+    find-up "^4.1.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^4.2.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^16.1.0"
+
+yargs@15.3.1, yargs@~15.3.0:
+  version "15.3.1"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b"
+  integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==
+  dependencies:
+    cliui "^6.0.0"
+    decamelize "^1.2.0"
+    find-up "^4.1.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^4.2.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^18.1.1"
+
 yargs@^3.7.2:
   version "3.32.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
@@ -9758,7 +13359,7 @@ yargs@^5.0.0:
     y18n "^3.2.1"
     yargs-parser "^3.2.0"
 
-yargs@^7.0.0:
+yargs@^7.0.0, yargs@^7.1.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
   integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
@@ -9777,16 +13378,6 @@ yargs@^7.0.0:
     y18n "^3.2.1"
     yargs-parser "^5.0.0"
 
-yargs@~3.10.0:
-  version "3.10.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
-  integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=
-  dependencies:
-    camelcase "^1.0.2"
-    cliui "^2.1.0"
-    decamelize "^1.0.0"
-    window-size "0.1.0"
-
 yargs@~3.5.4:
   version "3.5.4"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.5.4.tgz#d8aff8f665e94c34bd259bdebd1bfaf0ddd35361"
@@ -9797,7 +13388,15 @@ yargs@~3.5.4:
     window-size "0.1.0"
     wordwrap "0.0.2"
 
-yazl@^2.1.0:
+yauzl@2.10.0:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+  integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
+  dependencies:
+    buffer-crc32 "~0.2.3"
+    fd-slicer "~1.1.0"
+
+yazl@^2.5.1:
   version "2.5.1"
   resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
   integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
@@ -9808,3 +13407,21 @@ yeast@0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
   integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk=
+
+zip-dir@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/zip-dir/-/zip-dir-1.0.2.tgz#253f907aead62a21acd8721d8b88032b2411c051"
+  integrity sha1-JT+QeurWKiGs2HIdi4gDKyQRwFE=
+  dependencies:
+    async "^1.5.2"
+    jszip "^2.4.0"
+
+zip-stream@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"
+  integrity sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=
+  dependencies:
+    archiver-utils "^1.3.0"
+    compress-commons "^1.2.0"
+    lodash "^4.8.0"
+    readable-stream "^2.0.0"