diff --git a/README.md b/README.md
index b2537cfd8face0b7ba6bb84f90fa93a218dcb4d5..626235967a262a4f68e2109baecbb7a11311f2b4 100644
--- a/README.md
+++ b/README.md
@@ -274,6 +274,8 @@ Custom Material SVG Icons will only show up when the application is deployed on
 
 5. **Si une nouvelle classe a été créée à l'étape 2**, dans la méthode _FormulaireService.newFormulaire()_, compléter le _switch_ pour fournir la classe à instancier.
 
+6. Dans `config.json`, ajouter si nécessaire le numéro de CalculatorType à un ou plusieurs thèmes afin de classer le module sur la page de liste; dans le cas contraire le nouveau module apparaîtra dans une section "Autres"
+
  # Create PDF from documentation
 
  ```sh
diff --git a/e2e/calculate-all-params.e2e-spec.ts b/e2e/calculate-all-params.e2e-spec.ts
index f83a8212adc414e65740da05d655303cfaa3fbff..043642aa6906cdae31bd04d425fde6a6fdd25c1e 100644
--- a/e2e/calculate-all-params.e2e-spec.ts
+++ b/e2e/calculate-all-params.e2e-spec.ts
@@ -1,12 +1,13 @@
 import { ListPage } from "./list.po";
 import { CalculatorPage } from "./calculator.po";
 import { Navbar } from "./navbar.po";
+import { browser } from "protractor";
 
 /**
  * For all calculators, try to calculate every parameter: check that only one parameter
  * is set to CAL mode, trigger the calculation, check that result is not empty
  */
-describe("ngHyd − calculate all parameters of all calculators", () => {
+fdescribe("ngHyd − calculate all parameters of all calculators", () => {
   let listPage: ListPage;
   let calcPage: CalculatorPage;
   let navBar: Navbar;
@@ -18,7 +19,7 @@ describe("ngHyd − calculate all parameters of all calculators", () => {
   });
 
   // get calculators list (IDs) @TODO read it from config !
-  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15 ];
+  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17 ];
 
   // for each calculator
   for (const ct of calcTypes) {
@@ -58,6 +59,17 @@ describe("ngHyd − calculate all parameters of all calculators", () => {
             const hasResults = await calcPage.hasResults();
             expect(hasResults).toBe(true);
           }
+        } else {
+          // module has no calculable params, just click the "compute" button
+          // check that "compute" button is active
+          const calcButton = calcPage.getCalculateButton();
+          const disabledState = await calcButton.getAttribute("disabled");
+          expect(disabledState).not.toBe("true");
+          // click "compute" button
+          await calcButton.click();
+          // check that result is not empty
+          const hasResults = await calcPage.hasResults();
+          expect(hasResults).toBe(true);
         }
       });
     });
diff --git a/e2e/calculator.po.ts b/e2e/calculator.po.ts
index 8ca7eac65d5090fdd31c84072c9fc4b74b14e788..f1659ce67f6238e8e9394a46af20829e2eeab830 100644
--- a/e2e/calculator.po.ts
+++ b/e2e/calculator.po.ts
@@ -100,7 +100,11 @@ export class CalculatorPage {
       ||
       await element(by.css("fixedvar-results results-graph > graph-results-container")).isPresent()
       ||
+      await element(by.css("remous-results #main-chart")).isPresent()
+      ||
       await element(by.css("pab-results pab-results-table")).isPresent()
+      ||
+      await element(by.css("macrorugo-compound-results macrorugo-compound-results-table")).isPresent()
     );
   }
 
diff --git a/e2e/clone-all-calc.e2e-spec.ts b/e2e/clone-all-calc.e2e-spec.ts
index 1cf0a8d470e2ec2e4a1de4c20190408c165ebbe5..e8260ac6b5501d383bb69814e07f4cbf9578a86b 100644
--- a/e2e/clone-all-calc.e2e-spec.ts
+++ b/e2e/clone-all-calc.e2e-spec.ts
@@ -18,7 +18,7 @@ describe("ngHyd − clone all calculators with all possible <select> values", ()
   });
 
   // get calculators list (IDs) @TODO read it from config !
-  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15 ];
+  const calcTypes = [ 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 15, 17 ];
 
   // for each calculator
   for (const ct of calcTypes) {
diff --git a/e2e/navbar.po.ts b/e2e/navbar.po.ts
index 621416ac95243f7d0fd7917d45e556b8cc73e4ff..13b1efc1f8c5c828ed9a99b903536f817804b69c 100644
--- a/e2e/navbar.po.ts
+++ b/e2e/navbar.po.ts
@@ -2,11 +2,11 @@ import { by, element } from "protractor";
 
 export class Navbar {
   getAllCalculatorTabs() {
-    return element.all(by.css("#tabs-container > button.calculator-button"));
+    return element.all(by.css("#tabs-container button.calculator-button"));
   }
 
   getCalculatorTabForUid(uid: string) {
-    return element(by.css("#tabs-container > button.calculator-button.calculator-uid-" + uid));
+    return element(by.css("#tabs-container button.calculator-button.calculator-uid-" + uid));
   }
 
   getNewCalculatorButton() {
diff --git a/jalhyd_branch b/jalhyd_branch
index c9cd8896aab158c293672a2feece50b940fadf67..0234e83afe24e8eb9178bd8d880294901564dae9 100644
--- a/jalhyd_branch
+++ b/jalhyd_branch
@@ -1 +1 @@
-128-reorganisation-du-stockage-des-resultats-dans-le-nub
+35-ajout-de-la-calculette-passe-a-enrochement-complexe
diff --git a/package-lock.json b/package-lock.json
index 4c9a9bbd2201aa56273ba5685f7118157eb44560..3ef9b8aabc97186be3c938bfe00e2befd828852d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,12 +11,12 @@
       "dev": true
     },
     "@angular-devkit/architect": {
-      "version": "0.801.2",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.801.2.tgz",
-      "integrity": "sha512-gdPdT6y3TDA3hzTAlI3Ym8QB8Zj8kqAMzDwP1JSXxekF6md0qc+NK7WCu6Y+pj1Bbo5mXpxHBov4Xwv1l4STQA==",
+      "version": "0.801.3",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.801.3.tgz",
+      "integrity": "sha512-gg6ZyJMiRYuzzmbpuDszrsE/hpwzoUnlOVoLNNzbACGBSDiqelC1mvGHb9JQM56Sy8gSjZn6RT0K2/Og79GoSg==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.1.2",
+        "@angular-devkit/core": "8.1.3",
         "rxjs": "6.4.0"
       },
       "dependencies": {
@@ -32,16 +32,16 @@
       }
     },
     "@angular-devkit/build-angular": {
-      "version": "0.801.2",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.801.2.tgz",
-      "integrity": "sha512-PXwqvogl/brFjWhQMJoBTif5cGs5w1O/dahNaW3s9qbPGOg0E0nta+K8F/lL8x2pksslQi0jui6CeP1Yv+i1aA==",
+      "version": "0.801.3",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.801.3.tgz",
+      "integrity": "sha512-BmN48xepRzQN2h2L7k9MhEWSAmEJj8celtD9Tu9Gn2DeM0yh2TFW9OKFKJlqyF3vGd3at24bqHOXI4MtDeltQQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.801.2",
-        "@angular-devkit/build-optimizer": "0.801.2",
-        "@angular-devkit/build-webpack": "0.801.2",
-        "@angular-devkit/core": "8.1.2",
-        "@ngtools/webpack": "8.1.2",
+        "@angular-devkit/architect": "0.801.3",
+        "@angular-devkit/build-optimizer": "0.801.3",
+        "@angular-devkit/build-webpack": "0.801.3",
+        "@angular-devkit/core": "8.1.3",
+        "@ngtools/webpack": "8.1.3",
         "ajv": "6.10.0",
         "autoprefixer": "9.6.0",
         "browserslist": "4.6.3",
@@ -99,12 +99,41 @@
             "uri-js": "^4.2.2"
           }
         },
+        "chokidar": {
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+          "dev": true,
+          "requires": {
+            "anymatch": "^2.0.0",
+            "async-each": "^1.0.1",
+            "braces": "^2.3.2",
+            "fsevents": "^1.2.7",
+            "glob-parent": "^3.1.0",
+            "inherits": "^2.0.3",
+            "is-binary-path": "^1.0.0",
+            "is-glob": "^4.0.0",
+            "normalize-path": "^3.0.0",
+            "path-is-absolute": "^1.0.0",
+            "readdirp": "^2.2.1",
+            "upath": "^1.1.1"
+          }
+        },
         "core-js": {
           "version": "3.1.4",
           "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz",
           "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==",
           "dev": true
         },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "dev": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
         "glob": {
           "version": "7.1.4",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
@@ -119,6 +148,18 @@
             "path-is-absolute": "^1.0.0"
           }
         },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
+        },
+        "normalize-path": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+          "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+          "dev": true
+        },
         "rxjs": {
           "version": "6.4.0",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
@@ -149,13 +190,58 @@
             "buffer-from": "^1.0.0",
             "source-map": "^0.6.0"
           }
+        },
+        "upath": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+          "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+          "dev": true
+        },
+        "webpack-dev-server": {
+          "version": "3.7.2",
+          "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz",
+          "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==",
+          "dev": true,
+          "requires": {
+            "ansi-html": "0.0.7",
+            "bonjour": "^3.5.0",
+            "chokidar": "^2.1.6",
+            "compression": "^1.7.4",
+            "connect-history-api-fallback": "^1.6.0",
+            "debug": "^4.1.1",
+            "del": "^4.1.1",
+            "express": "^4.17.1",
+            "html-entities": "^1.2.1",
+            "http-proxy-middleware": "^0.19.1",
+            "import-local": "^2.0.0",
+            "internal-ip": "^4.3.0",
+            "ip": "^1.1.5",
+            "killable": "^1.0.1",
+            "loglevel": "^1.6.3",
+            "opn": "^5.5.0",
+            "p-retry": "^3.0.1",
+            "portfinder": "^1.0.20",
+            "schema-utils": "^1.0.0",
+            "selfsigned": "^1.10.4",
+            "semver": "^6.1.1",
+            "serve-index": "^1.9.1",
+            "sockjs": "0.3.19",
+            "sockjs-client": "1.3.0",
+            "spdy": "^4.0.0",
+            "strip-ansi": "^3.0.1",
+            "supports-color": "^6.1.0",
+            "url": "^0.11.0",
+            "webpack-dev-middleware": "^3.7.0",
+            "webpack-log": "^2.0.0",
+            "yargs": "12.0.5"
+          }
         }
       }
     },
     "@angular-devkit/build-optimizer": {
-      "version": "0.801.2",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.801.2.tgz",
-      "integrity": "sha512-BwbRn+11MpR4XjVLoFZZY1DAPCnft/5z6g6kfbTmoJNm6TD7+KypCEXw3MzdGt9vp085XJibc405R1QmmrOF+g==",
+      "version": "0.801.3",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.801.3.tgz",
+      "integrity": "sha512-5wyzek1Ls7T9bh24yGDC/3Ss1YePpnOyBu0D8mJkByjPJjQr0xXR6UPx/7Idq6Y8BMeGO/+MiMOLZoUTPTIa0w==",
       "dev": true,
       "requires": {
         "loader-utils": "1.2.3",
@@ -179,13 +265,13 @@
       }
     },
     "@angular-devkit/build-webpack": {
-      "version": "0.801.2",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.801.2.tgz",
-      "integrity": "sha512-xy0MHLaXw4pz0NEg7fNyPjXdKkjeLAI6T2fnzYbLw3TJOqVe9y7p5uDLWa2/wp66mk34gcM/7A0ILqaIJ/ytGg==",
+      "version": "0.801.3",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.801.3.tgz",
+      "integrity": "sha512-IuR1WKldZwrAQWlKCLv+MnNeR1tWFCSJ9wXAgKqvlAPiYHEvTvazRVbWerxgVFvL4MCOt2wYVz/AqQWVYAhwlQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.801.2",
-        "@angular-devkit/core": "8.1.2",
+        "@angular-devkit/architect": "0.801.3",
+        "@angular-devkit/core": "8.1.3",
         "rxjs": "6.4.0",
         "webpack-merge": "4.2.1"
       },
@@ -202,9 +288,9 @@
       }
     },
     "@angular-devkit/core": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.2.tgz",
-      "integrity": "sha512-sNkqXbkHE9+ObtLOYmDKJL1bOf1zY0AwGVKemgDqCmu1mRUNqhb7CmF13DRscfU3MEcuiJYDjXqBQDjIszrFiw==",
+      "version": "8.1.3",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.1.3.tgz",
+      "integrity": "sha512-Vj5fowuz27J+S74U1+MrSrJ7vI+OZC5HBOp4m7rrh/GcYlujcX3BUu0Bxi7LI1v90yDsr0s/iEAKsff05ByXiw==",
       "dev": true,
       "requires": {
         "ajv": "6.10.0",
@@ -238,15 +324,40 @@
       }
     },
     "@angular-devkit/schematics": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.1.2.tgz",
-      "integrity": "sha512-Di/3vPR4jwdYcMAk13t19sAF0qQUH8KSkFcmO/5E/gECTL1tXNvV690K1Vhn6zpeE17Z1MLB5HwRNcb6nJkD+Q==",
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.2.tgz",
+      "integrity": "sha512-WwiHtDeW7+Gw5pukdjyuwQ+Ino7AFnoKUqqYrsTwPnNky+p8JVT4tY6jTxwenOLOVsLSDz5oVn9jk5u70HLX4Q==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.1.2",
+        "@angular-devkit/core": "8.3.2",
         "rxjs": "6.4.0"
       },
       "dependencies": {
+        "@angular-devkit/core": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.2.tgz",
+          "integrity": "sha512-jFrBGPJBhy4D4foH9YHDrlbqGmb+ZivTKtHnR4yV241VUd3W53+KABrvPyHeS5xk/aHTRsm76rx6l+UREEEUkw==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.10.2",
+            "fast-json-stable-stringify": "2.0.0",
+            "magic-string": "0.25.3",
+            "rxjs": "6.4.0",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.10.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+          "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
         "rxjs": {
           "version": "6.4.0",
           "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
@@ -259,17 +370,17 @@
       }
     },
     "@angular/animations": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.1.2.tgz",
-      "integrity": "sha512-szR5qzRe6vS1qrPhV2p5fMp5vQxT2SaljXGs3Xgt2Tl23om0XVNcqK0I8NNuK/ehuJ5LXQ1fJHniGcmN2aUw0g==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.4.tgz",
+      "integrity": "sha512-EHTvA5ugoFiYVwi9SyozJORWcBhUIn06VbNa2uhQQdOUrsbvKBCF0PpH2nZZJz7wsQ6Pyonizee8vgea8/X59Q==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/cdk": {
-      "version": "8.1.3",
-      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.1.3.tgz",
-      "integrity": "sha512-+DOS6x05/nNdnoRmEi3bgQxKym34PeCRGD6dimdw0l7ZgM57qhlaBWo0dXB7QSyR9E44uVT91e4h8ye+/ne1DQ==",
+      "version": "8.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-8.1.4.tgz",
+      "integrity": "sha512-U0tjhAZM4qqUHGGKIKFZZ9d8929s2U/HO0FdoT/eX+oHPOA6mm3bBep7myrSzlkP9V7O1JJfYdhEgijXhYxprQ==",
       "requires": {
         "parse5": "^5.0.0",
         "tslib": "^1.7.1"
@@ -284,37 +395,96 @@
       }
     },
     "@angular/cli": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.1.2.tgz",
-      "integrity": "sha512-Zz9WGqPgr+w9SfpDeKLPzGFLZaX7uu2kU7/r6vxvnESJcnoxKOJBf+ipXu42TY7D3FtSiPBO27GBTSVgPCseoQ==",
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.2.tgz",
+      "integrity": "sha512-NFL/QG+u607kQigubTj6Mlv289/6AvBooqkesBGta/Axaqgz3kPqJbz8YJs51mrHpa9rmx0IIncIMeKjHa7vTw==",
       "dev": true,
       "requires": {
-        "@angular-devkit/architect": "0.801.2",
-        "@angular-devkit/core": "8.1.2",
-        "@angular-devkit/schematics": "8.1.2",
-        "@schematics/angular": "8.1.2",
-        "@schematics/update": "0.801.2",
+        "@angular-devkit/architect": "0.803.2",
+        "@angular-devkit/core": "8.3.2",
+        "@angular-devkit/schematics": "8.3.2",
+        "@schematics/angular": "8.3.2",
+        "@schematics/update": "0.803.2",
         "@yarnpkg/lockfile": "1.1.0",
-        "ansi-colors": "4.1.0",
+        "ansi-colors": "4.1.1",
         "debug": "^4.1.1",
         "ini": "1.3.5",
-        "inquirer": "6.4.1",
+        "inquirer": "6.5.1",
         "npm-package-arg": "6.1.0",
         "open": "6.4.0",
-        "pacote": "9.5.1",
+        "pacote": "9.5.5",
         "read-package-tree": "5.3.1",
-        "semver": "6.2.0",
+        "semver": "6.3.0",
         "symbol-observable": "1.2.0",
         "universal-analytics": "^0.4.20",
         "uuid": "^3.3.2"
       },
       "dependencies": {
+        "@angular-devkit/architect": {
+          "version": "0.803.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.2.tgz",
+          "integrity": "sha512-1HFuZzMOFhVmbfoNwbYDLU3hhYMFmtB0eve/dB4KEvCFq6AEoFPVc5xt4tWpeN41wISfiCgxf5kHE3y07g0Yag==",
+          "dev": true,
+          "requires": {
+            "@angular-devkit/core": "8.3.2",
+            "rxjs": "6.4.0"
+          }
+        },
+        "@angular-devkit/core": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.2.tgz",
+          "integrity": "sha512-jFrBGPJBhy4D4foH9YHDrlbqGmb+ZivTKtHnR4yV241VUd3W53+KABrvPyHeS5xk/aHTRsm76rx6l+UREEEUkw==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.10.2",
+            "fast-json-stable-stringify": "2.0.0",
+            "magic-string": "0.25.3",
+            "rxjs": "6.4.0",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.10.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+          "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
         "ansi-colors": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+          "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+          "dev": true
+        },
+        "ansi-escapes": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz",
+          "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.5.2"
+          }
+        },
+        "ansi-regex": {
           "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.0.tgz",
-          "integrity": "sha512-3NkLpm6I6kEgC8J0I9EZ0fouXc/mm5J9zqJFCgA2jGqmsL0O64I7Uvi3AmUMnnRqc6u7uLgVVnY4pyBQ03nCiw==",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
+        "cli-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+          "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+          "dev": true,
+          "requires": {
+            "restore-cursor": "^3.1.0"
+          }
+        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -324,40 +494,136 @@
             "ms": "^2.1.1"
           }
         },
+        "figures": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz",
+          "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        },
+        "inquirer": {
+          "version": "6.5.1",
+          "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz",
+          "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==",
+          "dev": true,
+          "requires": {
+            "ansi-escapes": "^4.2.1",
+            "chalk": "^2.4.2",
+            "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",
+            "rxjs": "^6.4.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^5.1.0",
+            "through": "^2.3.6"
+          }
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.15",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+          "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+          "dev": true
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
           "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
           "dev": true
         },
+        "mute-stream": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+          "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+          "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "restore-cursor": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+          "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+          "dev": true,
+          "requires": {
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2"
+          }
+        },
+        "rxjs": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
+          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "semver": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
-          "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
+        },
+        "string-width": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz",
+          "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^5.2.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
         }
       }
     },
     "@angular/common": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.1.2.tgz",
-      "integrity": "sha512-bywFofN5RjcvygYEC/3eo+bfUnYBmARA6DPau8fm6D2ZGpXrWXJ3Thd99ZesuuffvpniaIHlAjbHGI83XSnixQ==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.4.tgz",
+      "integrity": "sha512-sPeTkor3uf8T3MvpekS0ZQe9K/yzlHBSoMyT0bIPOYeDTHUph3f/0XyYhH7KSGXLo7tSw1Mx9Ua05nQ+VHtLGQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/compiler": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.1.2.tgz",
-      "integrity": "sha512-oRkHrstOV6imbb4mGf6q20d4N4iYfBbI6WfxtPL4dz08GipGg4Zvekn4e3R01vzhFBxssGcgmeEtFQJh/UzI8g==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.4.tgz",
+      "integrity": "sha512-LYaYhQlW3GFiXrNywJBYQtsLOWmUFcgudacF1m7QHHhlljnkG3BqkosbT0Dkcl7ayrIDYT/ZMTkVmaiGvgAhnw==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/compiler-cli": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.1.2.tgz",
-      "integrity": "sha512-Dxm99iuv265AlUf3aX3nRl+Iqrj3RvlQgPOYLsV1EEVnA2+4Mjj52zbKgdOOOfhCF48imVbaU45Sh8p2l1xdOw==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.4.tgz",
+      "integrity": "sha512-tN269yWPbJsetzmO8x/Bx7wLwqCfnD8BYoJsBFPcZOZpW0cfELzVdY13R325WB1uXiMrVN0lskNtPBLe9OcMTA==",
       "dev": true,
       "requires": {
         "canonical-path": "1.0.0",
@@ -372,10 +638,16 @@
         "yargs": "13.1.0"
       },
       "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
         "chokidar": {
-          "version": "2.1.6",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
-          "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
           "dev": true,
           "requires": {
             "anymatch": "^2.0.0",
@@ -392,6 +664,18 @@
             "upath": "^1.1.1"
           }
         },
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+          "dev": true
+        },
         "minimist": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
@@ -404,86 +688,141 @@
           "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
           "dev": true
         },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+          "dev": true
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        },
         "upath": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
-          "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+          "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
           "dev": true
+        },
+        "yargs": {
+          "version": "13.1.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz",
+          "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==",
+          "dev": true,
+          "requires": {
+            "cliui": "^4.0.0",
+            "find-up": "^3.0.0",
+            "get-caller-file": "^2.0.1",
+            "os-locale": "^3.1.0",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^3.0.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^13.0.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "13.1.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
+          "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
     "@angular/core": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.1.2.tgz",
-      "integrity": "sha512-Gm/UIUnIkeah39vxi4enVH/CUcPZOgGDyw4RNagw4pH8dTP8V0RUz8uteOr3DS+Eh49BcHkrT2oU5MBZSZ3lvw==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.4.tgz",
+      "integrity": "sha512-8FSdkUSb5S4+K2w49iLzrQF/jzcmoRnOogFZQ8CctiXQHSVHHF8AjpoFpFVUAI6/77UVL8CehlyBSKF5EE1Z8A==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/flex-layout": {
-      "version": "8.0.0-beta.26",
-      "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-8.0.0-beta.26.tgz",
-      "integrity": "sha512-lXDLlMSNQhidW0grvisIsj/3gqLuYyN2MvABuRYybnFTc233sXGZuOAaulqq663LA0/DP/GNcz6a+A4ZAAlmPA==",
+      "version": "8.0.0-beta.27",
+      "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-8.0.0-beta.27.tgz",
+      "integrity": "sha512-qmpvQPesU4ZQ56IscwgmVRpK2UnyV+gwvXUql7TMv0QV215hLcHczjGsrKkLfW2By5E7XEyDat9br72uVXcPMw==",
       "requires": {
         "tslib": "^1.7.1"
       }
     },
     "@angular/forms": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.1.2.tgz",
-      "integrity": "sha512-DHqbWt6AGnLkNajLZUAH4yQrxZdgUkjzEW6oxwvS2PxmLIrppz4TYWizfAVQndZ1Ddl7Eo1zRoRzqqHT90XyGA==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.4.tgz",
+      "integrity": "sha512-TsaMrfy/Ls9kpxxlkqaPSQCL3DWqIzh3fMd0aGXTjcsEFI3gztttAmE/dlU0dtVsQxD0M9cdqjjPqi0TGamfTw==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/language-service": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.1.2.tgz",
-      "integrity": "sha512-9DR5TclsEpMIzCmagLHKYDTAqcZUkZKPjkngqIAUJg5R4IUjsuYn8NZX+agoOrS4ky6Dy9FXGYUC+QB0iEiycg==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.4.tgz",
+      "integrity": "sha512-8yoplzpNgZOMMluvxiyc0hwVs6WJBkHJoM8Dy3pb0UIRfYO1IDwrEEV6bbn25oORW59q7tUO3GD1yXwuJCswPQ==",
       "dev": true
     },
     "@angular/material": {
-      "version": "8.1.3",
-      "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.1.3.tgz",
-      "integrity": "sha512-qZVWrJ/EO1y0lJCy7pe536RlYiih3p3fQzj7tgus7JdOpspyF+zBLzn8gNrdAFACXpVWwq2kLorieoR3BB47ZQ==",
+      "version": "8.1.4",
+      "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.1.4.tgz",
+      "integrity": "sha512-HV1qU63MaOtAc+cWg21Y2ygQKdEDjsGQ/3d3qym9sfR0xU2vvY7OG6gH48BfPeU63oMYxQkhxfoGP8wWMXSU1w==",
       "requires": {
         "tslib": "^1.7.1"
       }
     },
     "@angular/platform-browser": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.1.2.tgz",
-      "integrity": "sha512-n61OtH3B0e+LTHCfHPjB7hiuo0ZxKxZvNWigczGyLZf2abga5jac2bNrdZnU8zXC44AUfasUD2qDS2IPIhNbqA==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.4.tgz",
+      "integrity": "sha512-3nd71h6S4RT9lHu9mVGD/741O+8MBSjI1A0V8H/LjT79yWnkxoR6BgZA7KL76AeTTITagUcVIuxtNAaxssgLHg==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/platform-browser-dynamic": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.1.2.tgz",
-      "integrity": "sha512-NmbGMwKPbYq3ZFt6nOqRslJsQNRS2E94cjkSLseEb5wauUmdUBX9stoHu8BOhvd+EIEcYhD7uxPB+L/qPsH46g==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.4.tgz",
+      "integrity": "sha512-qn84B796UZIl1KB+YcxwFCx/Ze439Zf7G8ZK+xKsUA16H0R6GswAgBndnYq8xFjww1g4dY7zNH/XZ2FKngETKA==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@angular/router": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.1.2.tgz",
-      "integrity": "sha512-+SWoYZHyDBBUydDTbIu+hyoGzWtSA4VUsriUPWEOCplzQiabFhWxVvcT00mO0cim4XfupL1tmiPjE66sivLYBw==",
+      "version": "8.2.4",
+      "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.4.tgz",
+      "integrity": "sha512-ZJwsztlD1vbb2HF9SgvHfpIK82BkOlDP2OmdZZavnxV7RstbU5hUkJ4lB4JB/EN9B76djo117CwOxxIveOhJMQ==",
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "@babel/code-frame": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
-      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+      "version": "7.5.5",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+      "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
       "dev": true,
       "requires": {
         "@babel/highlight": "^7.0.0"
@@ -546,9 +885,9 @@
       }
     },
     "@babel/highlight": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
-      "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
       "dev": true,
       "requires": {
         "chalk": "^2.0.0",
@@ -615,15 +954,6 @@
         "lodash": "^4.17.13"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.5.5",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
-          "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
-          "dev": true,
-          "requires": {
-            "@babel/highlight": "^7.0.0"
-          }
-        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -929,6 +1259,16 @@
         }
       }
     },
+    "@develar/schema-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.1.0.tgz",
+      "integrity": "sha512-qjCqB4ctMig9Gz5bd6lkdFr3bO6arOdQqptdBSpF1ZpCnjofieCciEzkoS9ujY9cMGyllYSCSmBJ3x9OKHXzoA==",
+      "dev": true,
+      "requires": {
+        "ajv": "^6.1.0",
+        "ajv-keywords": "^3.1.0"
+      }
+    },
     "@dsherret/to-absolute-glob": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
@@ -950,12 +1290,12 @@
       }
     },
     "@ngtools/webpack": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.1.2.tgz",
-      "integrity": "sha512-xA1SZI6BiEqmfxyaxw2TobF3gkZdfyEeCP1zhPm38PjQ1zU7Xx3TbvxTeMKGV3EOTMxvUETDiS65YJrIvGnaNA==",
+      "version": "8.1.3",
+      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.1.3.tgz",
+      "integrity": "sha512-gSsLMdCJsQp7ZKF5Tl/yfns1eMtmc89J+yoWiOLoSHb8cupP2G4o7DL8wGkylsyALu5eomF/RSnivC9SGvdxYQ==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.1.2",
+        "@angular-devkit/core": "8.1.3",
         "enhanced-resolve": "4.1.0",
         "rxjs": "6.4.0",
         "tree-kill": "1.2.1",
@@ -980,49 +1320,110 @@
       "dev": true
     },
     "@schematics/angular": {
-      "version": "8.1.2",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.1.2.tgz",
-      "integrity": "sha512-BeEzuS0s4j+BPboUhl97VMfhj7V+HpNbbY3PkD3TLd0cnSEoaLmtX+YjxbxZgwk6vhDp+l6YtpWt//5H/+0rFQ==",
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.2.tgz",
+      "integrity": "sha512-kDT5lhr488NpqS4OKn8B9VUwl5AUNqRkLLqWgNHvxQcV1OtLhVJVw4ih1vhrH7wlUd39EwnRqtBX+53cg2PDmA==",
       "dev": true,
       "requires": {
-        "@angular-devkit/core": "8.1.2",
-        "@angular-devkit/schematics": "8.1.2"
-      }
-    },
-    "@schematics/update": {
-      "version": "0.801.2",
-      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.801.2.tgz",
-      "integrity": "sha512-xb54QXvII1JLdqgEqsh6mWu5qTt5UezmOWTZayRegsj0vNlzWFzoLXpiPFCWVEKUODa6aV4O5XW5CiQuVYPVuQ==",
-      "dev": true,
-      "requires": {
-        "@angular-devkit/core": "8.1.2",
-        "@angular-devkit/schematics": "8.1.2",
-        "@yarnpkg/lockfile": "1.1.0",
-        "ini": "1.3.5",
-        "pacote": "9.5.1",
-        "rxjs": "6.4.0",
-        "semver": "6.2.0",
-        "semver-intersect": "1.4.0"
+        "@angular-devkit/core": "8.3.2",
+        "@angular-devkit/schematics": "8.3.2"
       },
       "dependencies": {
-        "rxjs": {
-          "version": "6.4.0",
-          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
-          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+        "@angular-devkit/core": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.2.tgz",
+          "integrity": "sha512-jFrBGPJBhy4D4foH9YHDrlbqGmb+ZivTKtHnR4yV241VUd3W53+KABrvPyHeS5xk/aHTRsm76rx6l+UREEEUkw==",
           "dev": true,
           "requires": {
-            "tslib": "^1.9.0"
+            "ajv": "6.10.2",
+            "fast-json-stable-stringify": "2.0.0",
+            "magic-string": "0.25.3",
+            "rxjs": "6.4.0",
+            "source-map": "0.7.3"
           }
         },
-        "semver": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
-          "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
-          "dev": true
-        }
-      }
-    },
-    "@sindresorhus/is": {
+        "ajv": {
+          "version": "6.10.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+          "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "rxjs": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
+          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        }
+      }
+    },
+    "@schematics/update": {
+      "version": "0.803.2",
+      "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.2.tgz",
+      "integrity": "sha512-UX01kuGEXMEnV19Dd7/lNzFnokZ05an9o0yEoRp50e7HH2mUOCPcxlnwGOq1obUJdyXkvItNrwWsIp2krXt4wQ==",
+      "dev": true,
+      "requires": {
+        "@angular-devkit/core": "8.3.2",
+        "@angular-devkit/schematics": "8.3.2",
+        "@yarnpkg/lockfile": "1.1.0",
+        "ini": "1.3.5",
+        "pacote": "9.5.5",
+        "rxjs": "6.4.0",
+        "semver": "6.3.0",
+        "semver-intersect": "1.4.0"
+      },
+      "dependencies": {
+        "@angular-devkit/core": {
+          "version": "8.3.2",
+          "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.2.tgz",
+          "integrity": "sha512-jFrBGPJBhy4D4foH9YHDrlbqGmb+ZivTKtHnR4yV241VUd3W53+KABrvPyHeS5xk/aHTRsm76rx6l+UREEEUkw==",
+          "dev": true,
+          "requires": {
+            "ajv": "6.10.2",
+            "fast-json-stable-stringify": "2.0.0",
+            "magic-string": "0.25.3",
+            "rxjs": "6.4.0",
+            "source-map": "0.7.3"
+          }
+        },
+        "ajv": {
+          "version": "6.10.2",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
+          "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+          "dev": true,
+          "requires": {
+            "fast-deep-equal": "^2.0.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "rxjs": {
+          "version": "6.4.0",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
+          "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
+        "semver": {
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "dev": true
+        }
+      }
+    },
+    "@sindresorhus/is": {
       "version": "0.14.0",
       "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
       "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
@@ -1038,9 +1439,9 @@
       }
     },
     "@types/debug": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.4.tgz",
-      "integrity": "sha512-D9MyoQFI7iP5VdpEyPZyjjqIJ8Y8EDNQFIFVLOmeg1rI1xiHOChyUPMPRUVfqFCerxfE+yS3vMyj37F6IdtOoQ==",
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz",
+      "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==",
       "dev": true
     },
     "@types/events": {
@@ -1067,9 +1468,9 @@
       }
     },
     "@types/jasmine": {
-      "version": "3.3.14",
-      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.14.tgz",
-      "integrity": "sha512-0mE8mLKrobGicrQqSU3GI1rE+yy0tfGWoGklhrsYVV3ZaHcQGNUs0UQ07pXIiGVHJB3fKP0qApcmApySk4wCRw==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.4.0.tgz",
+      "integrity": "sha512-6pUnBg6DuSB55xnxJ5+gW9JOkFrPsXkYAuqqEE8oyrpgDiPQ+TZ+1Zt4S+CHcRJcxyNYXeIXG4vHSzdF6y9Uvw==",
       "dev": true
     },
     "@types/jasminewd2": {
@@ -1093,9 +1494,9 @@
       "integrity": "sha512-13gmo3M2qVvjQrWNseqM3+cR6S2Ss3grbR2NZltgMq94wOwqJYQdgn8qzwDshzgXqMlSUtyPZjysImmktu22ew=="
     },
     "@types/node": {
-      "version": "12.6.8",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz",
-      "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==",
+      "version": "12.7.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.4.tgz",
+      "integrity": "sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ==",
       "dev": true
     },
     "@types/pako": {
@@ -1365,9 +1766,9 @@
       }
     },
     "acorn": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz",
-      "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==",
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
+      "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
       "dev": true
     },
     "acorn-dynamic-import": {
@@ -1385,12 +1786,6 @@
         "printj": "~1.1.0"
       }
     },
-    "adm-zip": {
-      "version": "0.4.13",
-      "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz",
-      "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==",
-      "dev": true
-    },
     "after": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
@@ -1462,9 +1857,9 @@
       }
     },
     "angular2-hotkeys": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/angular2-hotkeys/-/angular2-hotkeys-2.1.4.tgz",
-      "integrity": "sha512-/KzgsrFjodoeZosXqsx1IvUo3rWBalSJ3QyVz2EALj1C0Woz84iNtXPZnlzuPNHrCmHcfOu28BNvIGBa+9Ving==",
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/angular2-hotkeys/-/angular2-hotkeys-2.1.5.tgz",
+      "integrity": "sha512-HiAnK1pW7lns5LpxtRsdkRRb5iVa7fv8Cf69Jye6l9gI6/IyvaVDptRtsWmdIG7VAr2Ngz6Yeehkym39O/LdgA==",
       "requires": {
         "@types/mousetrap": "^1.6.0",
         "mousetrap": "^1.6.0"
@@ -1490,10 +1885,10 @@
           "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
           "dev": true
         },
         "string-width": {
@@ -1609,26 +2004,27 @@
       "dev": true
     },
     "app-builder-bin": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.0.tgz",
-      "integrity": "sha512-ZyQqfFnyjAmXep29PmuMIu2KvGlfHiziz2/I38zOFe5kqnkMqeNNn/qmnwD6wdCKKeHqBuZtoWQnft8q0YyLpw==",
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.4.3.tgz",
+      "integrity": "sha512-qMhayIwi3juerQEVJMQ76trObEbfQT0nhUdxZz9a26/3NLT3pE6awmQ8S1cEnrGugaaM5gYqR8OElcDezfmEsg==",
       "dev": true
     },
     "app-builder-lib": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.1.1.tgz",
-      "integrity": "sha512-nG5w9xjv4c16ki+pyBPqJvUCtQY97XQNsA4dEBryq6vClwDTkwKrl7aS0cXjo3dsWKsf/5EIcLrV0tfIiXUqJA==",
+      "version": "21.2.0",
+      "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-21.2.0.tgz",
+      "integrity": "sha512-aOX/nv77/Bti6NymJDg7p9T067xD8m1ipIEJR7B4Mm1GsJWpMm9PZdXtCRiMNRjHtQS5KIljT0g17781y6qn5A==",
       "dev": true,
       "requires": {
         "7zip-bin": "~5.0.3",
+        "@develar/schema-utils": "~2.1.0",
         "async-exit-hook": "^2.0.1",
         "bluebird-lst": "^1.0.9",
-        "builder-util": "21.1.1",
+        "builder-util": "21.2.0",
         "builder-util-runtime": "8.3.0",
         "chromium-pickle-js": "^0.2.0",
         "debug": "^4.1.1",
         "ejs": "^2.6.2",
-        "electron-publish": "21.1.1",
+        "electron-publish": "21.2.0",
         "fs-extra": "^8.1.0",
         "hosted-git-info": "^2.7.1",
         "is-ci": "^2.0.0",
@@ -1637,9 +2033,9 @@
         "lazy-val": "^1.0.4",
         "minimatch": "^3.0.4",
         "normalize-package-data": "^2.5.0",
-        "read-config-file": "4.0.1",
-        "sanitize-filename": "^1.6.1",
-        "semver": "^6.2.0",
+        "read-config-file": "5.0.0",
+        "sanitize-filename": "^1.6.2",
+        "semver": "^6.3.0",
         "temp-file": "^3.3.4"
       },
       "dependencies": {
@@ -1652,29 +2048,6 @@
             "ms": "^2.1.1"
           }
         },
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-          "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
-          "dev": true
-        },
-        "isbinaryfile": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.2.tgz",
-          "integrity": "sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==",
-          "dev": true
-        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -1682,9 +2055,9 @@
           "dev": true
         },
         "semver": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
-          "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         }
       }
@@ -1956,9 +2329,9 @@
       "dev": true
     },
     "async-limiter": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
-      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
       "dev": true
     },
     "asynckit": {
@@ -2309,9 +2682,9 @@
       }
     },
     "bluebird": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
-      "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
+      "version": "3.5.5",
+      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
+      "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
       "dev": true
     },
     "bluebird-lst": {
@@ -2321,14 +2694,6 @@
       "dev": true,
       "requires": {
         "bluebird": "^3.5.5"
-      },
-      "dependencies": {
-        "bluebird": {
-          "version": "3.5.5",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
-          "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
-          "dev": true
-        }
       }
     },
     "bn.js": {
@@ -2374,15 +2739,6 @@
             "toidentifier": "1.0.0"
           }
         },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
         "qs": {
           "version": "6.7.0",
           "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
@@ -2445,16 +2801,10 @@
           "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
           "dev": true
         },
         "string-width": {
@@ -2476,6 +2826,12 @@
           "requires": {
             "ansi-regex": "^4.1.0"
           }
+        },
+        "type-fest": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+          "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
+          "dev": true
         }
       }
     },
@@ -2729,14 +3085,14 @@
       "dev": true
     },
     "builder-util": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.1.1.tgz",
-      "integrity": "sha512-+t6pbMo/COTYDfqfRDrWDi9tuPxBctb0S9PVt8Kgd+K0eqD1lvbF05rrkiQpXIrhb6cndXgcl3FG18Oqgy5YPg==",
+      "version": "21.2.0",
+      "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-21.2.0.tgz",
+      "integrity": "sha512-Nd6CUb6YgDY8EXAXEIegx+1kzKqyFQ5ZM5BoYkeunAlwz/zDJoH1UCyULjoS5wQe5czNClFQy07zz2bzYD0Z4A==",
       "dev": true,
       "requires": {
         "7zip-bin": "~5.0.3",
         "@types/debug": "^4.1.4",
-        "app-builder-bin": "3.4.0",
+        "app-builder-bin": "3.4.3",
         "bluebird-lst": "^1.0.9",
         "builder-util-runtime": "8.3.0",
         "chalk": "^2.4.2",
@@ -2744,7 +3100,7 @@
         "fs-extra": "^8.1.0",
         "is-ci": "^2.0.0",
         "js-yaml": "^3.13.1",
-        "source-map-support": "^0.5.12",
+        "source-map-support": "^0.5.13",
         "stat-mode": "^0.3.0",
         "temp-file": "^3.3.4"
       },
@@ -2758,23 +3114,6 @@
             "ms": "^2.1.1"
           }
         },
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-          "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
-          "dev": true
-        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -2788,9 +3127,9 @@
           "dev": true
         },
         "source-map-support": {
-          "version": "0.5.12",
-          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
-          "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
+          "version": "0.5.13",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+          "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
           "dev": true,
           "requires": {
             "buffer-from": "^1.0.0",
@@ -2878,12 +3217,6 @@
         "y18n": "^4.0.0"
       },
       "dependencies": {
-        "bluebird": {
-          "version": "3.5.5",
-          "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
-          "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
-          "dev": true
-        },
         "glob": {
           "version": "7.1.4",
           "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
@@ -2907,15 +3240,6 @@
             "yallist": "^3.0.2"
           }
         },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
         "yallist": {
           "version": "3.0.3",
           "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz",
@@ -2976,6 +3300,12 @@
           "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
           "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
           "dev": true
+        },
+        "normalize-url": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz",
+          "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==",
+          "dev": true
         }
       }
     },
@@ -3016,9 +3346,9 @@
       "dev": true
     },
     "camelcase": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
       "dev": true
     },
     "camelcase-keys": {
@@ -3029,6 +3359,14 @@
       "requires": {
         "camelcase": "^2.0.0",
         "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+          "dev": true
+        }
       }
     },
     "caniuse-lite": {
@@ -3056,9 +3394,9 @@
       "dev": true
     },
     "cfb": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.1.2.tgz",
-      "integrity": "sha512-FAEjGHtrAF027TFkhDmTDNbRf97C33jBXRa9ODeabZRqYDglsq/F5uRpJfV5BitCH4yiyplHNBKx2xOhQb12PA==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.1.3.tgz",
+      "integrity": "sha512-joXBW0nMuwV9no7UTMiyVJnQL6XIU3ThXVjFUDHgl9MpILPOomyfaGqC290VELZ48bbQKZXnQ81UT5HouTxHsw==",
       "requires": {
         "adler-32": "~1.2.0",
         "commander": "^2.16.0",
@@ -3306,22 +3644,6 @@
           "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
           "dev": true
         },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-          "dev": true,
-          "requires": {
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^4.0.0"
-          }
-        },
         "strip-ansi": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
@@ -3478,9 +3800,9 @@
       "dev": true
     },
     "compare-versions": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.0.tgz",
-      "integrity": "sha512-hX+4kt2Rcwu+x1U0SsEFCn1quURjEjPEGH/cPBlpME/IidGimAdwfMU+B+xDr7et/KTR7VH2+ZqWGerv4NGs2w==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz",
+      "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==",
       "dev": true
     },
     "component-bind": {
@@ -3681,17 +4003,6 @@
         "mkdirp": "^0.5.1",
         "rimraf": "^2.5.4",
         "run-queue": "^1.0.0"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
       }
     },
     "copy-descriptor": {
@@ -4236,9 +4547,9 @@
       }
     },
     "core-js": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz",
-      "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ=="
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz",
+      "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw=="
     },
     "core-util-is": {
       "version": "1.0.2",
@@ -4535,6 +4846,16 @@
       "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
       "dev": true
     },
+    "default-gateway": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+      "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+      "dev": true,
+      "requires": {
+        "execa": "^1.0.0",
+        "ip-regex": "^2.1.0"
+      }
+    },
     "default-require-extensions": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
@@ -4612,37 +4933,105 @@
       "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
       "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
     },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
-      "dev": true
-    },
-    "delegate": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
-      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
-      "optional": true
-    },
-    "dep-graph": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/dep-graph/-/dep-graph-1.1.0.tgz",
-      "integrity": "sha1-+t6GqSeZqBPptCURzfPfpsyNvv4=",
+    "del": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
       "dev": true,
       "requires": {
-        "underscore": "1.2.1"
+        "@types/glob": "^7.1.1",
+        "globby": "^6.1.0",
+        "is-path-cwd": "^2.0.0",
+        "is-path-in-cwd": "^2.0.0",
+        "p-map": "^2.0.0",
+        "pify": "^4.0.1",
+        "rimraf": "^2.6.3"
       },
       "dependencies": {
-        "underscore": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz",
-          "integrity": "sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q=",
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "dev": true,
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+              "dev": true
+            }
+          }
+        },
+        "is-path-cwd": {
+          "version": "2.2.0",
+          "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+          "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
           "dev": true
-        }
-      }
-    },
-    "depd": {
-      "version": "1.1.2",
+        },
+        "is-path-in-cwd": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+          "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+          "dev": true,
+          "requires": {
+            "is-path-inside": "^2.1.0"
+          }
+        },
+        "is-path-inside": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+          "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+          "dev": true,
+          "requires": {
+            "path-is-inside": "^1.0.2"
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        }
+      }
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+      "optional": true
+    },
+    "dep-graph": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/dep-graph/-/dep-graph-1.1.0.tgz",
+      "integrity": "sha1-+t6GqSeZqBPptCURzfPfpsyNvv4=",
+      "dev": true,
+      "requires": {
+        "underscore": "1.2.1"
+      },
+      "dependencies": {
+        "underscore": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz",
+          "integrity": "sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q=",
+          "dev": true
+        }
+      }
+    },
+    "depd": {
+      "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
       "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
       "dev": true
@@ -4733,38 +5122,20 @@
       }
     },
     "dmg-builder": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.1.1.tgz",
-      "integrity": "sha512-WsafJ+LkG20ddVfKfNlJC6AMRKTvLMJhAwAmBHzb+KWhMZVs9/3QY2yd2BIpvWYRfUD/lWd+LmclTNWw7540Cw==",
+      "version": "21.2.0",
+      "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-21.2.0.tgz",
+      "integrity": "sha512-9cJEclnGy7EyKFCoHDYDf54pub/t92CQapyiUxU0w9Bj2vUvfoDagP1PMiX4XD5rPp96141h9A+QN0OB4VgvQg==",
       "dev": true,
       "requires": {
-        "app-builder-lib": "~21.1.1",
+        "app-builder-lib": "~21.2.0",
         "bluebird-lst": "^1.0.9",
-        "builder-util": "~21.1.1",
+        "builder-util": "~21.2.0",
         "fs-extra": "^8.1.0",
         "iconv-lite": "^0.5.0",
         "js-yaml": "^3.13.1",
-        "parse-color": "^1.0.0",
-        "sanitize-filename": "^1.6.1"
+        "sanitize-filename": "^1.6.2"
       },
       "dependencies": {
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-          "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
-          "dev": true
-        },
         "iconv-lite": {
           "version": "0.5.0",
           "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz",
@@ -4870,9 +5241,9 @@
       }
     },
     "dotenv": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz",
-      "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.1.0.tgz",
+      "integrity": "sha512-GUE3gqcDCaMltj2++g6bRQ5rBJWtkWTmqmD0fo1RnnMuUqHNCt2oTPeDnS9n6fKYvlhn7AeBkb38lymBtWBQdA==",
       "dev": true
     },
     "dotenv-expand": {
@@ -4937,15 +5308,15 @@
       "dev": true
     },
     "ejs": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz",
-      "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.1.tgz",
+      "integrity": "sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==",
       "dev": true
     },
     "electron": {
-      "version": "5.0.7",
-      "resolved": "https://registry.npmjs.org/electron/-/electron-5.0.7.tgz",
-      "integrity": "sha512-OMMz8DhatxLuBFbnW7KYcAUjflGYFn0IQEtKR0iZhMAm89FgNOd9SVbxXWAGNxvRR6C0gORXwhTh6BCqqqcR6Q==",
+      "version": "5.0.10",
+      "resolved": "https://registry.npmjs.org/electron/-/electron-5.0.10.tgz",
+      "integrity": "sha512-OSyxTlJ+7Yf0B+6pTdHdxY9RvI4U+mVKAbn+CkAOWxlCPMg3K+jt5UHKSPRRLnXQhQ0Tulg4vupbC0k27aukVw==",
       "dev": true,
       "requires": {
         "@types/node": "^10.12.18",
@@ -4954,30 +5325,30 @@
       },
       "dependencies": {
         "@types/node": {
-          "version": "10.14.12",
-          "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.12.tgz",
-          "integrity": "sha512-QcAKpaO6nhHLlxWBvpc4WeLrTvPqlHOvaj0s5GriKkA1zq+bsFBPpfYCvQhLqLgYlIko8A9YrPdaMHCo5mBcpg==",
+          "version": "10.14.17",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.17.tgz",
+          "integrity": "sha512-p/sGgiPaathCfOtqu2fx5Mu1bcjuP8ALFg4xpGgNkcin7LwRyzUKniEHBKdcE1RPsenq5JVPIpMTJSygLboygQ==",
           "dev": true
         }
       }
     },
     "electron-builder": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-21.1.1.tgz",
-      "integrity": "sha512-4A3h0dhqSranoX7cM0eqkzABeHABH9Nch12003XIZ9MUPV4jL97nK5WBbbVG06qglYTV9x62XAqPPDS+KBOsEg==",
+      "version": "21.2.0",
+      "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-21.2.0.tgz",
+      "integrity": "sha512-x8EXrqFbAb2L3N22YlGar3dGh8vwptbB3ovo3OF6K7NTpcsmM2zEoJv7GhFyX73rNzSG2HaWpXwGAtOp2JWiEw==",
       "dev": true,
       "requires": {
-        "app-builder-lib": "21.1.1",
+        "app-builder-lib": "21.2.0",
         "bluebird-lst": "^1.0.9",
-        "builder-util": "21.1.1",
+        "builder-util": "21.2.0",
         "builder-util-runtime": "8.3.0",
         "chalk": "^2.4.2",
-        "dmg-builder": "21.1.1",
+        "dmg-builder": "21.2.0",
         "fs-extra": "^8.1.0",
         "is-ci": "^2.0.0",
         "lazy-val": "^1.0.4",
-        "read-config-file": "4.0.1",
-        "sanitize-filename": "^1.6.1",
+        "read-config-file": "5.0.0",
+        "sanitize-filename": "^1.6.2",
         "update-notifier": "^3.0.1",
         "yargs": "^13.3.0"
       },
@@ -4999,16 +5370,11 @@
             "wrap-ansi": "^5.1.0"
           }
         },
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
+        "emoji-regex": {
+          "version": "7.0.3",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+          "dev": true
         },
         "get-caller-file": {
           "version": "2.0.5",
@@ -5016,18 +5382,6 @@
           "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
           "dev": true
         },
-        "graceful-fs": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-          "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
         "require-main-filename": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
@@ -5082,6 +5436,16 @@
             "y18n": "^4.0.0",
             "yargs-parser": "^13.1.1"
           }
+        },
+        "yargs-parser": {
+          "version": "13.1.1",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
+          "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
         }
       }
     },
@@ -5137,13 +5501,13 @@
       }
     },
     "electron-publish": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.1.1.tgz",
-      "integrity": "sha512-cM5XLFolIB5NnVpBKewcUM3Ggg+wm+LeKRYHjcB9ri58cbPKxaN+fRUXAZs3m1U9t7SIgjZy83sUSi3asxMXgQ==",
+      "version": "21.2.0",
+      "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-21.2.0.tgz",
+      "integrity": "sha512-mWavuoWJe87iaeKd0I24dNWIaR+0yRzshjNVqGyK019H766fsPWl3caQJnVKFaEyrZRP397v4JZVG0e7s16AxA==",
       "dev": true,
       "requires": {
         "bluebird-lst": "^1.0.9",
-        "builder-util": "~21.1.1",
+        "builder-util": "~21.2.0",
         "builder-util-runtime": "8.3.0",
         "chalk": "^2.4.2",
         "fs-extra": "^8.1.0",
@@ -5151,23 +5515,6 @@
         "mime": "^2.4.4"
       },
       "dependencies": {
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-          "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
-          "dev": true
-        },
         "mime": {
           "version": "2.4.4",
           "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
@@ -5177,9 +5524,9 @@
       }
     },
     "electron-to-chromium": {
-      "version": "1.3.199",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.199.tgz",
-      "integrity": "sha512-gachlDdHSK47s0N2e58GH9HMC6Z4ip0SfmYUa5iEbE50AKaOUXysaJnXMfKj0xB245jWbYcyFSH+th3rqsF8hA==",
+      "version": "1.3.252",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.252.tgz",
+      "integrity": "sha512-NWJ5TztDnjExFISZHFwpoJjMbLUifsNBnx7u2JI0gCw6SbKyQYYWWtBHasO/jPtHym69F4EZuTpRNGN11MT/jg==",
       "dev": true
     },
     "elementtree": {
@@ -5198,9 +5545,9 @@
       }
     },
     "elliptic": {
-      "version": "6.5.0",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz",
-      "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==",
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz",
+      "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==",
       "dev": true,
       "requires": {
         "bn.js": "^4.4.0",
@@ -5213,9 +5560,9 @@
       }
     },
     "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
       "dev": true
     },
     "emojis-list": {
@@ -5510,9 +5857,9 @@
       }
     },
     "eventemitter3": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
-      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+      "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
       "dev": true
     },
     "events": {
@@ -6133,9 +6480,9 @@
           "dev": true
         },
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         }
       }
@@ -6172,22 +6519,28 @@
       }
     },
     "follow-redirects": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz",
-      "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==",
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.8.1.tgz",
+      "integrity": "sha512-micCIbldHioIegeKs41DoH0KS3AXfFzgS30qVkM6z/XOE/GJgvmsoc839NUqa1B9udYe9dQxgv7KFwng6+p/dw==",
       "dev": true,
       "requires": {
-        "debug": "=3.1.0"
+        "debug": "^3.0.0"
       },
       "dependencies": {
         "debug": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "version": "3.2.6",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "ms": "^2.1.1"
           }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "dev": true
         }
       }
     },
@@ -7353,6 +7706,18 @@
         }
       }
     },
+    "http-proxy-middleware": {
+      "version": "0.19.1",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "dev": true,
+      "requires": {
+        "http-proxy": "^1.17.0",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.11",
+        "micromatch": "^3.1.10"
+      }
+    },
     "http-signature": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -7506,60 +7871,6 @@
       "requires": {
         "pkg-dir": "^3.0.0",
         "resolve-cwd": "^2.0.0"
-      },
-      "dependencies": {
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
-          "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
-        "pkg-dir": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
-          "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
-          "dev": true,
-          "requires": {
-            "find-up": "^3.0.0"
-          }
-        }
       }
     },
     "imurmurhash": {
@@ -7583,6 +7894,12 @@
       "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
       "dev": true
     },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "dev": true
+    },
     "inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -7728,6 +8045,16 @@
         }
       }
     },
+    "internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+      "dev": true,
+      "requires": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      }
+    },
     "invariant": {
       "version": "2.2.4",
       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -7771,6 +8098,12 @@
         "is-windows": "^1.0.1"
       }
     },
+    "is-absolute-url": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.1.tgz",
+      "integrity": "sha512-c2QjUwuMxLsld90sj3xYzpFYWJtuxkIn1f5ua9RTEYJt/vV2IsM+Py00/6qjV7qExgifUvt7qfyBGBBKm+2iBg==",
+      "dev": true
+    },
     "is-accessor-descriptor": {
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
@@ -7898,13 +8231,10 @@
       }
     },
     "is-fullwidth-code-point": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-      "dev": true,
-      "requires": {
-        "number-is-nan": "^1.0.0"
-      }
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "dev": true
     },
     "is-glob": {
       "version": "4.0.0",
@@ -7963,21 +8293,6 @@
       "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
       "dev": true
     },
-    "is-path-cwd": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
-      "dev": true
-    },
-    "is-path-in-cwd": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
-      "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
-      "dev": true,
-      "requires": {
-        "is-path-inside": "^1.0.0"
-      }
-    },
     "is-path-inside": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
@@ -8103,13 +8418,10 @@
       "dev": true
     },
     "isbinaryfile": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
-      "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
-      "dev": true,
-      "requires": {
-        "buffer-alloc": "^1.2.0"
-      }
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.2.tgz",
+      "integrity": "sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ==",
+      "dev": true
     },
     "isexe": {
       "version": "2.0.0",
@@ -8181,9 +8493,9 @@
           },
           "dependencies": {
             "semver": {
-              "version": "5.7.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-              "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+              "version": "5.7.1",
+              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+              "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
               "dev": true
             }
           }
@@ -8195,9 +8507,9 @@
           "dev": true
         },
         "semver": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
-          "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         }
       }
@@ -8313,9 +8625,9 @@
           "dev": true
         },
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         }
       }
@@ -8370,19 +8682,10 @@
           "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
           "dev": true
         },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
         "source-map": {
@@ -8622,9 +8925,9 @@
       }
     },
     "karma": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-4.2.0.tgz",
-      "integrity": "sha512-fmCuxN1rwJxTdZfOXK5LjlmS4Ana/OvzNMpkyLL/TLE8hmgSkpVpMYQ7RTVa8TNKRVQDZNl5W1oF5cfKfgIMlA==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/karma/-/karma-4.3.0.tgz",
+      "integrity": "sha512-NSPViHOt+RW38oJklvYxQC4BSQsv737oQlr/r06pCM+slDOr4myuI1ivkRmp+3dVpJDfZt2DmaPJ2wkx+ZZuMQ==",
       "dev": true,
       "requires": {
         "bluebird": "^3.3.0",
@@ -8641,7 +8944,7 @@
         "graceful-fs": "^4.1.2",
         "http-proxy": "^1.13.0",
         "isbinaryfile": "^3.0.0",
-        "lodash": "^4.17.11",
+        "lodash": "^4.17.14",
         "log4js": "^4.0.0",
         "mime": "^2.3.1",
         "minimatch": "^3.0.2",
@@ -8657,9 +8960,9 @@
       },
       "dependencies": {
         "anymatch": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz",
-          "integrity": "sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==",
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz",
+          "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==",
           "dev": true,
           "requires": {
             "normalize-path": "^3.0.0",
@@ -8697,12 +9000,6 @@
             "readdirp": "^3.1.1"
           }
         },
-        "core-js": {
-          "version": "3.1.4",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz",
-          "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==",
-          "dev": true
-        },
         "fill-range": {
           "version": "7.0.1",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -8752,8 +9049,17 @@
           "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
           "dev": true
         },
-        "mime": {
-          "version": "2.4.4",
+        "isbinaryfile": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+          "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+          "dev": true,
+          "requires": {
+            "buffer-alloc": "^1.2.0"
+          }
+        },
+        "mime": {
+          "version": "2.4.4",
           "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
           "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
           "dev": true
@@ -8765,23 +9071,14 @@
           "dev": true
         },
         "readdirp": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.1.tgz",
-          "integrity": "sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ==",
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz",
+          "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==",
           "dev": true,
           "requires": {
             "picomatch": "^2.0.4"
           }
         },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -8800,9 +9097,9 @@
       }
     },
     "karma-chrome-launcher": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.0.0.tgz",
-      "integrity": "sha512-u/PnVgDOP97AUe/gJeABlC6Wa6aQ83MZsm0JgsJQ5bGQ9XcXON/7b2aRhl59A62Zom+q3PFveBkczc7E1RT7TA==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
+      "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
       "dev": true,
       "requires": {
         "which": "^1.2.1"
@@ -8829,9 +9126,9 @@
       }
     },
     "karma-coverage-istanbul-reporter": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz",
-      "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.0.tgz",
+      "integrity": "sha512-UH0mXPJFJyK5uiK7EkwGtQ8f30lCBAfqRResnZ4pzLJ04SOp4SPlYkmwbbZ6iVJ6sQFVzlDUXlntBEsLRdgZpg==",
       "dev": true,
       "requires": {
         "istanbul-api": "^2.1.6",
@@ -9297,13 +9594,13 @@
       "dev": true
     },
     "make-fetch-happen": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.2.tgz",
-      "integrity": "sha512-YMJrAjHSb/BordlsDEcVcPyTbiJKkzqMf48N8dAJZT9Zjctrkb6Yg4TY9Sq2AwSIQJFn5qBBKVTYt3vP5FMIHA==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.0.tgz",
+      "integrity": "sha512-nFr/vpL1Jc60etMVKeaLOqfGjMMb3tAHFVJWxHOFCFS04Zmd7kGlMxo0l1tzfhoQje0/UPnd0X8OeGUiXXnfPA==",
       "dev": true,
       "requires": {
         "agentkeepalive": "^3.4.1",
-        "cacache": "^11.3.3",
+        "cacache": "^12.0.0",
         "http-cache-semantics": "^3.8.1",
         "http-proxy-agent": "^2.1.0",
         "https-proxy-agent": "^2.2.1",
@@ -9315,6 +9612,43 @@
         "ssri": "^6.0.0"
       },
       "dependencies": {
+        "cacache": {
+          "version": "12.0.3",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
+          "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.4",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+          "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
         "lru-cache": {
           "version": "5.1.1",
           "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -9568,26 +9902,6 @@
         "normalize-url": "1.9.1",
         "schema-utils": "^1.0.0",
         "webpack-sources": "^1.1.0"
-      },
-      "dependencies": {
-        "normalize-url": {
-          "version": "1.9.1",
-          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
-          "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
-          "dev": true,
-          "requires": {
-            "object-assign": "^4.0.1",
-            "prepend-http": "^1.0.0",
-            "query-string": "^4.1.0",
-            "sort-keys": "^1.0.0"
-          }
-        },
-        "prepend-http": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-          "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
-          "dev": true
-        }
       }
     },
     "minimalistic-assert": {
@@ -9617,9 +9931,9 @@
       "dev": true
     },
     "minipass": {
-      "version": "2.3.5",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz",
-      "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.5.0.tgz",
+      "integrity": "sha512-9FwMVYhn6ERvMR8XFdOavRz4QK/VJV8elU1x50vYexf9lslDcWe/f4HBRxCPd185ekRSjU6CfYyJCECa/CQy7Q==",
       "dev": true,
       "requires": {
         "safe-buffer": "^5.1.2",
@@ -9744,17 +10058,6 @@
         "mkdirp": "^0.5.1",
         "rimraf": "^2.5.4",
         "run-queue": "^1.0.3"
-      },
-      "dependencies": {
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        }
       }
     },
     "ms": {
@@ -9859,9 +10162,9 @@
       }
     },
     "ngx-webstorage-service": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/ngx-webstorage-service/-/ngx-webstorage-service-4.0.1.tgz",
-      "integrity": "sha512-hSWmwnj+hHBdwMZDeFbJjzXKUrJMw86B3l74cb6LePM97Vu8D62MTOPj2+ABB5NMIkUhxgO1E27ih/zhrEd9Fg==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ngx-webstorage-service/-/ngx-webstorage-service-4.1.0.tgz",
+      "integrity": "sha512-t0aO4X8rqesLqypU8ZK2W7xGVbpi/z7u/Xg7qhnLoKVauI29NFzdKxV2oaYZmpkxIpgdbLSsIfklkjgxIM0IFA==",
       "requires": {
         "tslib": "^1.9.0"
       }
@@ -9928,9 +10231,9 @@
       }
     },
     "node-releases": {
-      "version": "1.1.25",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.25.tgz",
-      "integrity": "sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ==",
+      "version": "1.1.29",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.29.tgz",
+      "integrity": "sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==",
       "dev": true,
       "requires": {
         "semver": "^5.3.0"
@@ -9974,10 +10277,16 @@
       "dev": true
     },
     "normalize-url": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz",
-      "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==",
-      "dev": true
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+      "dev": true,
+      "requires": {
+        "object-assign": "^4.0.1",
+        "prepend-http": "^1.0.0",
+        "query-string": "^4.1.0",
+        "sort-keys": "^1.0.0"
+      }
     },
     "npm-bundled": {
       "version": "1.0.6",
@@ -10019,16 +10328,16 @@
       }
     },
     "npm-registry-fetch": {
-      "version": "3.9.1",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.1.tgz",
-      "integrity": "sha512-VQCEZlydXw4AwLROAXWUR7QDfe2Y8Id/vpAgp6TI1/H78a4SiQ1kQrKZALm5/zxM5n4HIi+aYb+idUAV/RuY0Q==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz",
+      "integrity": "sha512-Jllq35Jag8dtv0M17ue74XtdQTyqKzuAYGiX9mAjOhkmNjib3bBUgK6mUY61+AHnXeSRobQkpY3/xIOS/omptw==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.3.4",
         "bluebird": "^3.5.1",
         "figgy-pudding": "^3.4.1",
         "lru-cache": "^5.1.1",
-        "make-fetch-happen": "^4.0.2",
+        "make-fetch-happen": "^5.0.0",
         "npm-package-arg": "^6.1.0"
       },
       "dependencies": {
@@ -10380,9 +10689,9 @@
       "dev": true
     },
     "p-limit": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
-      "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+      "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
       "dev": true,
       "requires": {
         "p-try": "^2.0.0"
@@ -10397,6 +10706,12 @@
         "p-limit": "^2.0.0"
       }
     },
+    "p-map": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+      "dev": true
+    },
     "p-retry": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
@@ -10404,14 +10719,6 @@
       "dev": true,
       "requires": {
         "retry": "^0.12.0"
-      },
-      "dependencies": {
-        "retry": {
-          "version": "0.12.0",
-          "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-          "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
-          "dev": true
-        }
       }
     },
     "p-try": {
@@ -10421,38 +10728,49 @@
       "dev": true
     },
     "package-json": {
-      "version": "6.4.0",
-      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.4.0.tgz",
-      "integrity": "sha512-bd1T8OBG7hcvMd9c/udgv6u5v9wISP3Oyl9Cm7Weop8EFwrtcQDnS2sb6zhwqus2WslSr5wSTIPiTTpxxmPm7Q==",
+      "version": "6.5.0",
+      "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
       "dev": true,
       "requires": {
         "got": "^9.6.0",
-        "registry-auth-token": "^3.4.0",
+        "registry-auth-token": "^4.0.0",
         "registry-url": "^5.0.0",
-        "semver": "^6.1.1"
+        "semver": "^6.2.0"
       },
       "dependencies": {
+        "registry-auth-token": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.0.0.tgz",
+          "integrity": "sha512-lpQkHxd9UL6tb3k/aHAVfnVtn+Bcs9ob5InuFLLEDqSqeq+AljB8GZW9xY0x7F+xYwEcjKe07nyoxzEYz6yvkw==",
+          "dev": true,
+          "requires": {
+            "rc": "^1.2.8",
+            "safe-buffer": "^5.0.1"
+          }
+        },
         "semver": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
-          "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         }
       }
     },
     "pacote": {
-      "version": "9.5.1",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.1.tgz",
-      "integrity": "sha512-Zqvczvf/zZ7QNosdE9uTC7SRuvSs9tFqRkF6cJl+2HH7COBnx4BRAGpeXJlrbN+mM0CMHpbi620xdEHhCflghA==",
+      "version": "9.5.5",
+      "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz",
+      "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==",
       "dev": true,
       "requires": {
         "bluebird": "^3.5.3",
-        "cacache": "^11.3.2",
+        "cacache": "^12.0.2",
         "figgy-pudding": "^3.5.1",
         "get-stream": "^4.1.0",
         "glob": "^7.1.3",
+        "infer-owner": "^1.0.4",
         "lru-cache": "^5.1.1",
-        "make-fetch-happen": "^4.0.1",
+        "make-fetch-happen": "^5.0.0",
         "minimatch": "^3.0.4",
         "minipass": "^2.3.5",
         "mississippi": "^3.0.0",
@@ -10461,7 +10779,7 @@
         "npm-package-arg": "^6.1.0",
         "npm-packlist": "^1.1.12",
         "npm-pick-manifest": "^2.2.3",
-        "npm-registry-fetch": "^3.8.0",
+        "npm-registry-fetch": "^4.0.0",
         "osenv": "^0.1.5",
         "promise-inflight": "^1.0.1",
         "promise-retry": "^1.1.1",
@@ -10475,6 +10793,45 @@
         "which": "^1.3.1"
       },
       "dependencies": {
+        "cacache": {
+          "version": "12.0.3",
+          "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz",
+          "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==",
+          "dev": true,
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          },
+          "dependencies": {
+            "glob": {
+              "version": "7.1.4",
+              "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
+              "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
+              "dev": true,
+              "requires": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.0.4",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+              }
+            }
+          }
+        },
         "get-stream": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@@ -10493,19 +10850,10 @@
             "yallist": "^3.0.2"
           }
         },
-        "rimraf": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-          "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-          "dev": true,
-          "requires": {
-            "glob": "^7.1.3"
-          }
-        },
         "semver": {
-          "version": "5.7.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-          "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
           "dev": true
         },
         "yallist": {
@@ -10563,15 +10911,6 @@
         "safe-buffer": "^5.1.1"
       }
     },
-    "parse-color": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz",
-      "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=",
-      "dev": true,
-      "requires": {
-        "color-convert": "~0.5.0"
-      }
-    },
     "parse-json": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@@ -10852,9 +11191,9 @@
       "dev": true
     },
     "portfinder": {
-      "version": "1.0.21",
-      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.21.tgz",
-      "integrity": "sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==",
+      "version": "1.0.23",
+      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.23.tgz",
+      "integrity": "sha512-B729mL/uLklxtxuiJKfQ84WPxNw5a7Yhx3geQZdcA4GjNjZSTSSMMWyoennMVnTWSmAR0lMdzWYN0JLnHrg1KQ==",
       "dev": true,
       "requires": {
         "async": "^1.5.2",
@@ -10942,9 +11281,9 @@
       "dev": true
     },
     "prepend-http": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
-      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
       "dev": true
     },
     "pretty-bytes": {
@@ -10958,9 +11297,9 @@
       }
     },
     "primeng": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/primeng/-/primeng-8.0.1.tgz",
-      "integrity": "sha512-87HQEh+S4lm4r280Thlk3pHzJJ1lr4Dl82zidnfWeOBZ5lMbK2w9w9yKJH875aPKWs0MMDVZeQ5V9jMWolRjlA=="
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/primeng/-/primeng-8.0.2.tgz",
+      "integrity": "sha512-MCY2oYXt0TLqDHcuMD2yqe/pg7OCCTvK/szqInkhXn8a76KA0yLDmm+hF+gaH/xQShqnYuazb23GlYVZi8zFDQ=="
     },
     "printj": {
       "version": "1.1.2",
@@ -11072,6 +11411,14 @@
       "requires": {
         "err-code": "^1.0.0",
         "retry": "^0.10.0"
+      },
+      "dependencies": {
+        "retry": {
+          "version": "0.10.1",
+          "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
+          "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
+          "dev": true
+        }
       }
     },
     "promzard": {
@@ -11120,7 +11467,7 @@
         "selenium-webdriver": "3.6.0",
         "source-map-support": "~0.4.0",
         "webdriver-js-extender": "2.1.0",
-        "webdriver-manager": "^12.0.6"
+        "webdriver-manager": "^12.1.6"
       },
       "dependencies": {
         "ansi-styles": {
@@ -11157,13 +11504,19 @@
             "rimraf": "^2.2.8"
           },
           "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-              "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+            "is-path-cwd": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+              "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+              "dev": true
+            },
+            "is-path-in-cwd": {
+              "version": "1.0.1",
+              "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+              "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
               "dev": true,
               "requires": {
-                "glob": "^7.1.3"
+                "is-path-inside": "^1.0.0"
               }
             }
           }
@@ -11216,9 +11569,9 @@
           "dev": true
         },
         "webdriver-manager": {
-          "version": "12.1.1",
-          "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz",
-          "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==",
+          "version": "12.1.6",
+          "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.6.tgz",
+          "integrity": "sha512-B1mOycNCrbk7xODw7Jgq/mdD3qzPxMaTsnKIQDy2nXlQoyjTrJTTD0vRpEZI9b8RibPEyQvh9zIZ0M1mpOxS3w==",
           "dev": true,
           "requires": {
             "adm-zip": "^0.4.9",
@@ -11234,14 +11587,11 @@
             "xml2js": "^0.4.17"
           },
           "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-              "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
+            "adm-zip": {
+              "version": "0.4.13",
+              "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz",
+              "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==",
+              "dev": true
             }
           }
         }
@@ -11454,15 +11804,6 @@
             "toidentifier": "1.0.0"
           }
         },
-        "iconv-lite": {
-          "version": "0.4.24",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-          "dev": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3"
-          }
-        },
         "setprototypeof": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
@@ -11552,13 +11893,11 @@
       }
     },
     "read-config-file": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-4.0.1.tgz",
-      "integrity": "sha512-5caED3uo2IAZMPcbh/9hx/O29s2430RLxtnFDdzxpH/epEpawOrQnGBHueotIXUrGPPIgdNQN+S/CIp2WmiSfw==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.0.tgz",
+      "integrity": "sha512-jIKUu+C84bfnKxyJ5j30CxCqgXWYjZLXuVE/NYlMEpeni+dhESgAeZOZd0JZbg1xTkMmnCdxksDoarkOyfEsOg==",
       "dev": true,
       "requires": {
-        "ajv": "^6.10.1",
-        "ajv-keywords": "^3.4.1",
         "dotenv": "^8.0.0",
         "dotenv-expand": "^5.1.0",
         "fs-extra": "^8.1.0",
@@ -11567,35 +11906,6 @@
         "lazy-val": "^1.0.4"
       },
       "dependencies": {
-        "ajv": {
-          "version": "6.10.2",
-          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
-          "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
-          "dev": true,
-          "requires": {
-            "fast-deep-equal": "^2.0.1",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.4.1",
-            "uri-js": "^4.2.2"
-          }
-        },
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-          "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
-          "dev": true
-        },
         "json5": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
@@ -11973,9 +12283,9 @@
       "dev": true
     },
     "retry": {
-      "version": "0.10.1",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz",
-      "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=",
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
       "dev": true
     },
     "rfdc": {
@@ -11984,6 +12294,15 @@
       "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==",
       "dev": true
     },
+    "rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "dev": true,
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
     "ripemd160": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
@@ -12018,9 +12337,9 @@
       }
     },
     "rxjs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
-      "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
+      "version": "6.5.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz",
+      "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==",
       "requires": {
         "tslib": "^1.9.0"
       }
@@ -12047,9 +12366,9 @@
       "dev": true
     },
     "sanitize-filename": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz",
-      "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=",
+      "version": "1.6.3",
+      "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
+      "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
       "dev": true,
       "requires": {
         "truncate-utf8-bytes": "^1.0.0"
@@ -12105,9 +12424,9 @@
       }
     },
     "screenfull": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-4.2.0.tgz",
-      "integrity": "sha512-qpyI9XbwuMJElWRP5vTgxkFAl4k7HpyhIqBFOZEwX9QBXn0MAuRSpn7LOc6/4CeSwoz61oBu1VPV+2fbIWC+5Q=="
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-4.2.1.tgz",
+      "integrity": "sha512-PLSp6f5XdhvjCCCO8OjavRfzkSGL3Qmdm7P82bxyU8HDDDBhDV3UckRaYcRa/NDNTYt8YBpzjoLWHUAejmOjLg=="
     },
     "select": {
       "version": "1.1.2",
@@ -12261,9 +12580,9 @@
       }
     },
     "serialize-javascript": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz",
-      "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.0.tgz",
+      "integrity": "sha512-UkGlcYMtw4d9w7YfCtJFgdRTps8N4L0A48R+SmcGL57ki1+yHwJXnalk5bjgrw+ljv6SfzjzPjhohod2qllg/Q==",
       "dev": true
     },
     "serve-index": {
@@ -12403,6 +12722,28 @@
       "dev": true,
       "requires": {
         "string-width": "^1.0.1"
+      },
+      "dependencies": {
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        }
       }
     },
     "slash": {
@@ -12799,9 +13140,9 @@
       "dev": true
     },
     "spdy": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz",
-      "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
+      "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
       "dev": true,
       "requires": {
         "debug": "^4.1.0",
@@ -13114,14 +13455,30 @@
       "dev": true
     },
     "string-width": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
       "dev": true,
       "requires": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+          "dev": true
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
       }
     },
     "string.prototype.codepointat": {
@@ -13361,25 +13718,6 @@
       "requires": {
         "async-exit-hook": "^2.0.1",
         "fs-extra": "^8.1.0"
-      },
-      "dependencies": {
-        "fs-extra": {
-          "version": "8.1.0",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-          "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-          "dev": true,
-          "requires": {
-            "graceful-fs": "^4.2.0",
-            "jsonfile": "^4.0.0",
-            "universalify": "^0.1.0"
-          }
-        },
-        "graceful-fs": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
-          "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==",
-          "dev": true
-        }
       }
     },
     "term-size": {
@@ -13420,9 +13758,9 @@
       }
     },
     "terser": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-4.1.2.tgz",
-      "integrity": "sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.2.1.tgz",
+      "integrity": "sha512-cGbc5utAcX4a9+2GGVX4DsenG6v0x3glnDi5hx8816X1McEAwPlPgRtXPJzSBsbpILxZ8MQMT0KvArLuE0HP5A==",
       "dev": true,
       "requires": {
         "commander": "^2.20.0",
@@ -13437,9 +13775,9 @@
           "dev": true
         },
         "source-map-support": {
-          "version": "0.5.12",
-          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
-          "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
+          "version": "0.5.13",
+          "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+          "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
           "dev": true,
           "requires": {
             "buffer-from": "^1.0.0",
@@ -13514,9 +13852,9 @@
       "dev": true
     },
     "timers-browserify": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
-      "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+      "version": "2.0.11",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
+      "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
       "dev": true,
       "requires": {
         "setimmediate": "^1.0.4"
@@ -13755,9 +14093,9 @@
       "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
     },
     "tslint": {
-      "version": "5.18.0",
-      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.18.0.tgz",
-      "integrity": "sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w==",
+      "version": "5.19.0",
+      "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.19.0.tgz",
+      "integrity": "sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -13815,9 +14153,9 @@
       }
     },
     "type-fest": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
-      "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==",
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz",
+      "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==",
       "dev": true
     },
     "type-is": {
@@ -13854,9 +14192,9 @@
       "dev": true
     },
     "typescript": {
-      "version": "3.4.5",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz",
-      "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==",
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz",
+      "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==",
       "dev": true
     },
     "uglify-js": {
@@ -14155,6 +14493,14 @@
       "dev": true,
       "requires": {
         "prepend-http": "^2.0.0"
+      },
+      "dependencies": {
+        "prepend-http": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+          "dev": true
+        }
       }
     },
     "use": {
@@ -14391,9 +14737,9 @@
       }
     },
     "webpack-dev-server": {
-      "version": "3.7.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz",
-      "integrity": "sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==",
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz",
+      "integrity": "sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==",
       "dev": true,
       "requires": {
         "ansi-html": "0.0.7",
@@ -14409,42 +14755,32 @@
         "import-local": "^2.0.0",
         "internal-ip": "^4.3.0",
         "ip": "^1.1.5",
+        "is-absolute-url": "^3.0.0",
         "killable": "^1.0.1",
         "loglevel": "^1.6.3",
         "opn": "^5.5.0",
         "p-retry": "^3.0.1",
-        "portfinder": "^1.0.20",
+        "portfinder": "^1.0.21",
         "schema-utils": "^1.0.0",
         "selfsigned": "^1.10.4",
-        "semver": "^6.1.1",
+        "semver": "^6.3.0",
         "serve-index": "^1.9.1",
         "sockjs": "0.3.19",
         "sockjs-client": "1.3.0",
-        "spdy": "^4.0.0",
+        "spdy": "^4.0.1",
         "strip-ansi": "^3.0.1",
         "supports-color": "^6.1.0",
         "url": "^0.11.0",
         "webpack-dev-middleware": "^3.7.0",
         "webpack-log": "^2.0.0",
+        "ws": "^6.2.1",
         "yargs": "12.0.5"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
-        },
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        },
         "chokidar": {
-          "version": "2.1.6",
-          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
-          "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
+          "version": "2.1.8",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+          "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
           "dev": true,
           "requires": {
             "anymatch": "^2.0.0",
@@ -14461,49 +14797,6 @@
             "upath": "^1.1.1"
           }
         },
-        "cliui": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
-          "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
-          "dev": true,
-          "requires": {
-            "string-width": "^2.1.1",
-            "strip-ansi": "^4.0.0",
-            "wrap-ansi": "^2.0.0"
-          },
-          "dependencies": {
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^3.0.0"
-              }
-            }
-          }
-        },
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "requires": {
-            "nice-try": "^1.0.4",
-            "path-key": "^2.0.1",
-            "semver": "^5.5.0",
-            "shebang-command": "^1.2.0",
-            "which": "^1.2.9"
-          },
-          "dependencies": {
-            "semver": {
-              "version": "5.7.0",
-              "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
-              "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
-              "dev": true
-            }
-          }
-        },
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -14513,179 +14806,6 @@
             "ms": "^2.1.1"
           }
         },
-        "default-gateway": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
-          "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
-          "dev": true,
-          "requires": {
-            "execa": "^1.0.0",
-            "ip-regex": "^2.1.0"
-          }
-        },
-        "del": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
-          "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
-          "dev": true,
-          "requires": {
-            "@types/glob": "^7.1.1",
-            "globby": "^6.1.0",
-            "is-path-cwd": "^2.0.0",
-            "is-path-in-cwd": "^2.0.0",
-            "p-map": "^2.0.0",
-            "pify": "^4.0.1",
-            "rimraf": "^2.6.3"
-          },
-          "dependencies": {
-            "rimraf": {
-              "version": "2.7.1",
-              "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-              "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-              "dev": true,
-              "requires": {
-                "glob": "^7.1.3"
-              }
-            }
-          }
-        },
-        "execa": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "requires": {
-            "cross-spawn": "^6.0.0",
-            "get-stream": "^4.0.0",
-            "is-stream": "^1.1.0",
-            "npm-run-path": "^2.0.0",
-            "p-finally": "^1.0.0",
-            "signal-exit": "^3.0.0",
-            "strip-eof": "^1.0.0"
-          }
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "globby": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-          "dev": true,
-          "requires": {
-            "array-union": "^1.0.1",
-            "glob": "^7.0.3",
-            "object-assign": "^4.0.1",
-            "pify": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
-          },
-          "dependencies": {
-            "pify": {
-              "version": "2.3.0",
-              "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-              "dev": true
-            }
-          }
-        },
-        "http-proxy-middleware": {
-          "version": "0.19.1",
-          "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
-          "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
-          "dev": true,
-          "requires": {
-            "http-proxy": "^1.17.0",
-            "is-glob": "^4.0.0",
-            "lodash": "^4.17.11",
-            "micromatch": "^3.1.10"
-          }
-        },
-        "internal-ip": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
-          "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
-          "dev": true,
-          "requires": {
-            "default-gateway": "^4.2.0",
-            "ipaddr.js": "^1.9.0"
-          }
-        },
-        "invert-kv": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
-          "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "is-path-cwd": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
-          "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
-          "dev": true
-        },
-        "is-path-in-cwd": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
-          "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
-          "dev": true,
-          "requires": {
-            "is-path-inside": "^2.1.0"
-          }
-        },
-        "is-path-inside": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
-          "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
-          "dev": true,
-          "requires": {
-            "path-is-inside": "^1.0.2"
-          }
-        },
-        "lcid": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
-          "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
-          "dev": true,
-          "requires": {
-            "invert-kv": "^2.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "mime": {
-          "version": "2.4.4",
-          "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
-          "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
-          "dev": true
-        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -14698,148 +14818,25 @@
           "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
           "dev": true
         },
-        "os-locale": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
-          "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
-          "dev": true,
-          "requires": {
-            "execa": "^1.0.0",
-            "lcid": "^2.0.0",
-            "mem": "^4.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
-          "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "p-map": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
-          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
-          "dev": true
-        },
-        "p-try": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-          "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-          "dev": true
-        },
-        "pify": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-          "dev": true
-        },
-        "pump": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-          "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-          "dev": true,
-          "requires": {
-            "end-of-stream": "^1.1.0",
-            "once": "^1.3.1"
-          }
-        },
-        "range-parser": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-          "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-          "dev": true
-        },
         "semver": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz",
-          "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==",
+          "version": "6.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
         },
-        "string-width": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-          "dev": true,
-          "requires": {
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^4.0.0"
-          },
-          "dependencies": {
-            "strip-ansi": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-              "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-              "dev": true,
-              "requires": {
-                "ansi-regex": "^3.0.0"
-              }
-            }
-          }
-        },
         "upath": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
-          "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==",
-          "dev": true
-        },
-        "webpack-dev-middleware": {
-          "version": "3.7.0",
-          "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz",
-          "integrity": "sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==",
-          "dev": true,
-          "requires": {
-            "memory-fs": "^0.4.1",
-            "mime": "^2.4.2",
-            "range-parser": "^1.2.1",
-            "webpack-log": "^2.0.0"
-          }
-        },
-        "which-module": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-          "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+          "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
           "dev": true
         },
-        "yargs": {
-          "version": "12.0.5",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
-          "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^4.0.0",
-            "decamelize": "^1.2.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^1.0.1",
-            "os-locale": "^3.0.0",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^1.0.1",
-            "set-blocking": "^2.0.0",
-            "string-width": "^2.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^3.2.1 || ^4.0.0",
-            "yargs-parser": "^11.1.1"
-          }
-        },
-        "yargs-parser": {
-          "version": "11.1.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
-          "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
+        "ws": {
+          "version": "6.2.1",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+          "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
           "dev": true,
           "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
+            "async-limiter": "~1.0.0"
           }
         }
       }
@@ -15078,6 +15075,28 @@
       "requires": {
         "string-width": "^1.0.1",
         "strip-ansi": "^3.0.1"
+      },
+      "dependencies": {
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        }
       }
     },
     "wrappy": {
@@ -15114,9 +15133,9 @@
       "dev": true
     },
     "xlsx": {
-      "version": "0.14.4",
-      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.14.4.tgz",
-      "integrity": "sha512-AYVNzZKmU9pxDf4d6dSOy52EivzRnJ5lo0Jyxqk7Pz5G+8dMCUsO1PdFlGj6C6MQZ8xBRPinmIpTHYzI2DyfXg==",
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.14.5.tgz",
+      "integrity": "sha512-s/5f4/mjeWREmIWZ+HtDfh/rnz51ar+dZ4LWKZU3u9VBx2zLdSIWTdXgoa52/pnZ9Oe/Vu1W1qzcKzLVe+lq4w==",
       "requires": {
         "adler-32": "~1.2.0",
         "cfb": "^1.1.2",
@@ -15187,86 +15206,33 @@
       "dev": true
     },
     "yargs": {
-      "version": "13.1.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz",
-      "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==",
+      "version": "12.0.5",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
+      "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
       "dev": true,
       "requires": {
         "cliui": "^4.0.0",
+        "decamelize": "^1.2.0",
         "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
-        "os-locale": "^3.1.0",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^3.0.0",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
+        "require-main-filename": "^1.0.1",
         "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
+        "string-width": "^2.0.0",
         "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "get-caller-file": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-          "dev": true
-        },
-        "is-fullwidth-code-point": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-          "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-          "dev": true
-        },
-        "require-main-filename": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
+        "y18n": "^3.2.1 || ^4.0.0",
+        "yargs-parser": "^11.1.1"
       }
     },
     "yargs-parser": {
-      "version": "13.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
-      "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
+      "version": "11.1.1",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
+      "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
       "dev": true,
       "requires": {
         "camelcase": "^5.0.0",
         "decamelize": "^1.2.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "5.3.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-          "dev": true
-        }
       }
     },
     "yauzl": {
diff --git a/package.json b/package.json
index 2fd54de46848af8a57f2a43cb6b07ea46290eb5d..43c683940468a842409e1f3c384d75ae51b186a2 100644
--- a/package.json
+++ b/package.json
@@ -29,26 +29,26 @@
   },
   "private": true,
   "dependencies": {
-    "@angular/animations": "^8.1.2",
-    "@angular/cdk": "^8.1.3",
-    "@angular/common": "^8.1.2",
-    "@angular/compiler": "^8.1.2",
-    "@angular/core": "^8.1.2",
-    "@angular/flex-layout": "^8.0.0-beta.26",
-    "@angular/forms": "^8.1.2",
-    "@angular/material": "^8.1.3",
-    "@angular/platform-browser": "^8.1.2",
-    "@angular/platform-browser-dynamic": "^8.1.2",
-    "@angular/router": "^8.1.2",
+    "@angular/animations": "^8.2.4",
+    "@angular/cdk": "^8.1.4",
+    "@angular/common": "^8.2.4",
+    "@angular/compiler": "^8.2.4",
+    "@angular/core": "^8.2.4",
+    "@angular/flex-layout": "^8.0.0-beta.27",
+    "@angular/forms": "^8.2.4",
+    "@angular/material": "^8.1.4",
+    "@angular/platform-browser": "^8.2.4",
+    "@angular/platform-browser-dynamic": "^8.2.4",
+    "@angular/router": "^8.2.4",
     "@types/pako": "^1.0.1",
     "@types/sprintf-js": "^1.1.2",
     "angular2-chartjs": "^0.5.1",
-    "angular2-hotkeys": "^2.1.4",
+    "angular2-hotkeys": "^2.1.5",
     "chartjs-plugin-zoom": "^0.7.3",
     "cordova-android": "^8.0.0",
     "cordova-plugin-device": "^2.0.3",
     "cordova-plugin-whitelist": "^1.3.4",
-    "core-js": "^3.1.4",
+    "core-js": "^3.2.1",
     "file-saver": "^2.0.2",
     "hammerjs": "^2.0.8",
     "he": "^1.2.0",
@@ -58,44 +58,44 @@
     "ngx-konami": "^1.6.0",
     "ngx-material-file-input": "^1.1.1",
     "ngx-md": "^8.0.0",
-    "ngx-webstorage-service": "^4.0.1",
+    "ngx-webstorage-service": "^4.1.0",
     "pako": "^1.0.10",
-    "primeng": "^8.0.1",
+    "primeng": "^8.0.2",
     "roboto-fontface": "^0.10.0",
-    "rxjs": "^6.5.2",
-    "screenfull": "^4.2.0",
+    "rxjs": "^6.5.3",
+    "screenfull": "^4.2.1",
     "tslib": "^1.10.0",
-    "xlsx": "^0.14.4",
+    "xlsx": "^0.14.5",
     "zone.js": "~0.9.1"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "^0.801.2",
-    "@angular/cli": "^8.1.2",
-    "@angular/compiler-cli": "^8.1.2",
-    "@angular/language-service": "^8.1.2",
+    "@angular-devkit/build-angular": "^0.801.3",
+    "@angular/cli": "^8.3.2",
+    "@angular/compiler-cli": "^8.2.4",
+    "@angular/language-service": "^8.2.4",
     "@compodoc/compodoc": "^1.1.10",
     "@types/file-saver": "^2.0.1",
-    "@types/jasmine": "^3.3.14",
+    "@types/jasmine": "^3.4.0",
     "@types/jasminewd2": "^2.0.6",
-    "@types/node": "^12.6.8",
+    "@types/node": "^12.7.4",
     "codelyzer": "^5.0.1",
     "cordova": "^9.0.0",
-    "electron": "^5.0.7",
-    "electron-builder": "^21.1.1",
+    "electron": "^5.0.10",
+    "electron-builder": "^21.2.0",
     "fs-extra": "^8.1.0",
     "jasmine-core": "^3.4.0",
     "jasmine-spec-reporter": "~4.2.1",
-    "karma": "^4.2.0",
-    "karma-chrome-launcher": "^3.0.0",
+    "karma": "^4.3.0",
+    "karma-chrome-launcher": "^3.1.0",
     "karma-cli": "~2.0.0",
-    "karma-coverage-istanbul-reporter": "^2.0.6",
+    "karma-coverage-istanbul-reporter": "^2.1.0",
     "karma-jasmine": "^2.0.1",
     "karma-jasmine-html-reporter": "^1.4.2",
     "protractor": "^5.4.2",
     "ts-node": "^8.3.0",
-    "tslint": "^5.18.0",
-    "typescript": "^3.4.5",
-    "webpack-dev-server": "^3.7.2"
+    "tslint": "^5.19.0",
+    "typescript": "^3.5.3",
+    "webpack-dev-server": "^3.8.0"
   },
   "cordova": {
     "plugins": {
diff --git a/protractor.conf.js b/protractor.conf.js
index 4c1db58bb4df2a13d103f8cff50e398cfb8af244..6c546c716abefb1a23c5b94b4a3228151b64cff8 100644
--- a/protractor.conf.js
+++ b/protractor.conf.js
@@ -16,7 +16,7 @@ exports.config = {
   capabilities: {
     browserName: 'chrome',
     chromeOptions: {
-      // args: [ "--headless", "--window-size=1024x768" ],
+      args: [ "--headless", "--window-size=1024x768" ],
       prefs: {
         download: {
             prompt_for_download: false, 
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 26158718f4ca443d0d91d523784d5c6df4e0f9f7..9b3247c78e0c9126d747327aa76a929a2da7978b 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -85,8 +85,10 @@ import { ParamLinkComponent } from "./components/param-link/param-link.component
 import { SelectModelFieldLineComponent } from "./components/select-model-field-line/select-model-field-line.component";
 import { PabProfileGraphComponent } from "./components/pab-profile-graph/pab-profile-graph.component";
 import { PabTableComponent } from "./components/pab-table/pab-table.component";
-import { PabVariableResultsSelectorComponent } from "./components/pab-results/pab-variable-results-selector.component";
+import { VariableResultsSelectorComponent } from "./components/variable-results-selector/variable-results-selector.component";
 import { QuicknavComponent } from "./components/quicknav/quicknav.component";
+import { MacrorugoCompoundResultsTableComponent } from "./components/macrorugo-compound-results/macrorugo-compound-results-table.component";
+import { MacrorugoCompoundResultsComponent } from "./components/macrorugo-compound-results/macrorugo-compound-results.component";
 
 import { DialogConfirmEmptySessionComponent } from "./components/dialog-confirm-empty-session/dialog-confirm-empty-session.component";
 import { DialogConfirmCloseCalcComponent } from "./components/dialog-confirm-close-calc/dialog-confirm-close-calc.component";
@@ -196,7 +198,9 @@ const appRoutes: Routes = [
     PabResultsComponent,
     PabResultsTableComponent,
     PabTableComponent,
-    PabVariableResultsSelectorComponent,
+    VariableResultsSelectorComponent,
+    MacrorugoCompoundResultsComponent,
+    MacrorugoCompoundResultsTableComponent,
     ParamComputedComponent,
     ParamFieldLineComponent,
     ParamLinkComponent,
diff --git a/src/app/calculators/macrorugo-compound/macrorugo-compound.config.json b/src/app/calculators/macrorugo-compound/macrorugo-compound.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..5f9ef98981e53428f048194be3596b6d15b242be
--- /dev/null
+++ b/src/app/calculators/macrorugo-compound/macrorugo-compound.config.json
@@ -0,0 +1,64 @@
+[
+    {
+        "id": "fs_hydraulique",
+        "type": "fieldset",
+        "fields": [
+            "Z1",
+            "DH"
+        ]
+    },
+    {
+        "id": "fs_pass",
+        "type": "fieldset",
+        "fields": [
+            "If",
+            "Ks",
+            "C"
+        ]
+    },
+    {
+        "id": "fs_bloc",
+        "type": "fieldset",
+        "fields": [
+            "PBD",
+            "PBH",
+            "Cd0"
+        ]
+    },
+    {
+        "id": "fs_pass_type",
+        "type": "fieldset",
+        "fields": [
+            {
+                "id": "select_pass_type",
+                "type": "select",
+                "source": "mrc_pass_type"
+            },
+            "ZRL",
+            "ZRR",
+            "BR"
+        ]
+    },
+    {
+        "id": "fs_macrorugo",
+        "type": "fieldset_template",
+        "calcType": "MacroRugo",
+        "fields": [
+            "ZF1",
+            "B"
+        ]
+    },
+    {
+        "id": "macrorugo_container",
+        "type": "template_container",
+        "templates": [
+            "fs_macrorugo"
+        ]
+    },
+    {
+        "type": "options",
+        "idCal": "Q",
+        "apronTypeSelectId": "select_pass_type",
+        "help": "pam/macrorugo-compound"
+    }
+]
\ No newline at end of file
diff --git a/src/app/calculators/macrorugo-compound/macrorugo-compound.en.json b/src/app/calculators/macrorugo-compound/macrorugo-compound.en.json
new file mode 100644
index 0000000000000000000000000000000000000000..6d94fcc83decc78297f4ecb7fc6825243d655afb
--- /dev/null
+++ b/src/app/calculators/macrorugo-compound/macrorugo-compound.en.json
@@ -0,0 +1,33 @@
+{
+    "fs_hydraulique": "Hydraulic parameters",
+    "fs_pass": "Fish pass parameters",
+    "fs_bloc": "Blocks parameters",
+    "fs_pass_type": "Pass type",
+    "macrorugo_container": "Aprons",
+    "fs_macrorugo": "Apron",
+
+    "select_pass_type": "Pass type",
+    "If": "Slope",
+    "Ks": "Bottom roughness",
+    "C": "Block concentration",
+    "PBD": "Diameter",
+    "PBH": "Height",
+    "Cd0": "Shape (1 for round, 2 for square)",
+    "ZRL": "Left apron elevation",
+    "ZRR": "Right apron elevation",
+    "BR": "Total width",
+    "ZF1": "Apron elevation",
+    "B": "Width",
+    "xCenter": "Mid-apron abscissa",
+
+    "select_pass_type_0": "Multiple aprons",
+    "select_pass_type_1": "Inclined apron",
+
+    "UNIT_Q": "m³/s",
+    "UNIT_PV": "W/m³",
+    "UNIT_Q_GUIDETECH": "m³/s",
+    "UNIT_V_GUIDETECH": "m/s",
+    "UNIT_VDEB": "m/s",
+    "UNIT_VMAX": "m/s",
+    "UNIT_ZF2": "m"
+}
\ No newline at end of file
diff --git a/src/app/calculators/macrorugo-compound/macrorugo-compound.fr.json b/src/app/calculators/macrorugo-compound/macrorugo-compound.fr.json
new file mode 100644
index 0000000000000000000000000000000000000000..1a8b5331f20824e36d5f6eca682d003cf5da9e07
--- /dev/null
+++ b/src/app/calculators/macrorugo-compound/macrorugo-compound.fr.json
@@ -0,0 +1,33 @@
+{
+    "fs_hydraulique": "Paramètres hydrauliques",
+    "fs_pass": "Paramètres de la passe",
+    "fs_bloc": "Paramètres des blocs",
+    "fs_pass_type": "Type de passe",
+    "macrorugo_container": "Radiers",
+    "fs_macrorugo": "Radier",
+
+    "select_pass_type": "Type de passe",
+    "If": "Pente",
+    "Ks": "Rugosité de fond",
+    "C": "Concentration de blocs",
+    "PBD": "Diamètre",
+    "PBH": "Hauteur",
+    "Cd0": "Forme (1 pour rond, 2 pour carré)",
+    "ZRL": "Cote de radier gauche",
+    "ZRR": "Cote de radier droite",
+    "BR": "Largeur totale",
+    "ZF1": "Cote de radier",
+    "B": "Largeur",
+    "xCenter": "Abscisse du milieu du radier",
+
+    "select_pass_type_0": "Radiers multiples",
+    "select_pass_type_1": "Radier incliné",
+
+    "UNIT_Q": "m³/s",
+    "UNIT_PV": "W/m³",
+    "UNIT_Q_GUIDETECH": "m³/s",
+    "UNIT_V_GUIDETECH": "m/s",
+    "UNIT_VDEB": "m/s",
+    "UNIT_VMAX": "m/s",
+    "UNIT_ZF2": "m"
+}
\ No newline at end of file
diff --git a/src/app/components/app-setup/app-setup.component.scss b/src/app/components/app-setup/app-setup.component.scss
index f21f04ee05569edae10aee054c629b74b625c87c..8cf82ff5c3de05fd78d557ad64dd17c84f9bffa9 100644
--- a/src/app/components/app-setup/app-setup.component.scss
+++ b/src/app/components/app-setup/app-setup.component.scss
@@ -6,8 +6,6 @@
         margin-bottom: 2em;
         min-height: 110px;
 
-        // @WARNING ::ng-deep est déprécié, mais y a rien d'autre pour
-        // l'instant (en attente de normalisation par le W3C)
         ::ng-deep .mat-card-header-text {
             margin: 0;
         }
diff --git a/src/app/components/calculator-list/calculator-list.component.ts b/src/app/components/calculator-list/calculator-list.component.ts
index d58d2758e6b4c99f450a63ce4b63589e60513537..95be8190d4754ac41c2b90e26eae4a861c7b938b 100644
--- a/src/app/components/calculator-list/calculator-list.component.ts
+++ b/src/app/components/calculator-list/calculator-list.component.ts
@@ -9,6 +9,7 @@ import { I18nService } from "../../services/internationalisation/internationalis
 import { FormulaireParallelStructure } from "../../formulaire/definition/concrete/form-parallel-structures";
 import { FieldsetContainer } from "../../formulaire/fieldset-container";
 import { FormulairePab } from "../../formulaire/definition/concrete/form-pab";
+import { FormulaireMacrorugoCompound } from "../../formulaire/definition/concrete/form-macrorugo-compound";
 
 
 @Component({
@@ -119,6 +120,15 @@ export class CalculatorListComponent implements OnInit {
                     }
                 }
             }
+            // adding GUI for default apron, in MacroRugoCompound
+            if (f instanceof FormulaireMacrorugoCompound) {
+                for (const e of f.allFormElements) {
+                    if (e instanceof FieldsetContainer) {
+                        e.addFromTemplate(0, 0, f.mrcNub.children[0]);
+                        break;
+                    }
+                }
+            }
         });
     }
 
diff --git a/src/app/components/calculator-results/calculator-results.component.html b/src/app/components/calculator-results/calculator-results.component.html
index be99ed81b6241ed5baa4a3c2d900a339826d4535..93748fe047535181136b937a26c71df1c2b1f8b8 100644
--- a/src/app/components/calculator-results/calculator-results.component.html
+++ b/src/app/components/calculator-results/calculator-results.component.html
@@ -2,5 +2,6 @@
     <section-results></section-results>
     <remous-results></remous-results>
     <pab-results></pab-results>
+    <macrorugo-compound-results></macrorugo-compound-results>
     <fixedvar-results></fixedvar-results>
 </div>
diff --git a/src/app/components/calculator-results/calculator-results.component.ts b/src/app/components/calculator-results/calculator-results.component.ts
index cf74d342c9a1b0027463c2dc3da50c432c415282..9dd4576c506802ce8fd390a5168ae6068d550cb9 100644
--- a/src/app/components/calculator-results/calculator-results.component.ts
+++ b/src/app/components/calculator-results/calculator-results.component.ts
@@ -4,6 +4,7 @@ import { FixedVarResultsComponent } from "../../components/fixedvar-results/fixe
 import { SectionResultsComponent } from "../../components/section-results/section-results.component";
 import { RemousResultsComponent } from "../../components/remous-results/remous-results.component";
 import { PabResultsComponent } from "../../components/pab-results/pab-results.component";
+import { MacrorugoCompoundResultsComponent } from "../macrorugo-compound-results/macrorugo-compound-results.component";
 import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
 
 @Component({
@@ -37,6 +38,12 @@ export class CalculatorResultsComponent implements AfterViewChecked {
     @ViewChild(PabResultsComponent, { static: true })
     private pabResultsComponent: PabResultsComponent;
 
+    /**
+     * composant d'affichage des résultats des passes à macrorugosités complexes
+     */
+    @ViewChild(MacrorugoCompoundResultsComponent, { static: true })
+    private mrcResultsComponent: PabResultsComponent;
+
     /**
      * événement émis à la fin du dessin de la vue
      */
@@ -50,11 +57,13 @@ export class CalculatorResultsComponent implements AfterViewChecked {
             this.sectionResultsComponent.results = undefined;
             this.remousResultsComponent.results = undefined;
             this.pabResultsComponent.results = undefined;
+            this.mrcResultsComponent.results = undefined;
         } else {
             this.fixedVarResultsComponent.results = f.results;
             this.sectionResultsComponent.results = f.results;
             this.remousResultsComponent.results = f.results;
             this.pabResultsComponent.results = f.results;
+            this.mrcResultsComponent.results = f.results;
         }
     }
 
@@ -63,6 +72,7 @@ export class CalculatorResultsComponent implements AfterViewChecked {
         this.sectionResultsComponent.updateView();
         this.remousResultsComponent.updateView();
         this.pabResultsComponent.updateView();
+        this.mrcResultsComponent.updateView();
     }
 
     public ngAfterViewChecked() {
diff --git a/src/app/components/field-set/field-set.component.ts b/src/app/components/field-set/field-set.component.ts
index eea59f37d5acc5bff661eb60dc4ae1b4fbbfba7c..45601ca85c8dba22b59483725e2719d142a97c12 100644
--- a/src/app/components/field-set/field-set.component.ts
+++ b/src/app/components/field-set/field-set.component.ts
@@ -6,7 +6,6 @@ import { ParamFieldLineComponent } from "../param-field-line/param-field-line.co
 import { Field } from "../../formulaire/field";
 import { InputField } from "../../formulaire/input-field";
 import { SelectField } from "../../formulaire/select-field";
-import { SelectFieldModel } from "../../formulaire/select-field-model";
 import { FormulairePab } from "../../formulaire/definition/concrete/form-pab";
 import { SelectModelFieldLineComponent } from "../select-model-field-line/select-model-field-line.component";
 import { FieldsetContainer } from "../../formulaire/fieldset-container";
@@ -15,6 +14,8 @@ import { I18nService } from "../../services/internationalisation/internationalis
 
 import { sprintf } from "sprintf-js";
 
+import { capitalize } from "jalhyd";
+
 @Component({
     selector: "field-set",
     templateUrl: "./field-set.component.html",
@@ -343,9 +344,11 @@ export class FieldSetComponent implements DoCheck {
         }
         let msg: string;
         if (this.childrenToAdd === 1) {
-            msg = this.i18nService.localizeText("INFO_DEVICE_ADDED");
+            const cns = this.i18nService.childName(this._fieldSet.nub.parent);
+            msg = sprintf(this.i18nService.localizeText("INFO_STUFF_ADDED"), cns);
         } else {
-            msg = sprintf(this.i18nService.localizeText("INFO_DEVICE_ADDED_N_TIMES"), this.childrenToAdd);
+            const cnp = this.i18nService.childName(this._fieldSet.nub.parent, true);
+            msg = sprintf(this.i18nService.localizeText("INFO_STUFF_ADDED_N_TIMES"), this.childrenToAdd, cnp);
         }
         this.notifService.notify(msg);
         this.childrenToAdd = 1; // reinit to avoid confusion
@@ -363,10 +366,11 @@ export class FieldSetComponent implements DoCheck {
         }
         const pos = (this._fieldSet.parent as FieldsetContainer).getFieldsetPosition(this._fieldSet) + 1;
         let msg: string;
+        const cns = capitalize(this.i18nService.childName(this._fieldSet.nub.parent));
         if (this.childrenToAdd === 1) {
-            msg = sprintf(this.i18nService.localizeText("INFO_DEVICE_COPIED"), pos);
+            msg = sprintf(this.i18nService.localizeText("INFO_STUFF_COPIED"), cns, pos);
         } else {
-            msg = sprintf(this.i18nService.localizeText("INFO_DEVICE_COPIED_N_TIMES"), pos, this.childrenToAdd);
+            msg = sprintf(this.i18nService.localizeText("INFO_STUFF_COPIED_N_TIMES"), cns, pos, this.childrenToAdd);
         }
         this.notifService.notify(msg);
         this.childrenToAdd = 1; // reinit to avoid confusion
@@ -378,8 +382,9 @@ export class FieldSetComponent implements DoCheck {
     private onRemoveClick() {
         const pos = (this._fieldSet.parent as FieldsetContainer).getFieldsetPosition(this._fieldSet) + 1;
         this.removeFieldset.emit(this._fieldSet);
+        const cns = capitalize(this.i18nService.childName(this._fieldSet.nub.parent));
         this.notifService.notify(
-            sprintf(this.i18nService.localizeText("INFO_DEVICE_REMOVED"), pos)
+            sprintf(this.i18nService.localizeText("INFO_STUFF_REMOVED"), cns, pos)
         );
     }
 
@@ -389,8 +394,9 @@ export class FieldSetComponent implements DoCheck {
     private onMoveUpClick() {
         const pos = (this._fieldSet.parent as FieldsetContainer).getFieldsetPosition(this._fieldSet) + 1;
         this.moveFieldsetUp.emit(this._fieldSet);
+        const cns = capitalize(this.i18nService.childName(this._fieldSet.nub.parent));
         this.notifService.notify(
-            sprintf(this.i18nService.localizeText("INFO_DEVICE_MOVED"), pos)
+            sprintf(this.i18nService.localizeText("INFO_STUFF_MOVED"), cns, pos)
         );
     }
 
@@ -400,8 +406,9 @@ export class FieldSetComponent implements DoCheck {
     private onMoveDownClick() {
         const pos = (this._fieldSet.parent as FieldsetContainer).getFieldsetPosition(this._fieldSet) + 1;
         this.moveFieldsetDown.emit(this._fieldSet);
+        const cns = capitalize(this.i18nService.childName(this._fieldSet.nub.parent));
         this.notifService.notify(
-            sprintf(this.i18nService.localizeText("INFO_DEVICE_MOVED"), pos)
+            sprintf(this.i18nService.localizeText("INFO_STUFF_MOVED"), cns, pos)
         );
     }
 
diff --git a/src/app/components/fieldset-container/fieldset-container.component.ts b/src/app/components/fieldset-container/fieldset-container.component.ts
index 784034788dde560dcff86dd658deaacf2e780df4..6152826176cedd3e0fa264a99cba12531ce07bcc 100644
--- a/src/app/components/fieldset-container/fieldset-container.component.ts
+++ b/src/app/components/fieldset-container/fieldset-container.component.ts
@@ -116,7 +116,7 @@ export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
     private updateValidity() {
         this._isValid = false;
 
-        if (this._fieldsetComponents !== undefined) {
+        if (this._fieldsetComponents !== undefined && this._fieldsetComponents.length > 0) {
             this._isValid = this._fieldsetComponents.reduce(
                 // callback
                 (
@@ -133,6 +133,9 @@ export class FieldsetContainerComponent implements DoCheck, AfterViewInit {
                 }
                 // valeur initiale
                 , this._fieldsetComponents.length > 0);
+        } else {
+            // empty / hidden container ? everything OK.
+            this._isValid = true;
         }
 
         this.validChange.emit();
diff --git a/src/app/components/fixedvar-results/fixed-results.component.ts b/src/app/components/fixedvar-results/fixed-results.component.ts
index 6a38cb84eb649a562e81824f6f98a479291ab40a..ff3b3e8b7c318bbf25d2426706de1267b99f3a2d 100644
--- a/src/app/components/fixedvar-results/fixed-results.component.ts
+++ b/src/app/components/fixedvar-results/fixed-results.component.ts
@@ -5,10 +5,14 @@ import { NgParameter } from "../../formulaire/ngparam";
 import { CalculatorResults } from "../../results/calculator-results";
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
 import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
-import * as XLSX from "xlsx";
-import { Structure } from "jalhyd";
 import { FormulaireService } from "../../services/formulaire/formulaire.service";
 
+import { Structure, capitalize } from "jalhyd";
+
+import * as XLSX from "xlsx";
+
+import { sprintf } from "sprintf-js";
+
 @Component({
     selector: "fixed-results",
     templateUrl: "./fixed-results.component.html",
@@ -105,8 +109,17 @@ export class FixedResultsComponent {
                 if (sn.parent) {
                     ct = sn.parent.calcType;
                 }
+                let unit;
+                // is k the calculated parameter ? If so, extract its unit
+                try {
+                    const p = res.sourceNub.getParameter(k);
+                    if (p) {
+                        unit = p.unit;
+                    }
+                } catch (e) { /* silent fail */ }
+                const label = this.formService.expandVariableNameAndUnit(ct, k, unit);
                 data.push({
-                    label: this.formService.expandVariableNameAndUnit(ct, k),
+                    label: label,
                     value: this.intlService.formatResult(k, er),
                     isCalcResult: true // for CSS
                 });
@@ -122,8 +135,9 @@ export class FixedResultsComponent {
                         if (sn.parent) {
                             ct = sn.parent.calcType;
                         }
+                        const cn = capitalize(this.intlService.childName(sn));
                         data.push({
-                            label: this.intlService.localizeText("INFO_OUVRAGE_N")
+                            label: sprintf(this.intlService.localizeText("INFO_STUFF_N"), cn)
                                     + (c.findPositionInParent() + 1) + " : "
                                     + this.formService.expandVariableNameAndUnit(ct, k),
                             value: this.intlService.formatResult(k, er),
diff --git a/src/app/components/fixedvar-results/var-results.component.ts b/src/app/components/fixedvar-results/var-results.component.ts
index 5eb499f01060bb0de3af6e671585eb2ee06ef59c..9ed0b85b6cc8bdf72379d8dcee24b92aff950e33 100644
--- a/src/app/components/fixedvar-results/var-results.component.ts
+++ b/src/app/components/fixedvar-results/var-results.component.ts
@@ -66,9 +66,7 @@ export class VarResultsComponent extends ResultsComponent {
             if (this._messages.length > 0) { // has log messages
                 this._headers.push("logMessagesColumn");
             }
-            for (let i = 0; i < this._varResults.variatedParameters.length; i++) {
-                this._headers.push(this._varResults.variableParamHeaders[i]);
-            }
+            this._headers = this._headers.concat(this._varResults.variableParamHeaders);
             this._headers = this._headers.concat(this._varResults.resultHeaders);
 
             // C. pre-extract variable parameters values
diff --git a/src/app/components/generic-calculator/calculator.component.html b/src/app/components/generic-calculator/calculator.component.html
index 87c73d874de93d764114056ea843626cf9ca3b60..7770790c0f6d0e5ec52c58c2d1084cba141e3b39 100644
--- a/src/app/components/generic-calculator/calculator.component.html
+++ b/src/app/components/generic-calculator/calculator.component.html
@@ -29,7 +29,7 @@
 
     </mat-card-header>
 
-    <quicknav [fxHide.gt-sm]="! isPAB" [items]="quicknavItems" [currentItem]="'input'" [align]="'left'"></quicknav>
+    <quicknav [fxHide.gt-sm]="! isWide" [items]="quicknavItems" [currentItem]="'input'" [align]="'left'"></quicknav>
 
     <form>
 
@@ -39,24 +39,24 @@
             <calc-name id="calculator-name" [title]="uitextCalculatorName"></calc-name>
 
             <div id="calc-cards-container" class="container"
-              [fxLayout]="isPAB ? 'column' : 'row wrap'"
-              [fxLayoutAlign]="isPAB ? 'space-around stretch' : 'space-around start'">
+              [fxLayout]="isWide ? 'column' : 'row wrap'"
+              [fxLayoutAlign]="isWide ? 'space-around stretch' : 'space-around start'">
 
                 <!-- chapitres -->
                 <mat-card id="calc-card-field-sets"
-                  [class.pab-field-sets]="isPAB"
-                  [fxFlex.gt-sm]="isPAB ? '1 0 auto' : '1 0 400px'"
-                  [fxFlex.lt-md]="isPAB ? '1 0 auto' : '1 0 500px'"
-                  [fxFlex.lt-sm]="isPAB ? '1 0 auto' : '1 0 300px'">
+                  [class.pab-field-sets]="isWide"
+                  [fxFlex.gt-sm]="isWide ? '1 0 auto' : '1 0 400px'"
+                  [fxFlex.lt-md]="isWide ? '1 0 auto' : '1 0 500px'"
+                  [fxFlex.lt-sm]="isWide ? '1 0 auto' : '1 0 300px'">
 
                     <ng-template ngFor let-fe [ngForOf]="formElements">
-                        <field-set *ngIf="isFieldset(fe)" [style.display]="getFieldsetStyleDisplay(fe.id)" [fieldSet]=fe
+                        <field-set *ngIf="isFieldset(fe)" [style.display]="getElementStyleDisplay(fe.id)" [fieldSet]=fe
                             (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
                             (tabPressed)="onTabPressed($event)">
                         </field-set>
 
-                        <fieldset-container *ngIf="isFieldsetContainer(fe)" [_container]=fe (radio)=onRadioClick($event)
-                            (validChange)=onElementValid() (inputChange)=onInputChange($event)
+                        <fieldset-container *ngIf="isFieldsetContainer(fe)" [style.display]="getElementStyleDisplay(fe.id)" [_container]=fe
+                            (radio)=onRadioClick($event) (validChange)=onElementValid() (inputChange)=onInputChange($event)
                             (tabPressed)="onTabPressed($event)">
                         </fieldset-container>
 
@@ -75,16 +75,16 @@
 
                 <!-- résultats -->
                 <mat-card id="calc-card-results"
-                  [class.pab-results]="isPAB"
-                  [fxFlex.gt-sm]="isPAB ? '1 0 auto' : '1 0 400px'"
-                  [fxFlex.lt-md]="isPAB ? '1 0 auto' : '1 0 500px'"
-                  [fxFlex.lt-sm]="isPAB ? '1 0 auto' : '1 0 300px'">
+                  [class.pab-results]="isWide"
+                  [fxFlex.gt-sm]="isWide ? '1 0 auto' : '1 0 400px'"
+                  [fxFlex.lt-md]="isWide ? '1 0 auto' : '1 0 500px'"
+                  [fxFlex.lt-sm]="isWide ? '1 0 auto' : '1 0 300px'">
 
                     <div id="fake-results-anchor"></div>
 
-                    <quicknav [ngClass.lt-xs]="'extraSmall'" [fxHide.gt-sm]="! isPAB" [items]="quicknavItems" [currentItem]="'results'" [align]="'left'"></quicknav>
+                    <quicknav [ngClass.lt-xs]="'extraSmall'" [fxHide.gt-sm]="! isWide" [items]="quicknavItems" [currentItem]="'results'" [align]="'left'"></quicknav>
 
-                    <mat-card-header *ngIf="! isPAB" [fxHide.lt-md]="! isPAB">
+                    <mat-card-header *ngIf="! isWide" [fxHide.lt-md]="! isWide">
                         <mat-card-title>
                             <h1 [innerHTML]="uitextResultsTitle"></h1>
                         </mat-card-title>
diff --git a/src/app/components/generic-calculator/calculator.component.scss b/src/app/components/generic-calculator/calculator.component.scss
index 86ee927526a79e70fdc5851e00e14613106f92ac..e10f322335ea2b461e719939b14e1d4507918859 100644
--- a/src/app/components/generic-calculator/calculator.component.scss
+++ b/src/app/components/generic-calculator/calculator.component.scss
@@ -68,8 +68,6 @@ mat-card {
         }
     }
 
-    // @WARNING ::ng-deep est déprécié, mais y a rien d'autre pour
-    // l'instant (en attente de normalisation par le W3C)
     ::ng-deep .mat-card-header-text {
         margin: 0;
     }
diff --git a/src/app/components/generic-calculator/calculator.component.ts b/src/app/components/generic-calculator/calculator.component.ts
index 005a9556544cbaca2aefde571fba3942af4cd452..19e8926e40d0a4d809d1c620b8f1acfc21865833 100644
--- a/src/app/components/generic-calculator/calculator.component.ts
+++ b/src/app/components/generic-calculator/calculator.component.ts
@@ -205,7 +205,7 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
 
     public get quicknavItems() {
         const elts = [ "input", "results" ];
-        if (this.isPAB && this.hasResults) {
+        if (this.isWide && this.hasResults) {
             elts.push("charts");
         }
         return elts;
@@ -399,7 +399,7 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
         }
     }
 
-    public getFieldsetStyleDisplay(id: string) {
+    public getElementStyleDisplay(id: string) {
         const isDisplayed: boolean = this._formulaire.isDisplayed(id);
         return isDisplayed ? "block" : "none";
     }
@@ -470,6 +470,11 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
     }
 
     // for "one wide column" layout
+    public get isWide() {
+        return (this.isPAB || this.isMRC);
+    }
+
+    // true if current Nub is PAB
     public get isPAB() {
         return (
             this._formulaire
@@ -478,6 +483,15 @@ export class GenericCalculatorComponent extends BaseComponent implements OnInit,
         );
     }
 
+    // true if current Nub is MacroRugoCompound
+    public get isMRC() {
+        return (
+            this._formulaire
+            && this._formulaire.currentNub
+            && this._formulaire.currentNub.calcType === CalculatorType.MacroRugoCompound
+        );
+    }
+
     // for "generate PAB" button
     public get isPABCloisons() {
         return (
diff --git a/src/app/components/generic-input/generic-input.component.ts b/src/app/components/generic-input/generic-input.component.ts
index e18680906029b4fca26f61f8d1543b1c33439ca7..1afd483b2a4948250b25c6358a6d463a7cb61b4b 100644
--- a/src/app/components/generic-input/generic-input.component.ts
+++ b/src/app/components/generic-input/generic-input.component.ts
@@ -1,7 +1,7 @@
 import { Input, Output, EventEmitter, ChangeDetectorRef, OnChanges, ViewChild } from "@angular/core";
 import { NgModel } from "@angular/forms";
 import { BaseComponent } from "../base/base.component";
-import { isNumeric, Structure, Pab } from "jalhyd";
+import { isNumeric, Structure, Pab, MacrorugoCompound } from "jalhyd";
 import { FormulaireDefinition } from "../../formulaire/definition/form-definition";
 import { NgParameter } from "../../formulaire/ngparam";
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
@@ -46,7 +46,7 @@ export abstract class GenericInputComponent extends BaseComponent implements OnC
                 // if inside a nested Structure, prefix with Structure position
                 // to disambiguate
                 const nub = param.paramDefinition.parentNub;
-                if (nub && (nub instanceof Structure || nub.parent instanceof Pab)) {
+                if (nub && (nub instanceof Structure || nub.parent instanceof Pab || nub.parent instanceof MacrorugoCompound)) {
                     id = nub.findPositionInParent() + "_" + id;
                 }
             }
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.html b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..1e1df2713ccb63ddce22a7355588146221c088c9
--- /dev/null
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.html
@@ -0,0 +1,32 @@
+<!-- @TODO copied from var-results.component.html > merge ?-->
+<div class="macrorugo-compound-results-table-container" #mrcResultsTable fxLayout="row wrap" fxLayoutAlign="center center">
+    <div fxFlex="1 1 100%">
+        <div class="macrorugo-compound-results-table-buttons">
+            <button mat-icon-button (click)="exportAsSpreadsheet()" [title]="uitextExportAsSpreadsheet">
+                <mat-icon color="primary">file_download</mat-icon>
+            </button>
+            <button mat-icon-button *ngIf="! isFullscreen" (click)="setFullscreen(mrcResultsTable)" [title]="uitextEnterFSTitle">
+                <mat-icon color="primary" class="scaled12">fullscreen</mat-icon>
+            </button>
+            <button mat-icon-button *ngIf="isFullscreen" (click)="exitFullscreen()" [title]="uitextExitFSTitle">
+                <mat-icon color="primary" class="scaled12">fullscreen_exit</mat-icon>
+            </button>
+        </div>
+
+        <div class="macrorugo-compound-results-table-scrollable-container" [ngClass]="{'full-height': isFullscreen}">
+            <!-- scrollable -->
+            <div class="macrorugo-compound-results-table-inner-container" #tableContainer>
+
+                <table mat-table [dataSource]="dataSet">
+                    <ng-container *ngFor="let h of headers; let i = index" [matColumnDef]="h">
+                        <th mat-header-cell *matHeaderCellDef>{{ h }}</th>
+                        <td mat-cell *matCellDef="let element" [innerHTML]="element[i]"></td>
+                    </ng-container>
+
+                    <tr mat-header-row *matHeaderRowDef="headers"></tr>
+                    <tr mat-row *matRowDef="let row; columns: headers;"></tr>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.scss b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..14c20aa01d6539da5befe396c5d73d71cdc3035d
--- /dev/null
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.scss
@@ -0,0 +1,66 @@
+:host {
+    display: block;
+    margin-bottom: 1.5em;
+}
+
+.macrorugo-compound-results-table-container {
+    background-color: white;
+}
+
+.macrorugo-compound-results-table-buttons {
+    padding-right: 4px;
+    padding-top: 4px;
+    text-align: right;
+    background-color: white;
+
+    button {
+        margin-left: 3px;
+        width: auto;
+
+        mat-icon {
+            &.scaled12 {
+                transform: scale(1.2)
+            }
+        }
+    }
+}
+
+.macrorugo-compound-results-table-scrollable-container {
+    overflow-x: scroll;
+    border: solid #ccc 1px;
+
+    &.full-height {
+        height: calc(100vh - 40px); // rend le mode plein-écran scrollable verticalement, sinon ça dépasse
+    }
+}
+
+table.mat-table {
+
+    .mat-header-row {
+        height: 40px;
+    }
+
+    .mat-row {
+        height: 32px;
+
+        &:nth-child(odd) {
+            background-color: #f4f4f4;
+        }
+    }
+
+    ::ng-deep .mat-cell {
+        padding: 5px;
+
+        .inner-cell-line {
+            display: block;
+            white-space: nowrap;
+            line-height: 20px;
+        }
+    }
+
+    ::ng-deep .mat-header-cell {
+        font-size: 1em;
+        color: black;
+        padding: 5px;
+    }
+}
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5f3e09781863c44d55581968cb7f26ad22390a65
--- /dev/null
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results-table.component.ts
@@ -0,0 +1,144 @@
+import { Component, ViewChild, ElementRef } from "@angular/core";
+
+import { MacroRugo } from "jalhyd";
+
+import * as XLSX from "xlsx";
+
+import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
+import { I18nService } from "../../services/internationalisation/internationalisation.service";
+import { ResultsComponent } from "../fixedvar-results/results.component";
+import { MacrorugoCompoundResults } from "../../results/macrorugo-compound-results";
+
+@Component({
+    selector: "macrorugo-compound-results-table",
+    templateUrl: "./macrorugo-compound-results-table.component.html",
+    styleUrls: [
+        "./macrorugo-compound-results-table.component.scss"
+    ]
+})
+export class MacrorugoCompoundResultsTableComponent extends ResultsComponent {
+
+    /** résultats non mis en forme */
+    private _mrcResults: MacrorugoCompoundResults;
+
+    /** entêtes des colonnes */
+    private _headers: string[];
+
+    /** résultats mis en forme */
+    private _dataSet: any[];
+
+    @ViewChild("tableContainer", { static: false })
+    table: ElementRef;
+
+    constructor(
+        protected appSetupService: ApplicationSetupService,
+        protected intlService: I18nService
+    ) {
+        super();
+    }
+
+    public set results(r: MacrorugoCompoundResults) {
+        this._mrcResults = r;
+
+        this._dataSet = [];
+        if (
+            this._mrcResults
+            && this._mrcResults.childrenResults
+            && this._mrcResults.childrenResults.length > 0
+            && ! this._mrcResults.hasOnlyErrors()
+        ) {
+            const pr = this._mrcResults;
+            const nDigits = this.appSetupService.displayDigits;
+            // when a parameter is variating, index of the variating parameter
+            // values to build the data from
+            const vi = pr.variableIndex;
+
+            // refresh headers here if language changed
+            this._headers = pr.headers;
+
+            // lines 1 - n-1 (aprons)
+            for (let i = 0; i < pr.childrenResults.length; i++) {
+                // @TODO protect loop contents with if(vCalc) ? Will hide erroneous apron results..
+                const res = pr.childrenResults[i].resultElements[vi].values;
+                const nub = (pr.childrenResults[i].sourceNub as MacroRugo);
+                // does ZF1 or B vary ?
+                let zf1: number;
+                try {
+                    if (nub.prms.ZF1.hasMultipleValues) {
+                        zf1 = nub.prms.ZF1.getInferredValuesList()[vi];
+                    } else {
+                        zf1 = nub.prms.ZF1.singleValue;
+                    }
+                } catch (e) {
+                    // silent fail
+                }
+                let b: number;
+                try {
+                    if (nub.prms.B.hasMultipleValues) {
+                        b = nub.prms.B.getInferredValuesList()[vi];
+                    } else {
+                        b = nub.prms.B.singleValue;
+                    }
+                } catch (e) {
+                    // silent fail
+                }
+
+                this._dataSet.push([
+                    i + 1, // n° radier
+                    (zf1 !== undefined ? zf1.toFixed(nDigits) : "-"),
+                    (b !== undefined ? b.toFixed(nDigits) : "-"),
+                    res.Q.toFixed(nDigits),
+                    res.ZF2.toFixed(nDigits),
+                    res.Vdeb.toFixed(nDigits),
+                    res.Fr.toFixed(nDigits),
+                    res.Vmax.toFixed(nDigits),
+                    res.PV.toFixed(nDigits),
+                    this.intlService.localizeText("INFO_ENUM_MACRORUGOFLOWTYPE_" + res.ENUM_MacroRugoFlowType),
+                    res.Q_GuideTech.toFixed(nDigits),
+                    (res.V_GuideTech !== undefined ? res.V_GuideTech.toFixed(nDigits) : "-"),
+                    res.xCenter.toFixed(nDigits)
+                ]);
+            }
+
+            // line n (total flow)
+            this._dataSet.push([
+                this.intlService.localizeText("INFO_LIB_TOTAL"),
+                "", "",
+                pr.result.resultElements[vi].vCalc.toFixed(nDigits),
+                "", "", "", "", "", "", "", "", ""
+            ]);
+        }
+    }
+
+    public get headers() {
+        return this._headers;
+    }
+
+    /**
+     * Returns a combination of parameters and results for mat-table
+     */
+    public get dataSet() {
+        return this._dataSet;
+    }
+
+    public exportAsSpreadsheet() {
+        // automagic <table> extraction
+        const ws: XLSX.WorkSheet = XLSX.utils.table_to_sheet(this.table.nativeElement);
+        const wb: XLSX.WorkBook = XLSX.utils.book_new();
+        XLSX.utils.book_append_sheet(wb, ws, "default");
+        // save and download
+        XLSX.writeFile(wb, "MacrorugoCompoundResults.xlsx");
+    }
+
+    public get uitextExportAsSpreadsheet() {
+        return this.intlService.localizeText("INFO_RESULTS_EXPORT_AS_SPREADSHEET");
+    }
+
+    public get uitextEnterFSTitle() {
+        return this.intlService.localizeText("INFO_GRAPH_BUTTON_TITLE_ENTER_FS");
+    }
+
+    public get uitextExitFSTitle() {
+        return this.intlService.localizeText("INFO_GRAPH_BUTTON_TITLE_EXIT_FS");
+    }
+}
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..e03d0b2b10ec65cf17c17297c6d9544c240818f7
--- /dev/null
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.html
@@ -0,0 +1,25 @@
+<div class="container">
+
+    <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
+
+    <variable-results-selector [results]="mrcResults" (indexChange)="variableIndexChanged()">
+    </variable-results-selector>
+
+    <log #iterationLog></log>
+
+    <div>
+        <!-- tableau de résultats -->
+        <macrorugo-compound-results-table *ngIf="hasDisplayableResults" [results]="mrcResults"></macrorugo-compound-results-table>
+    </div>
+
+    <quicknav *ngIf="hasDisplayableResults" [items]="[ 'input', 'results', 'charts' ]"
+        [currentItem]="'charts'" [align]="'left'"></quicknav>
+
+    <div id="macrorugo-compound-graphs-container" class="container" fxLayout="row wrap" fxLayoutAlign="space-around start">
+        <!-- <pab-profile-graph *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        </pab-profile-graph> -->
+        <results-graph *ngIf="hasDisplayableResults" fxFlex.gt-xs="1 0 400px" fxFlex.lt-sm="1 0 300px">
+        </results-graph>
+    </div>
+
+</div>
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.scss b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6f5eb10d525664ef64b09c7c5eda9a8a074218b1
--- /dev/null
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.scss
@@ -0,0 +1,4 @@
+results-graph {
+    margin-left: 1em;
+    margin-right: 1em;
+}
diff --git a/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ca523574c08e40236b62e72dee3b9925ad2c68df
--- /dev/null
+++ b/src/app/components/macrorugo-compound-results/macrorugo-compound-results.component.ts
@@ -0,0 +1,319 @@
+import { Component, ViewChild, DoCheck } from "@angular/core";
+
+import { Result, cLog, Message, MessageCode, MessageSeverity } from "jalhyd";
+
+import { LogComponent } from "../../components/log/log.component";
+import { CalculatorResults } from "../../results/calculator-results";
+import { NgParameter } from "../../formulaire/ngparam";
+import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
+import { PlottableData } from "../../results/plottable-data";
+import { ResultsGraphComponent } from "../results-graph/results-graph.component";
+import { I18nService } from "../../services/internationalisation/internationalisation.service";
+import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
+import { MacrorugoCompoundResultsTableComponent } from "./macrorugo-compound-results-table.component";
+import { MacrorugoCompoundResults } from "../../results/macrorugo-compound-results";
+import { PlottableMacrorugoCompoundResults } from "../../results/plottable-macrorugo-compound-results";
+
+@Component({
+    selector: "macrorugo-compound-results",
+    templateUrl: "./macrorugo-compound-results.component.html",
+    styleUrls: [
+        "./macrorugo-compound-results.component.scss"
+    ]
+})
+export class MacrorugoCompoundResultsComponent implements DoCheck {
+
+    /** résultats non mis en forme */
+    private _mrcResults: MacrorugoCompoundResults;
+
+    /** résultats mis en forme pour le graphique de données (classique) */
+    private _plottableResults: PlottableMacrorugoCompoundResults;
+
+    /** true si les résultats doiventt être remis à jour */
+    private _doUpdate = false;
+
+    @ViewChild(MacrorugoCompoundResultsTableComponent, { static: false })
+    private mrcResultsTableComponent: MacrorugoCompoundResultsTableComponent;
+
+    @ViewChild(VariableResultsSelectorComponent, { static: false })
+    private variableResultsSelectorComponent: VariableResultsSelectorComponent;
+
+    @ViewChild("generalLog", { static: false })
+    private generalLogComponent: LogComponent;
+
+    @ViewChild("iterationLog", { static: false })
+    private iterationLogComponent: LogComponent;
+
+    @ViewChild(ResultsGraphComponent, { static: false })
+    private resultsGraphComponent: ResultsGraphComponent;
+
+    constructor(
+        private appSetupService: ApplicationSetupService,
+        private i18nService: I18nService,
+    ) {
+        this._plottableResults = new PlottableMacrorugoCompoundResults();
+    }
+
+    public set results(rs: CalculatorResults[]) {
+        this._mrcResults = undefined;
+        if (rs.length > 0 && rs[0] instanceof MacrorugoCompoundResults) {
+            this._mrcResults = rs[0] as MacrorugoCompoundResults;
+        }
+        this.updateView();
+    }
+
+    /**
+     * update results table and chart when the variable index changed (event sent by
+     * VariableResultsSelectorComponent); variable index is already set in
+     * mrcResults at this time
+     */
+    public variableIndexChanged() {
+        this.updateView();
+    }
+
+    public updateView() {
+        if (this.iterationLogComponent) {
+            this.iterationLogComponent.log = undefined;
+        }
+        if (this.generalLogComponent) {
+            this.generalLogComponent.log = undefined;
+        }
+        if (this.mrcResultsTableComponent) {
+            this.mrcResultsTableComponent.results = undefined;
+        }
+        if (this.variableResultsSelectorComponent) {
+            this.variableResultsSelectorComponent.results = undefined;
+        }
+        if (this.resultsGraphComponent) {
+            this.resultsGraphComponent.results = undefined;
+        }
+        // set _doUpdate flag so that results are rebuilt on the next Angular display cycle
+        this._doUpdate = false;
+        if (this._mrcResults !== undefined) {
+            this._doUpdate = this._doUpdate || this._mrcResults.hasResults || this._mrcResults.hasLog;
+        }
+    }
+
+    public ngDoCheck() {
+        if (this._doUpdate) {
+            this._doUpdate = !this.updateResults();
+        }
+    }
+
+    private mergeGlobalLog(result: Result, log: cLog) {
+        if (result) {
+            if (result.hasGlobalLog()) {
+                log.addLog(result.globalLog);
+            }
+            // if no parameter is varying, 1st element log is considered "global"
+            if (this.mrcResults.variatedParameters.length === 0) {
+                if (result.hasResultElements() && result.resultElement.hasLog()) {
+                    log.addLog(result.log);
+                }
+            }
+        }
+    }
+
+    /**
+     * Returns the number of errors, warnings, infos among children logs
+     */
+    private logStats(): any {
+        const ret = {
+            info: 0,
+            warning: 0,
+            error: 0
+        };
+        if (this._mrcResults.result && this._mrcResults.result.hasLog()) {
+            for (const re of this._mrcResults.result.resultElements) {
+                if (re.hasLog()) {
+                    for (const m of re.log.messages) {
+                        const s = m.getSeverity();
+                        switch (s) {
+                            case MessageSeverity.INFO:
+                                ret.info ++;
+                                break;
+                            case MessageSeverity.WARNING:
+                                ret.warning ++;
+                                break;
+                            case MessageSeverity.ERROR:
+                                ret.error ++;
+                                break;
+                        }
+                    }
+                }
+            }
+        }
+        for (const cr of this._mrcResults.childrenResults) {
+            if (cr && cr.hasLog()) {
+                for (const re of cr.resultElements) {
+                    if (re.hasLog()) {
+                        for (const m of re.log.messages) {
+                            const s = m.getSeverity();
+                            switch (s) {
+                                case MessageSeverity.INFO:
+                                    ret.info ++;
+                                    break;
+                                case MessageSeverity.WARNING:
+                                    ret.warning ++;
+                                    break;
+                                case MessageSeverity.ERROR:
+                                    ret.error ++;
+                                    break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return ret;
+    }
+
+    /*
+     * Retourne les logs à afficher dans le composant de log global, au dessus
+     * du sélecteur d'itération : messages globaux et / ou résumé des messages
+     * spécifiques à chaque ResultElement
+     */
+    private get globalLog(): cLog {
+        const l = new cLog();
+        if (this._mrcResults && this.mrcResults.variatedParameters.length > 0) {
+            this.mergeGlobalLog(this._mrcResults.result, l);
+            // un problème avec la MRC en général / les cloisons, à une étape quelconque ?
+            if (
+                (this.mrcResults.hasLog)
+                && l.messages.length === 0 // existing global messages make generic message below useless
+            ) {
+                const logStats = this.logStats();
+                const m = new Message(MessageCode.WARNING_PROBLEMS_ENCOUNTERED);
+                m.extraVar.info = "" + logStats.info; // to avoid displaying fixed number of digits
+                m.extraVar.warning = "" + logStats.warning;
+                m.extraVar.error = "" + logStats.error;
+                l.add(m);
+                // l.add(new Message(MessageCode.WARNING_PROBLEMS_ENCOUNTERED));
+            }
+        } // sinon pas de log global (aucun paramètre ne varie)
+        return l;
+    }
+
+    /**
+     * Retourne les logs à afficher dans le composant de log global, au dessus
+     * du sélecteur d'itération : messages globaux et / ou résumé des messages
+     * spécifiques à chaque ResultElement
+     */
+    private get iterationLog(): cLog {
+        const l = new cLog();
+        if (this._mrcResults) {
+            if (this.mrcResults.variatedParameters.length > 0) {
+                // A. si un paramètre varie
+                const vi = this._mrcResults.variableIndex;
+                // log de la MRC pour l'itération en cours
+                if (
+                    this._mrcResults.result
+                    && this._mrcResults.result.hasResultElements()
+                    && this._mrcResults.result.resultElements[vi]
+                    && this._mrcResults.result.resultElements[vi].hasLog()
+                ) {
+                    l.addLog(this._mrcResults.result.resultElements[vi].log);
+                }
+                // logs des enfants pour l'itération en cours
+                for (const cr of this._mrcResults.childrenResults) {
+                    if (cr && cr.hasResultElements() && cr.resultElements[vi].hasLog()) {
+                        l.addLog(cr.resultElements[vi].log);
+                    }
+                }
+            } else {
+                // B. si aucun paramètre ne varie
+                this.mergeGlobalLog(this._mrcResults.result, l); // faut bien mettre le log global quelque part
+                // logs des enfants
+                for (const cr of this._mrcResults.childrenResults) {
+                    if (cr && cr.hasResultElements() && cr.resultElement.hasLog()) {
+                        l.addLog(cr.resultElement.log);
+                    }
+                }
+            }
+        }
+        return l;
+    }
+
+    /**
+     * met à jour l'affichage des résultats
+     * @returns true si les résultats ont pu être mis à jour
+     */
+    private updateResults() {
+        let mrcUpdated: boolean;
+        let resultsGraphUpdated: boolean;
+        let selectorUpdated: boolean;
+
+        // results or not, there might be a log
+        const logUpdated = (this.iterationLogComponent !== undefined || this.generalLogComponent !== undefined); // gne ?
+        if (logUpdated) {
+            // order of logs is important !
+            this.iterationLogComponent.log = this.iterationLog;
+            this.generalLogComponent.log = this.globalLog;
+        }
+
+        if (this.hasResults) {
+            mrcUpdated = this.mrcResultsTableComponent !== undefined;
+            if (mrcUpdated) {
+                this.mrcResultsTableComponent.results = this._mrcResults;
+            }
+            selectorUpdated = this.variableResultsSelectorComponent !== undefined;
+            if (selectorUpdated) {
+                this.variableResultsSelectorComponent.results = this._mrcResults;
+            }
+            resultsGraphUpdated = this.resultsGraphComponent !== undefined;
+            if (resultsGraphUpdated) {
+                this.resultsGraphComponent.results = this.plottableResults;
+                this.resultsGraphComponent.updateView();
+            }
+        } else {
+            mrcUpdated = true;
+            resultsGraphUpdated = true;
+            selectorUpdated = true;
+        }
+
+        return mrcUpdated && logUpdated && resultsGraphUpdated && selectorUpdated;
+    }
+
+    public get mrcResults() {
+        return this._mrcResults;
+    }
+
+    public formattedLabel(p: NgParameter): string {
+        return CalculatorResults.paramLabel(p, false);
+    }
+
+    public formattedValue(p: NgParameter): string {
+        const nDigits = this.appSetupService.displayDigits;
+        return p.getValue().toFixed(nDigits);
+    }
+
+    public get hasResults(): boolean {
+        return this._mrcResults && this._mrcResults.hasResults;
+    }
+
+    public get hasDisplayableResults(): boolean {
+        let ret = this._mrcResults && this._mrcResults.hasResults;
+        if (
+            this._mrcResults
+            && this._mrcResults.variatedParameters
+            && this._mrcResults.variatedParameters.length > 0
+        ) {
+            ret = ret
+            && this._mrcResults.variableIndex !== undefined
+            && this._mrcResults.result.resultElements[this._mrcResults.variableIndex] !== undefined
+            && this._mrcResults.result.resultElements[this._mrcResults.variableIndex].ok;
+        }
+        return ret;
+    }
+
+    public get uitextGeneralLogTitle(): string {
+        return this.i18nService.localizeText("INFO_TITREJOURNAL_GLOBAL");
+    }
+
+    /** builds a set of PlottableData from MacrorugoCompoundResults, to feed the graph */
+    protected get plottableResults(): PlottableData {
+        this._plottableResults.setMrcResults(this.mrcResults);
+        return this._plottableResults;
+    }
+
+}
diff --git a/src/app/components/pab-results/pab-results.component.html b/src/app/components/pab-results/pab-results.component.html
index 2e31dc126d9bd8b2286c6465f10660f3f2c57f0d..d601347bd661f08b02a75e331a0e9b083122a53c 100644
--- a/src/app/components/pab-results/pab-results.component.html
+++ b/src/app/components/pab-results/pab-results.component.html
@@ -2,8 +2,8 @@
 
     <log #generalLog [logTitle]="uitextGeneralLogTitle">log général</log>
 
-    <pab-variable-results-selector [results]="pabResults" (indexChange)="variableIndexChanged()">
-    </pab-variable-results-selector>
+    <variable-results-selector [results]="pabResults" (indexChange)="variableIndexChanged()">
+    </variable-results-selector>
 
     <log #iterationLog></log>
 
diff --git a/src/app/components/pab-results/pab-results.component.ts b/src/app/components/pab-results/pab-results.component.ts
index 510867ca6f1655075e52eab16f92b8f0580fd26f..fefa3a36bb8a887a976e4fd4d28a25a6edae2c0e 100644
--- a/src/app/components/pab-results/pab-results.component.ts
+++ b/src/app/components/pab-results/pab-results.component.ts
@@ -8,12 +8,13 @@ import { NgParameter } from "../../formulaire/ngparam";
 import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
 import { PabResultsTableComponent } from "./pab-results-table.component";
 import { PabResults } from "../../results/pab-results";
-import { PabVariableResultsSelectorComponent } from "./pab-variable-results-selector.component";
+import { VariableResultsSelectorComponent } from "../variable-results-selector/variable-results-selector.component";
 import { PlottableData } from "../../results/plottable-data";
 import { PlottablePabResults } from "../../results/plottable-pab-results";
 import { ResultsGraphComponent } from "../results-graph/results-graph.component";
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
 import { PabProfileGraphComponent } from "../pab-profile-graph/pab-profile-graph.component";
+import { VarResults } from "../../results/var-results";
 
 @Component({
     selector: "pab-results",
@@ -36,8 +37,8 @@ export class PabResultsComponent implements DoCheck {
     @ViewChild(PabResultsTableComponent, { static: false })
     private pabResultsTableComponent: PabResultsTableComponent;
 
-    @ViewChild(PabVariableResultsSelectorComponent, { static: false })
-    private pabVariableResultsSelectorComponent: PabVariableResultsSelectorComponent;
+    @ViewChild(VariableResultsSelectorComponent, { static: false })
+    private variableResultsSelectorComponent: VariableResultsSelectorComponent;
 
     @ViewChild("generalLog", { static: false })
     private generalLogComponent: LogComponent;
@@ -85,8 +86,8 @@ export class PabResultsComponent implements DoCheck {
         if (this.pabResultsTableComponent) {
             this.pabResultsTableComponent.results = undefined;
         }
-        if (this.pabVariableResultsSelectorComponent) {
-            this.pabVariableResultsSelectorComponent.results = undefined;
+        if (this.variableResultsSelectorComponent) {
+            this.variableResultsSelectorComponent.results = undefined;
         }
         if (this.resultsGraphComponent) {
             this.resultsGraphComponent.results = undefined;
@@ -272,6 +273,7 @@ export class PabResultsComponent implements DoCheck {
      * @returns true si les résultats ont pu être mis à jour
      */
     private updateResults() {
+        console.log("UPD RES PAB", this._pabResults);
         let pabUpdated: boolean;
         let resultsGraphUpdated: boolean;
         let profileGraphUpdated: boolean;
@@ -290,9 +292,9 @@ export class PabResultsComponent implements DoCheck {
             if (pabUpdated) {
                 this.pabResultsTableComponent.results = this._pabResults;
             }
-            selectorUpdated = this.pabVariableResultsSelectorComponent !== undefined;
+            selectorUpdated = this.variableResultsSelectorComponent !== undefined;
             if (selectorUpdated) {
-                this.pabVariableResultsSelectorComponent.results = this._pabResults;
+                this.variableResultsSelectorComponent.results = this._pabResults;
             }
             resultsGraphUpdated = this.resultsGraphComponent !== undefined;
             if (resultsGraphUpdated) {
diff --git a/src/app/components/pab-results/pab-variable-results-selector.component.html b/src/app/components/variable-results-selector/variable-results-selector.component.html
similarity index 76%
rename from src/app/components/pab-results/pab-variable-results-selector.component.html
rename to src/app/components/variable-results-selector/variable-results-selector.component.html
index c02043692cc2442431ade75b674fd2882e32ac30..757776ab804cb4458ce1135c7e0fc29605b59365 100644
--- a/src/app/components/pab-results/pab-variable-results-selector.component.html
+++ b/src/app/components/variable-results-selector/variable-results-selector.component.html
@@ -1,4 +1,4 @@
-<div class="pab-variable-results-selector" *ngIf="hasVariableResults" fxLayout="row wrap" fxLayoutAlign="center center">
+<div class="pabvariable-results-selector" *ngIf="hasVariableResults" fxLayout="row wrap" fxLayoutAlign="center center">
     <div fxFlex="1 1 100%">
         <mat-form-field>
             <mat-select id="pab-variating-element" [placeholder]="label" [(value)]="selectedValue">
diff --git a/src/app/components/pab-results/pab-variable-results-selector.component.scss b/src/app/components/variable-results-selector/variable-results-selector.component.scss
similarity index 100%
rename from src/app/components/pab-results/pab-variable-results-selector.component.scss
rename to src/app/components/variable-results-selector/variable-results-selector.component.scss
diff --git a/src/app/components/pab-results/pab-variable-results-selector.component.ts b/src/app/components/variable-results-selector/variable-results-selector.component.ts
similarity index 57%
rename from src/app/components/pab-results/pab-variable-results-selector.component.ts
rename to src/app/components/variable-results-selector/variable-results-selector.component.ts
index 4986bfbf8502342932af0831c8104985d575f3a9..0ac86ebd1c8f17be30b229129428686221ab6410 100644
--- a/src/app/components/pab-results/pab-variable-results-selector.component.ts
+++ b/src/app/components/variable-results-selector/variable-results-selector.component.ts
@@ -1,20 +1,20 @@
 import { Component, Output, EventEmitter } from "@angular/core";
 
-import { PabResults } from "../../results/pab-results";
 import { I18nService } from "../../services/internationalisation/internationalisation.service";
 import { ApplicationSetupService } from "../../services/app-setup/app-setup.service";
+import { MultiDimensionResults } from "../../results/multidimension-results";
 
 @Component({
-    selector: "pab-variable-results-selector",
-    templateUrl: "./pab-variable-results-selector.component.html",
+    selector: "variable-results-selector",
+    templateUrl: "./variable-results-selector.component.html",
     styleUrls: [
-        "./pab-variable-results-selector.component.scss"
+        "./variable-results-selector.component.scss"
     ]
 })
-export class PabVariableResultsSelectorComponent {
+export class VariableResultsSelectorComponent {
 
     /** résultats non mis en forme */
-    private _pabResults: PabResults;
+    private _results: MultiDimensionResults;
 
     private _selectedValue: number;
 
@@ -34,23 +34,23 @@ export class PabVariableResultsSelectorComponent {
         this._selectedValue = 0;
     }
 
-    public set results(r: PabResults) {
-        this._pabResults = r;
+    public set results(r: MultiDimensionResults) {
+        this._results = r;
 
-        if (this._pabResults) {
+        if (this._results) {
             // pre-extract variable parameters values
             this.varValues = [];
             const nDigits = this.appSetupService.displayDigits;
             // find longest list
             this.size = 0;
-            for (let i = 0; i < this._pabResults.variatedParameters.length; i++) {
-                const vs = this._pabResults.variatedParameters[i].valuesIterator.count();
+            for (let i = 0; i < this._results.variatedParameters.length; i++) {
+                const vs = this._results.variatedParameters[i].valuesIterator.count();
                 if (vs > this.size) {
                     this.size = vs;
                 }
             }
             // get extended values lists for each variable parameter
-            for (const v of this._pabResults.variatedParameters) {
+            for (const v of this._results.variatedParameters) {
                 const vv = [];
                 const iter = v.getExtendedValuesIterator(this.size);
                 while (iter.hasNext) {
@@ -64,9 +64,9 @@ export class PabVariableResultsSelectorComponent {
 
     public get hasVariableResults(): boolean {
         return (
-            this._pabResults
-            && this._pabResults.hasResults
-            && this._pabResults.variatedParameters.length > 0
+            this._results
+            && this._results.hasResults
+            && this._results.variatedParameters.length > 0
         );
     }
 
@@ -79,14 +79,22 @@ export class PabVariableResultsSelectorComponent {
     }
 
     protected entryLabel(index: number): string {
-        let i = 0;
-        return this.varValues.map((vv) => {
-            const vp = this._pabResults.variatedParameters[i];
-            i++;
-            let value = "0";
-            value = vv[index];
-            return `${vp.symbol} = ${value}`;
-        }).join(", ");
+        const kv = [];
+        for (let i = 0; i < this.varValues.length; i++) {
+            const vv = this.varValues[i];
+            const vp = this._results.variatedParameters[i];
+            let symbol = vp.symbol;
+            // is vp a parameter of a child Nub ?
+            if (
+                vp.paramDefinition.parentNub
+                && vp.paramDefinition.parentNub !== vp.paramDefinition.originNub
+            ) {
+                const pos = vp.paramDefinition.parentNub.findPositionInParent() + 1;
+                symbol = this.intlService.localizeText("INFO_LIB_RADIER_N_COURT") + pos + "_" + symbol;
+            }
+            kv.push(`${symbol} = ${vv[index]}`);
+        }
+        return kv.join(", ");
     }
 
     public get selectedValue(): number {
@@ -94,7 +102,7 @@ export class PabVariableResultsSelectorComponent {
     }
 
     public set selectedValue(v: number) {
-        this._pabResults.variableIndex = v;
+        this._results.variableIndex = v;
         this.indexChange.emit();
     }
 
diff --git a/src/app/config.json b/src/app/config.json
index 5160a729c5b169892b9d6c0eacebdbbdaf6e813e..1d9710c5dc8238e6c8d8fef278364e75eeecbd59 100644
--- a/src/app/config.json
+++ b/src/app/config.json
@@ -24,7 +24,7 @@
                 "title": "Passe à poisson sur le petit Buech, seuil de Chiala ou des Savoillons",
                 "credits": "Catherine Tailleux / Irstea"
             },
-            "calculators": [ 11 ]
+            "calculators": [ 11, 17 ]
         },
         {
             "name": "HYDRAULIQUE_A_SURFACE_LIBRE",
diff --git a/src/app/formulaire/definition/concrete/form-macrorugo-compound.ts b/src/app/formulaire/definition/concrete/form-macrorugo-compound.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d15d41e2ba09851e6bb1c4a6356695fec70e941b
--- /dev/null
+++ b/src/app/formulaire/definition/concrete/form-macrorugo-compound.ts
@@ -0,0 +1,233 @@
+import { IObservable, MacroRugo, MacrorugoCompound, Nub, Props, Session } from "jalhyd";
+
+import { FormulaireBase } from "./form-base";
+import { FieldSet } from "../../fieldset";
+import { FieldsetContainer } from "../../fieldset-container";
+import { FormulaireNode } from "../../formulaire-node";
+import { FieldsetTemplate } from "../../fieldset-template";
+import { NgParameter } from "../../ngparam";
+import { FormResultMacrorugoCompound } from "../form-result-macrorugo-compound";
+import { FormComputeMacrorugoCompound } from "../form-compute-macrorugo-compound";
+
+/**
+ * Formulaire pour les passes à macrorugosités complexes
+ */
+export class FormulaireMacrorugoCompound extends FormulaireBase {
+
+    /** id of select configuring apron type */
+    private _apronTypeSelectId: string;
+
+    constructor() {
+        super();
+        this._formResult = new FormResultMacrorugoCompound(this);
+
+        // default properties
+        this._props["inclinedApron"] = false;
+
+        // remove obsolete observer set by super()
+        this.removeObserver(this._formCompute);
+        this._formCompute = new FormComputeMacrorugoCompound(this, (this._formResult as FormResultMacrorugoCompound));
+    }
+
+    public get mrcNub(): MacrorugoCompound {
+        return this.currentNub as MacrorugoCompound;
+    }
+
+    private createMacroRugoNub(templ: FieldsetTemplate): Nub {
+        const params = {};
+        params["calcType"] = templ.calcTypeFromConfig;
+        return this.createMacroRugo(new Props(params));
+    }
+
+    /**
+     * ajoute un nub MacroRugo
+     * @param mr nub à ajouter
+     * @param after position après laquelle insérer le nub, à la fin sinon
+     */
+    private addMacroRugoNub(mr: MacroRugo, after?: number) {
+        this.mrcNub.addChild(mr, after);
+    }
+
+    /**
+     * Asks JaLHyd to create a MacroRugo nub as a child of the current Calculator Module
+     * and return it; does not store it in the Session (for MacroRugo, not for Calculator Modules)
+     * @param p properties for the new Nub
+     */
+    protected createMacroRugo(p: Props): MacroRugo {
+        return Session.getInstance().createNub(p, this.mrcNub) as MacroRugo;
+    }
+
+    /**
+     * Replaces the given MacroRugo sn in the current calculator module,
+     * with a new one built with properties "params"
+     * @param mr MacroRugo to replace
+     * @param params properties to build the new Nub (calcType)
+     */
+    protected replaceNub(mr: MacroRugo, params: Props): Nub {
+        const parent = this.mrcNub;
+        const newStructure = this.createMacroRugo(params);
+        parent.replaceChildInplace(mr, newStructure);
+        return newStructure;
+    }
+
+    public createFieldset(parent: FormulaireNode, json: {}, data?: {}, nub?: Nub): FieldSet {
+        if (json["calcType"] === "MacroRugo") {
+            // indice après lequel insérer le nouveau FieldSet
+            const after = data["after"];
+
+            const res: FieldSet = new FieldSet(parent);
+            let mrn: Nub;
+            if (nub) { // use existing Nub (build interface based on model)
+                mrn = nub;
+            } else {
+                mrn = this.createMacroRugoNub(data["template"]);
+                this.addMacroRugoNub(mrn as MacroRugo, after);
+            }
+            res.setNub(mrn, false);
+
+            if (after !== undefined) {
+                parent.kids.splice(after + 1, 0, res);
+            } else {
+                parent.kids.push(res);
+            }
+
+            this.resetResults();
+
+            return res;
+        } else {
+            return super.createFieldset(parent, json, data);
+        }
+    }
+
+    protected parseOptions(json: {}) {
+        super.parseOptions(json);
+        this._apronTypeSelectId = this.getOption(json, "apronTypeSelectId");
+    }
+
+    public afterParseFieldset(fs: FieldSet) {
+        // if Fieldset contains apron type selector
+        if (this._apronTypeSelectId) {
+            const sel = fs.getFormulaireNodeById(this._apronTypeSelectId);
+            if (sel) {
+                // on abonne le formulaire aux propriétés du FieldSet
+                fs.properties.addObserver(this);
+            }
+        }
+    }
+
+    public moveFieldsetUp(fs: FieldSet) {
+        if (fs.nub instanceof MacroRugo) {
+            // déplacement du nub
+            fs.nub.parent.moveChildUp(fs.nub);
+            // déplacement du fieldset
+            this.fieldsetContainer.moveFieldsetUp(fs);
+
+            this.resetResults();
+        } else {
+            super.moveFieldsetUp(fs);
+        }
+    }
+
+    public moveFieldsetDown(fs: FieldSet) {
+        if (fs.nub instanceof MacroRugo) {
+            // déplacement du nub
+            fs.nub.parent.moveChildDown(fs.nub);
+            // déplacement du fieldset
+            this.fieldsetContainer.moveFieldsetDown(fs);
+
+            this.resetResults();
+        } else { super.moveFieldsetDown(fs); }
+    }
+
+    public removeFieldset(fs: FieldSet) {
+        if (fs.nub instanceof MacroRugo) {
+            // suppression du sous-nub dans le Nub parent
+            this.mrcNub.deleteChild(fs.nub.findPositionInParent());
+            // suppression du fieldset
+            this.fieldsetContainer.removeFieldset(fs);
+
+            this.resetResults();
+        } else { super.removeFieldset(fs); }
+    }
+
+    protected completeParse(json: {}) {
+        this.subscribeFieldsetContainer();
+        this.updateApronState(this.mrcNub.properties.getPropValue("inclinedApron"));
+    }
+
+    private get fieldsetContainer(): FieldsetContainer {
+        const n = this.getFormulaireNodeById("macrorugo_container");
+        if (n === undefined || !(n instanceof FieldsetContainer)) {
+            throw new Error("l'élément 'macrorugo_container' n'est pas du type FieldsetContainer");
+        }
+        return n as FieldsetContainer;
+    }
+
+    /**
+     * abonnement en tant qu'observateur du FieldsetContainer
+     */
+    private subscribeFieldsetContainer() {
+        this.fieldsetContainer.addObserver(this);
+    }
+
+    /**
+     * abonnement en tant qu'observateur des NgParameter des FieldSet contenus dans le FieldsetContainer
+     */
+    private subscribeMacrorugoInputFields(fs: FieldSet) {
+        for (const n of fs.allFormElements) {
+            if (n instanceof NgParameter) {
+                n.addObserver(this);
+            }
+        }
+    }
+
+    /**
+     * Reflect inclinedApron property state in GUI
+     */
+    public updateApronState(inclined: boolean) {
+        for (const fs of this.allFieldsets) {
+            // show / hide dependent fields (read from model)
+            fs.updateFields();
+        }
+        // show / hide children list (GUI only)
+        for (const elt of this.allFormElements) {
+            if (elt instanceof FieldsetContainer) {
+                elt.isDisplayed = (! inclined);
+            }
+        }
+        // when switching to multiple aprons, remove all fieldset container
+        // instances and reinstanciate for every MacroRugo child
+        if (! inclined) {
+            for (const elt of this.allFormElements) {
+                if (elt instanceof FieldsetContainer) {
+                    elt.clearKids();
+                    for (const c of this.mrcNub.children) {
+                        elt.addFromTemplate(0, undefined, c);
+                    }
+                }
+            }
+        }
+    }
+
+    // interface Observer
+
+    public update(sender: IObservable, data: any) {
+
+        super.update(sender, data);
+
+        if (sender instanceof FieldsetContainer) {
+            switch (data.action) {
+                case "newFieldset":
+                    this.reset();
+                    this.subscribeMacrorugoInputFields(data["fieldset"]);
+            }
+        } else  if (sender instanceof FieldSet && data.action === "propertyChange") {
+            switch (data.name) {
+                case "inclinedApron":
+                    this.updateApronState(data.value);
+                    this.reset();
+                    break;
+            }
+        }
+    }
+}
diff --git a/src/app/formulaire/definition/form-compute-fixedvar.ts b/src/app/formulaire/definition/form-compute-fixedvar.ts
index 00d5793b3e0b26a34340904c1e2e504c371b8b3e..ba74fda4ffa308a3d092a10fbad8fa8d7ecad172 100644
--- a/src/app/formulaire/definition/form-compute-fixedvar.ts
+++ b/src/app/formulaire/definition/form-compute-fixedvar.ts
@@ -14,24 +14,6 @@ export class FormComputeFixedVar extends FormCompute {
         return this._formResult as FormResultFixedVar;
     }
 
-    private getVariatedParameters(): NgParameter[] {
-        let res: NgParameter[] = [];
-        // find variated local parameters
-        res = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.VAR);
-        // add variated linked parameters
-        const pms = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.LINK);
-        for (const p of pms) {
-            if (p.paramDefinition.hasMultipleValues) {
-                res.push(p);
-            }
-        }
-        return res;
-    }
-
-    private getComputedParameter(): NgParameter {
-        return this._formBase.getDisplayedParamFromState(ParamRadioConfig.CAL);
-    }
-
     protected compute() {
         this.runNubCalc(this._formBase.currentNub);
         this.reaffectResultComponents();
diff --git a/src/app/formulaire/definition/form-compute-macrorugo-compound.ts b/src/app/formulaire/definition/form-compute-macrorugo-compound.ts
new file mode 100644
index 0000000000000000000000000000000000000000..4b6de1561f4af18a48d07b9d27a7f5f529bef14f
--- /dev/null
+++ b/src/app/formulaire/definition/form-compute-macrorugo-compound.ts
@@ -0,0 +1,42 @@
+import { Result, MacrorugoCompound } from "jalhyd";
+
+import { FormulaireDefinition } from "./form-definition";
+import { FormCompute } from "./form-compute";
+import { FormResultMacrorugoCompound } from "./form-result-macrorugo-compound";
+import { NgParameter, ParamRadioConfig } from "../ngparam";
+
+export class FormComputeMacrorugoCompound extends FormCompute {
+
+    constructor(formBase: FormulaireDefinition, formResult: FormResultMacrorugoCompound) {
+        super(formBase, formResult);
+    }
+
+    protected get formResult(): FormResultMacrorugoCompound {
+        return this._formResult as FormResultMacrorugoCompound;
+    }
+
+    protected compute() {
+        this.runNubCalc(this._formBase.currentNub);
+        this.reaffectResultComponents();
+    }
+
+    protected reaffectResultComponents() {
+        const mrc: MacrorugoCompound = (this._formBase.currentNub as MacrorugoCompound);
+        const computedParam: NgParameter = this.getComputedParameter();
+        const varParams: NgParameter[] = this.getVariatedParameters();
+
+        // résultat de calcul de la passe à macrorugo complexe
+        const mrcr = this.formResult.mrcResults;
+        mrcr.calculatedParameter = computedParam;
+        mrcr.result = mrc.result;
+        if (varParams) {
+            mrcr.variatedParameters = varParams;
+        }
+        // résultat de chaque enfant
+        const cr: Result[] = [];
+        for (const c of mrc.children) {
+            cr.push(c.result);
+        }
+        mrcr.childrenResults = cr;
+    }
+}
diff --git a/src/app/formulaire/definition/form-compute-pab.ts b/src/app/formulaire/definition/form-compute-pab.ts
index bcde3d155e6f9944a28fa8311c8c1db4d3d8f347..445ad0b5d4a853b28890a019b58640b1f18d858d 100644
--- a/src/app/formulaire/definition/form-compute-pab.ts
+++ b/src/app/formulaire/definition/form-compute-pab.ts
@@ -15,17 +15,6 @@ export class FormComputePab extends FormCompute {
         return this._formResult as FormResultPab;
     }
 
-    private getVariatedParameters(): NgParameter[] {
-        const res = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.VAR);
-        const pms = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.LINK);
-        for (const p of pms) {
-            if (p.paramDefinition.hasMultipleValues) {
-                res.push(p);
-            }
-        }
-        return res;
-    }
-
     protected compute() {
         this.runNubCalc(this._formBase.currentNub);
         this.reaffectResultComponents();
@@ -46,7 +35,7 @@ export class FormComputePab extends FormCompute {
         for (const c of pab.children) {
             cr.push(c.result);
         }
-        pabr.cloisonsResults = cr,
+        pabr.cloisonsResults = cr;
         // résultat de la cloison aval
         pabr.cloisonAvalResults = pab.downWall.result;
 
@@ -74,8 +63,4 @@ export class FormComputePab extends FormCompute {
             pabr.variatedParameters = varParams;
         }
     }
-
-    private getComputedParameter(): NgParameter {
-        return this._formBase.getDisplayedParamFromState(ParamRadioConfig.CAL);
-    }
 }
diff --git a/src/app/formulaire/definition/form-compute.ts b/src/app/formulaire/definition/form-compute.ts
index af5c587cda210a94a857ce12f2dc14e3888614c2..14a21c5d61839f463c8cec0b41667e01ea8fc606 100644
--- a/src/app/formulaire/definition/form-compute.ts
+++ b/src/app/formulaire/definition/form-compute.ts
@@ -2,6 +2,7 @@ import { Nub, Result, ParamDomainValue, Observer, ParamDefinition } from "jalhyd
 
 import { FormResult } from "./form-result";
 import { FormulaireDefinition } from "./form-definition";
+import { NgParameter, ParamRadioConfig } from "../ngparam";
 
 export abstract class FormCompute implements Observer {
 
@@ -91,6 +92,29 @@ export abstract class FormCompute implements Observer {
         return nub.CalcSerie(init, this.getParameterRefid(computedParam));
     }
 
+    protected getComputedParameter(): NgParameter {
+        const cpd = this._formBase.currentNub.calculatedParam;
+        let ngparam = this._formBase.getParamFromSymbol(cpd.symbol);
+        if (ngparam === undefined) { // calculated parameter is not displayed on screen
+            ngparam = new NgParameter(cpd, this._formBase);
+        }
+        return ngparam;
+    }
+
+    protected getVariatedParameters(): NgParameter[] {
+        let res: NgParameter[] = [];
+        // find variated local parameters
+        res = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.VAR);
+        // add variated linked parameters
+        const pms = this._formBase.getDisplayedParamListFromState(ParamRadioConfig.LINK);
+        for (const p of pms) {
+            if (p.paramDefinition.hasMultipleValues) {
+                res.push(p);
+            }
+        }
+        return res;
+    }
+
     /**
      * Triggers computation of the Nub, updates form results
      */
diff --git a/src/app/formulaire/definition/form-definition.ts b/src/app/formulaire/definition/form-definition.ts
index aae431e1eebbe31d9bb03e75870ca2b77b1e019a..151e4319e417ac99e994e5a08fa84d0b59c98b3b 100644
--- a/src/app/formulaire/definition/form-definition.ts
+++ b/src/app/formulaire/definition/form-definition.ts
@@ -153,8 +153,12 @@ export abstract class FormulaireDefinition extends FormulaireNode implements Obs
 
     public createFieldset(parent: FormulaireNode, json: {}, data?: {}, nub?: Nub): FieldSet {
         const res: FieldSet = new FieldSet(parent);
-        res.setNub(this._currentNub, false);
-        this.kids.push(res);
+        if (nub !== undefined) {
+            res.setNub(nub, false);
+        } else {
+            res.setNub(this._currentNub, false);
+        }
+        parent.kids.push(res);
         return res;
     }
 
diff --git a/src/app/formulaire/definition/form-result-macrorugo-compound.ts b/src/app/formulaire/definition/form-result-macrorugo-compound.ts
new file mode 100644
index 0000000000000000000000000000000000000000..73ba7e9d2ece0f8c90dfe8808a931db85b3b46b7
--- /dev/null
+++ b/src/app/formulaire/definition/form-result-macrorugo-compound.ts
@@ -0,0 +1,33 @@
+import { FormulaireDefinition } from "./form-definition";
+import { FormResult } from "./form-result";
+import { CalculatorResults } from "../../results/calculator-results";
+import { MacrorugoCompoundResults } from "../../results/macrorugo-compound-results";
+
+export class FormResultMacrorugoCompound extends FormResult {
+
+    protected _formBase: FormulaireDefinition;
+
+    protected _mrcResults: MacrorugoCompoundResults;
+
+    constructor(base: FormulaireDefinition) {
+        super();
+        this._formBase = base;
+        this._mrcResults = new MacrorugoCompoundResults();
+    }
+
+    public get mrcResults() {
+        return this._mrcResults;
+    }
+
+    public resetResults() {
+        this._mrcResults.reset();
+    }
+
+    public get results(): CalculatorResults[] {
+        return [ this._mrcResults ];
+    }
+
+    public get hasResults(): boolean {
+        return this._mrcResults.hasResults;
+    }
+}
diff --git a/src/app/formulaire/fieldset.ts b/src/app/formulaire/fieldset.ts
index fcfbb4e889530fccac16df11fbac2264a71bf89b..053d95f2f0be0b0856c0c11b269935d71741a46e 100644
--- a/src/app/formulaire/fieldset.ts
+++ b/src/app/formulaire/fieldset.ts
@@ -227,6 +227,9 @@ export class FieldSet extends FormulaireElement implements Observer {
                 this.setSelectValueFromProperty("select_target", "varCalc");
                 break;
 
+            case "fs_pass_type": // macro-rugo complexe
+                this.setSelectValueFromProperty("select_pass_type", "inclinedApron");
+                break;
         }
     }
 
@@ -358,6 +361,9 @@ export class FieldSet extends FormulaireElement implements Observer {
                         case "select_target": // courbes de remous, variable à calculer
                             this.setPropValue("varCalc", data.value.value);
                             break;
+                        case "select_pass_type": // macro-rugo complexe
+                            this.setPropValue("inclinedApron", data.value.value);
+                            break;
                     }
                     break;
             }
diff --git a/src/app/formulaire/formulaire-element.ts b/src/app/formulaire/formulaire-element.ts
index dab5ab0cb6ff2fa1c4052dbcce7c8cca0a0dd144..1542ad3156e6eb8f810d47cff161c3bfdb199010 100644
--- a/src/app/formulaire/formulaire-element.ts
+++ b/src/app/formulaire/formulaire-element.ts
@@ -53,10 +53,6 @@ export abstract class FormulaireElement extends FormulaireNode {
         return this._label;
     }
 
-    /* set labelNumber(n: number) {
-        this._labelNumber = n;
-    } */
-
     public getKids(): FormulaireElement[] {
         return this.kids as FormulaireElement[];
     }
diff --git a/src/app/formulaire/ngparam.ts b/src/app/formulaire/ngparam.ts
index a76a934ffbc26dea8d725d3010265fbc1c99ed1c..5bfa5e187603bc0bd787f0b4f7d09b0b09a7dc7c 100644
--- a/src/app/formulaire/ngparam.ts
+++ b/src/app/formulaire/ngparam.ts
@@ -107,7 +107,7 @@ export class NgParameter extends InputField implements Observer {
             // calculated param ?
             if (targetParam.valueMode === ParamValueMode.CALCUL) {
                 // was the result already computed ?
-                // @WARNING .result might be set but the computation might have failed (dichotomy for ex.)
+                // .result might be set but the computation might have failed (dichotomy for ex.)
                 if (ref.nub.result) {
                     if (ref.hasMultipleValues()) {
                         // compact representation
diff --git a/src/app/formulaire/select-field.ts b/src/app/formulaire/select-field.ts
index 7e87dd83baadfeced8ca68e00c3b8d79b6723022..bcf8cc69c8a7b30cf1d1de10aa07ee2ca8c75aa2 100644
--- a/src/app/formulaire/select-field.ts
+++ b/src/app/formulaire/select-field.ts
@@ -157,6 +157,11 @@ export class SelectField extends Field {
                     this.addEntry(e);
                 }
                 break;
+
+            case "mrc_pass_type": // macrorugo complexe: type de radier
+                this.addEntry(new SelectEntry(this._entriesBaseId + "0", false));
+                this.addEntry(new SelectEntry(this._entriesBaseId + "1", true));
+                break;
         }
     }
 }
diff --git a/src/app/results/calculator-results.ts b/src/app/results/calculator-results.ts
index 36f23984c93504e36b34a31fa7ff71ff3db16189..0fcc1c0901c576fa9c3a357d30d12044cd94fa93 100644
--- a/src/app/results/calculator-results.ts
+++ b/src/app/results/calculator-results.ts
@@ -1,11 +1,13 @@
+import { Nub, capitalize } from "jalhyd";
+
 import { NgParameter } from "../formulaire/ngparam";
-import { Nub } from "jalhyd";
 import { ServiceFactory } from "../services/service-factory";
 
+import { sprintf } from "sprintf-js";
+
 export abstract class CalculatorResults {
 
     /**
-     * 
      * @param p parameter to generate label for
      * @param displaySymbol if true, will prefix label with parameter symbol (ex: "ZDV")
      * @param referenceNub if given, will detect if parameter belongs to a child of this reference Nub, and
@@ -18,10 +20,11 @@ export abstract class CalculatorResults {
         if (referenceNub) {
             const children = referenceNub.getChildren();
             const parameterNub = p.paramDefinition.parentNub;
+            const cn = capitalize(ServiceFactory.instance.i18nService.childName(parameterNub));
             if (children.includes(parameterNub)) {
                 isChildParam = true;
                 const pos = parameterNub.findPositionInParent() + 1;
-                res = ServiceFactory.instance.i18nService.localizeText("INFO_OUVRAGE_N") + pos + " : ";
+                res = sprintf(ServiceFactory.instance.i18nService.localizeText("INFO_OUVRAGE_N"), cn) + pos + " : ";
             }
         }
         if (displaySymbol && ! isChildParam) {
diff --git a/src/app/results/macrorugo-compound-results.ts b/src/app/results/macrorugo-compound-results.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dbcdaa4559f4169252885d5ff6b6c385758280b3
--- /dev/null
+++ b/src/app/results/macrorugo-compound-results.ts
@@ -0,0 +1,122 @@
+import { Result } from "jalhyd";
+
+import { ServiceFactory } from "../services/service-factory";
+import { MultiDimensionResults } from "./multidimension-results";
+
+export class MacrorugoCompoundResults extends MultiDimensionResults {
+
+    /** résultats des modules MacroRugo enfants */
+    public childrenResults: Result[];
+
+    /** symboles des colonnes de résultat */
+    protected _columns: string[];
+
+    public constructor() {
+        super();
+        this.reset();
+        // standard headers
+        this._columns = [
+            "RADIER_N",
+            "ZF1",
+            "B",
+            "Q",
+            "ZF2",
+            "Vdeb",
+            "Fr",
+            "Vmax",
+            "PV",
+            "ENUM_MacroRugoFlowType",
+            "Q_GuideTech",
+            "V_GuideTech",
+            "xCenter"
+        ];
+    }
+
+    /** headers symbols */
+    public get columns() {
+        return this._columns;
+    }
+
+    /** translated headers texts */
+    public get headers() {
+        return this._columns.map((h) => {
+            // calculator type for translation
+            const sn = this.result.sourceNub;
+            let ct = sn.calcType;
+            if (sn.parent) {
+                ct = sn.parent.calcType;
+            }
+            let unit;
+            // is h a parameter ? If so, extract its unit
+            try {
+                const p = sn.getParameter(h);
+                if (p) {
+                    unit = p.unit;
+                }
+            } catch (e) { /* silent fail */ }
+            return ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct , h, unit);
+        });
+    }
+
+    public reset() {
+        super.reset();
+        this.childrenResults = [];
+    }
+
+    /**
+     * Returns true if at least one log message is present in the PAB result or any
+     * of the children results
+     */
+    public get hasLog(): boolean {
+        if (this.childrenResults) {
+            for (const cr of this.childrenResults) {
+                if (cr && cr.hasLog()) {
+                    return true;
+                }
+            }
+        }
+        return (this.result && this.result.hasLog());
+    }
+
+    // do not test result.ok else log messages will prevent partial results from being displayed
+    public get hasResults(): boolean {
+        return this.result !== undefined && ! this.result.hasOnlyErrors;
+    }
+
+    /** retourne true si au moins un calcul a échoué (le log a un code négatif) */
+    public hasError(): boolean {
+        let err = false;
+        // log principal
+        err = (err || this.result.hasErrorMessages());
+        // logs des enfants
+        for (const c of this.childrenResults) {
+            err = (err || c.hasErrorMessages());
+        }
+
+        return err;
+    }
+
+    /** retourne true si le calcul à l'itération i a échoué */
+    public iterationHasError(i: number): boolean {
+        let err = this.result.resultElements[i].hasErrorMessages();
+        // logs des cloisons
+        for (const c of this.childrenResults) {
+            err = (err || c.resultElements[i].hasErrorMessages());
+        }
+
+        return err;
+    }
+
+    /** retourne true si tous les calculs ont échoué */
+    public hasOnlyErrors(): boolean {
+        let err = true;
+        // log principal
+        err = (err && this.result.hasOnlyErrors);
+        // logs des cloisons
+        for (const c of this.childrenResults) {
+            err = (err && c.hasOnlyErrors);
+        }
+
+        return err;
+    }
+}
diff --git a/src/app/results/multidimension-results.ts b/src/app/results/multidimension-results.ts
new file mode 100644
index 0000000000000000000000000000000000000000..86c42164c5a9646a744530c4fd7a050c0a7cdb39
--- /dev/null
+++ b/src/app/results/multidimension-results.ts
@@ -0,0 +1,13 @@
+import { CalculatedParamResults } from "./param-calc-results";
+import { PlottableData } from "./plottable-data";
+import { NgParameter } from "../formulaire/ngparam";
+
+
+export class MultiDimensionResults extends CalculatedParamResults/*  implements PlottableData */ {
+
+    /** paramètres variés */
+    public variatedParameters: NgParameter[];
+
+    /** index de la valeur du paramètre varié à afficher dans les résultats */
+    public variableIndex = 0;
+}
diff --git a/src/app/results/pab-results.ts b/src/app/results/pab-results.ts
index a81d371583a9a71b80c1d0242482021689be7f0a..d407ae8a49735568ca7777c56373d3e1555470b0 100644
--- a/src/app/results/pab-results.ts
+++ b/src/app/results/pab-results.ts
@@ -1,10 +1,10 @@
 import { Result } from "jalhyd";
 
-import { CalculatedParamResults } from "./param-calc-results";
 import { NgParameter } from "../formulaire/ngparam";
 import { ServiceFactory } from "../services/service-factory";
+import { MultiDimensionResults } from "./multidimension-results";
 
-export class PabResults extends CalculatedParamResults {
+export class PabResults extends MultiDimensionResults {
 
     /** résultats des modules Cloisons avant chaque bassin */
     public cloisonsResults: Result[];
@@ -18,12 +18,6 @@ export class PabResults extends CalculatedParamResults {
      * */
     public Z2: number[];
 
-    /** paramètres variés */
-    public variatedParameters: NgParameter[];
-
-    /** index de la valeur du paramètre varié à afficher dans les résultats */
-    public variableIndex = 0;
-
     /** symboles des colonnes de résultat */
     protected _columns: string[];
 
diff --git a/src/app/results/plottable-macrorugo-compound-results.ts b/src/app/results/plottable-macrorugo-compound-results.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b4fb93c505d5430bf0ff3665dcd18d89ea5869eb
--- /dev/null
+++ b/src/app/results/plottable-macrorugo-compound-results.ts
@@ -0,0 +1,121 @@
+import { PlottableData } from "./plottable-data";
+import { GraphType } from "./graph-type";
+import { ServiceFactory } from "../services/service-factory";
+import { MacrorugoCompoundResults } from "./macrorugo-compound-results";
+
+export class PlottableMacrorugoCompoundResults implements PlottableData {
+
+    public graphType: GraphType = GraphType.Scatter;
+    public chartX: string;
+    public chartY: string;
+
+    protected mrcResults: MacrorugoCompoundResults;
+
+    public constructor(mrcResults?: MacrorugoCompoundResults) {
+        if (mrcResults) {
+            this.setMrcResults(mrcResults);
+        }
+        // axes par défaut
+        this.chartX = this.chartX || "xCenter";
+        this.chartY = this.chartY || "Q";
+    }
+
+    /** reaffect mrcResults, for ex. when objet was contructed with empty mrcResults */
+    public setMrcResults(mrcResults: MacrorugoCompoundResults) {
+        this.mrcResults = mrcResults;
+    }
+
+    /**
+     * Returns the label to display, for an element of getAvailableChartAxis()
+     * @param symbol parameter / result symbol (ex: "Q")
+     */
+    public getChartAxisLabel(symbol: string): string {
+        return this.mrcResults.headers[this.mrcResults.columns.indexOf(symbol)];
+    }
+
+    public expandLabelFromSymbol(symbol: string): string {
+        return symbol;
+    }
+
+    /**
+     * Returns a list of plottable parameters / result elements, that can be defined
+     * as X or Y chart axis
+     */
+    public getAvailableChartAxis(): string[] {
+        const axis = [];
+        for (const c of this.mrcResults.columns) {
+            if (c.indexOf("ENUM_") === -1) { // ENUM variables are not plottable
+                axis.push(c);
+            }
+        }
+        return axis;
+    }
+
+    public getAvailableXAxis(): string[] {
+        return this.getAvailableChartAxis();
+    }
+
+    public getAvailableYAxis(): string[] {
+        return this.getAvailableChartAxis();
+    }
+
+    // just to implement interface
+    public getVariatingParametersSymbols(): string[] {
+        return [];
+    }
+
+    /**
+     * Returns the series of values for the required symbol
+     * @param symbol parameter / result symbol (ex: "Q")
+     */
+    public getValuesSeries(symbol: string): number[] {
+        const data: number[] = [];
+        const l = this.mrcResults.childrenResults.length;
+        // when a parameter is variating, index of the variating parameter
+        // values to build the data from
+        const vi = this.mrcResults.variableIndex;
+
+        if (this.mrcResults.iterationHasError(vi)) {
+            return [];
+        }
+
+        for (let i = 0; i < l; i++) {
+            switch (symbol) {
+                case "RADIER_N":
+                    data.push(i + 1);
+                    break;
+
+                case "ZF1":
+                case "B":
+                    let v: number;
+                    const nub = this.mrcResults.childrenResults[i].sourceNub;
+                    const param = nub.getParameter(symbol);
+                    try {
+                        if (param.hasMultipleValues) {
+                            v = param.getInferredValuesList()[vi];
+                        } else {
+                            v = param.singleValue;
+                        }
+                    } catch (e) {
+                        // silent fail
+                    }
+                    data.push(v);
+                    break;
+
+                case "Q":
+                case "ZF2":
+                case "Vdeb":
+                case "Fr":
+                case "Vmax":
+                case "PV":
+                case "Q_GuideTech":
+                case "V_GuideTech":
+                case "xCenter":
+                    data.push(this.mrcResults.childrenResults[i].resultElements[vi].getValue(symbol));
+                    break;
+            }
+        }
+
+        return data;
+    }
+}
diff --git a/src/app/results/var-results.ts b/src/app/results/var-results.ts
index a3823065caa4db96c3939c878bbf3f37387fa36d..132ae82341b247e6278bd8fdefa87f46dbe501b8 100644
--- a/src/app/results/var-results.ts
+++ b/src/app/results/var-results.ts
@@ -1,11 +1,13 @@
 import { CalculatorResults } from "./calculator-results";
 import { CalculatedParamResults } from "./param-calc-results";
 import { NgParameter } from "../formulaire/ngparam";
-import { ResultElement, ParamFamily } from "jalhyd";
+import { ResultElement, ParamFamily, capitalize } from "jalhyd";
 import { ServiceFactory } from "../services/service-factory";
 import { PlottableData } from "./plottable-data";
 import { GraphType } from "./graph-type";
 
+import { sprintf } from "sprintf-js";
+
 export class VarResults extends CalculatedParamResults implements PlottableData {
     /**
      * paramètres variés
@@ -132,7 +134,8 @@ export class VarResults extends CalculatedParamResults implements PlottableData
             const pos = +match[1];
             ct = sn.getChildren()[pos].calcType;
             symbol = match[2];
-            ret += ServiceFactory.instance.i18nService.localizeText("INFO_OUVRAGE_N") + (pos + 1) + " : ";
+            const cn = capitalize(ServiceFactory.instance.i18nService.childName(sn));
+            ret += sprintf(ServiceFactory.instance.i18nService.localizeText("INFO_STUFF_N"), cn) + (pos + 1) + " : ";
         }
         ret += ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct, symbol);
         return ret;
@@ -353,19 +356,28 @@ export class VarResults extends CalculatedParamResults implements PlottableData
         // entêtes des résultats
         this._resultHeaders = [];
         for (const k of this.resultKeys) {
+            let unit;
+            // is k the calculated parameter ? If so, extract its unit
+            try {
+                const p = sn.getParameter(k);
+                if (p) {
+                    unit = p.unit;
+                }
+            } catch (e) { /* silent fail */ }
             this._resultHeaders.push(
-                ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct, k)
+                ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct, k, unit)
             );
         }
         // entêtes des résultats des enfants
         for (const c of sn.getChildren()) {
             if (c.result) {
+                const cn = capitalize(ServiceFactory.instance.i18nService.childName(sn));
                 // using latest ResultElement; results count / types are supposed to be the same on every iteration
                 for (const k of c.result.resultElement.keys) {
                     this._resultHeaders.push(
-                        ServiceFactory.instance.i18nService.localizeText("INFO_OUVRAGE_N")
+                        sprintf(ServiceFactory.instance.i18nService.localizeText("INFO_STUFF_N"), cn)
                             + (c.findPositionInParent() + 1) + " : "
-                            + ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(c.calcType, k)
+                            + ServiceFactory.instance.formulaireService.expandVariableNameAndUnit(ct, k)
                     );
                 }
             }
diff --git a/src/app/services/formulaire/formulaire.service.ts b/src/app/services/formulaire/formulaire.service.ts
index c88c9681a90d317e2c765f912688c241a0dedd4b..dd372d615e51f2d64a6c1d2602dd4dc54d6e8c9c 100644
--- a/src/app/services/formulaire/formulaire.service.ts
+++ b/src/app/services/formulaire/formulaire.service.ts
@@ -35,6 +35,7 @@ import { FieldsetContainer } from "../..//formulaire/fieldset-container";
 import { ApplicationSetupService } from "../app-setup/app-setup.service";
 import { NotificationsService } from "../notifications/notifications.service";
 import { FormulairePab } from "../../formulaire/definition/concrete/form-pab";
+import { FormulaireMacrorugoCompound } from "../../formulaire/definition/concrete/form-macrorugo-compound";
 
 @Injectable()
 export class FormulaireService extends Observable {
@@ -75,6 +76,7 @@ export class FormulaireService extends Observable {
         this.calculatorPaths[CalculatorType.Cloisons] = "cloisons";
         this.calculatorPaths[CalculatorType.MacroRugo] = "macrorugo";
         this.calculatorPaths[CalculatorType.Pab] = "pab";
+        this.calculatorPaths[CalculatorType.MacroRugoCompound] = "macrorugo-compound";
     }
 
     private get _intlService(): I18nService {
@@ -206,8 +208,9 @@ export class FormulaireService extends Observable {
      * Returns variable name and unit from symbol
      * @param calcType
      * @param symbol
+     * @param forceUnit if given, will be used as nuit
      */
-    public expandVariableNameAndUnit(calcType: CalculatorType, symbol: string): string {
+    public expandVariableNameAndUnit(calcType: CalculatorType, symbol: string, forceUnit?: string): string {
         let s = this.expandVariableName(calcType, symbol);
         let langCache = this.languageCache; // language cache…
         if (langCache && langCache[calcType]) {
@@ -222,9 +225,17 @@ export class FormulaireService extends Observable {
         if (idx !== -1) {
             symbolBase = symbolBase.substring(idx + 2);
         }
-        const unitKey = "UNIT_" + symbolBase;
-        if (langCache && langCache[unitKey] !== undefined) {
-            s = s + " (" + this.intlService.localizeText(unitKey, langCache) + ")";
+        let unit;
+        if (forceUnit) {
+            unit = forceUnit;
+        } else {
+            const unitKey = "UNIT_" + symbolBase;
+            if (langCache && langCache[unitKey] !== undefined) {
+                unit = this.intlService.localizeText(unitKey, langCache);
+            }
+        }
+        if (unit) {
+            s = s + " (" + unit + ")";
         }
         return s;
     }
@@ -299,6 +310,10 @@ export class FormulaireService extends Observable {
                 f = new FormulairePab();
                 break;
 
+            case CalculatorType.MacroRugoCompound:
+                f = new FormulaireMacrorugoCompound();
+                break;
+
             default:
                 f = new FormulaireBase();
         }
diff --git a/src/app/services/internationalisation/internationalisation.service.ts b/src/app/services/internationalisation/internationalisation.service.ts
index 7590f251dc3410941b9a04f7e86204ec92d69636..23621adbe0ffaa70384e566b6094dc63e2b03c6e 100644
--- a/src/app/services/internationalisation/internationalisation.service.ts
+++ b/src/app/services/internationalisation/internationalisation.service.ts
@@ -1,6 +1,6 @@
 import { Injectable, isDevMode } from "@angular/core";
 
-import { Message, MessageCode, Observable, Observer, CalculatorType, LoiDebit } from "jalhyd";
+import { Message, MessageCode, Observable, Observer, CalculatorType, LoiDebit, Nub } from "jalhyd";
 
 import { StringMap } from "../../stringmap";
 import { ApplicationSetupService } from "../app-setup/app-setup.service";
@@ -201,6 +201,19 @@ export class I18nService extends Observable implements Observer {
         return value.toFixed(nDigits);
     }
 
+    /**
+     * Returns the localized name for the children type of the current Nub
+     * @param plural if true, will return plural name
+     */
+    public childName(nub: Nub, plural: boolean = false) {
+        const type: string = nub.childrenType;
+        let k = "INFO_CHILD_TYPE_" + type.toUpperCase();
+        if (plural) {
+            k += "_PLUR";
+        }
+        return this.localizeText(k);
+    }
+
     // interface Observer
 
     /**
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 08c4f88647b1887523977625fd2337dab092ed5a..3305a7ddc8c0f851e5b9f0f05560c9b0c3bb62d3 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -123,6 +123,17 @@
     "INFO_DEVICE_MOVED": "Device #%s moved",
     "INFO_DEVICE_REMOVED": "Device #%s removed",
     "INFO_DEVICES_REMOVED": "%s device(s) removed",
+    "INFO_STUFF_ADDED": "1 %s added",
+    "INFO_STUFF_ADDED_N_TIMES": "%s %s added",
+    "INFO_STUFF_COPIED": "%s #%s copied",
+    "INFO_STUFF_COPIED_N_TIMES": "%s #%s copied %s times",
+    "INFO_STUFF_MOVED": "%s #%s moved",
+    "INFO_STUFF_REMOVED": "%s #%s removed",
+    "INFO_STUFF_N": "%s #",
+    "INFO_CHILD_TYPE_STRUCTURE": "device",
+    "INFO_CHILD_TYPE_STRUCTURE_PLUR": "devices",
+    "INFO_CHILD_TYPE_MACRORUGO": "apron",
+    "INFO_CHILD_TYPE_MACRORUGO_PLUR": "aprons",
     "INFO_FIELDSET_ADD": "Add",
     "INFO_FIELDSET_COPY": "Copy",
     "INFO_FIELDSET_REMOVE": "Remove",
@@ -204,8 +215,10 @@
     "INFO_LIB_Q": "Discharge",
     "INFO_LIB_QA": "Attraction flow",
     "INFO_LIB_R": "Hydraulic radius",
-    "INFO_LIB_S": "Orifice area",
     "INFO_LIB_RADIER": "Basin bottom",
+    "INFO_LIB_RADIER_N": "Apron #",
+    "INFO_LIB_RADIER_N_COURT": "A",
+    "INFO_LIB_S": "Orifice area",
     "INFO_LIB_SELECT_LOIDEBIT": "Stage-discharge law",
     "INFO_LIB_SELECT_LOIDEBIT1_KIVI": "Kindsvater-Carter and Villemonte",
     "INFO_LIB_SELECT_LOIDEBIT1": "Stage-discharge law",
@@ -217,6 +230,7 @@
     "INFO_LIB_STRUCT_CONTAINER": "Devices",
     "INFO_LIB_TAU0": "Tractive force",
     "INFO_LIB_TOR": "Supercritical water line",
+    "INFO_LIB_TOTAL": "Total",
     "INFO_LIB_V_GUIDETECH": "Technical guide speed",
     "INFO_LIB_V": "Average speed",
     "INFO_LIB_VDEB": "Conveyance speed",
@@ -261,6 +275,8 @@
     "INFO_LOIDEBIT_WeirVillemonte": "Notch (Villemonte 1957)",
     "INFO_MACRORUGO_TITRE_COURT": "Rock-ramp",
     "INFO_MACRORUGO_TITRE": "Rock-ramp fishpasses (beta)",
+    "INFO_MACRORUGOCOMPOUND_TITRE": "Compound rock-ramp fishpasses (beta)",
+    "INFO_MACRORUGOCOMPOUND_TITRE_COURT": "Compound RR",
     "INFO_MENU_EMPTY_SESSION_TITLE": "New session",
     "INFO_MENU_HELP_TITLE": "Help",
     "INFO_MENU_LOAD_SESSION_TITLE": "Load session",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index de9d932ff3245b7da61fe157b704906b91aeb4ca..5f94ea7acb2425d0cef89b10ea6faacb479268dc 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -123,6 +123,17 @@
     "INFO_DEVICE_MOVED": "Ouvrage n°%s déplacé",
     "INFO_DEVICE_REMOVED": "Ouvrage n°%s supprimé",
     "INFO_DEVICES_REMOVED": "%s ouvrage(s) supprimé(s)",
+    "INFO_STUFF_ADDED": "1 %s ajouté(e)",
+    "INFO_STUFF_ADDED_N_TIMES": "%s %s ajouté(e)s",
+    "INFO_STUFF_COPIED": "%s n°%s copié(e)",
+    "INFO_STUFF_COPIED_N_TIMES": "%s n°%s copié(e) %s fois",
+    "INFO_STUFF_MOVED": "%s n°%s déplacé(e)",
+    "INFO_STUFF_REMOVED": "%s n°%s supprimé(e)",
+    "INFO_STUFF_N": "%s n°",
+    "INFO_CHILD_TYPE_STRUCTURE": "ouvrage",
+    "INFO_CHILD_TYPE_STRUCTURE_PLUR": "ouvrages",
+    "INFO_CHILD_TYPE_MACRORUGO": "radier",
+    "INFO_CHILD_TYPE_MACRORUGO_PLUR": "radiers",
     "INFO_FIELDSET_ADD": "Ajouter",
     "INFO_FIELDSET_COPY": "Copier",
     "INFO_FIELDSET_REMOVE": "Supprimer",
@@ -204,6 +215,8 @@
     "INFO_LIB_QA": "Débit d'attrait",
     "INFO_LIB_R": "Rayon hydraulique",
     "INFO_LIB_RADIER": "Radier",
+    "INFO_LIB_RADIER_N": "Radier n°",
+    "INFO_LIB_RADIER_N_COURT": "R",
     "INFO_LIB_S": "Surface de l'orifice",
     "INFO_LIB_SELECT_LOIDEBIT": "Loi de débit",
     "INFO_LIB_SELECT_LOIDEBIT1_KIVI": "Kindsvater-Carter et Villemonte",
@@ -216,6 +229,7 @@
     "INFO_LIB_STRUCT_CONTAINER": "Ouvrages",
     "INFO_LIB_TAU0": "Force tractrice",
     "INFO_LIB_TOR": "Ligne d'eau torrentielle",
+    "INFO_LIB_TOTAL": "Total",
     "INFO_LIB_V_GUIDETECH": "Vitesse Guide technique",
     "INFO_LIB_V": "Vitesse moyenne",
     "INFO_LIB_VDEB": "Vitesse débitante",
@@ -260,6 +274,8 @@
     "INFO_LOIDEBIT_WeirVillemonte": "Échancrure (Villemonte 1957)",
     "INFO_MACRORUGO_TITRE_COURT": "Macro-rugo.",
     "INFO_MACRORUGO_TITRE": "Passe à macro-rugosités (beta)",
+    "INFO_MACRORUGOCOMPOUND_TITRE": "Passe à macro-rugosités complexe (beta)",
+    "INFO_MACRORUGOCOMPOUND_TITRE_COURT": "M-Rugo complexe",
     "INFO_MENU_EMPTY_SESSION_TITLE": "Nouvelle session",
     "INFO_MENU_HELP_TITLE": "Aide",
     "INFO_MENU_LOAD_SESSION_TITLE": "Charger une session",