diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..947b4af
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,15 @@
+FROM node:12.13.0-alpine
+
+ARG APP_DIR=/usr/src/app
+RUN mkdir -p ${APP_DIR}
+WORKDIR ${APP_DIR}
+
+COPY package.json ${APP_DIR}
+
+RUN npm install --production
+
+COPY . ${APP_DIR}
+
+EXPOSE 3000
+CMD [ "node", "app.js" ]
+
diff --git a/README.md b/README.md
index 00bcb6e..499cc57 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# test
\ No newline at end of file
+# version 1.10
diff --git a/allure-results/1b436d0d-574a-41d3-8671-247236919c53-testsuite.xml b/allure-results/1b436d0d-574a-41d3-8671-247236919c53-testsuite.xml
new file mode 100644
index 0000000..d7cb46f
--- /dev/null
+++ b/allure-results/1b436d0d-574a-41d3-8671-247236919c53-testsuite.xml
@@ -0,0 +1,15 @@
+
+
+ #test() without arguments
+ #test() without arguments
+
+
+ should return 0
+ should return 0
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/22cce3cf-322a-4996-918d-35150d501f11-testsuite.xml b/allure-results/22cce3cf-322a-4996-918d-35150d501f11-testsuite.xml
new file mode 100644
index 0000000..484e119
--- /dev/null
+++ b/allure-results/22cce3cf-322a-4996-918d-35150d501f11-testsuite.xml
@@ -0,0 +1,23 @@
+
+
+ #test() with number arguments
+ #test() with number arguments
+
+
+ should return sum of arguments
+ should return sum of arguments
+
+
+
+
+
+
+ should return argument when only one argument is passed
+ should return argument when only one argument is passed
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/2b665c35-7b3f-40da-95cb-a4a6d813b0d9-testsuite.xml b/allure-results/2b665c35-7b3f-40da-95cb-a4a6d813b0d9-testsuite.xml
new file mode 100644
index 0000000..9124843
--- /dev/null
+++ b/allure-results/2b665c35-7b3f-40da-95cb-a4a6d813b0d9-testsuite.xml
@@ -0,0 +1,15 @@
+
+
+ #test() without arguments
+ #test() without arguments
+
+
+ should return 0
+ should return 0
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/3f548ac4-758d-44ad-8bed-c83ad8dccb6e-testsuite.xml b/allure-results/3f548ac4-758d-44ad-8bed-c83ad8dccb6e-testsuite.xml
new file mode 100644
index 0000000..7e05279
--- /dev/null
+++ b/allure-results/3f548ac4-758d-44ad-8bed-c83ad8dccb6e-testsuite.xml
@@ -0,0 +1,15 @@
+
+
+ #test() without arguments
+ #test() without arguments
+
+
+ should return 0
+ should return 0
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/3fee2627-b0e1-405b-84d2-2798d80a98d2-testsuite.xml b/allure-results/3fee2627-b0e1-405b-84d2-2798d80a98d2-testsuite.xml
new file mode 100644
index 0000000..3b52ea3
--- /dev/null
+++ b/allure-results/3fee2627-b0e1-405b-84d2-2798d80a98d2-testsuite.xml
@@ -0,0 +1,25 @@
+
+
+ #test() with number arguments
+ #test() with number arguments
+
+
+ should return sum of arguments
+ should return sum of arguments
+
+
+
+
+
+
+
+
+ should return argument when only one argument is passed
+ should return argument when only one argument is passed
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/5234a2a4-cc06-4b69-b958-7587c10ea52d-testsuite.xml b/allure-results/5234a2a4-cc06-4b69-b958-7587c10ea52d-testsuite.xml
new file mode 100644
index 0000000..dd1afc7
--- /dev/null
+++ b/allure-results/5234a2a4-cc06-4b69-b958-7587c10ea52d-testsuite.xml
@@ -0,0 +1,25 @@
+
+
+ #test() with number arguments
+ #test() with number arguments
+
+
+ should return sum of arguments
+ should return sum of arguments
+
+
+
+
+
+
+
+
+ should return argument when only one argument is passed
+ should return argument when only one argument is passed
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/60731f8a-ea8d-4ded-a0b5-43b981581590-testsuite.xml b/allure-results/60731f8a-ea8d-4ded-a0b5-43b981581590-testsuite.xml
new file mode 100644
index 0000000..3321063
--- /dev/null
+++ b/allure-results/60731f8a-ea8d-4ded-a0b5-43b981581590-testsuite.xml
@@ -0,0 +1,15 @@
+
+
+ #test() without arguments
+ #test() without arguments
+
+
+ should return 0
+ should return 0
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/70e6b7e9-f563-44b8-a9be-fe4ab27cff69-attachment.html b/allure-results/70e6b7e9-f563-44b8-a9be-fe4ab27cff69-attachment.html
new file mode 100644
index 0000000..1ce6d8c
--- /dev/null
+++ b/allure-results/70e6b7e9-f563-44b8-a9be-fe4ab27cff69-attachment.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/allure-results/76a8b218-adb7-4932-93cb-9c2bc2e34bd0-attachment.txt b/allure-results/76a8b218-adb7-4932-93cb-9c2bc2e34bd0-attachment.txt
new file mode 100644
index 0000000..22034a4
--- /dev/null
+++ b/allure-results/76a8b218-adb7-4932-93cb-9c2bc2e34bd0-attachment.txt
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/allure-results/9413333d-ed92-4d1a-8fcb-a2738edcdcaf-attachment.html b/allure-results/9413333d-ed92-4d1a-8fcb-a2738edcdcaf-attachment.html
new file mode 100644
index 0000000..4abf594
--- /dev/null
+++ b/allure-results/9413333d-ed92-4d1a-8fcb-a2738edcdcaf-attachment.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/allure-results/990ed676-bf00-432b-bb51-3eaf00926753-testsuite.xml b/allure-results/990ed676-bf00-432b-bb51-3eaf00926753-testsuite.xml
new file mode 100644
index 0000000..ec37852
--- /dev/null
+++ b/allure-results/990ed676-bf00-432b-bb51-3eaf00926753-testsuite.xml
@@ -0,0 +1,25 @@
+
+
+ #test() with number arguments
+ #test() with number arguments
+
+
+ should return sum of arguments
+ should return sum of arguments
+
+
+
+
+
+
+
+
+ should return argument when only one argument is passed
+ should return argument when only one argument is passed
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml b/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml
new file mode 100644
index 0000000..ff513e3
--- /dev/null
+++ b/allure-results/d36e9d1f-74fb-49a5-b0e2-44d91784317b-testsuite.xml
@@ -0,0 +1,23 @@
+
+
+ #test() with number arguments
+ #test() with number arguments
+
+
+ should return sum of arguments
+ should return sum of arguments
+
+
+
+
+
+
+ should return argument when only one argument is passed
+ should return argument when only one argument is passed
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/allure-results/f0bb6347-31b8-4673-9ed6-a9fec2affe81-testsuite.xml b/allure-results/f0bb6347-31b8-4673-9ed6-a9fec2affe81-testsuite.xml
new file mode 100644
index 0000000..733d132
--- /dev/null
+++ b/allure-results/f0bb6347-31b8-4673-9ed6-a9fec2affe81-testsuite.xml
@@ -0,0 +1,15 @@
+
+
+ #test() without arguments
+ #test() without arguments
+
+
+ should return 0
+ should return 0
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..ab7aed4
--- /dev/null
+++ b/app.js
@@ -0,0 +1,41 @@
+var createError = require('http-errors');
+var express = require('express');
+var path = require('path');
+var cookieParser = require('cookie-parser');
+var logger = require('morgan');
+
+var indexRouter = require('./routes/index');
+var usersRouter = require('./routes/users');
+
+var app = express();
+
+// view engine setup
+app.set('views', path.join(__dirname, 'views'));
+app.set('view engine', 'pug');
+
+app.use(logger('dev'));
+app.use(express.json());
+app.use(express.urlencoded({ extended: false }));
+app.use(cookieParser());
+app.use(express.static(path.join(__dirname, 'public')));
+
+app.use('/', indexRouter);
+app.use('/users', usersRouter);
+
+// catch 404 and forward to error handler
+app.use(function(req, res, next) {
+ next(createError(404));
+});
+
+// error handler
+app.use(function(err, req, res, next) {
+ // set locals, only providing error in development
+ res.locals.message = err.message;
+ res.locals.error = req.app.get('env') === 'development' ? err : {};
+
+ // render the error page
+ res.status(err.status || 500);
+ res.render('error');
+});
+
+module.exports = app;
diff --git a/bin/www b/bin/www
new file mode 100755
index 0000000..a8c2d36
--- /dev/null
+++ b/bin/www
@@ -0,0 +1,90 @@
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var app = require('../app');
+var debug = require('debug')('app:server');
+var http = require('http');
+
+/**
+ * Get port from environment and store in Express.
+ */
+
+var port = normalizePort(process.env.PORT || '3000');
+app.set('port', port);
+
+/**
+ * Create HTTP server.
+ */
+
+var server = http.createServer(app);
+
+/**
+ * Listen on provided port, on all network interfaces.
+ */
+
+server.listen(port);
+server.on('error', onError);
+server.on('listening', onListening);
+
+/**
+ * Normalize a port into a number, string, or false.
+ */
+
+function normalizePort(val) {
+ var port = parseInt(val, 10);
+
+ if (isNaN(port)) {
+ // named pipe
+ return val;
+ }
+
+ if (port >= 0) {
+ // port number
+ return port;
+ }
+
+ return false;
+}
+
+/**
+ * Event listener for HTTP server "error" event.
+ */
+
+function onError(error) {
+ if (error.syscall !== 'listen') {
+ throw error;
+ }
+
+ var bind = typeof port === 'string'
+ ? 'Pipe ' + port
+ : 'Port ' + port;
+
+ // handle specific listen errors with friendly messages
+ switch (error.code) {
+ case 'EACCES':
+ console.error(bind + ' requires elevated privileges');
+ process.exit(1);
+ break;
+ case 'EADDRINUSE':
+ console.error(bind + ' is already in use');
+ process.exit(1);
+ break;
+ default:
+ throw error;
+ }
+}
+
+/**
+ * Event listener for HTTP server "listening" event.
+ */
+
+function onListening() {
+ var addr = server.address();
+ var bind = typeof addr === 'string'
+ ? 'pipe ' + addr
+ : 'port ' + addr.port;
+ debug('Listening on ' + bind);
+}
diff --git a/coverage_data/unified_coverage_reports/0/html/index.html b/coverage_data/unified_coverage_reports/0/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/0/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/1/0/html/index.html b/coverage_data/unified_coverage_reports/1/0/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/1/0/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/1/html/index.html b/coverage_data/unified_coverage_reports/1/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/1/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/10/html/index.html b/coverage_data/unified_coverage_reports/10/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/10/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/100/html/index.html b/coverage_data/unified_coverage_reports/100/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/100/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/101/html/index.html b/coverage_data/unified_coverage_reports/101/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/101/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/102/html/index.html b/coverage_data/unified_coverage_reports/102/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/102/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/103/html/index.html b/coverage_data/unified_coverage_reports/103/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/103/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/104/html/index.html b/coverage_data/unified_coverage_reports/104/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/104/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/105/html/index.html b/coverage_data/unified_coverage_reports/105/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/105/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/106/html/index.html b/coverage_data/unified_coverage_reports/106/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/106/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/107/html/index.html b/coverage_data/unified_coverage_reports/107/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/107/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/108/html/index.html b/coverage_data/unified_coverage_reports/108/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/108/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/109/html/index.html b/coverage_data/unified_coverage_reports/109/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/109/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/11/html/index.html b/coverage_data/unified_coverage_reports/11/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/11/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/110/html/index.html b/coverage_data/unified_coverage_reports/110/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/110/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/111/html/index.html b/coverage_data/unified_coverage_reports/111/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/111/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/112/html/index.html b/coverage_data/unified_coverage_reports/112/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/112/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/113/html/index.html b/coverage_data/unified_coverage_reports/113/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/113/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/114/html/index.html b/coverage_data/unified_coverage_reports/114/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/114/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/115/html/index.html b/coverage_data/unified_coverage_reports/115/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/115/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/116/html/index.html b/coverage_data/unified_coverage_reports/116/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/116/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/117/html/index.html b/coverage_data/unified_coverage_reports/117/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/117/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/118/html/index.html b/coverage_data/unified_coverage_reports/118/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/118/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/119/html/index.html b/coverage_data/unified_coverage_reports/119/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/119/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/12/html/index.html b/coverage_data/unified_coverage_reports/12/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/12/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/120/html/index.html b/coverage_data/unified_coverage_reports/120/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/120/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/121/html/index.html b/coverage_data/unified_coverage_reports/121/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/121/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/122/html/index.html b/coverage_data/unified_coverage_reports/122/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/122/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/123/html/index.html b/coverage_data/unified_coverage_reports/123/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/123/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/124/html/index.html b/coverage_data/unified_coverage_reports/124/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/124/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/125/html/index.html b/coverage_data/unified_coverage_reports/125/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/125/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/126/html/index.html b/coverage_data/unified_coverage_reports/126/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/126/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/127/html/index.html b/coverage_data/unified_coverage_reports/127/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/127/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/128/html/index.html b/coverage_data/unified_coverage_reports/128/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/128/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/129/html/index.html b/coverage_data/unified_coverage_reports/129/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/129/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/13/html/index.html b/coverage_data/unified_coverage_reports/13/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/13/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/130/html/index.html b/coverage_data/unified_coverage_reports/130/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/130/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/131/html/index.html b/coverage_data/unified_coverage_reports/131/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/131/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/132/html/index.html b/coverage_data/unified_coverage_reports/132/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/132/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/133/html/index.html b/coverage_data/unified_coverage_reports/133/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/133/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/134/html/index.html b/coverage_data/unified_coverage_reports/134/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/134/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/135/html/index.html b/coverage_data/unified_coverage_reports/135/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/135/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/136/html/index.html b/coverage_data/unified_coverage_reports/136/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/136/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/137/html/index.html b/coverage_data/unified_coverage_reports/137/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/137/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/138/html/index.html b/coverage_data/unified_coverage_reports/138/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/138/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/139/html/index.html b/coverage_data/unified_coverage_reports/139/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/139/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/14/html/index.html b/coverage_data/unified_coverage_reports/14/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/14/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/140/html/index.html b/coverage_data/unified_coverage_reports/140/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/140/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/141/html/index.html b/coverage_data/unified_coverage_reports/141/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/141/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/142/html/index.html b/coverage_data/unified_coverage_reports/142/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/142/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/143/html/index.html b/coverage_data/unified_coverage_reports/143/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/143/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/144/html/index.html b/coverage_data/unified_coverage_reports/144/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/144/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/145/html/index.html b/coverage_data/unified_coverage_reports/145/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/145/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/146/html/index.html b/coverage_data/unified_coverage_reports/146/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/146/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/147/html/index.html b/coverage_data/unified_coverage_reports/147/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/147/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/148/html/index.html b/coverage_data/unified_coverage_reports/148/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/148/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/149/html/index.html b/coverage_data/unified_coverage_reports/149/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/149/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/15/html/index.html b/coverage_data/unified_coverage_reports/15/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/15/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/150/html/index.html b/coverage_data/unified_coverage_reports/150/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/150/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/16/html/index.html b/coverage_data/unified_coverage_reports/16/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/16/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/17/html/index.html b/coverage_data/unified_coverage_reports/17/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/17/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/18/html/index.html b/coverage_data/unified_coverage_reports/18/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/18/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/19/html/index.html b/coverage_data/unified_coverage_reports/19/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/19/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/2/html/index.html b/coverage_data/unified_coverage_reports/2/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/2/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/20/html/index.html b/coverage_data/unified_coverage_reports/20/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/20/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/21/html/index.html b/coverage_data/unified_coverage_reports/21/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/21/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/22/html/index.html b/coverage_data/unified_coverage_reports/22/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/22/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/23/html/index.html b/coverage_data/unified_coverage_reports/23/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/23/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/24/html/index.html b/coverage_data/unified_coverage_reports/24/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/24/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/25/html/index.html b/coverage_data/unified_coverage_reports/25/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/25/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/26/html/index.html b/coverage_data/unified_coverage_reports/26/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/26/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/27/html/index.html b/coverage_data/unified_coverage_reports/27/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/27/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/28/html/index.html b/coverage_data/unified_coverage_reports/28/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/28/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/29/html/index.html b/coverage_data/unified_coverage_reports/29/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/29/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/3/html/index.html b/coverage_data/unified_coverage_reports/3/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/3/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/30/html/index.html b/coverage_data/unified_coverage_reports/30/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/30/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/31/html/index.html b/coverage_data/unified_coverage_reports/31/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/31/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/32/html/index.html b/coverage_data/unified_coverage_reports/32/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/32/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/33/html/index.html b/coverage_data/unified_coverage_reports/33/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/33/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/34/html/index.html b/coverage_data/unified_coverage_reports/34/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/34/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/35/html/index.html b/coverage_data/unified_coverage_reports/35/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/35/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/36/html/index.html b/coverage_data/unified_coverage_reports/36/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/36/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/37/html/index.html b/coverage_data/unified_coverage_reports/37/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/37/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/38/html/index.html b/coverage_data/unified_coverage_reports/38/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/38/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/39/html/index.html b/coverage_data/unified_coverage_reports/39/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/39/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/4/html/index.html b/coverage_data/unified_coverage_reports/4/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/4/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/40/html/index.html b/coverage_data/unified_coverage_reports/40/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/40/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/41/html/index.html b/coverage_data/unified_coverage_reports/41/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/41/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/42/html/index.html b/coverage_data/unified_coverage_reports/42/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/42/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/43/html/index.html b/coverage_data/unified_coverage_reports/43/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/43/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/44/html/index.html b/coverage_data/unified_coverage_reports/44/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/44/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/45/html/index.html b/coverage_data/unified_coverage_reports/45/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/45/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/46/html/index.html b/coverage_data/unified_coverage_reports/46/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/46/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/47/html/index.html b/coverage_data/unified_coverage_reports/47/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/47/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/48/html/index.html b/coverage_data/unified_coverage_reports/48/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/48/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/49/html/index.html b/coverage_data/unified_coverage_reports/49/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/49/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/5/html/index.html b/coverage_data/unified_coverage_reports/5/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/5/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/50/html/index.html b/coverage_data/unified_coverage_reports/50/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/50/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/51/html/index.html b/coverage_data/unified_coverage_reports/51/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/51/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/52/html/index.html b/coverage_data/unified_coverage_reports/52/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/52/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/53/html/index.html b/coverage_data/unified_coverage_reports/53/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/53/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/54/html/index.html b/coverage_data/unified_coverage_reports/54/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/54/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/55/html/index.html b/coverage_data/unified_coverage_reports/55/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/55/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/56/html/index.html b/coverage_data/unified_coverage_reports/56/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/56/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/57/html/index.html b/coverage_data/unified_coverage_reports/57/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/57/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/58/html/index.html b/coverage_data/unified_coverage_reports/58/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/58/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/59/html/index.html b/coverage_data/unified_coverage_reports/59/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/59/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/6/html/index.html b/coverage_data/unified_coverage_reports/6/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/6/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/60/html/index.html b/coverage_data/unified_coverage_reports/60/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/60/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/61/html/index.html b/coverage_data/unified_coverage_reports/61/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/61/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/62/html/index.html b/coverage_data/unified_coverage_reports/62/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/62/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/63/html/index.html b/coverage_data/unified_coverage_reports/63/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/63/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/64/html/index.html b/coverage_data/unified_coverage_reports/64/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/64/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/65/html/index.html b/coverage_data/unified_coverage_reports/65/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/65/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/66/html/index.html b/coverage_data/unified_coverage_reports/66/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/66/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/67/html/index.html b/coverage_data/unified_coverage_reports/67/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/67/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/68/html/index.html b/coverage_data/unified_coverage_reports/68/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/68/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/69/html/index.html b/coverage_data/unified_coverage_reports/69/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/69/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/7/html/index.html b/coverage_data/unified_coverage_reports/7/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/7/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/70/html/index.html b/coverage_data/unified_coverage_reports/70/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/70/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/71/html/index.html b/coverage_data/unified_coverage_reports/71/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/71/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/72/html/index.html b/coverage_data/unified_coverage_reports/72/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/72/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/73/html/index.html b/coverage_data/unified_coverage_reports/73/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/73/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/74/html/index.html b/coverage_data/unified_coverage_reports/74/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/74/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/75/html/index.html b/coverage_data/unified_coverage_reports/75/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/75/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/76/html/index.html b/coverage_data/unified_coverage_reports/76/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/76/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/77/html/index.html b/coverage_data/unified_coverage_reports/77/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/77/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/78/html/index.html b/coverage_data/unified_coverage_reports/78/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/78/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/79/html/index.html b/coverage_data/unified_coverage_reports/79/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/79/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/8/html/index.html b/coverage_data/unified_coverage_reports/8/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/8/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/80/html/index.html b/coverage_data/unified_coverage_reports/80/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/80/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/81/html/index.html b/coverage_data/unified_coverage_reports/81/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/81/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/82/html/index.html b/coverage_data/unified_coverage_reports/82/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/82/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/83/html/index.html b/coverage_data/unified_coverage_reports/83/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/83/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/84/html/index.html b/coverage_data/unified_coverage_reports/84/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/84/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/85/html/index.html b/coverage_data/unified_coverage_reports/85/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/85/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/86/html/index.html b/coverage_data/unified_coverage_reports/86/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/86/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/87/html/index.html b/coverage_data/unified_coverage_reports/87/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/87/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/88/html/index.html b/coverage_data/unified_coverage_reports/88/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/88/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/89/html/index.html b/coverage_data/unified_coverage_reports/89/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/89/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/9/html/index.html b/coverage_data/unified_coverage_reports/9/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/9/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/90/html/index.html b/coverage_data/unified_coverage_reports/90/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/90/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/91/html/index.html b/coverage_data/unified_coverage_reports/91/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/91/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/92/html/index.html b/coverage_data/unified_coverage_reports/92/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/92/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/93/html/index.html b/coverage_data/unified_coverage_reports/93/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/93/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/94/html/index.html b/coverage_data/unified_coverage_reports/94/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/94/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/95/html/index.html b/coverage_data/unified_coverage_reports/95/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/95/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/96/html/index.html b/coverage_data/unified_coverage_reports/96/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/96/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/97/html/index.html b/coverage_data/unified_coverage_reports/97/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/97/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/98/html/index.html b/coverage_data/unified_coverage_reports/98/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/98/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/99/html/index.html b/coverage_data/unified_coverage_reports/99/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/99/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data/unified_coverage_reports/gen.sh b/coverage_data/unified_coverage_reports/gen.sh
new file mode 100755
index 0000000..8c43cbf
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/gen.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+for i in {1..150}
+do
+ cp -r 0 $i
+done
diff --git a/coverage_data/unified_coverage_reports/index.html b/coverage_data/unified_coverage_reports/index.html
new file mode 100644
index 0000000..c85674e
--- /dev/null
+++ b/coverage_data/unified_coverage_reports/index.html
@@ -0,0 +1,161 @@
+
+
+
+
+Test reports
+
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/0/html/index.html b/coverage_data_1/unified_coverage_reports/0/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/0/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/1/0/html/index.html b/coverage_data_1/unified_coverage_reports/1/0/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/1/0/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/1/html/index.html b/coverage_data_1/unified_coverage_reports/1/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/1/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/2/html/index.html b/coverage_data_1/unified_coverage_reports/2/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/2/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/3/html/index.html b/coverage_data_1/unified_coverage_reports/3/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/3/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/4/html/index.html b/coverage_data_1/unified_coverage_reports/4/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/4/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/5/html/index.html b/coverage_data_1/unified_coverage_reports/5/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/5/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/6/html/index.html b/coverage_data_1/unified_coverage_reports/6/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/6/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/7/html/index.html b/coverage_data_1/unified_coverage_reports/7/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/7/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/8/html/index.html b/coverage_data_1/unified_coverage_reports/8/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/8/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_1/unified_coverage_reports/9/html/index.html b/coverage_data_1/unified_coverage_reports/9/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_1/unified_coverage_reports/9/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/0/html/index.html b/coverage_data_2/unified_coverage_reports/0/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/0/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/1/0/html/index.html b/coverage_data_2/unified_coverage_reports/1/0/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/1/0/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/1/html/index.html b/coverage_data_2/unified_coverage_reports/1/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/1/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/10/html/index.html b/coverage_data_2/unified_coverage_reports/10/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/10/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/11/html/index.html b/coverage_data_2/unified_coverage_reports/11/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/11/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/12/html/index.html b/coverage_data_2/unified_coverage_reports/12/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/12/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/13/html/index.html b/coverage_data_2/unified_coverage_reports/13/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/13/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/14/html/index.html b/coverage_data_2/unified_coverage_reports/14/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/14/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/15/html/index.html b/coverage_data_2/unified_coverage_reports/15/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/15/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/16/html/index.html b/coverage_data_2/unified_coverage_reports/16/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/16/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/17/html/index.html b/coverage_data_2/unified_coverage_reports/17/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/17/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/18/html/index.html b/coverage_data_2/unified_coverage_reports/18/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/18/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/19/html/index.html b/coverage_data_2/unified_coverage_reports/19/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/19/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/2/html/index.html b/coverage_data_2/unified_coverage_reports/2/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/2/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/20/html/index.html b/coverage_data_2/unified_coverage_reports/20/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/20/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/21/html/index.html b/coverage_data_2/unified_coverage_reports/21/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/21/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/22/html/index.html b/coverage_data_2/unified_coverage_reports/22/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/22/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/23/html/index.html b/coverage_data_2/unified_coverage_reports/23/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/23/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/3/html/index.html b/coverage_data_2/unified_coverage_reports/3/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/3/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/4/html/index.html b/coverage_data_2/unified_coverage_reports/4/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/4/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/5/html/index.html b/coverage_data_2/unified_coverage_reports/5/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/5/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/6/html/index.html b/coverage_data_2/unified_coverage_reports/6/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/6/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/7/html/index.html b/coverage_data_2/unified_coverage_reports/7/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/7/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/8/html/index.html b/coverage_data_2/unified_coverage_reports/8/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/8/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/9/html/index.html b/coverage_data_2/unified_coverage_reports/9/html/index.html
new file mode 100644
index 0000000..4fc39c8
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/9/html/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+Test report
+
+prevPage
+
+
+
+
diff --git a/coverage_data_2/unified_coverage_reports/gen.sh b/coverage_data_2/unified_coverage_reports/gen.sh
new file mode 100755
index 0000000..8c43cbf
--- /dev/null
+++ b/coverage_data_2/unified_coverage_reports/gen.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+for i in {1..150}
+do
+ cp -r 0 $i
+done
diff --git a/deployment.yml b/deployment.yml
new file mode 100644
index 0000000..8a7fa78
--- /dev/null
+++ b/deployment.yml
@@ -0,0 +1,32 @@
+kind: Deployment
+apiVersion: apps/v1
+metadata:
+ name: nginx-deployment
+spec:
+ # A deployment's specification really only
+ # has a few useful options
+
+ # 1. How many copies of each pod do we want?
+ replicas: 1
+
+ # 2. How do want to update the pods?
+ strategy: Recreate
+
+ # 3. Which pods are managed by this deployment?
+ selector:
+ # This must match the labels we set on the pod!
+ matchLabels:
+ deploy: example
+
+ # This template field is a regular pod configuration
+ # nested inside the deployment spec
+ template:
+ metadata:
+ # Set labels on the pod.
+ # This is used in the deployment selector.
+ labels:
+ deploy: example
+ spec:
+ containers:
+ - name: nginx
+ image: nginx:1.7.9
diff --git a/deployment2.yml b/deployment2.yml
new file mode 100644
index 0000000..0b2224e
--- /dev/null
+++ b/deployment2.yml
@@ -0,0 +1,19 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: my-demo-app
+ annotations:
+ branch: {{CF_BRANCH_TAG_NORMALIZED}}
+ source-repository: {{CF_REPO_NAME}}
+spec:
+ replicas: 1
+ template:
+ metadata:
+ labels:
+ name: my-demo-app
+ app: my-demo-app
+ spec:
+ containers:
+ - name: my-demo-app
+ image: nginx:1.7.9
+ imagePullPolicy: Always
diff --git a/deployment3.yml b/deployment3.yml
new file mode 100644
index 0000000..c295e5f
--- /dev/null
+++ b/deployment3.yml
@@ -0,0 +1,21 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: nginx-deployment
+ labels:
+ app: nginx
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: nginx
+ template:
+ metadata:
+ labels:
+ app: nginx
+ spec:
+ containers:
+ - name: nginx
+ image: nginx:1.14.2
+ ports:
+ - containerPort: 80
diff --git a/mochawesome-report/assets/MaterialIcons-Regular.woff b/mochawesome-report/assets/MaterialIcons-Regular.woff
new file mode 100644
index 0000000..b648a3e
Binary files /dev/null and b/mochawesome-report/assets/MaterialIcons-Regular.woff differ
diff --git a/mochawesome-report/assets/MaterialIcons-Regular.woff2 b/mochawesome-report/assets/MaterialIcons-Regular.woff2
new file mode 100644
index 0000000..9fa2112
Binary files /dev/null and b/mochawesome-report/assets/MaterialIcons-Regular.woff2 differ
diff --git a/mochawesome-report/assets/app.css b/mochawesome-report/assets/app.css
new file mode 100644
index 0000000..32567ac
--- /dev/null
+++ b/mochawesome-report/assets/app.css
@@ -0,0 +1,14 @@
+/*! mochawesome-report-generator 4.1.0 | https://github.com/adamgruber/mochawesome-report-generator */
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.dropdown--trans-color---3ixtY{transition:color .2s ease-out;transition:var(--link-transition)}.dropdown--component---21Q9c{position:relative}.dropdown--toggle---3gdzr{white-space:nowrap}.dropdown--toggle-icon---1j9Ga:not(.dropdown--icon-only---3vq2I){margin-left:.5rem}.dropdown--list---8GPrA{padding:0;margin:0;list-style:none;text-align:left}.dropdown--list-main---3QZnQ{position:absolute;top:100%;z-index:1000;visibility:hidden;min-width:160px;overflow:auto}.dropdown--align-left---3-3Hu{left:0}.dropdown--align-right---2ZQx0{right:0}.dropdown--list-item-link---JRrOY,.dropdown--list-item-text---2COKZ{display:block;position:relative;white-space:nowrap;text-decoration:none}.dropdown--list-item-text---2COKZ{cursor:default}@-webkit-keyframes dropdown--in---FpwEb{0%{opacity:0}to{opacity:1}}@keyframes dropdown--in---FpwEb{0%{opacity:0}to{opacity:1}}@-webkit-keyframes dropdown--out---2HVe1{0%{opacity:1;visibility:visible}to{opacity:0}}@keyframes dropdown--out---2HVe1{0%{opacity:1;visibility:visible}to{opacity:0}}.dropdown--close---2LnDu{-webkit-animation:dropdown--out---2HVe1 .2s ease;animation:dropdown--out---2HVe1 .2s ease;-webkit-animation:dropdown--out---2HVe1 var(--default-transition-duration) var(--default-transition-easing);animation:dropdown--out---2HVe1 var(--default-transition-duration) var(--default-transition-easing);visibility:hidden}.dropdown--open---3bwiy{-webkit-animation:dropdown--in---FpwEb .2s ease;animation:dropdown--in---FpwEb .2s ease;-webkit-animation:dropdown--in---FpwEb var(--default-transition-duration) var(--default-transition-easing);animation:dropdown--in---FpwEb var(--default-transition-duration) var(--default-transition-easing);visibility:visible}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.dropdown-selector--trans-color---3nePW{transition:color .2s ease-out;transition:var(--link-transition)}.dropdown-selector--dropdown---AT5ee{right:-8px}.dropdown-selector--menu---nW4gv{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);font-family:robotolight;font-family:var(--font-family-light);min-width:70px;width:70px;background:#fff;top:0}.dropdown-selector--toggle---WEnEe{display:inline-block;font-family:robotoregular;font-family:var(--font-family-regular);font-size:14px;color:rgba(0,0,0,.54);color:var(--black54);vertical-align:top;line-height:24px;padding:0 22px 0 0;cursor:pointer;border:none;background:none;outline:none;width:70px}.dropdown-selector--toggle---WEnEe:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500)}.dropdown-selector--toggle-icon---10VKo{position:absolute;top:4px;right:4px}.dropdown-selector--item-link---2W1T7,.dropdown-selector--toggle-icon---10VKo{color:rgba(0,0,0,.38);color:var(--black38)}.dropdown-selector--item-link---2W1T7{border:none;cursor:pointer;padding:4px 10px;text-align:left;width:100%}.dropdown-selector--item-link---2W1T7:hover{background-color:#f5f5f5;background-color:var(--grey100)}.dropdown-selector--item-link---2W1T7:focus{box-shadow:inset 0 0 2px 0 #03a9f4;box-shadow:inset 0 0 2px 0 var(--ltblue500);outline:none}.dropdown-selector--item-selected---1q-NK .dropdown-selector--item-link---2W1T7{color:#4caf50;color:var(--green500)}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.footer--trans-color---205XF{transition:color .2s ease-out;transition:var(--link-transition)}.footer--component---1WcTR{position:absolute;bottom:0;width:100%;height:60px;height:var(--footer-height);color:rgba(0,0,0,.38);color:var(--black38);text-align:center}.footer--component---1WcTR p{font-size:12px;margin:10px 0}.footer--component---1WcTR a{color:rgba(0,0,0,.54);color:var(--black54);transition:color .2s ease-out;transition:var(--link-transition)}.footer--component---1WcTR a:hover{color:rgba(0,0,0,.87);color:var(--black87)}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.loader--trans-color---97r08{transition:color .2s ease-out;transition:var(--link-transition)}.loader--component---2grcA{position:fixed;top:0;height:100%;width:100%;background-color:color(#f2f2f2 alpha(60%));background-color:color(var(--body-bg) alpha(60%));padding-top:122px;padding-top:var(--navbar-height)}.loader--wrap---3Fhrc{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;min-height:200px}.loader--text---3Yu3g{color:color(#000 tint(46.7%));color:var(--gray-light);text-align:center;margin:1rem 0 0}.loader--spinner---2q6MO{border-radius:50%;width:42px;height:42px;border:.25rem solid color(#000 tint(73.5%));border-top-color:color(#000 tint(33.5%));border:.25rem solid var(--gray-medium);border-top-color:var(--gray);-webkit-animation:loader--spin---K6Loh 1s linear infinite;animation:loader--spin---K6Loh 1s linear infinite}@-webkit-keyframes loader--spin---K6Loh{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loader--spin---K6Loh{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@media (min-width:768px){.loader--component---2grcA{padding-top:56px;padding-top:var(--navbar-height-short)}}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.nav-menu--trans-color---1l-R-{transition:color .2s ease-out;transition:var(--link-transition)}.nav-menu--wrap---39S_b{position:fixed;z-index:2010;top:0;right:0;bottom:0;left:0;overflow:hidden;visibility:hidden}.nav-menu--overlay---k2Lwz{display:none;background:rgba(0,0,0,.5)}.nav-menu--close-btn---2m7W7{border:none;background:transparent;padding:0}.nav-menu--close-btn---2m7W7:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.nav-menu--close-btn---2m7W7{cursor:pointer;transition:color .2s ease-out;transition:var(--link-transition);position:absolute;top:16px;right:16px;color:rgba(0,0,0,.54);color:var(--black54)}.nav-menu--close-btn---2m7W7:active,.nav-menu--close-btn---2m7W7:hover{color:rgba(0,0,0,.87);color:var(--black87)}.nav-menu--menu---lFcsl{position:absolute;transition:all .15s cubic-bezier(.25,1,.8,1);-webkit-transform:translate(-100%);transform:translate(-100%);width:100%;z-index:1;top:0;bottom:0;left:0;overflow:auto;background:#fff}.nav-menu--close-button---2_OHr{border:none;background:transparent;padding:0}.nav-menu--close-button---2_OHr:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.nav-menu--close-button---2_OHr{cursor:pointer;transition:color .2s ease-out;transition:var(--link-transition);position:absolute;top:14px;right:14px;font-size:21px;width:26px;height:26px;color:color(#000 tint(33.5%));color:var(--gray)}.nav-menu--close-button---2_OHr:hover{color:color(#000 tint(20%));color:var(--gray-dark)}.nav-menu--date---3SYOi,.nav-menu--section-head---3LXPD{color:rgba(0,0,0,.54);color:var(--black54)}.nav-menu--section-head---3LXPD{text-transform:uppercase}.nav-menu--control---1JEYH{display:-webkit-flex;display:flex;position:relative;margin:8px 0;-webkit-align-items:center;align-items:center}.nav-menu--control-label---3f2XU{display:inline-block;-webkit-flex-grow:1;flex-grow:1;font-family:var(--font-family--regular);font-size:13px;vertical-align:top;line-height:24px}.nav-menu--control-label---3f2XU.nav-menu--with-icon---qF4hj{margin-left:12px}.nav-menu--control-group---32kKg{margin-bottom:10px}.nav-menu--toggle-icon-passed---132lH{color:#4caf50;color:var(--green500)}.nav-menu--toggle-icon-failed---x-XUB{color:#f44336;color:var(--red500)}.nav-menu--toggle-icon-pending---3ZJAs{color:#03a9f4;color:var(--ltblue500)}.nav-menu--toggle-icon-skipped---FyedH{color:#9e9e9e;color:var(--grey500)}.nav-menu--wrap---39S_b.nav-menu--open---3BW1O{visibility:visible}.nav-menu--wrap---39S_b.nav-menu--open---3BW1O .nav-menu--overlay---k2Lwz{opacity:1}.nav-menu--wrap---39S_b.nav-menu--open---3BW1O .nav-menu--menu---lFcsl{-webkit-transform:translate(0);transform:translate(0)}.nav-menu--section---2z7Dj{padding:0 16px;border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.nav-menu--list---2QMG9{list-style:none;padding-left:0}.nav-menu--main---jkqJW{margin:8px 0}.nav-menu--no-tests---2sRAg>.nav-menu--item---gXWu6:not(.nav-menu--has-tests---1ND4g)>div>.nav-menu--sub---EnSIu{padding-left:0}.nav-menu--no-tests---2sRAg>.nav-menu--item---gXWu6:not(.nav-menu--has-tests---1ND4g):not(:only-child){padding-left:22px}.nav-menu--sub---EnSIu{padding-left:24px;margin:0 0 2px}.nav-menu--link---tywPF{display:-webkit-flex;display:flex;position:relative;-webkit-align-items:center;align-items:center;padding:3px 0;color:color(#000 tint(33.5%));color:var(--gray)}.nav-menu--link---tywPF:hover{color:color(color(#428bca shade(6.5%)) shade(15%));color:var(--link-hover-color);text-decoration:none}.nav-menu--link---tywPF:active,.nav-menu--link---tywPF:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none;text-decoration:none}.nav-menu--link---tywPF span{transition:color .2s ease-out;transition:var(--link-transition);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.nav-menu--link-icon---1Q2NP{margin-right:2px}.nav-menu--link-icon---1Q2NP.nav-menu--pass---1PUeh{color:#4caf50;color:var(--green500)}.nav-menu--link-icon---1Q2NP.nav-menu--fail---3gQQa{color:#f44336;color:var(--red500)}.nav-menu--link-icon---1Q2NP.nav-menu--pending---9zAw0{color:#03a9f4;color:var(--ltblue500)}.nav-menu--link-icon---1Q2NP.nav-menu--skipped---31GPM{color:#9e9e9e;color:var(--grey500)}.nav-menu--disabled---2MoA_{opacity:.3;pointer-events:none}@media (min-width:768px){.nav-menu--menu---lFcsl{width:320px;left:auto}.nav-menu--overlay---k2Lwz{display:block;position:fixed;transition:all .2s ease-out;top:0;right:0;bottom:0;left:0;cursor:pointer;opacity:0}}
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.trans-color{transition:color .2s ease-out;transition:var(--link-transition)}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-family:var(--headings-font-family);font-weight:400;font-weight:var(--headings-font-weight);line-height:1.1;line-height:var(--headings-line-height);color:inherit;color:var(--headings-color)}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:color(#000 tint(46.7%));color:var(--headings-small-color)}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-top:var(--line-height-computed);margin-bottom:10px;margin-bottom:calc(var(--line-height-computed)/2)}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-top:calc(var(--line-height-computed)/2);margin-bottom:10px;margin-bottom:calc(var(--line-height-computed)/2)}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px;font-size:var(--font-size-h1)}.h2,h2{font-size:30px;font-size:var(--font-size-h2)}.h3,h3{font-size:24px;font-size:var(--font-size-h3)}.h4,h4{font-size:18px;font-size:var(--font-size-h4)}.h5,h5{font-size:14px;font-size:var(--font-size-h5)}.h6,h6{font-size:12px;font-size:var(--font-size-h6)}p{margin:0 0 10px;margin:0 0 calc(var(--line-height-computed)/2)}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}ol,ul{margin-top:0;margin-bottom:10px;margin-bottom:calc(var(--line-height-computed)/2);ol,ul{margin-bottom:0}}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}code{font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-family-mono)}.hljs{display:block;overflow-x:auto;padding:.5em;color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-built_in,.hljs-class .hljs-title{color:#c18401}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-flex;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{-webkit-align-items:flex-end;align-items:flex-end}.ct-label.ct-horizontal.ct-end,.ct-label.ct-horizontal.ct-start{-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-align-items:flex-start;align-items:flex-start}.ct-label.ct-vertical.ct-start{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-align-items:flex-end;align-items:flex-end;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-grid-background{fill:none}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{fill:none;stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-donut-solid,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-donut-solid,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-donut-solid,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-donut-solid,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-donut-solid,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-donut-solid,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-donut-solid,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-donut-solid,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-donut-solid,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-donut-solid,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-donut-solid,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-donut-solid,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-donut-solid,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-donut-solid,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-donut-solid,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{content:"";display:table;clear:both}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{content:"";display:table;clear:both}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.8888888889%}.ct-major-second:after{content:"";display:table;clear:both}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.3333333333%}.ct-minor-third:after{content:"";display:table;clear:both}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{content:"";display:table;clear:both}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{content:"";display:table;clear:both}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-perfect-fifth:after{content:"";display:table;clear:both}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{content:"";display:table;clear:both}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.804697157%}.ct-golden-section:after{content:"";display:table;clear:both}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{content:"";display:table;clear:both}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{content:"";display:table;clear:both}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.3333333333%}.ct-major-seventh:after{content:"";display:table;clear:both}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:50%}.ct-octave:after{content:"";display:table;clear:both}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{content:"";display:table;clear:both}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{content:"";display:table;clear:both}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.3333333333%}.ct-major-twelfth:after{content:"";display:table;clear:both}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{content:"";display:table;clear:both}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0}@font-face{font-family:robotolight;src:url(roboto-light-webfont.woff2) format("woff2"),url(roboto-light-webfont.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:robotomedium;src:url(roboto-medium-webfont.woff2) format("woff2"),url(roboto-medium-webfont.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:robotoregular;src:url(roboto-regular-webfont.woff2) format("woff2"),url(roboto-regular-webfont.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.woff2) format("woff2"),url(MaterialIcons-Regular.woff) format("woff")}.material-icons{display:inline-block;font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:"liga";font-feature-settings:"liga"}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}.material-icons.md-dark{color:rgba(0,0,0,.54)}.material-icons.md-dark.md-inactive{color:rgba(0,0,0,.26)}.material-icons.md-light{color:#fff}.material-icons.md-light.md-inactive{color:hsla(0,0%,100%,.3)}*,:after,:before{box-sizing:border-box}html{position:relative;min-height:100%}body{font-family:robotoregular,Helvetica Neue,Helvetica,Arial,sans-serif;font-family:var(--font-family-base);font-size:14px;font-size:var(--font-size-base);line-height:1.429;line-height:var(--line-height-base);color:rgba(0,0,0,.87);color:var(--text-color);background-color:#f2f2f2;background-color:var(--body-bg);margin-bottom:60px;margin-bottom:var(--footer-height)}a{text-decoration:none;transition:color .2s ease-out;transition:var(--link-transition)}a:hover{text-decoration:underline}pre{word-break:break-all;word-wrap:break-word;border-radius:4px}.cf:before,.clearfix:before{content:" ";display:table}.cf:after,.clearfix:after{content:" ";display:table;clear:both}.container:after,.container:before{content:" ";display:table}.container:after{clear:both}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-left:calc(var(--grid-gutter-width)/2);padding-right:15px;padding-right:calc(var(--grid-gutter-width)/2)}.row:after,.row:before{content:" ";display:table}.row:after{clear:both}.row{margin-left:-15px;margin-left:calc(var(--grid-gutter-width)/-2);margin-right:-15px;margin-right:calc(var(--grid-gutter-width)/-2)}.details{padding-top:146px;padding-top:calc(var(--navbar-height) + 24px)}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12)}.z-depth-1-half{box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15)}.z-depth-2{box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.z-depth-3{box-shadow:0 12px 15px 0 rgba(0,0,0,.24),0 17px 50px 0 rgba(0,0,0,.19)}.z-depth-4{box-shadow:0 16px 28px 0 rgba(0,0,0,.22),0 25px 55px 0 rgba(0,0,0,.21)}.z-depth-5{box-shadow:0 27px 24px 0 rgba(0,0,0,.2),0 40px 77px 0 rgba(0,0,0,.22)}@media (min-width:768px){.container{width:750px;width:var(--container-sm)}.details{padding-top:80px;padding-top:calc(var(--navbar-height-short) + 24px)}}@media (min-width:992px){.container{width:970px;width:var(--container-md)}}@media (min-width:1200px){.container{width:1170px;width:var(--container-lg)}}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.navbar--trans-color---1tk7E{transition:color .2s ease-out;transition:var(--link-transition)}.navbar--component---2UCEi:after,.navbar--component---2UCEi:before{content:" ";display:table}.navbar--component---2UCEi:after{clear:both}.navbar--component---2UCEi{position:fixed;-webkit-flex-direction:column;flex-direction:column;top:0;right:0;left:0;z-index:1030;min-height:122px;min-height:var(--navbar-height);height:122px;height:var(--navbar-height);margin-bottom:0;border:none;background:#37474f;background:var(--bluegrey800)}.navbar--component---2UCEi,.navbar--report-info-cnt---8y9Bb{display:-webkit-flex;display:flex}.navbar--report-info-cnt---8y9Bb{overflow:hidden;padding-right:12px}.navbar--menu-button---1ZRpz{border:none;background:transparent;padding:0}.navbar--menu-button---1ZRpz:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.navbar--menu-button---1ZRpz{cursor:pointer;transition:color .2s ease-out;transition:var(--link-transition);height:40px;margin:8px 8px 0;padding:8px;color:hsla(0,0%,100%,.5);color:var(--light-icon-inactive)}.navbar--menu-button---1ZRpz:hover{color:#fff;color:var(--light-icon-active)}.navbar--report-title---3bXCv{-webkit-flex-grow:1;flex-grow:1;font-family:var(--font-family--light);color:#fff;font-size:18px;line-height:52px;line-height:calc(var(--navbar-height-short) - 4px);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.navbar--pct-bar---3EwW-:after,.navbar--pct-bar---3EwW-:before{content:" ";display:table}.navbar--pct-bar---3EwW-:after{clear:both}.navbar--pct-bar---3EwW-{display:-webkit-flex;display:flex;position:absolute;left:0;right:0;bottom:0;height:4px}.navbar--pct-bar---3EwW- .navbar--pass---2oR-w{background-color:#4caf50;background-color:var(--green500)}.navbar--pct-bar---3EwW- .navbar--fail---3mN80{background-color:#f44336;background-color:var(--red500)}.navbar--pct-bar---3EwW- .navbar--pend---2iqjh{background-color:#03a9f4;background-color:var(--ltblue500)}.navbar--pct-bar-segment---3T0_o{height:4px}@media (min-width:768px){.navbar--component---2UCEi{min-height:56px;min-height:var(--navbar-height-short);height:56px;height:var(--navbar-height-short);-webkit-flex-direction:initial;flex-direction:row}.navbar--report-info-cnt---8y9Bb{-webkit-flex-grow:1;flex-grow:1}}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.quick-summary--trans-color---HUJqE{transition:color .2s ease-out;transition:var(--link-transition)}.quick-summary--cnt---3s38x{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;padding:0 12px}.quick-summary--list---2_80W:after,.quick-summary--list---2_80W:before{content:" ";display:table}.quick-summary--list---2_80W:after{clear:both}.quick-summary--list---2_80W{list-style:none;padding-left:0;transition:opacity .2s ease-out;margin:0 0 8px}.quick-summary--item---bfSQ0,.quick-summary--list---2_80W{display:-webkit-flex;display:flex}.quick-summary--item---bfSQ0{font-family:var(--font-family--light);-webkit-align-items:flex-start;align-items:flex-start;color:#fff;font-size:16px;-webkit-flex-basis:25%;flex-basis:25%}.quick-summary--item---bfSQ0 button{border:none;background:transparent;padding:0}.quick-summary--item---bfSQ0 button:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.quick-summary--item---bfSQ0 button{transition:color .2s ease-out;transition:var(--link-transition);display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;color:#fff;cursor:pointer}.quick-summary--item---bfSQ0 button:hover .quick-summary--icon---TW1oG{border-color:#fff}.quick-summary--item---bfSQ0.quick-summary--tests---2nNut{color:#fff}.quick-summary--item---bfSQ0.quick-summary--passes---3IjYH .quick-summary--icon---TW1oG{color:#388e3c;color:var(--green700);background-color:#c8e6c9;background-color:var(--green100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--passes---3IjYH .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--passed---3QnUL .quick-summary--item---bfSQ0.quick-summary--passes---3IjYH .quick-summary--icon---TW1oG{color:#fff;background-color:#388e3c;background-color:var(--green700)}.quick-summary--item---bfSQ0.quick-summary--failures---14s29 .quick-summary--icon---TW1oG{color:#d32f2f;color:var(--red700);background-color:#ffcdd2;background-color:var(--red100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--failures---14s29 .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--failed---3_tAw .quick-summary--item---bfSQ0.quick-summary--failures---14s29 .quick-summary--icon---TW1oG{color:#fff;background-color:#d32f2f;background-color:var(--red700)}.quick-summary--item---bfSQ0.quick-summary--pending---261aV .quick-summary--icon---TW1oG{color:#0288d1;color:var(--ltblue700);background-color:#b3e5fc;background-color:var(--ltblue100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--pending---261aV .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--pending---21lZM .quick-summary--item---bfSQ0.quick-summary--pending---261aV .quick-summary--icon---TW1oG{color:#fff;background-color:#0288d1;background-color:var(--ltblue700)}.quick-summary--item---bfSQ0.quick-summary--skipped---tyOc4 .quick-summary--icon---TW1oG{color:#616161;color:var(--grey700);background-color:#f5f5f5;background-color:var(--grey100)}.quick-summary--single-filter---31Thy .quick-summary--item---bfSQ0.quick-summary--skipped---tyOc4 .quick-summary--icon---TW1oG{background-color:#e0e0e0;background-color:var(--grey300);color:#9e9e9e;color:var(--grey500)}.quick-summary--single-filter--skipped---1AdZA .quick-summary--item---bfSQ0.quick-summary--skipped---tyOc4 .quick-summary--icon---TW1oG{color:#fff;background-color:#616161;background-color:var(--grey700)}.quick-summary--icon---TW1oG{position:relative;top:2px;font-size:18px;margin-right:4px}.quick-summary--circle-icon---1HDS7{font-size:12px;border-radius:50%;padding:2px;border:1px solid transparent;transition:border-color .2s ease-out}@media (min-width:768px){.quick-summary--cnt---3s38x{-webkit-flex-direction:initial;flex-direction:row;padding:14px 12px 0 0}.quick-summary--list---2_80W{margin:0}.quick-summary--item---bfSQ0{font-size:18px;-webkit-flex-basis:initial;flex-basis:auto;margin:0 12px}.quick-summary--icon---TW1oG{font-size:24px;width:24px;top:0}.quick-summary--circle-icon---1HDS7{font-size:18px}}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.radio-button--trans-color---egsik{transition:color .2s ease-out;transition:var(--link-transition)}.radio-button--component---1ix3c:after,.radio-button--component---1ix3c:before{content:" ";display:table}.radio-button--component---1ix3c:after{clear:both}.radio-button--component---1ix3c{position:relative;height:24px}.radio-button--outer---a_NqL{position:absolute;top:50%;right:0;margin-top:-9px;width:18px;height:18px;border:2px solid #4caf50;border:2px solid var(--green500);border-radius:12px;cursor:pointer;transition:border-color .2s ease-out}.radio-button--off---dBAOK{border-color:color(#000 tint(73.5%));border-color:var(--gray-medium)}.radio-button--inner---3bo9Q{display:block;position:absolute;top:2px;right:2px;width:10px;height:10px;border-radius:100%;background-color:#4caf50;background-color:var(--green500)}.radio-button--off---dBAOK .radio-button--inner---3bo9Q{background-color:#fff;-webkit-transform:scale(0);transform:scale(0)}.radio-button--inner---3bo9Q{transition:all .15s cubic-bezier(.23,1,.32,1)}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.test--trans-color---3sP2r{transition:color .2s ease-out;transition:var(--link-transition)}.test--component---1mwsi{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.test--component---1mwsi.test--expanded---3hI0z.test--passed---38wAs .test--body-wrap---3EGPT,.test--component---1mwsi.test--expanded---3hI0z.test--passed---38wAs .test--header-btn---mI0Oy{border-left-color:#4caf50;border-left-color:var(--green500)}.test--component---1mwsi.test--expanded---3hI0z.test--failed---2PZhW .test--body-wrap---3EGPT,.test--component---1mwsi.test--expanded---3hI0z.test--failed---2PZhW .test--header-btn---mI0Oy{border-left-color:#f44336;border-left-color:var(--red500)}.test--list---24Hjy{list-style-type:none;margin:0;padding:0}.test--header-btn---mI0Oy{display:-webkit-flex;display:flex;position:relative;background:#fff;border:none;border-left:3px solid transparent;cursor:pointer;-webkit-flex-wrap:wrap;flex-wrap:wrap;padding:10px 16px 10px 13px;transition:border-color .2s ease-out;width:100%}.test--header-btn---mI0Oy[disabled]{cursor:default}.test--header-btn---mI0Oy:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.test--header-btn---mI0Oy:focus:not([disabled]),.test--header-btn---mI0Oy:hover:not([disabled]){border-left-color:#9e9e9e;border-left-color:var(--grey500)}.test--title---4c0rg{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-flex-grow:1;flex-grow:1;font-family:var(--font-family--regular);font-size:13px;line-height:24px;margin:0;padding-right:12px;text-align:left}.test--hook---3T4lI .test--title---4c0rg{color:rgba(0,0,0,.54);color:var(--black54)}.test--expanded---3hI0z .test--title---4c0rg{line-height:1.5;padding-top:3px;white-space:normal}.test--icon---2jgH_{-webkit-align-self:flex-start;align-self:flex-start;padding:3px;border-radius:50%;color:#fff;margin-right:16px}.test--icon---2jgH_.test--pass---C1Mk7{color:#c8e6c9;color:var(--green100);background-color:#4caf50;background-color:var(--green500)}.test--icon---2jgH_.test--fail---3u2w0{color:#ffcdd2;color:var(--red100);background-color:#f44336;background-color:var(--red500)}.test--icon---2jgH_.test--pending---3Ctfm{color:#b3e5fc;color:var(--ltblue100);background-color:#03a9f4;background-color:var(--ltblue500)}.test--icon---2jgH_.test--skipped---3aU0Y{color:#f5f5f5;color:var(--grey100);background-color:#9e9e9e;background-color:var(--grey500)}.test--icon---2jgH_.test--hook---3T4lI{color:rgba(0,0,0,.38);color:var(--black38);padding:0}.test--failed---2PZhW .test--icon---2jgH_.test--hook---3T4lI{color:#f44336;color:var(--red500)}.test--info---1UQNw{display:-webkit-flex;display:flex}.test--duration---2tVp5{font-family:var(--font-family--regular);line-height:24px;color:rgba(0,0,0,.54);color:var(--black54)}.test--component---1mwsi:hover:not(.test--pending---3Ctfm) .test--duration---2tVp5,.test--expanded---3hI0z .test--duration---2tVp5{color:rgba(0,0,0,.87);color:var(--black87)}.test--duration---2tVp5{transition:color .2s ease-out}.test--duration-icon---2KnOU{margin-left:4px;line-height:24px!important;color:rgba(0,0,0,.38);color:var(--black38)}.test--duration-icon---2KnOU.test--slow---MQOnF{color:#e57373;color:var(--red300)}.test--duration-icon---2KnOU.test--medium---5j890{color:#fbc02d;color:var(--yellow700)}.test--context-icon---2POzC{position:relative;line-height:24px!important;color:rgba(0,0,0,.38);color:var(--black38);margin-right:8px;top:1px}.test--body-wrap---3EGPT{border-left:3px solid transparent;transition:border-color .2s ease-out}.test--expanded---3hI0z .test--body-wrap---3EGPT{display:block;padding-bottom:10px}.test--body---Ox0q_{display:none;background-color:#fafafa;border:1px solid #eceff1;border:1px solid var(--grey50);border-radius:4px}.test--expanded---3hI0z .test--body---Ox0q_{display:block;margin:0 16px 0 13px}.test--error-message---3Grn0{color:#f44336;color:var(--red500);font-size:12px;margin:10px 0 0;text-align:left;width:100%;word-break:break-word}.test--code-snippet---3H5Xj{position:relative;font-size:11px;margin:0;border-radius:0}.test--code-snippet---3H5Xj+.test--code-snippet---3H5Xj{border-top:1px solid #fff}.test--code-snippet---3H5Xj.hljs{padding:1em;background:none}.test--code-diff---2XQsb code>span:first-child{margin-right:11px}.test--code-diff-expected---1QWLl span{color:#859900}.test--inline-diff---3OmYO .test--code-diff-expected---1QWLl{background-color:#859900;color:#fff}.test--code-diff-actual---3MMxN span{color:#dc322f}.test--inline-diff---3OmYO .test--code-diff-actual---3MMxN{background-color:#dc322f;color:#fff}.test--code-label---1QEUY{position:absolute;font-family:var(--font-family--regular);top:0;right:0;padding:.2em .6em;background-color:#9e9e9e;background-color:var(--grey500);color:#fff}.test--context---1YYgX{background-color:#fff;border-top:1px solid #eceff1;border-top:1px solid var(--grey50);border-bottom-left-radius:4px;border-bottom-right-radius:4px}.test--context-title---HHH10{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family--regular);font-size:13px;color:rgba(0,0,0,.54);color:var(--black54);margin:0;padding:11px 11px 0}.test--context-item---R1NNU{padding-top:11px}.test--context-item---R1NNU .test--code-snippet---3H5Xj{padding-top:0}.test--context-item-title---1KxIO{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family--medium);font-size:13px;margin:0;padding:0 11px 11px}.test--text-link---2_cSn{display:inline-block;padding:0 1em 1em;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-family:var(--font-family-mono);font-size:11px;color:#0288d1;color:var(--ltblue700)}.test--text-link---2_cSn:hover{color:#03a9f4;color:var(--ltblue500)}.test--image-link---PUFPJ,.test--video-link---1L-2D{display:inline-block;font-size:11px;padding:0 1em 1em}.test--image---2Z5X2,.test--video---2JK7O{display:block;max-width:100%;height:auto}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.suite--trans-color---2pu6T{transition:color .2s ease-out;transition:var(--link-transition)}.suite--component---22Vxk:after,.suite--component---22Vxk:before{content:" ";display:table}.suite--component---22Vxk:after{clear:both}.suite--component---22Vxk{position:relative;background-color:#fff;margin-bottom:20px}.suite--component---22Vxk>.suite--body---1itCO>ul>li>.suite--component---22Vxk{border:1px solid #e0e0e0;border:1px solid var(--grey300);border-right:none;border-bottom:none;margin:16px 0 16px 16px}.suite--component---22Vxk>.suite--body---1itCO>ul>li>.suite--component---22Vxk.suite--no-tests---l47BS{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--list---3WtMK{list-style-type:none;margin:0;padding:0}.suite--list-main---3KCXR>li>.suite--component---22Vxk,.suite--root-suite---ZDRuj{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin:0 0 24px}.suite--list-main---3KCXR>.suite--no-tests---l47BS>.suite--body---1itCO>ul>li>.suite--component---22Vxk:not(.suite--no-suites---2PQFQ){border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--header---TddSn:after,.suite--header---TddSn:before{content:" ";display:table}.suite--header---TddSn:after{clear:both}.suite--header---TddSn{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--no-tests---l47BS>.suite--header---TddSn{padding-bottom:0;border-bottom:none}.suite--header-btn---25qLz{background:#fff;border:none;cursor:pointer;padding:12px 16px;text-align:left;width:100%}.suite--header-btn---25qLz:focus{box-shadow:0 0 2px 0 #03a9f4;box-shadow:0 0 2px 0 var(--ltblue500);outline:none}.suite--title---3T6OR{display:-webkit-flex;display:flex;font-family:var(--font-family--light);font-size:21px;margin:0}.suite--title---3T6OR span{margin-right:auto}.suite--title---3T6OR .suite--icon---2KPe5{margin-left:58px}.suite--filename---1u8oo{color:rgba(0,0,0,.54);color:var(--black54);font-family:var(--font-family--regular);margin:6px 0 0}.suite--body---1itCO:after,.suite--body---1itCO:before{content:" ";display:table}.suite--body---1itCO:after{clear:both}.suite--body---1itCO.suite--hide---2i8QF{display:none}.suite--has-suites---3OYDf>.suite--body---1itCO{border-bottom:1px solid #e0e0e0;border-bottom:1px solid var(--grey300)}.suite--chart-wrap---7hvUh{display:none;position:absolute;top:12px;right:36px;width:50px;height:50px}.suite--chart-slice---1XN2j{stroke:#fff;stroke-width:2px}.ct-series-a .suite--chart-slice---1XN2j{fill:#4caf50;fill:var(--green500)}.ct-series-b .suite--chart-slice---1XN2j{fill:#f44336;fill:var(--red500)}.ct-series-c .suite--chart-slice---1XN2j{fill:#03a9f4;fill:var(--ltblue500)}.ct-series-d .suite--chart-slice---1XN2j{fill:rgba(0,0,0,.38);fill:var(--black38)}@media (min-width:768px){.suite--chart-wrap---7hvUh{display:block}.suite--chart-enabled---1N-VF:not(.suite--no-tests---l47BS) .suite--header---TddSn{min-height:66px}}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.suite-summary--trans-color---14JXk{transition:color .2s ease-out;transition:var(--link-transition)}.suite-summary--component---cFAkx:after,.suite-summary--component---cFAkx:before{content:" ";display:table}.suite-summary--component---cFAkx:after{clear:both}.suite-summary--component---cFAkx{list-style:none;padding-left:0;display:-webkit-flex;display:flex;font-family:var(--font-family--regular);font-size:15px;margin:16px 0 0}.suite-summary--component---cFAkx.suite-summary--no-margin---3WX9n{margin:0}.suite-summary--summary-item---JHYFN{display:-webkit-flex;display:flex;line-height:18px;margin:0 8px;color:rgba(0,0,0,.54);color:var(--black54)}.suite-summary--summary-item---JHYFN:first-child{margin-left:0}.suite-summary--summary-item---JHYFN.suite-summary--duration---AzGUQ,.suite-summary--summary-item---JHYFN.suite-summary--tests---3Zhct{color:rgba(0,0,0,.54);color:var(--black54)}.suite-summary--summary-item---JHYFN.suite-summary--passed---24BnC{color:#4caf50;color:var(--green500)}.suite-summary--summary-item---JHYFN.suite-summary--failed---205C4{color:#f44336;color:var(--red500)}.suite-summary--summary-item---JHYFN.suite-summary--pending---3_Nkj{color:#03a9f4;color:var(--ltblue500)}.suite-summary--summary-item---JHYFN.suite-summary--skipped---TovqF{color:rgba(0,0,0,.38);color:var(--black38)}.suite-summary--icon---3rZ6G{margin-right:2px}
+:root{--screen-sm-min:768px;--screen-md-min:992px;--screen-lg-min:1200px;--grid-gutter-width:30px;--container-sm:calc(720px + var(--grid-gutter-width));--container-md:calc(940px + var(--grid-gutter-width));--container-lg:calc(1140px + var(--grid-gutter-width));--navbar-height:122px;--navbar-height-short:56px;--summary-height-stacked:82px;--statusbar-height-stacked:54px;--footer-height:60px;--default-transition-duration:0.2s;--default-transition-easing:ease;--gray-base:#000;--gray-darker-faded:color(var(--gray-darker) alpha(95%));--gray-darker:color(var(--gray-base) tint(13.5%));--gray-dark:color(var(--gray-base) tint(20%));--gray:color(var(--gray-base) tint(33.5%));--gray-light:color(var(--gray-base) tint(46.7%));--gray-medium:color(var(--gray-base) tint(73.5%));--gray-lighter:color(var(--gray-base) tint(93.5%));--gray-lighter-faded:color(var(--gray-lighter) alpha(95%));--gray-border:color(var(--gray-base) tint(80%));--grey50:#eceff1;--grey100:#f5f5f5;--grey300:#e0e0e0;--grey500:#9e9e9e;--grey700:#616161;--green100:#c8e6c9;--green200:#a5d6a7;--green300:#81c784;--green500:#4caf50;--green700:#388e3c;--red100:#ffcdd2;--red300:#e57373;--red500:#f44336;--red700:#d32f2f;--ltblue100:#b3e5fc;--ltblue300:#4fc3f7;--ltblue500:#03a9f4;--ltblue700:#0288d1;--black87:rgba(0,0,0,0.87);--black54:rgba(0,0,0,0.54);--black38:rgba(0,0,0,0.38);--bluegrey500:#607d8b;--bluegrey800:#37474f;--bluegrey900:#263238;--light-icon-active:#fff;--light-icon-inactive:hsla(0,0%,100%,0.5);--dark-icon-active:var(--black54);--dark-icon-inactive:var(--black38);--amber300:#ffd54f;--amber400:#ffca28;--amber500:#ffc107;--yellow700:#fbc02d;--yellow800:#f9a825;--brand-primary:color(#428bca shade(6.5%));--brand-success:#4caf50;--brand-info:#5bc0de;--brand-warning:#f0ad4e;--brand-danger:#d9534f;--text-color:var(--black87);--body-bg:#f2f2f2;--link-color:var(--brand-primary);--link-hover-color:color(var(--link-color) shade(15%));--list-group-border:#ddd;--font-family-sans-serif:"robotoregular","Helvetica Neue",Helvetica,Arial,sans-serif;--font-family-base:var(--font-family-sans-serif);--font-family-mono:"Menlo","Monaco","Consolas","Courier New",monospace;--font-size-base:14px;--line-height-base:1.429;--line-height-computed:20px;--headings-font-family:inherit;--headings-font-weight:400;--headings-line-height:1.1;--headings-color:inherit;--headings-small-color:var(--gray-light);--font-size-h1:36px;--font-size-h2:30px;--font-size-h3:24px;--font-size-h4:18px;--font-size-h5:var(--font-size-base);--font-size-h6:12px;--font-family-light:"robotolight";--font-family-regular:"robotoregular";--font-family-medium:"robotomedium";--link-transition:color 0.2s ease-out}.toggle-switch--trans-color---16in9{transition:color .2s ease-out;transition:var(--link-transition)}.toggle-switch--component---3vjvh:after,.toggle-switch--component---3vjvh:before{content:" ";display:table}.toggle-switch--component---3vjvh:after{clear:both}.toggle-switch--component---3vjvh{height:24px}.toggle-switch--label---1Lu8U{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center}.toggle-switch--toggle-input---3BB7e{position:absolute;opacity:0}.toggle-switch--toggle-input---3BB7e:checked+.toggle-switch--toggle---2kPqc{background-color:#a5d6a7;background-color:var(--green200)}.toggle-switch--toggle-input---3BB7e:checked+.toggle-switch--toggle---2kPqc:before{background-color:#4caf50;background-color:var(--green500);-webkit-transform:translateX(14px);transform:translateX(14px)}.toggle-switch--toggle-input---3BB7e:focus+.toggle-switch--toggle---2kPqc:before{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12),0 0 2px 0 #03a9f4;box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12),0 0 2px 0 var(--ltblue500)}.toggle-switch--toggle---2kPqc{display:inline-block;position:relative;background-color:#e0e0e0;background-color:var(--grey300);border-radius:7px;cursor:pointer;height:14px;margin-left:auto;transition:background-color .15s cubic-bezier(.4,0,.2,1) 0s;width:34px}.toggle-switch--toggle---2kPqc:before{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);content:"";position:absolute;background-color:#9e9e9e;background-color:var(--grey500);border-radius:100%;height:20px;left:0;top:-3px;width:20px;transition:-webkit-transform .15s cubic-bezier(.4,0,.2,1) 0s;transition:transform .15s cubic-bezier(.4,0,.2,1) 0s;transition:transform .15s cubic-bezier(.4,0,.2,1) 0s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) 0s}.toggle-switch--disabled---1qDLf{opacity:.6}.toggle-switch--disabled---1qDLf .toggle-switch--icon---348nT{color:rgba(0,0,0,.38);color:var(--black38)}.toggle-switch--disabled---1qDLf .toggle-switch--toggle---2kPqc{cursor:default}
diff --git a/mochawesome-report/assets/app.js b/mochawesome-report/assets/app.js
new file mode 100644
index 0000000..b8ad716
--- /dev/null
+++ b/mochawesome-report/assets/app.js
@@ -0,0 +1 @@
+/*! mochawesome-report-generator 4.1.0 | https://github.com/adamgruber/mochawesome-report-generator */!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=318)}([function(e,t,n){"use strict";e.exports=n(125)},function(e,t,n){e.exports=n(129)()},function(e,t,n){var r=n(196),o=n(52),i=36e5,a=/[T ]/,s=/:/,u=/^(\d{2})$/,l=[/^([+-]\d{2})$/,/^([+-]\d{3})$/,/^([+-]\d{4})$/],c=/^(\d{4})/,f=[/^([+-]\d{4})/,/^([+-]\d{5})/,/^([+-]\d{6})/],p=/^-(\d{2})$/,d=/^-?(\d{3})$/,h=/^-?(\d{2})-?(\d{2})$/,m=/^-?W(\d{2})$/,v=/^-?W(\d{2})-?(\d{1})$/,g=/^(\d{2}([.,]\d*)?)$/,y=/^(\d{2}):?(\d{2}([.,]\d*)?)$/,b=/^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/,_=/([Z+-].*)$/,w=/^(Z)$/,x=/^([+-])(\d{2})$/,k=/^([+-])(\d{2}):?(\d{2})$/;function S(e,t,n){t=t||0,n=n||0;var r=new Date(0);r.setUTCFullYear(e,0,4);var o=7*t+n+1-(r.getUTCDay()||7);return r.setUTCDate(r.getUTCDate()+o),r}e.exports=function(e,t){if(o(e))return new Date(e.getTime());if("string"!=typeof e)return new Date(e);var n=(t||{}).additionalDigits;n=null==n?2:Number(n);var E=function(e){var t,n={},r=e.split(a);if(t=s.test(r[0])?(n.date=null,r[0]):(n.date=r[0],r[1])){var o=_.exec(t);o?(n.time=t.replace(o[1],""),n.timezone=o[1]):n.time=t}return n}(e),O=function(e,t){var n,r=l[t],o=f[t];if(n=c.exec(e)||o.exec(e)){var i=n[1];return{year:parseInt(i,10),restDateString:e.slice(i.length)}}if(n=u.exec(e)||r.exec(e)){var a=n[1];return{year:100*parseInt(a,10),restDateString:e.slice(a.length)}}return{year:null}}(E.date,n),T=O.year,C=function(e,t){if(null===t)return null;var n,r,o;if(0===e.length)return(r=new Date(0)).setUTCFullYear(t),r;if(n=p.exec(e))return r=new Date(0),o=parseInt(n[1],10)-1,r.setUTCFullYear(t,o),r;if(n=d.exec(e)){r=new Date(0);var i=parseInt(n[1],10);return r.setUTCFullYear(t,0,i),r}if(n=h.exec(e)){r=new Date(0),o=parseInt(n[1],10)-1;var a=parseInt(n[2],10);return r.setUTCFullYear(t,o,a),r}return(n=m.exec(e))?S(t,parseInt(n[1],10)-1):(n=v.exec(e))?S(t,parseInt(n[1],10)-1,parseInt(n[2],10)-1):null}(O.restDateString,T);if(C){var N,P=C.getTime(),M=0;if(E.time&&(M=function(e){var t,n,r;if(t=g.exec(e))return(n=parseFloat(t[1].replace(",",".")))%24*i;if(t=y.exec(e))return n=parseInt(t[1],10),r=parseFloat(t[2].replace(",",".")),n%24*i+6e4*r;if(t=b.exec(e)){n=parseInt(t[1],10),r=parseInt(t[2],10);var o=parseFloat(t[3].replace(",","."));return n%24*i+6e4*r+1e3*o}return null}(E.time)),E.timezone)N=6e4*function(e){var t,n;return(t=w.exec(e))?0:(t=x.exec(e))?(n=60*parseInt(t[2],10),"+"===t[1]?-n:n):(t=k.exec(e))?(n=60*parseInt(t[2],10)+parseInt(t[3],10),"+"===t[1]?-n:n):0}(E.timezone);else{var j=P+M,D=new Date(j);N=r(D);var A=new Date(j);A.setDate(D.getDate()+1);var I=r(A)-r(D);0=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}function s(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||0r&&(r=s.dependenciesState)}for(n.length=o,e.newObserving=null,i=t.length;i--;){0===(s=t[i]).diffValue&&ke(s,e),s.diffValue=0}for(;o--;){var s;1===(s=n[o]).diffValue&&(s.diffValue=0,xe(s,e))}r!==Z.UP_TO_DATE&&(e.dependenciesState=r,e.onBecomeStale())}(e),r}function fe(e){var t=e.observing;e.observing=[];for(var n=t.length;n--;)ke(t[n],e);e.dependenciesState=Z.NOT_TRACKING}function pe(e){var t=de();try{return e()}finally{he(t)}}function de(){var e=_e.trackingDerivation;return _e.trackingDerivation=null,e}function he(e){_e.trackingDerivation=e}function me(e){if(e.dependenciesState!==Z.UP_TO_DATE){e.dependenciesState=Z.UP_TO_DATE;for(var t=e.observing,n=t.length;n--;)t[n].lowestObserverState=Z.UP_TO_DATE}}var ve,ge=function(){this.version=5,this.UNCHANGED={},this.trackingDerivation=null,this.computationDepth=0,this.runId=0,this.mobxGuid=0,this.inBatch=0,this.pendingUnobservations=[],this.pendingReactions=[],this.isRunningReactions=!1,this.allowStateChanges=!0,this.enforceActions=!1,this.spyListeners=[],this.globalReactionErrorHandlers=[],this.computedRequiresReaction=!1,this.disableErrorBoundaries=!1,this.suppressReactionErrors=!1},ye=!0,be=!1,_e=(0<(ve=we()).__mobxInstanceCount&&!ve.__mobxGlobals&&(ye=!1),ve.__mobxGlobals&&ve.__mobxGlobals.version!==(new ge).version&&(ye=!1),ye?ve.__mobxGlobals?(ve.__mobxInstanceCount+=1,ve.__mobxGlobals.UNCHANGED||(ve.__mobxGlobals.UNCHANGED={}),ve.__mobxGlobals):(ve.__mobxInstanceCount=1,ve.__mobxGlobals=new ge):(setTimeout(function(){be||p("There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`")},1),new ge));function we(){return"undefined"!=typeof window?window:r}function xe(e,t){e.observers.add(t),e.lowestObserverState>t.dependenciesState&&(e.lowestObserverState=t.dependenciesState)}function ke(e,t){e.observers.delete(t),0===e.observers.size&&Se(e)}function Se(e){!1===e.isPendingUnobservation&&(e.isPendingUnobservation=!0,_e.pendingUnobservations.push(e))}function Ee(){_e.inBatch++}function Oe(){if(0==--_e.inBatch){je();for(var e=_e.pendingUnobservations,t=0;t=t.length&&(t.length=n+1),t[n]=r,Oe()}else{Ee();var i=n;try{for(var a in i)e(t,a,i[a])}finally{Oe()}}}(e,t,n),!0)},deleteProperty:function(e,t){return"string"==typeof t&&(Ke(e).remove(t),!0)},ownKeys:function(e){return Ke(e).keysAtom.reportObserved(),Reflect.ownKeys(e)},preventExtensions:function(e){return p("Dynamic observable objects cannot be frozen"),!1}};function Ze(e){return void 0!==e.interceptors&&0=a.getTime()?n+1:t.getTime()>=u.getTime()?n:n-1}},function(e,t,n){var r=n(34);e.exports=function(e){return r(e,{weekStartsOn:1})}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e);return t.setHours(0,0,0,0),t}},function(e,t,n){"use strict";(function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}})(),e.exports=n(126)},function(e,t,n){var r=n(27),o=n(131),i=n(132),a=r?r.toStringTag:void 0;e.exports=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":a&&a in Object(e)?o(e):i(e)}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t,n){var r=n(139),o=n(142);e.exports=function(e,t){var n=o(e,t);return r(n)?n:void 0}},function(e,t,n){e.exports={"trans-color":"nav-menu--trans-color---1l-R-",wrap:"nav-menu--wrap---39S_b",overlay:"nav-menu--overlay---k2Lwz","close-btn":"nav-menu--close-btn---2m7W7",menu:"nav-menu--menu---lFcsl","close-button":"nav-menu--close-button---2_OHr",date:"nav-menu--date---3SYOi","section-head":"nav-menu--section-head---3LXPD",control:"nav-menu--control---1JEYH","control-label":"nav-menu--control-label---3f2XU","with-icon":"nav-menu--with-icon---qF4hj","control-group":"nav-menu--control-group---32kKg","toggle-icon-passed":"nav-menu--toggle-icon-passed---132lH","toggle-icon-failed":"nav-menu--toggle-icon-failed---x-XUB","toggle-icon-pending":"nav-menu--toggle-icon-pending---3ZJAs","toggle-icon-skipped":"nav-menu--toggle-icon-skipped---FyedH",open:"nav-menu--open---3BW1O",section:"nav-menu--section---2z7Dj",list:"nav-menu--list---2QMG9",main:"nav-menu--main---jkqJW","no-tests":"nav-menu--no-tests---2sRAg",item:"nav-menu--item---gXWu6","has-tests":"nav-menu--has-tests---1ND4g",sub:"nav-menu--sub---EnSIu",link:"nav-menu--link---tywPF","link-icon":"nav-menu--link-icon---1Q2NP",pass:"nav-menu--pass---1PUeh",fail:"nav-menu--fail---3gQQa",pending:"nav-menu--pending---9zAw0",skipped:"nav-menu--skipped---31GPM",disabled:"nav-menu--disabled---2MoA_"}},function(e,t,n){e.exports={"trans-color":"suite--trans-color---2pu6T",component:"suite--component---22Vxk",body:"suite--body---1itCO","no-tests":"suite--no-tests---l47BS",list:"suite--list---3WtMK","list-main":"suite--list-main---3KCXR","root-suite":"suite--root-suite---ZDRuj","no-suites":"suite--no-suites---2PQFQ",header:"suite--header---TddSn","header-btn":"suite--header-btn---25qLz",title:"suite--title---3T6OR",icon:"suite--icon---2KPe5",filename:"suite--filename---1u8oo",hide:"suite--hide---2i8QF","has-suites":"suite--has-suites---3OYDf","chart-wrap":"suite--chart-wrap---7hvUh","chart-slice":"suite--chart-slice---1XN2j","chart-enabled":"suite--chart-enabled---1N-VF"}},function(e,t,n){var r=n(2);e.exports=function(e,t){var n=r(e),o=Number(t);return n.setDate(n.getDate()+o),n}},function(e,t,n){var r=n(2);e.exports=function(e,t){var n=r(e).getTime(),o=Number(t);return new Date(n+o)}},function(e,t,n){var r=n(11),o=n(12);e.exports=function(e){var t=r(e),n=new Date(0);return n.setFullYear(t,0,4),n.setHours(0,0,0,0),o(n)}},function(e,t,n){var r=n(2);e.exports=function(e,t){var n=r(e).getTime(),o=r(t).getTime();return n]+>|\t|)+|(?:\n)))/gm,l="",c={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function f(e){return e.replace(/&/g,"&").replace(//g,">")}function p(e){return e.nodeName.toLowerCase()}function d(e,t){var n=e&&e.exec(t);return n&&0===n.index}function h(e){return a.test(e)}function m(e){var t,n={},r=Array.prototype.slice.call(arguments,1);for(t in e)n[t]=e[t];return r.forEach(function(e){for(t in e)n[t]=e[t]}),n}function v(e){var t=[];return function e(n,r){for(var o=n.firstChild;o;o=o.nextSibling)3===o.nodeType?r+=o.nodeValue.length:1===o.nodeType&&(t.push({event:"start",offset:r,node:o}),r=e(o,r),p(o).match(/br|hr|img|input/)||t.push({event:"stop",offset:r,node:o}));return r}(e,0),t}function g(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map(function(t){return m(e,{variants:null},t)})),e.cached_variants||e.endsWithParent&&[m(e)]||[e]}function y(e){if(t&&!e.langApiRestored){for(var n in e.langApiRestored=!0,t)e[n]&&(e[t[n]]=e[n]);(e.contains||[]).concat(e.variants||[]).forEach(y)}}function b(e){function t(e){return e&&e.source||e}function n(n,r){return new RegExp(t(n),"m"+(e.case_insensitive?"i":"")+(r?"g":""))}!function o(i,a){if(!i.compiled){if(i.compiled=!0,i.keywords=i.keywords||i.beginKeywords,i.keywords){var s={},u=function(t,n){e.case_insensitive&&(n=n.toLowerCase()),n.split(" ").forEach(function(e){var n=e.split("|");s[n[0]]=[t,n[1]?Number(n[1]):1]})};"string"==typeof i.keywords?u("keyword",i.keywords):r(i.keywords).forEach(function(e){u(e,i.keywords[e])}),i.keywords=s}i.lexemesRe=n(i.lexemes||/\w+/,!0),a&&(i.beginKeywords&&(i.begin="\\b("+i.beginKeywords.split(" ").join("|")+")\\b"),i.begin||(i.begin=/\B|\b/),i.beginRe=n(i.begin),i.endSameAsBegin&&(i.end=i.begin),i.end||i.endsWithParent||(i.end=/\B|\b/),i.end&&(i.endRe=n(i.end)),i.terminator_end=t(i.end)||"",i.endsWithParent&&a.terminator_end&&(i.terminator_end+=(i.end?"|":"")+a.terminator_end)),i.illegal&&(i.illegalRe=n(i.illegal)),null==i.relevance&&(i.relevance=1),i.contains||(i.contains=[]),i.contains=Array.prototype.concat.apply([],i.contains.map(function(e){return g("self"===e?i:e)})),i.contains.forEach(function(e){o(e,i)}),i.starts&&o(i.starts,a);var l=i.contains.map(function(e){return e.beginKeywords?"\\.?(?:"+e.begin+")\\.?":e.begin}).concat([i.terminator_end,i.illegal]).map(t).filter(Boolean);i.terminators=l.length?n(function(e,n){for(var r=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,o=0,i="",a=0;a')+t+(n?"":l)}function a(){g+=null!=m.subLanguage?function(){var e="string"==typeof m.subLanguage;if(e&&!o[m.subLanguage])return f(y);var t=e?_(m.subLanguage,y,!0,v[m.subLanguage]):w(y,m.subLanguage.length?m.subLanguage:void 0);return 0")+'"');return y+=t,t.length||1}var p=E(e);if(!p)throw new Error('Unknown language: "'+e+'"');b(p);var h,m=r||p,v={},g="";for(h=m;h!==p;h=h.parent)h.className&&(g=i(h.className,"",!0)+g);var y="",x=0;try{for(var k,S,O=0;m.terminators.lastIndex=O,k=m.terminators.exec(t);)S=u(t.substring(O,k.index),k[0]),O=k.index+S;for(u(t.substr(O)),h=m;h.parent;h=h.parent)h.className&&(g+=l);return{relevance:x,value:g,language:e,top:m}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{relevance:0,value:f(t)};throw e}}function w(e,t){t=t||c.languages||r(o);var n={relevance:0,value:f(e)},i=n;return t.filter(E).filter(O).forEach(function(t){var r=_(t,e,!1);r.language=t,r.relevance>i.relevance&&(i=r),r.relevance>n.relevance&&(i=n,n=r)}),i.language&&(n.second_best=i),n}function x(e){return c.tabReplace||c.useBR?e.replace(u,function(e,t){return c.useBR&&"\n"===e?"
":c.tabReplace?t.replace(/\t/g,c.tabReplace):""}):e}function k(e){var t,r,o,a,u,l=function(e){var t,n,r,o,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",n=s.exec(i))return E(n[1])?n[1]:"no-highlight";for(t=0,r=(i=i.split(/\s+/)).length;t/g,"\n"):t=e,u=t.textContent,o=l?_(l,u,!0):w(u),(r=v(t)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=o.value,o.value=function(e,t,r){var o=0,i="",a=[];function s(){return e.length&&t.length?e[0].offset!==t[0].offset?e[0].offset"}function l(e){i+=""+p(e)+">"}function c(e){("start"===e.event?u:l)(e.node)}for(;e.length||t.length;){var d=s();if(i+=f(r.substring(o,d[0].offset)),o=d[0].offset,d===e){for(a.reverse().forEach(l);c(d.splice(0,1)[0]),(d=s())===e&&d.length&&d[0].offset===o;);a.reverse().forEach(u)}else"start"===d[0].event?a.push(d[0].node):a.pop(),c(d.splice(0,1)[0])}return i+f(r.substr(o))}(r,v(a),u)),o.value=x(o.value),e.innerHTML=o.value,e.className=function(e,t,n){var r=t?i[t]:n,o=[e.trim()];return e.match(/\bhljs\b/)||o.push("hljs"),-1===e.indexOf(r)&&o.push(r),o.join(" ").trim()}(e.className,l,o.language),e.result={language:o.language,re:o.relevance},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.relevance}))}function S(){if(!S.called){S.called=!0;var e=document.querySelectorAll("pre code");n.forEach.call(e,k)}}function E(e){return e=(e||"").toLowerCase(),o[e]||o[i[e]]}function O(e){var t=E(e);return t&&!t.disableAutodetect}e.highlight=_,e.highlightAuto=w,e.fixMarkup=x,e.highlightBlock=k,e.configure=function(e){c=m(c,e)},e.initHighlighting=S,e.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",S,!1),addEventListener("load",S,!1)},e.registerLanguage=function(t,n){var r=o[t]=n(e);y(r),r.aliases&&r.aliases.forEach(function(e){i[e]=t})},e.listLanguages=function(){return r(o)},e.getLanguage=E,e.autoDetection=O,e.inherit=m,e.IDENT_RE="[a-zA-Z]\\w*",e.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",e.NUMBER_RE="\\b\\d+(\\.\\d+)?",e.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BINARY_NUMBER_RE="\\b(0b[01]+)",e.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0},e.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.PHRASAL_WORDS_MODE={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.COMMENT=function(t,n,r){var o=e.inherit({className:"comment",begin:t,end:n,contains:[]},r||{});return o.contains.push(e.PHRASAL_WORDS_MODE),o.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),o},e.C_LINE_COMMENT_MODE=e.COMMENT("//","$"),e.C_BLOCK_COMMENT_MODE=e.COMMENT("/\\*","\\*/"),e.HASH_COMMENT_MODE=e.COMMENT("#","$"),e.NUMBER_MODE={className:"number",begin:e.NUMBER_RE,relevance:0},e.C_NUMBER_MODE={className:"number",begin:e.C_NUMBER_RE,relevance:0},e.BINARY_NUMBER_MODE={className:"number",begin:e.BINARY_NUMBER_RE,relevance:0},e.CSS_NUMBER_MODE={className:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},e.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}]},e.TITLE_MODE={className:"title",begin:e.IDENT_RE,relevance:0},e.UNDERSCORE_TITLE_MODE={className:"title",begin:e.UNDERSCORE_IDENT_RE,relevance:0},e.METHOD_GUARD={begin:"\\.\\s*"+e.UNDERSCORE_IDENT_RE,relevance:0}}(t)},function(e,t,n){var r=n(15),o=n(16);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t,n){var r=n(8).Symbol;e.exports=r},function(e,t,n){var r=n(17)(Object,"create");e.exports=r},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){var r=n(147),o=n(148),i=n(149),a=n(150),s=n(151);function u(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t":">",'"':""","'":"'"},n.serialize=function(e){return null==e?e:("number"==typeof e?e=""+e:"object"==typeof e&&(e=JSON.stringify({data:e})),Object.keys(n.escapingMap).reduce(function(e,t){return n.replaceAll(e,t,n.escapingMap[t])},e))},n.deserialize=function(e){if("string"!=typeof e)return e;e=Object.keys(n.escapingMap).reduce(function(e,t){return n.replaceAll(e,n.escapingMap[t],t)},e);try{e=void 0!==(e=JSON.parse(e)).data?e.data:e}catch(e){}return e},n.createSvg=function(e,t,r,o){var i;return t=t||"100%",r=r||"100%",Array.prototype.slice.call(e.querySelectorAll("svg")).filter(function(e){return e.getAttributeNS(n.namespaces.xmlns,"ct")}).forEach(function(t){e.removeChild(t)}),(i=new n.Svg("svg").attr({width:t,height:r}).addClass(o))._node.style.width=t,i._node.style.height=r,e.appendChild(i._node),i},n.normalizeData=function(e,t,r){var o,i={raw:e,normalized:{}};return i.normalized.series=n.getDataArray({series:e.series||[]},t,r),o=i.normalized.series.every(function(e){return e instanceof Array})?Math.max.apply(null,i.normalized.series.map(function(e){return e.length})):i.normalized.series.length,i.normalized.labels=(e.labels||[]).slice(),Array.prototype.push.apply(i.normalized.labels,n.times(Math.max(0,o-i.normalized.labels.length)).map(function(){return""})),t&&n.reverseData(i.normalized),i},n.safeHasProperty=function(e,t){return null!==e&&"object"==typeof e&&e.hasOwnProperty(t)},n.isDataHoleValue=function(e){return null==e||"number"==typeof e&&isNaN(e)},n.reverseData=function(e){e.labels.reverse(),e.series.reverse();for(var t=0;to.high&&(o.high=s),a&&s=r)l.step=1;else if(o&&f=r)l.step=f;else for(;;){if(c&&n.projectLength(e,l.step,l)<=r)l.step*=2;else{if(c||!(n.projectLength(e,l.step/2,l)>=r))break;if(l.step/=2,o&&l.step%1!=0){l.step*=2;break}}if(1e3=l.high;)s=d(s,-l.step);l.min=a,l.max=s,l.range=l.max-l.min;var h=[];for(i=l.min;i<=l.max;i=d(i,l.step)){var m=n.roundWithPrecision(i);m!==h[h.length-1]&&h.push(m)}return l.values=h,l},n.polarToCartesian=function(e,t,n,r){var o=(r-90)*Math.PI/180;return{x:e+n*Math.cos(o),y:t+n*Math.sin(o)}},n.createChartRect=function(e,t,r){var o=!(!t.axisX&&!t.axisY),i=o?t.axisY.offset:0,a=o?t.axisX.offset:0,s=e.width()||n.quantity(t.width).value||0,u=e.height()||n.quantity(t.height).value||0,l=n.normalizePadding(t.chartPadding,r);s=Math.max(s,i+l.left+l.right),u=Math.max(u,a+l.top+l.bottom);var c={padding:l,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return o?("start"===t.axisX.position?(c.y2=l.top+a,c.y1=Math.max(u-l.bottom,c.y2+1)):(c.y2=l.top,c.y1=Math.max(u-l.bottom-a,c.y2+1)),"start"===t.axisY.position?(c.x1=l.left+i,c.x2=Math.max(s-l.right,c.x1+1)):(c.x1=l.left,c.x2=Math.max(s-l.right-i,c.x1+1))):(c.x1=l.left,c.x2=Math.max(s-l.right,c.x1+1),c.y2=l.top,c.y1=Math.max(u-l.bottom,c.y2+1)),c},n.createGrid=function(e,t,r,o,i,a,s,u){var l={};l[r.units.pos+"1"]=e,l[r.units.pos+"2"]=e,l[r.counterUnits.pos+"1"]=o,l[r.counterUnits.pos+"2"]=o+i;var c=a.elem("line",l,s.join(" "));u.emit("draw",n.extend({type:"grid",axis:r,index:t,group:a,element:c},l))},n.createGridBackground=function(e,t,n,r){var o=e.elem("rect",{x:t.x1,y:t.y2,width:t.width(),height:t.height()},n,!0);r.emit("draw",{type:"gridBackground",group:e,element:o})},n.createLabel=function(e,r,o,i,a,s,u,l,c,f,p){var d,h={};if(h[a.units.pos]=e+u[a.units.pos],h[a.counterUnits.pos]=u[a.counterUnits.pos],h[a.units.len]=r,h[a.counterUnits.len]=Math.max(0,s-10),f){var m=t.createElement("span");m.className=c.join(" "),m.setAttribute("xmlns",n.namespaces.xhtml),m.innerText=i[o],m.style[a.units.len]=Math.round(h[a.units.len])+"px",m.style[a.counterUnits.len]=Math.round(h[a.counterUnits.len])+"px",d=l.foreignObject(m,n.extend({style:"overflow: visible;"},h))}else d=l.elem("text",h,c.join(" ")).text(i[o]);p.emit("draw",n.extend({type:"label",axis:a,index:o,group:l,element:d,text:i[o]},h))},n.getSeriesOption=function(e,t,n){if(e.name&&t.series&&t.series[e.name]){var r=t.series[e.name];return r.hasOwnProperty(n)?r[n]:t[n]}return t[n]},n.optionsProvider=function(t,r,o){var i,a,s=n.extend({},t),u=[];function l(t){var u=i;if(i=n.extend({},s),r)for(a=0;ae.x;return r&&"explode"===n||!r&&"implode"===n?"start":r&&"implode"===n||!r&&"explode"===n?"end":"middle"}n.Pie=n.Base.extend({constructor:function(e,t,o,i){n.Pie.super.constructor.call(this,e,t,r,n.extend({},r,o),i)},createChart:function(e){var t,i,a,s,u,l=n.normalizeData(this.data),c=[],f=e.startAngle;this.svg=n.createSvg(this.container,e.width,e.height,e.donut?e.classNames.chartDonut:e.classNames.chartPie),i=n.createChartRect(this.svg,e,r.padding),a=Math.min(i.width()/2,i.height()/2),u=e.total||l.normalized.series.reduce(function(e,t){return e+t},0);var p=n.quantity(e.donutWidth);"%"===p.unit&&(p.value*=a/100),a-=e.donut&&!e.donutSolid?p.value/2:0,s="outside"===e.labelPosition||e.donut&&!e.donutSolid?a:"center"===e.labelPosition?0:e.donutSolid?a-p.value/2:a/2,s+=e.labelOffset;var d={x:i.x1+i.width()/2,y:i.y2+i.height()/2},h=1===l.raw.series.filter(function(e){return e.hasOwnProperty("value")?0!==e.value:0!==e}).length;l.raw.series.forEach(function(e,t){c[t]=this.svg.elem("g",null,null)}.bind(this)),e.showLabel&&(t=this.svg.elem("g",null,null)),l.raw.series.forEach(function(r,i){if(0!==l.normalized.series[i]||!e.ignoreEmptyValues){c[i].attr({"ct:series-name":r.name}),c[i].addClass([e.classNames.series,r.className||e.classNames.series+"-"+n.alphaNumerate(i)].join(" "));var m=0"+t+"",t=nr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction(function(){return tr(e,t)})}:tr);function or(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var ir={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ar=["Webkit","ms","Moz","O"];function sr(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||ir.hasOwnProperty(e)&&ir[e]?(""+t).trim():t+"px"}function ur(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=sr(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(ir).forEach(function(e){ar.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ir[t]=ir[e]})});var lr=o({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function cr(e,t){t&&(lr[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&a("137",e,""),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&a("60"),"object"==typeof t.dangerouslySetInnerHTML&&"__html"in t.dangerouslySetInnerHTML||a("61")),null!=t.style&&"object"!=typeof t.style&&a("62",""))}function fr(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function pr(e,t){var n=jn(e=9===e.nodeType||11===e.nodeType?e:e.ownerDocument);t=_[t];for(var r=0;rt&&(e.latestPendingTime=t),to(t,e)}function Zr(e,t){e.didError=!1,e.latestPingedTime>=t&&(e.latestPingedTime=0);var n=e.earliestPendingTime,r=e.latestPendingTime;n===t?e.earliestPendingTime=r===t?e.latestPendingTime=0:r:r===t&&(e.latestPendingTime=n),n=e.earliestSuspendedTime,r=e.latestSuspendedTime,0===n?e.earliestSuspendedTime=e.latestSuspendedTime=t:nm?(v=f,f=null):v=f.sibling;var g=d(o,f,s[m],u);if(null===g){null===f&&(f=v);break}e&&f&&null===g.alternate&&t(o,f),a=i(g,a,m),null===c?l=g:c.sibling=g,c=g,f=v}if(m===s.length)return n(o,f),l;if(null===f){for(;mv?(g=m,m=null):g=m.sibling;var b=d(o,m,y.value,l);if(null===b){m||(m=g);break}e&&m&&null===b.alternate&&t(o,m),s=i(b,s,v),null===f?c=b:f.sibling=b,f=b,m=g}if(y.done)return n(o,m),c;if(null===m){for(;!y.done;v++,y=u.next())null!==(y=p(o,y.value,l))&&(s=i(y,s,v),null===f?c=y:f.sibling=y,f=y);return c}for(m=r(o,m);!y.done;v++,y=u.next())null!==(y=h(m,o,v,y.value,l))&&(e&&null!==y.alternate&&m.delete(null===y.key?v:y.key),s=i(y,s,v),null===f?c=y:f.sibling=y,f=y);return e&&m.forEach(function(e){return t(o,e)}),c}(u,l,c,f);if(v&&po(u,c),void 0===c&&!m)switch(u.tag){case 1:case 0:a("152",(f=u.type).displayName||f.name||"Component")}return n(u,l)}}var mo=ho(!0),vo=ho(!1),go={},yo={current:go},bo={current:go},_o={current:go};function wo(e){return e===go&&a("174"),e}function xo(e,t){Tr(_o,t),Tr(bo,e),Tr(yo,go);var n=t.nodeType;switch(n){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:er(null,"");break;default:t=er(t=(n=8===n?t.parentNode:t).namespaceURI||null,n=n.tagName)}Or(yo),Tr(yo,t)}function ko(e){Or(yo),Or(bo),Or(_o)}function So(e){wo(_o.current);var t=wo(yo.current),n=er(t,e.type);t!==n&&(Tr(bo,e),Tr(yo,n))}function Eo(e){bo.current===e&&(Or(yo),Or(bo))}var Oo=0,To=2,Co=4,No=8,Po=16,Mo=32,jo=64,Do=128,Ao=We.ReactCurrentDispatcher,Io=0,Ro=null,zo=null,Fo=null,Lo=null,Uo=null,Bo=null,Ho=0,Vo=null,Wo=0,Yo=!1,$o=null,qo=0;function Go(){a("321")}function Xo(e,t){if(null===t)return!1;for(var n=0;n=t&&(wi=!0),e.contextDependencies=null}function Ui(e,t){return Ri!==e&&!1!==t&&0!==t&&("number"==typeof t&&1073741823!==t||(Ri=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Ii?(null===Ai&&a("308"),Ii=t,Ai.contextDependencies={first:t,expirationTime:0}):Ii=Ii.next=t),e._currentValue}var Bi=0,Hi=1,Vi=2,Wi=3,Yi=!1;function $i(e){return{baseState:e,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function qi(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,lastUpdate:e.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Gi(e){return{expirationTime:e,tag:Bi,payload:null,callback:null,next:null,nextEffect:null}}function Xi(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.lastUpdate.next=t,e.lastUpdate=t)}function Qi(e,t){var n=e.alternate;if(null===n){var r=e.updateQueue,o=null;null===r&&(r=e.updateQueue=$i(e.memoizedState))}else r=e.updateQueue,o=n.updateQueue,null===r?null===o?(r=e.updateQueue=$i(e.memoizedState),o=n.updateQueue=$i(n.memoizedState)):r=e.updateQueue=qi(o):null===o&&(o=n.updateQueue=qi(r));null===o||r===o?Xi(r,t):null===r.lastUpdate||null===o.lastUpdate?(Xi(r,t),Xi(o,t)):(Xi(r,t),o.lastUpdate=t)}function Ki(e,t){var n=e.updateQueue;null===(n=null===n?e.updateQueue=$i(e.memoizedState):Ji(e,n)).lastCapturedUpdate?n.firstCapturedUpdate=n.lastCapturedUpdate=t:(n.lastCapturedUpdate.next=t,n.lastCapturedUpdate=t)}function Ji(e,t){var n=e.alternate;return null!==n&&t===n.updateQueue&&(t=e.updateQueue=qi(t)),t}function Zi(e,t,n,r,i,a){switch(n.tag){case Hi:return"function"==typeof(e=n.payload)?e.call(a,r,i):e;case Wi:e.effectTag=-2049&e.effectTag|64;case Bi:if(null==(i="function"==typeof(e=n.payload)?e.call(a,r,i):e))break;return o({},r,i);case Vi:Yi=!0}return r}function ea(e,t,n,r,o){Yi=!1;for(var i=(t=Ji(e,t)).baseState,a=null,s=0,u=t.firstUpdate,l=i;null!==u;){var c=u.expirationTime;ct&&(e.earliestPendingTime=e.latestPendingTime)),0===(n=e.earliestSuspendedTime)?Jr(e,t):t<\/script>",f=i.removeChild(i.firstChild)):"string"==typeof i.is?f=f.createElement(d,{is:i.is}):(f=f.createElement(d),"select"===d&&(d=f,i.multiple?d.multiple=!0:i.size&&(d.size=i.size))):f=f.createElementNS(c,d),(i=f)[D]=p,i[A]=u,ia(i,t,!1,!1),d=i;var h=l,m=fr(f=s,p=u);switch(f){case"iframe":case"object":En("load",d),l=p;break;case"video":case"audio":for(l=0;l component higher in the tree to provide a loading indicator or placeholder to display."+ut(c))}Pa=!0,f=ra(f,c),u=l;do{switch(u.tag){case 3:u.effectTag|=2048,u.expirationTime=s,Ki(u,s=ba(u,f,s));break e;case 1:if(d=f,h=u.type,c=u.stateNode,0==(64&u.effectTag)&&("function"==typeof h.getDerivedStateFromError||null!==c&&"function"==typeof c.componentDidCatch&&(null===Ra||!Ra.has(c)))){u.effectTag|=2048,u.expirationTime=s,Ki(u,s=_a(u,d,s));break e}}u=u.return}while(null!==u)}Oa=Va(i);continue}o=!0,Ps(t)}}break}if(Ea=!1,xa.current=n,Ri=Ii=Ai=null,Ko(),o)Ta=null,e.finishedWork=null;else if(null!==Oa)e.finishedWork=null;else{if(null===(n=e.current.alternate)&&a("281"),Ta=null,Pa){if(o=e.latestPendingTime,i=e.latestSuspendedTime,s=e.latestPingedTime,0!==o&&oe.expirationTime&&(e.expirationTime=t),ns||(us?ls&&Cs(rs=e,os=1073741823,!1):1073741823===t?Os(1073741823,!1):ys(e,t))}function xs(){var e=0,t=null;if(null!==Za)for(var n=Za,r=Ja;null!==r;){var o=r.expirationTime;if(0===o){if((null===n||null===Za)&&a("244"),r===r.nextScheduledRoot){Ja=Za=r.nextScheduledRoot=null;break}if(r===Ja)Ja=o=r.nextScheduledRoot,Za.nextScheduledRoot=o,r.nextScheduledRoot=null;else{if(r===Za){(Za=n).nextScheduledRoot=Ja,r.nextScheduledRoot=null;break}n.nextScheduledRoot=r.nextScheduledRoot,r.nextScheduledRoot=null}r=n.nextScheduledRoot}else{if(e=n&&(null===cs?cs=[r]:cs.push(r),r._defer))return e.finishedWork=t,void(e.expirationTime=0);e.finishedWork=null,e===vs?ms++:(vs=e,ms=0),i.unstable_runWithPriority(i.unstable_ImmediatePriority,function(){Ha(e,t)})}function Ps(e){null===rs&&a("246"),rs.expirationTime=0,as||(as=!0,ss=e)}function Ms(e,t){if(us&&!ls){ls=!0;try{return e(t)}finally{ls=!1}}return e(t)}function js(e,t,n,r,o){var i=t.current;e:if(n){t:{2===tn(n=n._reactInternalFiber)&&1===n.tag||a("170");var s=n;do{switch(s.tag){case 3:s=s.stateNode.context;break t;case 1:if(Dr(s.type)){s=s.stateNode.__reactInternalMemoizedMergedChildContext;break t}}s=s.return}while(null!==s);a("171"),s=void 0}if(1===n.tag){var u=n.type;if(Dr(u)){n=zr(n,u,s);break e}}n=s}else n=Cr;return null===t.context?t.context=n:t.pendingContext=n,t=o,(o=Gi(r)).payload={element:e},null!==(t=void 0===t?null:t)&&(o.callback=t),Ba(),Qi(i,o),Qa(i,r),r}function Ds(e,t,n,r){var o=t.current;return js(e,t,n,o=qa(_s(),o),r)}function As(e){if(!(e=e.current).child)return null;switch(e.child.tag){case 5:default:return e.child.stateNode}}function Is(e){var t=1073741822-25*(1+((1073741822-_s()+500)/25|0));Sa<=t&&(t=Sa-1),this._expirationTime=Sa=t,this._root=e,this._callbacks=this._next=null,this._hasChildren=this._didComplete=!1,this._children=null,this._defer=!0}function Rs(){this._callbacks=null,this._didCommit=!1,this._onCommit=this._onCommit.bind(this)}function zs(e,t,n){e={current:t=Wr(3,null,null,t?3:0),containerInfo:e,pendingChildren:null,pingCache:null,earliestPendingTime:0,latestPendingTime:0,earliestSuspendedTime:0,latestSuspendedTime:0,latestPingedTime:0,didError:!1,pendingCommitExpirationTime:0,finishedWork:null,timeoutHandle:-1,context:null,pendingContext:null,hydrate:n,nextExpirationTimeToWorkOn:0,expirationTime:0,firstBatch:null,nextScheduledRoot:null},this._internalRoot=t.stateNode=e}function Fs(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Ls(e,t,n,r,o){var i=n._reactRootContainer;if(i){if("function"==typeof o){var a=o;o=function(){var e=As(i._internalRoot);a.call(e)}}null!=e?i.legacy_renderSubtreeIntoContainer(e,t,o):i.render(t,o)}else{if(i=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new zs(e,!1,t)}(n,r),"function"==typeof o){var s=o;o=function(){var e=As(i._internalRoot);s.call(e)}}Ms(function(){null!=e?i.legacy_renderSubtreeIntoContainer(e,t,o):i.render(t,o)})}return As(i._internalRoot)}function Us(e,t){var n=2=t;)r=(n=r)._next;e._next=r,null!==n&&(n._next=e)}return e},Ae=function(){ns||0===is||(Os(is,!1),is=0)};var Bs,Hs,Vs={createPortal:Us,findDOMNode:function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternalFiber;return void 0===t&&("function"==typeof e.render?a("188"):a("268",Object.keys(e))),null===(e=rn(t))?null:e.stateNode},hydrate:function(e,t,n){return Fs(t)||a("200"),Ls(null,e,t,!0,n)},render:function(e,t,n){return Fs(t)||a("200"),Ls(null,e,t,!1,n)},unstable_renderSubtreeIntoContainer:function(e,t,n,r){return Fs(n)||a("200"),(null==e||void 0===e._reactInternalFiber)&&a("38"),Ls(e,t,n,!1,r)},unmountComponentAtNode:function(e){return Fs(e)||a("40"),!!e._reactRootContainer&&(Ms(function(){Ls(null,null,e,!1,function(){e._reactRootContainer=null})}),!0)},unstable_createPortal:function(){return Us.apply(void 0,arguments)},unstable_batchedUpdates:je=function(e,t){var n=us;us=!0;try{return e(t)}finally{(us=n)||ns||Os(1073741823,!1)}},unstable_interactiveUpdates:De=function(e,t,n){us||ns||0===is||(Os(is,!1),is=0);var r=us;us=!0;try{return i.unstable_runWithPriority(i.unstable_UserBlockingPriority,function(){return e(t,n)})}finally{(us=r)||ns||Os(1073741823,!1)}},flushSync:function(e,t){ns&&a("187");var n=us;us=!0;try{return Ka(e,t)}finally{us=n,Os(1073741823,!1)}},unstable_createRoot:function(e,t){return Fs(e)||a("299","unstable_createRoot"),new zs(e,!0,null!=t&&!0===t.hydrate)},unstable_flushControlled:function(e){var t=us;us=!0;try{Ka(e)}finally{(us=t)||ns||Os(1073741823,!1)}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[R,z,F,N.injectEventPluginsByName,y,W,function(e){O(e,V)},Pe,Me,Cn,M]}};Hs=(Bs={findFiberByHostInstance:I,bundleType:0,version:"16.8.5",rendererPackageName:"react-dom"}).findFiberByHostInstance,function(e){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!t.isDisabled&&t.supportsFiber)try{var n=t.inject(e);Ur=Hr(function(e){return t.onCommitFiberRoot(n,e)}),Br=Hr(function(e){return t.onCommitFiberUnmount(n,e)})}catch(e){}}}(o({},Bs,{overrideProps:null,currentDispatcherRef:We.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=rn(e))?null:e.stateNode},findFiberByHostInstance:function(e){return Hs?Hs(e):null}}));var Ws=Vs;e.exports=Ws.default||Ws},function(e,t,n){"use strict";e.exports=n(128)},function(e,t,n){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});var n=null,r=!1,o=3,i=-1,a=-1,s=!1,u=!1;function l(){if(!s){var e=n.expirationTime;u?k():u=!0,x(p,e)}}function c(){var e=n,t=n.next;if(n===t)n=null;else{var r=n.previous;n=r.next=t,t.previous=r}e.next=e.previous=null,r=e.callback,t=e.expirationTime,e=e.priorityLevel;var i=o,s=a;o=e,a=t;try{var u=r()}finally{o=i,a=s}if("function"==typeof u)if(u={callback:u,priorityLevel:e,expirationTime:t,next:null,previous:null},null===n)n=u.next=u.previous=u;else{r=null,e=n;do{if(e.expirationTime>=t){r=e;break}e=e.next}while(e!==n);null===r?r=n:r===n&&(n=u,l()),(t=r.previous).next=r.previous=u,u.next=r,u.previous=t}}function f(){if(-1===i&&null!==n&&1===n.priorityLevel){s=!0;try{for(;c(),null!==n&&1===n.priorityLevel;);}finally{s=!1,null!==n?l():u=!1}}}function p(e){s=!0;var o=r;r=e;try{if(e)for(;null!==n;){var i=t.unstable_now();if(!(n.expirationTime<=i))break;for(;c(),null!==n&&n.expirationTime<=i;);}else if(null!==n)for(;c(),null!==n&&!S(););}finally{s=!1,r=o,null!==n?l():u=!1,f()}}var d,h,m=Date,v="function"==typeof setTimeout?setTimeout:void 0,g="function"==typeof clearTimeout?clearTimeout:void 0,y="function"==typeof requestAnimationFrame?requestAnimationFrame:void 0,b="function"==typeof cancelAnimationFrame?cancelAnimationFrame:void 0;function _(e){d=y(function(t){g(h),e(t)}),h=v(function(){b(d),e(t.unstable_now())},100)}if("object"==typeof performance&&"function"==typeof performance.now){var w=performance;t.unstable_now=function(){return w.now()}}else t.unstable_now=function(){return m.now()};var x,k,S,E=null;if("undefined"!=typeof window?E=window:void 0!==e&&(E=e),E&&E._schedMock){var O=E._schedMock;x=O[0],k=O[1],S=O[2],t.unstable_now=O[3]}else if("undefined"==typeof window||"function"!=typeof MessageChannel){var T=null,C=function(e){if(null!==T)try{T(e)}finally{T=null}};x=function(e){null!==T?setTimeout(x,0,e):(T=e,setTimeout(C,0,!1))},k=function(){T=null},S=function(){return!1}}else{"undefined"!=typeof console&&("function"!=typeof y&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof b&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));var N=null,P=!1,M=-1,j=!1,D=!1,A=0,I=33,R=33;S=function(){return A<=t.unstable_now()};var z=new MessageChannel,F=z.port2;z.port1.onmessage=function(){P=!1;var e=N,n=M;N=null,M=-1;var r=t.unstable_now(),o=!1;if(A-r<=0){if(!(-1!==n&&n<=r))return j||(j=!0,_(L)),N=e,void(M=n);o=!0}if(null!==e){D=!0;try{e(o)}finally{D=!1}}};var L=function(e){if(null!==N){_(L);var t=e-A+R;tr){a=s;break}s=s.next}while(s!==n);null===a?a=n:a===n&&(n=e,l()),(r=a.previous).next=a.previous=e,e.next=a,e.previous=r}return e},t.unstable_cancelCallback=function(e){var t=e.next;if(null!==t){if(t===e)n=null;else{e===n&&(n=t);var r=e.previous;(r.next=t).previous=r}e.next=e.previous=null}},t.unstable_wrapCallback=function(e){var n=o;return function(){var r=o,a=i;o=n,i=t.unstable_now();try{return e.apply(this,arguments)}finally{o=r,i=a,f()}}},t.unstable_getCurrentPriorityLevel=function(){return o},t.unstable_shouldYield=function(){return!r&&(null!==n&&n.expirationTimea)throw new Error("The first date cannot be after the second date");var s=[],u=o;for(u.setHours(0,0,0,0);u.getTime()<=a;)s.push(r(u)),u.setDate(u.getDate()+i);return s}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e);return t.setMinutes(59,59,999),t}},function(e,t,n){var r=n(89);e.exports=function(e){return r(e,{weekStartsOn:1})}},function(e,t,n){var r=n(11),o=n(12);e.exports=function(e){var t=r(e),n=new Date(0);n.setFullYear(t+1,0,4),n.setHours(0,0,0,0);var i=o(n);return i.setMilliseconds(i.getMilliseconds()-1),i}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e);return t.setSeconds(59,999),t}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e),n=t.getMonth(),o=n-n%3+3;return t.setMonth(o,0),t.setHours(23,59,59,999),t}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e);return t.setMilliseconds(999),t}},function(e,t,n){var r=n(59);e.exports=function(){return r(new Date)}},function(e,t){e.exports=function(){var e=new Date,t=e.getFullYear(),n=e.getMonth(),r=e.getDate(),o=new Date(0);return o.setFullYear(t,n,r+1),o.setHours(23,59,59,999),o}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e),n=t.getFullYear();return t.setFullYear(n+1,0,0),t.setHours(23,59,59,999),t}},function(e,t){e.exports=function(){var e=new Date,t=e.getFullYear(),n=e.getMonth(),r=e.getDate(),o=new Date(0);return o.setFullYear(t,n,r-1),o.setHours(23,59,59,999),o}},function(e,t,n){var r=n(91),o=n(60),i=n(11),a=n(2),s=n(93),u=n(58),l={M:function(e){return e.getMonth()+1},MM:function(e){return f(e.getMonth()+1,2)},Q:function(e){return Math.ceil((e.getMonth()+1)/3)},D:function(e){return e.getDate()},DD:function(e){return f(e.getDate(),2)},DDD:function(e){return r(e)},DDDD:function(e){return f(r(e),3)},d:function(e){return e.getDay()},E:function(e){return e.getDay()||7},W:function(e){return o(e)},WW:function(e){return f(o(e),2)},YY:function(e){return f(e.getFullYear(),4).substr(2)},YYYY:function(e){return f(e.getFullYear(),4)},GG:function(e){return String(i(e)).substr(2)},GGGG:function(e){return i(e)},H:function(e){return e.getHours()},HH:function(e){return f(e.getHours(),2)},h:function(e){var t=e.getHours();return 0===t?12:12o.getTime()}},function(e,t,n){var r=n(2);e.exports=function(e,t){var n=r(e),o=r(t);return n.getTime()(new Date).getTime()}},function(e,t,n){var r=n(2),o=n(59),i=n(90);e.exports=function(e){var t=r(e);return o(t).getTime()===i(t).getTime()}},function(e,t,n){var r=n(2);e.exports=function(e){return 1===r(e).getDay()}},function(e,t,n){var r=n(2);e.exports=function(e){return r(e).getTime()<(new Date).getTime()}},function(e,t,n){var r=n(13);e.exports=function(e,t){var n=r(e),o=r(t);return n.getTime()===o.getTime()}},function(e,t,n){var r=n(2);e.exports=function(e){return 6===r(e).getDay()}},function(e,t,n){var r=n(2);e.exports=function(e){return 0===r(e).getDay()}},function(e,t,n){var r=n(96);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(98);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(99);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(100);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(102);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(103);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(105);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(61);e.exports=function(e,t){return r(new Date,e,t)}},function(e,t,n){var r=n(107);e.exports=function(e){return r(new Date,e)}},function(e,t,n){var r=n(2);e.exports=function(e){return 4===r(e).getDay()}},function(e,t,n){var r=n(13);e.exports=function(e){return r(e).getTime()===r(new Date).getTime()}},function(e,t,n){var r=n(13);e.exports=function(e){var t=new Date;return t.setDate(t.getDate()+1),r(e).getTime()===r(t).getTime()}},function(e,t,n){var r=n(2);e.exports=function(e){return 2===r(e).getDay()}},function(e,t,n){var r=n(2);e.exports=function(e){return 3===r(e).getDay()}},function(e,t,n){var r=n(2);e.exports=function(e){var t=r(e).getDay();return 0===t||6===t}},function(e,t,n){var r=n(2);e.exports=function(e,t,n){var o=r(e).getTime(),i=r(t).getTime(),a=r(n).getTime();if(a",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,contains:a}]}]},{begin:/,end:/(\/\w+|\w+\/)>/,subLanguage:"xml",contains:[{begin:/<\w+\s*\/>/,skip:!0},{begin:/<\w+/,end:/(\/\w+|\w+\/)>/,skip:!0,contains:[{begin:/<\w+\s*\/>/,skip:!0},"self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:t}),{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:a}],illegal:/\[|%/},{begin:/\$[(.]/},e.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor get set",end:/\{/,excludeEnd:!0}],illegal:/#(?!!)/}}},function(e,t){e.exports=function(e){return{aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/\*{5}/,end:/\*{5}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}},function(e,t,n){"use strict";n.r(t);var r=n(0),o=n.n(r),i=n(14),a=n.n(i),s=n(1),u=n.n(s),l=n(24),c=n.n(l),f=n(3),p=n.n(f),d=n(39),h=n.n(d),m=n(7),v=n.n(m),g=n(38),y=n.n(g);function b(e){return(b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _(e,t){for(var n=0;n>",a=a||r,null!=n[r])return e.apply(void 0,[n,r,o,i,a].concat(u));if(t){var s=null===n[r]?"null":"undefined";return new Error("The "+i+" `"+a+"` is marked as required in `"+o+"`, but its value is `"+s+"`.")}return null})}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}function Ne(e){var t=ie(e);return Array.isArray(e)?"array":e instanceof RegExp?"object":function(e,t){return"symbol"===e||"Symbol"===t["@@toStringTag"]||"function"==typeof Symbol&&t instanceof Symbol}(t,e)?"symbol":t}function Pe(e,t){return Ce(function(n,r,o,i,a){return Object(oe.o)(function(){if(e&&Ne(n[r])===t.toLowerCase())return null;var i;switch(t){case"Array":i=oe.i;break;case"Object":i=oe.k;break;case"Map":i=oe.j;break;default:throw new Error("Unexpected mobxType: ".concat(t))}var s=n[r];if(i(s))return null;var u=function(e){var t=Ne(e);if("object"===t){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return t}(s),l=e?" or javascript `"+t.toLowerCase()+"`":"";return new Error("Invalid prop `"+a+"` of type `"+u+"` supplied to `"+o+"`, expected `mobx.Observable"+t+"`"+l+".")})})}function Me(e,t){return Ce(function(n,r,o,i,a){for(var s=arguments.length,u=new Array(5",i=this._reactInternalInstance&&this._reactInternalInstance._rootNodeID||this._reactInternalInstance&&this._reactInternalInstance._debugID||this._reactInternalFiber&&this._reactInternalFiber._debugID;Ze(this,Qe,!1),Ze(this,Ke,!1);var a=e.bind(this),s=!1,u=new oe.b("".concat(o,"#").concat(i,".render()"),function(){if(!s&&(s=!0,"function"==typeof t.componentWillReact&&t.componentWillReact(),!0!==t[We])){var e=!0;try{Ze(t,Ke,!0),t[Qe]||r.Component.prototype.forceUpdate.call(t),e=!1}finally{Ze(t,Ke,!1),e&&u.dispose()}}});return u.reactComponent=this,n[Ve]=u,(this.render=n).call(this)}.call(this,c)},n}var ut=st(function(e){var t=e.children,n=e.inject,r=e.render,i=t||r;if(void 0===i)return null;if(!n)return i();console.warn(" is no longer supported. Please use inject on the enclosing component instead");var a=He(n)(i);return o.a.createElement(a,null)});ut.displayName="Observer";var lt=function(e,t,n,r,o){var i="children"===t?"render":"children";return"function"==typeof e[t]&&"function"==typeof e[i]?new Error("Invalid prop,do not use children and render in the same time in`"+n):"function"!=typeof e[t]&&"function"!=typeof e[i]?new Error("Invalid prop `"+o+"` of type `"+ie(e[t])+"` supplied to `"+n+"`, expected `function`."):void 0};function ct(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!=e&&this.setState(e)}function ft(e){this.setState(function(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!=n?n:null}.bind(this))}function pt(e,t){try{var n=this.props,r=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,r)}finally{this.props=n,this.state=r}}ut.propTypes={render:lt,children:lt};var dt={children:pt.__suppressDeprecationWarning=ft.__suppressDeprecationWarning=ct.__suppressDeprecationWarning=!0,key:!0,ref:!0},ht=function(e){function t(e,n){var r;return ae(this,t),(r=pe(this,fe(t).call(this,e,n))).state={},mt(e,r.state),r}return ce(t,r.Component),ue(t,[{key:"render",value:function(){return r.Children.only(this.props.children)}},{key:"getChildContext",value:function(){var e={};return mt(this.context.mobxStores,e),mt(this.props,e),{mobxStores:e}}}],[{key:"getDerivedStateFromProps",value:function(e,t){if(!e)return null;if(!t)return e;if(Object.keys(e).filter(vt).length!==Object.keys(t).filter(vt).length&&console.warn("MobX Provider: The set of provided stores has changed. Please avoid changing stores as the change might not propagate to all children"),!e.suppressChangedStoreWarning)for(var n in e)vt(n)&&t[n]!==e[n]&&console.warn("MobX Provider: Provided store '"+n+"' has changed. Please avoid replacing stores as the change might not propagate to all children");return e}}]),t}();function mt(e,t){if(e)for(var n in e)vt(n)&&(t[n]=e[n])}function vt(e){return!dt[e]&&"suppressChangedStoreWarning"!==e}if(ht.contextTypes={mobxStores:je},ht.childContextTypes={mobxStores:je.isRequired},function(e){var t=e.prototype;if(!t||!t.isReactComponent)throw new Error("Can only polyfill class components");if("function"==typeof e.getDerivedStateFromProps||"function"==typeof t.getSnapshotBeforeUpdate){var n=null,r=null,o=null;if("function"==typeof t.componentWillMount?n="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(n="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?r="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(r="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?o="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(o="UNSAFE_componentWillUpdate"),null!==n||null!==r||null!==o){var i=e.displayName||e.name,a="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+i+" uses "+a+" but also contains the following legacy lifecycles:"+(null!==n?"\n "+n:"")+(null!==r?"\n "+r:"")+(null!==o?"\n "+o:"")+"\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://fb.me/react-async-component-lifecycle-hooks")}if("function"==typeof e.getDerivedStateFromProps&&(t.componentWillMount=ct,t.componentWillReceiveProps=ft),"function"==typeof t.getSnapshotBeforeUpdate){if("function"!=typeof t.componentDidUpdate)throw new Error("Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype");t.componentWillUpdate=pt;var s=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var r=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;s.call(this,e,t,r)}}}}(ht),Ae("disposeOnUnmount"),!r.Component)throw new Error("mobx-react requires React to be available");if(!oe.n)throw new Error("mobx-react requires mobx to be available");if("function"==typeof i.unstable_batchedUpdates&&Object(oe.e)({reactionScheduler:i.unstable_batchedUpdates}),"object"===("undefined"==typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__?"undefined":ie(__MOBX_DEVTOOLS_GLOBAL_HOOK__))){var gt={spy:oe.n,extras:{getDebugName:oe.h}},yt={renderReporter:Xe,componentByNodeRegistry:Ge,componentByNodeRegistery:Ge,trackComponents:function(){if("undefined"==typeof WeakMap)throw new Error("[mobx-react] tracking components is not supported in this browser.");Ye||(Ye=!0)}};__MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobxReact(yt,gt)}var bt,_t,wt,xt=n(116),kt=n.n(xt);function St(e){return(St="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Et(e,t){for(var n=0;n
+Mochawesome Report
\ No newline at end of file
diff --git a/mochawesome-report/mochawesome.json b/mochawesome-report/mochawesome.json
new file mode 100644
index 0000000..a88cb95
--- /dev/null
+++ b/mochawesome-report/mochawesome.json
@@ -0,0 +1,176 @@
+{
+ "stats": {
+ "suites": 3,
+ "tests": 3,
+ "passes": 3,
+ "pending": 0,
+ "failures": 0,
+ "start": "2019-12-25T09:00:01.796Z",
+ "end": "2019-12-25T09:00:01.801Z",
+ "duration": 5,
+ "testsRegistered": 3,
+ "passPercent": 100,
+ "pendingPercent": 0,
+ "other": 0,
+ "hasOther": false,
+ "skipped": 0,
+ "hasSkipped": false
+ },
+ "results": [
+ {
+ "uuid": "9024efa6-5be1-485c-b0bc-08accd590411",
+ "title": "",
+ "fullFile": "",
+ "file": "",
+ "beforeHooks": [],
+ "afterHooks": [],
+ "tests": [],
+ "suites": [
+ {
+ "uuid": "b60b1af8-61b6-4281-ba4e-831695d22807",
+ "title": "#test()",
+ "fullFile": "/home/admincomp/work/test/test/sum.js",
+ "file": "/test/sum.js",
+ "beforeHooks": [],
+ "afterHooks": [],
+ "tests": [],
+ "suites": [
+ {
+ "uuid": "ba35c263-d88c-40d4-857c-7f0ef38571ef",
+ "title": "without arguments",
+ "fullFile": "/home/admincomp/work/test/test/sum.js",
+ "file": "/test/sum.js",
+ "beforeHooks": [],
+ "afterHooks": [],
+ "tests": [
+ {
+ "title": "should return 0",
+ "fullTitle": "#test() without arguments should return 0",
+ "timedOut": false,
+ "duration": 1,
+ "state": "passed",
+ "speed": "fast",
+ "pass": true,
+ "fail": false,
+ "pending": false,
+ "context": null,
+ "code": "expect(0).to.equal(0)",
+ "err": {},
+ "uuid": "d7b30e68-f514-47e4-ae7a-07dd6e307dac",
+ "parentUUID": "ba35c263-d88c-40d4-857c-7f0ef38571ef",
+ "isHook": false,
+ "skipped": false
+ }
+ ],
+ "suites": [],
+ "passes": [
+ "d7b30e68-f514-47e4-ae7a-07dd6e307dac"
+ ],
+ "failures": [],
+ "pending": [],
+ "skipped": [],
+ "duration": 1,
+ "root": false,
+ "rootEmpty": false,
+ "_timeout": 2000
+ },
+ {
+ "uuid": "7d95c54b-16f4-4a90-b334-f6013aca9fe6",
+ "title": "with number arguments",
+ "fullFile": "/home/admincomp/work/test/test/sum.js",
+ "file": "/test/sum.js",
+ "beforeHooks": [],
+ "afterHooks": [],
+ "tests": [
+ {
+ "title": "should return sum of arguments",
+ "fullTitle": "#test() with number arguments should return sum of arguments",
+ "timedOut": false,
+ "duration": 1,
+ "state": "passed",
+ "speed": "fast",
+ "pass": true,
+ "fail": false,
+ "pending": false,
+ "context": null,
+ "code": "expect(15).to.equal(15)",
+ "err": {},
+ "uuid": "009e02b5-c704-4eab-998a-62bb943b5084",
+ "parentUUID": "7d95c54b-16f4-4a90-b334-f6013aca9fe6",
+ "isHook": false,
+ "skipped": false
+ },
+ {
+ "title": "should return argument when only one argument is passed",
+ "fullTitle": "#test() with number arguments should return argument when only one argument is passed",
+ "timedOut": false,
+ "duration": 0,
+ "state": "passed",
+ "speed": "fast",
+ "pass": true,
+ "fail": false,
+ "pending": false,
+ "context": null,
+ "code": "expect(5).to.equal(5)",
+ "err": {},
+ "uuid": "68d0a915-9130-4a14-9825-1428f52eaeef",
+ "parentUUID": "7d95c54b-16f4-4a90-b334-f6013aca9fe6",
+ "isHook": false,
+ "skipped": false
+ }
+ ],
+ "suites": [],
+ "passes": [
+ "009e02b5-c704-4eab-998a-62bb943b5084",
+ "68d0a915-9130-4a14-9825-1428f52eaeef"
+ ],
+ "failures": [],
+ "pending": [],
+ "skipped": [],
+ "duration": 1,
+ "root": false,
+ "rootEmpty": false,
+ "_timeout": 2000
+ }
+ ],
+ "passes": [],
+ "failures": [],
+ "pending": [],
+ "skipped": [],
+ "duration": 0,
+ "root": false,
+ "rootEmpty": false,
+ "_timeout": 2000
+ }
+ ],
+ "passes": [],
+ "failures": [],
+ "pending": [],
+ "skipped": [],
+ "duration": 0,
+ "root": true,
+ "rootEmpty": true,
+ "_timeout": 2000
+ }
+ ],
+ "meta": {
+ "mocha": {
+ "version": "6.2.2"
+ },
+ "mochawesome": {
+ "options": {
+ "quiet": false,
+ "reportFilename": "mochawesome",
+ "saveHtml": true,
+ "saveJson": true,
+ "consoleReporter": "spec",
+ "useInlineDiffs": false
+ },
+ "version": "4.1.0"
+ },
+ "marge": {
+ "options": null,
+ "version": "4.1.0"
+ }
+ }
+}
\ No newline at end of file
diff --git a/mychart/.helmignore b/mychart/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/mychart/.helmignore
@@ -0,0 +1,23 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/mychart/Chart.yaml b/mychart/Chart.yaml
new file mode 100644
index 0000000..1613bff
--- /dev/null
+++ b/mychart/Chart.yaml
@@ -0,0 +1,21 @@
+apiVersion: v2
+name: mychart
+description: A Helm chart for Kubernetes
+
+# A chart can be either an 'application' or a 'library' chart.
+#
+# Application charts are a collection of templates that can be packaged into versioned archives
+# to be deployed.
+#
+# Library charts provide useful utilities or functions for the chart developer. They're included as
+# a dependency of application charts to inject those utilities and functions into the rendering
+# pipeline. Library charts do not define any templates and therefore cannot be deployed.
+type: application
+
+# This is the chart version. This version number should be incremented each time you make changes
+# to the chart and its templates, including the app version.
+version: 0.1.0
+
+# This is the version number of the application being deployed. This version number should be
+# incremented each time you make changes to the application.
+appVersion: 1.16.0
diff --git a/mychart/templates/NOTES.txt b/mychart/templates/NOTES.txt
new file mode 100644
index 0000000..8b795a8
--- /dev/null
+++ b/mychart/templates/NOTES.txt
@@ -0,0 +1,21 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+ {{- range .paths }}
+ http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
+ {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+ export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "mychart.fullname" . }})
+ export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+ echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+ NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+ You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "mychart.fullname" . }}'
+ export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "mychart.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
+ echo http://$SERVICE_IP:{{ .Values.service.port }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+ export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "mychart.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
+ echo "Visit http://127.0.0.1:8080 to use your application"
+ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80
+{{- end }}
diff --git a/mychart/templates/_helpers.tpl b/mychart/templates/_helpers.tpl
new file mode 100644
index 0000000..8479665
--- /dev/null
+++ b/mychart/templates/_helpers.tpl
@@ -0,0 +1,63 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "mychart.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "mychart.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "mychart.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Common labels
+*/}}
+{{- define "mychart.labels" -}}
+helm.sh/chart: {{ include "mychart.chart" . }}
+{{ include "mychart.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end -}}
+
+{{/*
+Selector labels
+*/}}
+{{- define "mychart.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "mychart.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end -}}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "mychart.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+ {{ default (include "mychart.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+ {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
diff --git a/mychart/templates/deployment.yaml b/mychart/templates/deployment.yaml
new file mode 100644
index 0000000..38e698f
--- /dev/null
+++ b/mychart/templates/deployment.yaml
@@ -0,0 +1,55 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "mychart.fullname" . }}
+ labels:
+ {{- include "mychart.labels" . | nindent 4 }}
+spec:
+ replicas: {{ .Values.replicaCount }}
+ selector:
+ matchLabels:
+ {{- include "mychart.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ labels:
+ {{- include "mychart.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- with .Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ serviceAccountName: {{ include "mychart.serviceAccountName" . }}
+ securityContext:
+ {{- toYaml .Values.podSecurityContext | nindent 8 }}
+ containers:
+ - name: {{ .Chart.Name }}
+ securityContext:
+ {{- toYaml .Values.securityContext | nindent 12 }}
+ image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ ports:
+ - name: http
+ containerPort: 80
+ protocol: TCP
+ livenessProbe:
+ httpGet:
+ path: /
+ port: http
+ readinessProbe:
+ httpGet:
+ path: /
+ port: http
+ resources:
+ {{- toYaml .Values.resources | nindent 12 }}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
diff --git a/mychart/templates/ingress.yaml b/mychart/templates/ingress.yaml
new file mode 100644
index 0000000..76d277c
--- /dev/null
+++ b/mychart/templates/ingress.yaml
@@ -0,0 +1,41 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "mychart.fullname" . -}}
+{{- $svcPort := .Values.service.port -}}
+{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1beta1
+{{- else -}}
+apiVersion: extensions/v1beta1
+{{- end }}
+kind: Ingress
+metadata:
+ name: {{ $fullName }}
+ labels:
+ {{- include "mychart.labels" . | nindent 4 }}
+ {{- with .Values.ingress.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+{{- if .Values.ingress.tls }}
+ tls:
+ {{- range .Values.ingress.tls }}
+ - hosts:
+ {{- range .hosts }}
+ - {{ . | quote }}
+ {{- end }}
+ secretName: {{ .secretName }}
+ {{- end }}
+{{- end }}
+ rules:
+ {{- range .Values.ingress.hosts }}
+ - host: {{ .host | quote }}
+ http:
+ paths:
+ {{- range .paths }}
+ - path: {{ . }}
+ backend:
+ serviceName: {{ $fullName }}
+ servicePort: {{ $svcPort }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/mychart/templates/service.yaml b/mychart/templates/service.yaml
new file mode 100644
index 0000000..bdceb88
--- /dev/null
+++ b/mychart/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "mychart.fullname" . }}
+ labels:
+ {{- include "mychart.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.port }}
+ targetPort: http
+ protocol: TCP
+ name: http
+ selector:
+ {{- include "mychart.selectorLabels" . | nindent 4 }}
diff --git a/mychart/templates/serviceaccount.yaml b/mychart/templates/serviceaccount.yaml
new file mode 100644
index 0000000..145e891
--- /dev/null
+++ b/mychart/templates/serviceaccount.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "mychart.serviceAccountName" . }}
+ labels:
+ {{- include "mychart.labels" . | nindent 4 }}
+ {{- with .Values.serviceAccount.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+{{- end -}}
diff --git a/mychart/templates/tests/test-connection.yaml b/mychart/templates/tests/test-connection.yaml
new file mode 100644
index 0000000..0bd46ef
--- /dev/null
+++ b/mychart/templates/tests/test-connection.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Pod
+metadata:
+ name: "{{ include "mychart.fullname" . }}-test-connection"
+ labels:
+ {{- include "mychart.labels" . | nindent 4 }}
+ annotations:
+ "helm.sh/hook": test-success
+spec:
+ containers:
+ - name: wget
+ image: busybox
+ command: ['wget']
+ args: ['{{ include "mychart.fullname" . }}:{{ .Values.service.port }}']
+ restartPolicy: Never
diff --git a/mychart/values.yaml b/mychart/values.yaml
new file mode 100644
index 0000000..dbf4257
--- /dev/null
+++ b/mychart/values.yaml
@@ -0,0 +1,68 @@
+# Default values for mychart.
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+replicaCount: 1
+
+image:
+ repository: nginx
+ pullPolicy: IfNotPresent
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+serviceAccount:
+ # Specifies whether a service account should be created
+ create: true
+ # Annotations to add to the service account
+ annotations: {}
+ # The name of the service account to use.
+ # If not set and create is true, a name is generated using the fullname template
+ name:
+
+podSecurityContext: {}
+ # fsGroup: 2000
+
+securityContext: {}
+ # capabilities:
+ # drop:
+ # - ALL
+ # readOnlyRootFilesystem: true
+ # runAsNonRoot: true
+ # runAsUser: 1000
+
+service:
+ type: ClusterIP
+ port: 80
+
+ingress:
+ enabled: false
+ annotations: {}
+ # kubernetes.io/ingress.class: nginx
+ # kubernetes.io/tls-acme: "true"
+ hosts:
+ - host: chart-example.local
+ paths: []
+ tls: []
+ # - secretName: chart-example-tls
+ # hosts:
+ # - chart-example.local
+
+resources: {}
+ # We usually recommend not to specify default resources and to leave this as a conscious
+ # choice for the user. This also increases chances charts run on environments with little
+ # resources, such as Minikube. If you do want to specify resources, uncomment the following
+ # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+ # limits:
+ # cpu: 100m
+ # memory: 128Mi
+ # requests:
+ # cpu: 100m
+ # memory: 128Mi
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
diff --git a/nginx-ingress/.helmignore b/nginx-ingress/.helmignore
new file mode 100644
index 0000000..f0c1319
--- /dev/null
+++ b/nginx-ingress/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/nginx-ingress/Chart.yaml b/nginx-ingress/Chart.yaml
new file mode 100644
index 0000000..af82011
--- /dev/null
+++ b/nginx-ingress/Chart.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+name: nginx-ingress
+version: 1.41.3
+appVersion: v0.34.1
+deprecated: true
+home: https://github.com/kubernetes/ingress-nginx
+description: DEPRECATED! An nginx Ingress controller that uses ConfigMap to store the nginx configuration.
+icon: https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Nginx_logo.svg/500px-Nginx_logo.svg.png
+keywords:
+ - ingress
+ - nginx
+sources:
+ - https://github.com/kubernetes/ingress-nginx
+engine: gotpl
+kubeVersion: ">=1.10.0-0"
diff --git a/nginx-ingress/README.md b/nginx-ingress/README.md
new file mode 100644
index 0000000..64683c9
--- /dev/null
+++ b/nginx-ingress/README.md
@@ -0,0 +1,464 @@
+# DEPRECATED - nginx-ingress
+
+This chart is deprecated as we have moved to the upstream repo [ingress-nginx](https://github.com/kubernetes/ingress-nginx)
+The chart source can be found here: https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx
+
+[nginx-ingress](https://github.com/kubernetes/ingress-nginx) is an Ingress controller that uses ConfigMap to store the nginx configuration.
+
+To use, add the `kubernetes.io/ingress.class: nginx` annotation to your Ingress resources.
+
+## TL;DR;
+
+```console
+$ helm install stable/nginx-ingress
+```
+
+## Introduction
+
+This chart bootstraps an nginx-ingress deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
+
+## Prerequisites
+
+ - Kubernetes 1.6+
+
+## Installing the Chart
+
+To install the chart with the release name `my-release`:
+
+```console
+$ helm install --name my-release stable/nginx-ingress
+```
+
+The command deploys nginx-ingress on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation.
+
+> **Tip**: List all releases using `helm list`
+
+## Uninstalling the Chart
+
+To uninstall/delete the `my-release` deployment:
+
+```console
+$ helm delete my-release
+```
+
+The command removes all the Kubernetes components associated with the chart and deletes the release.
+
+## Configuration
+
+The following table lists the configurable parameters of the nginx-ingress chart and their default values.
+
+Parameter | Description | Default
+--- | --- | ---
+`controller.name` | name of the controller component | `controller`
+`controller.image.registry` | controller container image registry | `us.gcr.io`
+`controller.image.repository` | controller container image repository | `k8s-artifacts-prod/ingress-nginx/controller`
+`controller.image.tag` | controller container image tag | `0.32.0`
+`controller.image.digest` | controller container image digest | `""`
+`controller.image.pullPolicy` | controller container image pull policy | `IfNotPresent`
+`controller.image.runAsUser` | User ID of the controller process. Value depends on the Linux distribution used inside of the container image. | `101`
+`controller.useComponentLabel` | Wether to add component label so the HPA can work separately for controller and defaultBackend. *Note: don't change this if you have an already running deployment as it will need the recreation of the controller deployment* | `false`
+`controller.componentLabelKeyOverride` | Allows override of the component label key | `""`
+`controller.containerPort.http` | The port that the controller container listens on for http connections. | `80`
+`controller.containerPort.https` | The port that the controller container listens on for https connections. | `443`
+`controller.config` | nginx [ConfigMap](https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/configmap.md) entries | none
+`controller.hostNetwork` | If the nginx deployment / daemonset should run on the host's network namespace. Do not set this when `controller.service.externalIPs` is set and `kube-proxy` is used as there will be a port-conflict for port `80` | false
+`controller.defaultBackendService` | default 404 backend service; needed only if `defaultBackend.enabled = false` and version < 0.21.0| `""`
+`controller.dnsPolicy` | If using `hostNetwork=true`, change to `ClusterFirstWithHostNet`. See [pod's dns policy](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy) for details | `ClusterFirst`
+`controller.dnsConfig` | custom pod dnsConfig. See [pod's dns config](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-config) for details | `{}`
+`controller.reportNodeInternalIp` | If using `hostNetwork=true`, setting `reportNodeInternalIp=true`, will pass the flag `report-node-internal-ip-address` to nginx-ingress. This sets the status of all Ingress objects to the internal IP address of all nodes running the NGINX Ingress controller.
+`controller.electionID` | election ID to use for the status update | `ingress-controller-leader`
+`controller.extraEnvs` | any additional environment variables to set in the pods | `{}`
+`controller.extraContainers` | Sidecar containers to add to the controller pod. See [LemonLDAP::NG controller](https://github.com/lemonldap-ng-controller/lemonldap-ng-controller) as example | `{}`
+`controller.extraVolumeMounts` | Additional volumeMounts to the controller main container | `{}`
+`controller.extraVolumes` | Additional volumes to the controller pod | `{}`
+`controller.extraInitContainers` | Containers, which are run before the app containers are started | `[]`
+`controller.ingressClass` | name of the ingress class to route through this controller | `nginx`
+`controller.maxmindLicenseKey` | Maxmind license key to download GeoLite2 Databases. See [Accessing and using GeoLite2 database](https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases/) | `""`
+`controller.scope.enabled` | limit the scope of the ingress controller | `false` (watch all namespaces)
+`controller.scope.namespace` | namespace to watch for ingress | `""` (use the release namespace)
+`controller.extraArgs` | Additional controller container arguments | `{}`
+`controller.kind` | install as Deployment, DaemonSet or Both | `Deployment`
+`controller.deploymentAnnotations` | annotations to be added to deployment | `{}`
+`controller.autoscaling.enabled` | If true, creates Horizontal Pod Autoscaler | false
+`controller.autoscaling.minReplicas` | If autoscaling enabled, this field sets minimum replica count | `2`
+`controller.autoscaling.maxReplicas` | If autoscaling enabled, this field sets maximum replica count | `11`
+`controller.autoscaling.targetCPUUtilizationPercentage` | Target CPU utilization percentage to scale | `"50"`
+`controller.autoscaling.targetMemoryUtilizationPercentage` | Target memory utilization percentage to scale | `"50"`
+`controller.daemonset.useHostPort` | If `controller.kind` is `DaemonSet`, this will enable `hostPort` for TCP/80 and TCP/443 | false
+`controller.daemonset.hostPorts.http` | If `controller.daemonset.useHostPort` is `true` and this is non-empty, it sets the hostPort | `"80"`
+`controller.daemonset.hostPorts.https` | If `controller.daemonset.useHostPort` is `true` and this is non-empty, it sets the hostPort | `"443"`
+`controller.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]`
+`controller.affinity` | node/pod affinities (requires Kubernetes >=1.6) | `{}`
+`controller.terminationGracePeriodSeconds` | how many seconds to wait before terminating a pod | `60`
+`controller.minReadySeconds` | how many seconds a pod needs to be ready before killing the next, during update | `0`
+`controller.nodeSelector` | node labels for pod assignment | `{}`
+`controller.podAnnotations` | annotations to be added to pods | `{}`
+`controller.podAnnotationConfigChecksum` | add annotation with checksum/config | `false`
+`controller.deploymentLabels` | labels to add to the deployment metadata | `{}`
+`controller.podLabels` | labels to add to the pod container metadata | `{}`
+`controller.podSecurityContext` | Security context policies to add to the controller pod | `{}`
+`controller.replicaCount` | desired number of controller pods | `1`
+`controller.minAvailable` | minimum number of available controller pods for PodDisruptionBudget | `1`
+`controller.resources` | controller pod resource requests & limits | `{}`
+`controller.priorityClassName` | controller priorityClassName | `nil`
+`controller.lifecycle` | controller pod lifecycle hooks | `{}`
+`controller.service.annotations` | annotations for controller service | `{}`
+`controller.service.labels` | labels for controller service | `{}`
+`controller.publishService.enabled` | if true, the controller will set the endpoint records on the ingress objects to reflect those on the service | `false`
+`controller.publishService.pathOverride` | override of the default publish-service name | `""`
+`controller.service.enabled` | if disabled no service will be created. This is especially useful when `controller.kind` is set to `DaemonSet` and `controller.daemonset.useHostPorts` is `true` | true
+`controller.service.clusterIP` | internal controller cluster service IP (set to `"-"` to pass an empty value) | `nil`
+`controller.service.omitClusterIP` | (Deprecated) To omit the `clusterIP` from the controller service | `false`
+`controller.service.externalIPs` | controller service external IP addresses. Do not set this when `controller.hostNetwork` is set to `true` and `kube-proxy` is used as there will be a port-conflict for port `80` | `[]`
+`controller.service.externalTrafficPolicy` | If `controller.service.type` is `NodePort` or `LoadBalancer`, set this to `Local` to enable [source IP preservation](https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typenodeport) | `"Cluster"`
+`controller.service.sessionAffinity` | Enables client IP based session affinity. Must be `ClientIP` or `None` if set. | `""`
+`controller.service.healthCheckNodePort` | If `controller.service.type` is `NodePort` or `LoadBalancer` and `controller.service.externalTrafficPolicy` is set to `Local`, set this to [the managed health-check port the kube-proxy will expose](https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typenodeport). If blank, a random port in the `NodePort` range will be assigned | `""`
+`controller.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""`
+`controller.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]`
+`controller.service.enableHttp` | if port 80 should be opened for service | `true`
+`controller.service.enableHttps` | if port 443 should be opened for service | `true`
+`controller.service.targetPorts.http` | Sets the targetPort that maps to the Ingress' port 80 | `80`
+`controller.service.targetPorts.https` | Sets the targetPort that maps to the Ingress' port 443 | `443`
+`controller.service.ports.http` | Sets service http port | `80`
+`controller.service.ports.https` | Sets service https port | `443`
+`controller.service.type` | type of controller service to create | `LoadBalancer`
+`controller.service.nodePorts.http` | If `controller.service.type` is either `NodePort` or `LoadBalancer` and this is non-empty, it sets the nodePort that maps to the Ingress' port 80 | `""`
+`controller.service.nodePorts.https` | If `controller.service.type` is either `NodePort` or `LoadBalancer` and this is non-empty, it sets the nodePort that maps to the Ingress' port 443 | `""`
+`controller.service.nodePorts.tcp` | Sets the nodePort for an entry referenced by its key from `tcp` | `{}`
+`controller.service.nodePorts.udp` | Sets the nodePort for an entry referenced by its key from `udp` | `{}`
+`controller.service.internal.enabled` | Enables an (additional) internal load balancer | false
+`controller.service.internal.annotations` | Annotations for configuring the additional internal load balancer | `{}`
+`controller.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 10
+`controller.livenessProbe.periodSeconds` | How often to perform the probe | 10
+`controller.livenessProbe.timeoutSeconds` | When the probe times out | 5
+`controller.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1
+`controller.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 3
+`controller.livenessProbe.port` | The port number that the liveness probe will listen on. | 10254
+`controller.readinessProbe.initialDelaySeconds` | Delay before readiness probe is initiated | 10
+`controller.readinessProbe.periodSeconds` | How often to perform the probe | 10
+`controller.readinessProbe.timeoutSeconds` | When the probe times out | 1
+`controller.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1
+`controller.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 3
+`controller.readinessProbe.port` | The port number that the readiness probe will listen on. | 10254
+`controller.metrics.enabled` | if `true`, enable Prometheus metrics | `false`
+`controller.metrics.service.annotations` | annotations for Prometheus metrics service | `{}`
+`controller.metrics.service.clusterIP` | cluster IP address to assign to service (set to `"-"` to pass an empty value) | `nil`
+`controller.metrics.service.omitClusterIP` | (Deprecated) To omit the `clusterIP` from the metrics service | `false`
+`controller.metrics.service.externalIPs` | Prometheus metrics service external IP addresses | `[]`
+`controller.metrics.service.labels` | labels for metrics service | `{}`
+`controller.metrics.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""`
+`controller.metrics.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]`
+`controller.metrics.service.servicePort` | Prometheus metrics service port | `9913`
+`controller.metrics.service.type` | type of Prometheus metrics service to create | `ClusterIP`
+`controller.metrics.serviceMonitor.enabled` | Set this to `true` to create ServiceMonitor for Prometheus operator | `false`
+`controller.metrics.serviceMonitor.additionalLabels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}`
+`controller.metrics.serviceMonitor.honorLabels` | honorLabels chooses the metric's labels on collisions with target labels. | `false`
+`controller.metrics.serviceMonitor.namespace` | namespace where servicemonitor resource should be created | `the same namespace as nginx ingress`
+`controller.metrics.serviceMonitor.namespaceSelector` | [namespaceSelector](https://github.com/coreos/prometheus-operator/blob/v0.34.0/Documentation/api.md#namespaceselector) to configure what namespaces to scrape | `will scrape the helm release namespace only`
+`controller.metrics.serviceMonitor.scrapeInterval` | interval between Prometheus scraping | `30s`
+`controller.metrics.prometheusRule.enabled` | Set this to `true` to create prometheusRules for Prometheus operator | `false`
+`controller.metrics.prometheusRule.additionalLabels` | Additional labels that can be used so prometheusRules will be discovered by Prometheus | `{}`
+`controller.metrics.prometheusRule.namespace` | namespace where prometheusRules resource should be created | `the same namespace as nginx ingress`
+`controller.metrics.prometheusRule.rules` | [rules](https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) to be prometheus in YAML format, check values for an example. | `[]`
+`controller.admissionWebhooks.enabled` | Create Ingress admission webhooks. Validating webhook will check the ingress syntax. | `false`
+`controller.admissionWebhooks.failurePolicy` | Failure policy for admission webhooks | `Fail`
+`controller.admissionWebhooks.port` | Admission webhook port | `8080`
+`controller.admissionWebhooks.service.annotations` | Annotations for admission webhook service | `{}`
+`controller.admissionWebhooks.service.omitClusterIP` | (Deprecated) To omit the `clusterIP` from the admission webhook service | `false`
+`controller.admissionWebhooks.service.clusterIP` | cluster IP address to assign to admission webhook service (set to `"-"` to pass an empty value) | `nil`
+`controller.admissionWebhooks.service.externalIPs` | Admission webhook service external IP addresses | `[]`
+`controller.admissionWebhooks.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""`
+`controller.admissionWebhooks.service.loadBalancerSourceRanges` | List of IP CIDRs allowed access to load balancer (if supported) | `[]`
+`controller.admissionWebhooks.service.servicePort` | Admission webhook service port | `443`
+`controller.admissionWebhooks.service.type` | Type of admission webhook service to create | `ClusterIP`
+`controller.admissionWebhooks.patch.enabled` | If true, will use a pre and post install hooks to generate a CA and certificate to use for validating webhook endpoint, and patch the created webhooks with the CA. | `true`
+`controller.admissionWebhooks.patch.image.repository` | Repository to use for the webhook integration jobs | `jettech/kube-webhook-certgen`
+`controller.admissionWebhooks.patch.image.tag` | Tag to use for the webhook integration jobs | `v1.0.0`
+`controller.admissionWebhooks.patch.image.digest` | Digest to use for the webhook integration jobs | `""`
+`controller.admissionWebhooks.patch.image.pullPolicy` | Image pull policy for the webhook integration jobs | `IfNotPresent`
+`controller.admissionWebhooks.patch.priorityClassName` | Priority class for the webhook integration jobs | `""`
+`controller.admissionWebhooks.patch.podAnnotations` | Annotations for the webhook job pods | `{}`
+`controller.admissionWebhooks.patch.nodeSelector` | Node selector for running admission hook patch jobs | `{}`
+`controller.admissionWebhooks.patch.resources` | Admission webhooks pod resource requests & limits | `{}`
+`controller.customTemplate.configMapName` | configMap containing a custom nginx template | `""`
+`controller.customTemplate.configMapKey` | configMap key containing the nginx template | `""`
+`controller.addHeaders` | configMap key:value pairs containing [custom headers](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#add-headers) added before sending response to the client | `{}`
+`controller.proxySetHeaders` | configMap key:value pairs containing [custom headers](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#proxy-set-headers) added before sending request to the backends| `{}`
+`controller.headers` | DEPRECATED, Use `controller.proxySetHeaders` instead. | `{}`
+`controller.updateStrategy` | allows setting of RollingUpdate strategy | `{}`
+`controller.configMapNamespace` | The nginx-configmap namespace name | `""`
+`controller.tcp.configMapNamespace` | The tcp-services-configmap namespace name | `""`
+`controller.udp.configMapNamespace` | The udp-services-configmap namespace name | `""`
+`defaultBackend.enabled` | Use default backend component | `true`
+`defaultBackend.name` | name of the default backend component | `default-backend`
+`defaultBackend.image.repository` | default backend container image repository | `k8s.gcr.io/defaultbackend-amd64`
+`defaultBackend.image.tag` | default backend container image tag | `1.5`
+`defaultBackend.image.digest` | default backend container image digest | `""`
+`defaultBackend.image.pullPolicy` | default backend container image pull policy | `IfNotPresent`
+`defaultBackend.image.runAsUser` | User ID of the controller process. Value depends on the Linux distribution used inside of the container image. By default uses nobody user. | `65534`
+`defaultBackend.useComponentLabel` | Whether to add component label so the HPA can work separately for controller and defaultBackend. *Note: don't change this if you have an already running deployment as it will need the recreation of the defaultBackend deployment* | `false`
+`defaultBackend.componentLabelKeyOverride` | Allows override of the component label key | `""`
+`defaultBackend.extraArgs` | Additional default backend container arguments | `{}`
+`defaultBackend.extraEnvs` | any additional environment variables to set in the defaultBackend pods | `[]`
+`defaultBackend.port` | Http port number | `8080`
+`defaultBackend.autoscaling.enabled` | If true, creates Horizontal Pod Autoscaler | false
+`defaultBackend.autoscaling.minReplicas` | If autoscaling enabled, this field sets minimum replica count | `1`
+`defaultBackend.autoscaling.maxReplicas` | If autoscaling enabled, this field sets maximum replica count | `2`
+`defaultBackend.autoscaling.targetCPUUtilizationPercentage` | Target CPU utilization percentage to scale | "50"
+`defaultBackend.autoscaling.targetMemoryUtilizationPercentage` | Target memory utilization percentage to scale | "50"
+`defaultBackend.livenessProbe.initialDelaySeconds` | Delay before liveness probe is initiated | 30
+`defaultBackend.livenessProbe.periodSeconds` | How often to perform the probe | 10
+`defaultBackend.livenessProbe.timeoutSeconds` | When the probe times out | 5
+`defaultBackend.livenessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1
+`defaultBackend.livenessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 3
+`defaultBackend.readinessProbe.initialDelaySeconds` | Delay before readiness probe is initiated | 0
+`defaultBackend.readinessProbe.periodSeconds` | How often to perform the probe | 5
+`defaultBackend.readinessProbe.timeoutSeconds` | When the probe times out | 5
+`defaultBackend.readinessProbe.successThreshold` | Minimum consecutive successes for the probe to be considered successful after having failed. | 1
+`defaultBackend.readinessProbe.failureThreshold` | Minimum consecutive failures for the probe to be considered failed after having succeeded. | 6
+`defaultBackend.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]`
+`defaultBackend.affinity` | node/pod affinities (requires Kubernetes >=1.6) | `{}`
+`defaultBackend.nodeSelector` | node labels for pod assignment | `{}`
+`defaultBackend.podAnnotations` | annotations to be added to pods | `{}`
+`defaultBackend.deploymentLabels` | labels to add to the deployment metadata | `{}`
+`defaultBackend.podLabels` | labels to add to the pod container metadata | `{}`
+`defaultBackend.replicaCount` | desired number of default backend pods | `1`
+`defaultBackend.minAvailable` | minimum number of available default backend pods for PodDisruptionBudget | `1`
+`defaultBackend.resources` | default backend pod resource requests & limits | `{}`
+`defaultBackend.priorityClassName` | default backend priorityClassName | `nil`
+`defaultBackend.podSecurityContext` | Security context policies to add to the default backend | `{}`
+`defaultBackend.service.annotations` | annotations for default backend service | `{}`
+`defaultBackend.service.clusterIP` | internal default backend cluster service IP (set to `"-"` to pass an empty value) | `nil`
+`defaultBackend.service.omitClusterIP` | (Deprecated) To omit the `clusterIP` from the default backend service | `false`
+`defaultBackend.service.externalIPs` | default backend service external IP addresses | `[]`
+`defaultBackend.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""`
+`defaultBackend.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]`
+`defaultBackend.service.type` | type of default backend service to create | `ClusterIP`
+`defaultBackend.serviceAccount.create` | if `true`, create a backend service account. Only useful if you need a pod security policy to run the backend. | `true`
+`defaultBackend.serviceAccount.name` | The name of the backend service account to use. If not set and `create` is `true`, a name is generated using the fullname template. Only useful if you need a pod security policy to run the backend. | ``
+`imagePullSecrets` | name of Secret resource containing private registry credentials | `nil`
+`rbac.create` | if `true`, create & use RBAC resources | `true`
+`rbac.scope` | if `true`, do not create & use clusterrole and -binding. Set to `true` in combination with `controller.scope.enabled=true` to disable load-balancer status updates and scope the ingress entirely. | `false`
+`podSecurityPolicy.enabled` | if `true`, create & use Pod Security Policy resources | `false`
+`serviceAccount.create` | if `true`, create a service account for the controller | `true`
+`serviceAccount.name` | The name of the controller service account to use. If not set and `create` is `true`, a name is generated using the fullname template. | ``
+`serviceAccount.annotations` | Annotations for service account. Only used if `create` is `true`. | ``
+`revisionHistoryLimit` | The number of old history to retain to allow rollback. | `10`
+`tcp` | TCP service key:value pairs. The value is evaluated as a template. | `{}`
+`udp` | UDP service key:value pairs The value is evaluated as a template. | `{}`
+`releaseLabelOverride` | If provided, the value will be used as the `release` label instead of .Release.Name | `""`
+
+These parameters can be passed via Helm's `--set` option
+```console
+$ helm install stable/nginx-ingress --name my-release \
+ --set controller.metrics.enabled=true
+```
+
+Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
+
+```console
+$ helm install stable/nginx-ingress --name my-release -f values.yaml
+```
+
+A useful trick to debug issues with ingress is to increase the logLevel
+as described [here](https://github.com/kubernetes/ingress-nginx/blob/master/docs/troubleshooting.md#debug)
+
+```console
+$ helm install stable/nginx-ingress --set controller.extraArgs.v=2
+```
+> **Tip**: You can use the default [values.yaml](values.yaml)
+
+## PodDisruptionBudget
+
+Note that the PodDisruptionBudget resource will only be defined if the replicaCount is greater than one,
+else it would make it impossible to evacuate a node. See [gh issue #7127](https://github.com/helm/charts/issues/7127) for more info.
+
+## Prometheus Metrics
+
+The Nginx ingress controller can export Prometheus metrics.
+
+```console
+$ helm install stable/nginx-ingress --name my-release \
+ --set controller.metrics.enabled=true
+```
+
+You can add Prometheus annotations to the metrics service using `controller.metrics.service.annotations`. Alternatively, if you use the Prometheus Operator, you can enable ServiceMonitor creation using `controller.metrics.serviceMonitor.enabled`.
+
+## nginx-ingress nginx\_status page/stats server
+
+Previous versions of this chart had a `controller.stats.*` configuration block, which is now obsolete due to the following changes in nginx ingress controller:
+* in [0.16.1](https://github.com/kubernetes/ingress-nginx/blob/master/Changelog.md#0161), the vts (virtual host traffic status) dashboard was removed
+* in [0.23.0](https://github.com/kubernetes/ingress-nginx/blob/master/Changelog.md#0230), the status page at port 18080 is now a unix socket webserver only available at localhost.
+ You can use `curl --unix-socket /tmp/nginx-status-server.sock http://localhost/nginx_status` inside the controller container to access it locally, or use the snippet from [nginx-ingress changelog](https://github.com/kubernetes/ingress-nginx/blob/master/Changelog.md#0230) to re-enable the http server
+
+## ExternalDNS Service configuration
+
+Add an [ExternalDNS](https://github.com/kubernetes-sigs/external-dns) annotation to the LoadBalancer service:
+
+```yaml
+controller:
+ service:
+ annotations:
+ external-dns.alpha.kubernetes.io/hostname: kubernetes-example.com.
+```
+
+## AWS L7 ELB with SSL Termination
+
+Annotate the controller as shown in the [nginx-ingress l7 patch](https://github.com/kubernetes/ingress-nginx/blob/master/deploy/aws/l7/service-l7.yaml):
+
+```yaml
+controller:
+ service:
+ targetPorts:
+ http: http
+ https: http
+ annotations:
+ service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:XX-XXXX-X:XXXXXXXXX:certificate/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
+ service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
+ service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
+ service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600'
+```
+
+## AWS L4 NLB with SSL Redirection
+
+`ssl-redirect` and `force-ssl-redirect` flag are not working with AWS Network Load Balancer. You need to turn if off and add additional port with `server-snippet` in order to make it work.
+
+The port NLB `80` will be mapped to nginx container port `80` and NLB port `443` will be mapped to nginx container port `8000` (special). Then we use `$server_port` to manage redirection on port `80`
+```
+controller:
+ config:
+ ssl-redirect: "false" # we use `special` port to control ssl redirection
+ server-snippet: |
+ listen 8000;
+ if ( $server_port = 80 ) {
+ return 308 https://$host$request_uri;
+ }
+ containerPort:
+ http: 80
+ https: 443
+ special: 8000
+ service:
+ targetPorts:
+ http: http
+ https: special
+ annotations:
+ service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
+ service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
+ service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "your-arn"
+ service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
+```
+
+## AWS route53-mapper
+
+To configure the LoadBalancer service with the [route53-mapper addon](https://github.com/kubernetes/kops/tree/master/addons/route53-mapper), add the `domainName` annotation and `dns` label:
+
+```yaml
+controller:
+ service:
+ labels:
+ dns: "route53"
+ annotations:
+ domainName: "kubernetes-example.com"
+```
+
+## Additional internal load balancer
+
+This setup is useful when you need both external and internal load balancers but don't want to have multiple ingress controllers and multiple ingress objects per application.
+
+By default, the ingress object will point to the external load balancer address, but if correctly configured, you can make use of the internal one if the URL you are looking up resolves to the internal load balancer's URL.
+
+You'll need to set both the following values:
+
+`controller.service.internal.enabled`
+`controller.service.internal.annotations`
+
+If one of them is missing the internal load balancer will not be deployed. Example you may have `controller.service.internal.enabled=true` but no annotations set, in this case no action will be taken.
+
+`controller.service.internal.annotations` varies with the cloud service you're using.
+
+Example for AWS
+```
+controller:
+ service:
+ internal:
+ enabled: true
+ annotations:
+ # Create internal ELB
+ service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
+ # Any other annotation can be declared here.
+```
+
+Example for GCE
+```
+controller:
+ service:
+ internal:
+ enabled: true
+ annotations:
+ # Create internal LB
+ cloud.google.com/load-balancer-type: "Internal"
+ # Any other annotation can be declared here.
+```
+
+An use case for this scenario is having a split-view DNS setup where the public zone CNAME records point to the external balancer URL while the private zone CNAME records point to the internal balancer URL. This way, you only need one ingress kubernetes object.
+
+## Ingress Admission Webhooks
+
+With nginx-ingress-controller version 0.25+, the nginx ingress controller pod exposes an endpoint that will integrate with the `validatingwebhookconfiguration` Kubernetes feature to prevent bad ingress from being added to the cluster.
+
+With nginx-ingress-controller in 0.25.* work only with kubernetes 1.14+, 0.26 fix [this issue](https://github.com/kubernetes/ingress-nginx/pull/4521)
+
+## Helm error when upgrading: spec.clusterIP: Invalid value: ""
+
+If you are upgrading this chart from a version between 0.31.0 and 1.2.2 then you may get an error like this:
+
+```
+Error: UPGRADE FAILED: Service "?????-controller" is invalid: spec.clusterIP: Invalid value: "": field is immutable
+```
+
+Detail of how and why are in [this issue](https://github.com/helm/charts/pull/13646) but to resolve this you can set `xxxx.service.omitClusterIP` to `true` where `xxxx` is the service referenced in the error.
+
+As of version `1.26.0` of this chart, by simply not providing any clusterIP value, `invalid: spec.clusterIP: Invalid value: "": field is immutable` will no longer occur since `clusterIP: ""` will not be rendered.
+
+## Using custom default backend
+
+Default can be used to server custom error pages when service endpoints are not available. This is requires custom webserver image build with simmilar configuration as below.
+
+```
+server {
+ listen 80 default_server;
+
+ location /nginx_status {
+ stub_status on;
+ access_log off;
+ allow 127.0.0.1;
+ allow all;
+ deny all;
+ }
+
+ location /healthz {
+ stub_status on;
+ access_log off;
+ allow 127.0.0.1;
+ allow all;
+ deny all;
+ }
+
+}
+
+###
+# DefaultBackend application handler block
+server {
+ listen 80;
+ server_name *.example-app.com example-app.com;
+
+ access_log /var/log/nginx/access.log main;
+ root /usr/share/nginx/html;
+
+ location / {
+ add_header Content-Type application/json;
+ add_header Cache-Control "no-cache, no-store" always;
+ try_files /maintenance.json =502;
+ }
+}
+```
\ No newline at end of file
diff --git a/nginx-ingress/ci/daemonset-customconfig-values.yaml b/nginx-ingress/ci/daemonset-customconfig-values.yaml
new file mode 100644
index 0000000..f12eac3
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-customconfig-values.yaml
@@ -0,0 +1,4 @@
+controller:
+ kind: DaemonSet
+ config:
+ use-proxy-protocol: "true"
diff --git a/nginx-ingress/ci/daemonset-customnodeport-values.yaml b/nginx-ingress/ci/daemonset-customnodeport-values.yaml
new file mode 100644
index 0000000..382bc50
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-customnodeport-values.yaml
@@ -0,0 +1,15 @@
+controller:
+ kind: DaemonSet
+ service:
+ type: NodePort
+ nodePorts:
+ tcp:
+ 9000: 30090
+ udp:
+ 9001: 30091
+
+tcp:
+ 9000: "default/test:8080"
+
+udp:
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/daemonset-headers-values.yaml b/nginx-ingress/ci/daemonset-headers-values.yaml
new file mode 100644
index 0000000..a29690f
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-headers-values.yaml
@@ -0,0 +1,6 @@
+controller:
+ kind: DaemonSet
+ addHeaders:
+ X-Frame-Options: deny
+ proxySetHeaders:
+ X-Forwarded-Proto: https
diff --git a/nginx-ingress/ci/daemonset-internal-lb-values.yaml b/nginx-ingress/ci/daemonset-internal-lb-values.yaml
new file mode 100644
index 0000000..58ef116
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-internal-lb-values.yaml
@@ -0,0 +1,7 @@
+controller:
+ kind: DaemonSet
+ service:
+ internal:
+ enabled: true
+ annotations:
+ service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
diff --git a/nginx-ingress/ci/daemonset-nodeport-values.yaml b/nginx-ingress/ci/daemonset-nodeport-values.yaml
new file mode 100644
index 0000000..ebc8f10
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-nodeport-values.yaml
@@ -0,0 +1,4 @@
+controller:
+ kind: DaemonSet
+ service:
+ type: NodePort
diff --git a/nginx-ingress/ci/daemonset-tcp-udp-configMapNamespace-values.yaml b/nginx-ingress/ci/daemonset-tcp-udp-configMapNamespace-values.yaml
new file mode 100644
index 0000000..3484704
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-tcp-udp-configMapNamespace-values.yaml
@@ -0,0 +1,14 @@
+controller:
+ kind: DaemonSet
+ service:
+ type: ClusterIP
+ tcp:
+ configMapNamespace: default
+ udp:
+ configMapNamespace: default
+
+tcp:
+ 9000: "default/test:8080"
+
+udp:
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/daemonset-tcp-udp-values.yaml b/nginx-ingress/ci/daemonset-tcp-udp-values.yaml
new file mode 100644
index 0000000..e6866d7
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-tcp-udp-values.yaml
@@ -0,0 +1,10 @@
+controller:
+ kind: DaemonSet
+ service:
+ type: ClusterIP
+
+tcp:
+ 9000: "default/test:8080"
+
+udp:
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/daemonset-tcp-values.yaml b/nginx-ingress/ci/daemonset-tcp-values.yaml
new file mode 100644
index 0000000..f0a6060
--- /dev/null
+++ b/nginx-ingress/ci/daemonset-tcp-values.yaml
@@ -0,0 +1,6 @@
+controller:
+ kind: DaemonSet
+
+tcp:
+ 9000: "default/test:8080"
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/deamonset-default-values.yaml b/nginx-ingress/ci/deamonset-default-values.yaml
new file mode 100644
index 0000000..ddb2562
--- /dev/null
+++ b/nginx-ingress/ci/deamonset-default-values.yaml
@@ -0,0 +1,2 @@
+controller:
+ kind: DaemonSet
diff --git a/nginx-ingress/ci/deamonset-metrics-values.yaml b/nginx-ingress/ci/deamonset-metrics-values.yaml
new file mode 100644
index 0000000..5ce435d
--- /dev/null
+++ b/nginx-ingress/ci/deamonset-metrics-values.yaml
@@ -0,0 +1,4 @@
+controller:
+ kind: DaemonSet
+ metrics:
+ enabled: true
diff --git a/nginx-ingress/ci/deamonset-psp-values.yaml b/nginx-ingress/ci/deamonset-psp-values.yaml
new file mode 100644
index 0000000..b441c1a
--- /dev/null
+++ b/nginx-ingress/ci/deamonset-psp-values.yaml
@@ -0,0 +1,5 @@
+controller:
+ kind: DaemonSet
+
+podSecurityPolicy:
+ enabled: true
diff --git a/nginx-ingress/ci/deamonset-webhook-and-psp-values.yaml b/nginx-ingress/ci/deamonset-webhook-and-psp-values.yaml
new file mode 100644
index 0000000..2cf9d6f
--- /dev/null
+++ b/nginx-ingress/ci/deamonset-webhook-and-psp-values.yaml
@@ -0,0 +1,7 @@
+controller:
+ kind: DaemonSet
+ admissionWebhooks:
+ enabled: true
+
+podSecurityPolicy:
+ enabled: true
diff --git a/nginx-ingress/ci/deamonset-webhook-values.yaml b/nginx-ingress/ci/deamonset-webhook-values.yaml
new file mode 100644
index 0000000..2d2cb47
--- /dev/null
+++ b/nginx-ingress/ci/deamonset-webhook-values.yaml
@@ -0,0 +1,4 @@
+controller:
+ kind: DaemonSet
+ admissionWebhooks:
+ enabled: true
diff --git a/nginx-ingress/ci/deployment-autoscaling-values.yaml b/nginx-ingress/ci/deployment-autoscaling-values.yaml
new file mode 100644
index 0000000..e9701da
--- /dev/null
+++ b/nginx-ingress/ci/deployment-autoscaling-values.yaml
@@ -0,0 +1,3 @@
+controller:
+ autoscaling:
+ enabled: true
diff --git a/nginx-ingress/ci/deployment-customconfig-values.yaml b/nginx-ingress/ci/deployment-customconfig-values.yaml
new file mode 100644
index 0000000..401aea4
--- /dev/null
+++ b/nginx-ingress/ci/deployment-customconfig-values.yaml
@@ -0,0 +1,3 @@
+controller:
+ config:
+ use-proxy-protocol: "true"
diff --git a/nginx-ingress/ci/deployment-customnodeport-values.yaml b/nginx-ingress/ci/deployment-customnodeport-values.yaml
new file mode 100644
index 0000000..6958eaa
--- /dev/null
+++ b/nginx-ingress/ci/deployment-customnodeport-values.yaml
@@ -0,0 +1,14 @@
+controller:
+ service:
+ type: NodePort
+ nodePorts:
+ tcp:
+ 9000: 30090
+ udp:
+ 9001: 30091
+
+tcp:
+ 9000: "default/test:8080"
+
+udp:
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/deployment-default-values.yaml b/nginx-ingress/ci/deployment-default-values.yaml
new file mode 100644
index 0000000..b15f0e4
--- /dev/null
+++ b/nginx-ingress/ci/deployment-default-values.yaml
@@ -0,0 +1 @@
+# Left blank to test default values
diff --git a/nginx-ingress/ci/deployment-headers-values.yaml b/nginx-ingress/ci/deployment-headers-values.yaml
new file mode 100644
index 0000000..f3873af
--- /dev/null
+++ b/nginx-ingress/ci/deployment-headers-values.yaml
@@ -0,0 +1,5 @@
+controller:
+ addHeaders:
+ X-Frame-Options: deny
+ proxySetHeaders:
+ X-Forwarded-Proto: https
diff --git a/nginx-ingress/ci/deployment-internal-lb-values.yaml b/nginx-ingress/ci/deployment-internal-lb-values.yaml
new file mode 100644
index 0000000..342910f
--- /dev/null
+++ b/nginx-ingress/ci/deployment-internal-lb-values.yaml
@@ -0,0 +1,6 @@
+controller:
+ service:
+ internal:
+ enabled: true
+ annotations:
+ service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
diff --git a/nginx-ingress/ci/deployment-metrics-values.yaml b/nginx-ingress/ci/deployment-metrics-values.yaml
new file mode 100644
index 0000000..9a93fa5
--- /dev/null
+++ b/nginx-ingress/ci/deployment-metrics-values.yaml
@@ -0,0 +1,3 @@
+controller:
+ metrics:
+ enabled: true
diff --git a/nginx-ingress/ci/deployment-nodeport-values.yaml b/nginx-ingress/ci/deployment-nodeport-values.yaml
new file mode 100644
index 0000000..ffdc47b
--- /dev/null
+++ b/nginx-ingress/ci/deployment-nodeport-values.yaml
@@ -0,0 +1,3 @@
+controller:
+ service:
+ type: NodePort
diff --git a/nginx-ingress/ci/deployment-psp-values.yaml b/nginx-ingress/ci/deployment-psp-values.yaml
new file mode 100644
index 0000000..7aae860
--- /dev/null
+++ b/nginx-ingress/ci/deployment-psp-values.yaml
@@ -0,0 +1,2 @@
+podSecurityPolicy:
+ enabled: true
diff --git a/nginx-ingress/ci/deployment-tcp-udp-configMapNamespace-values.yaml b/nginx-ingress/ci/deployment-tcp-udp-configMapNamespace-values.yaml
new file mode 100644
index 0000000..7b06c1e
--- /dev/null
+++ b/nginx-ingress/ci/deployment-tcp-udp-configMapNamespace-values.yaml
@@ -0,0 +1,13 @@
+controller:
+ service:
+ type: ClusterIP
+ tcp:
+ configMapNamespace: default
+ udp:
+ configMapNamespace: default
+
+tcp:
+ 9000: "default/test:8080"
+
+udp:
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/deployment-tcp-udp-values.yaml b/nginx-ingress/ci/deployment-tcp-udp-values.yaml
new file mode 100644
index 0000000..7c55d44
--- /dev/null
+++ b/nginx-ingress/ci/deployment-tcp-udp-values.yaml
@@ -0,0 +1,9 @@
+controller:
+ service:
+ type: ClusterIP
+
+tcp:
+ 9000: "default/test:8080"
+
+udp:
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/deployment-tcp-values.yaml b/nginx-ingress/ci/deployment-tcp-values.yaml
new file mode 100644
index 0000000..c8bc204
--- /dev/null
+++ b/nginx-ingress/ci/deployment-tcp-values.yaml
@@ -0,0 +1,3 @@
+tcp:
+ 9000: "default/test:8080"
+ 9001: "default/test:8080"
diff --git a/nginx-ingress/ci/deployment-webhook-and-psp-values.yaml b/nginx-ingress/ci/deployment-webhook-and-psp-values.yaml
new file mode 100644
index 0000000..0590d7c
--- /dev/null
+++ b/nginx-ingress/ci/deployment-webhook-and-psp-values.yaml
@@ -0,0 +1,6 @@
+controller:
+ admissionWebhooks:
+ enabled: true
+
+podSecurityPolicy:
+ enabled: true
diff --git a/nginx-ingress/ci/deployment-webhook-values.yaml b/nginx-ingress/ci/deployment-webhook-values.yaml
new file mode 100644
index 0000000..07e1a92
--- /dev/null
+++ b/nginx-ingress/ci/deployment-webhook-values.yaml
@@ -0,0 +1,3 @@
+controller:
+ admissionWebhooks:
+ enabled: true
diff --git a/nginx-ingress/templates/NOTES.txt b/nginx-ingress/templates/NOTES.txt
new file mode 100644
index 0000000..efa7101
--- /dev/null
+++ b/nginx-ingress/templates/NOTES.txt
@@ -0,0 +1,76 @@
+*******************************************************************************************************
+* DEPRECATED, please use https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx *
+*******************************************************************************************************
+
+
+The nginx-ingress controller has been installed.
+
+{{- if contains "NodePort" .Values.controller.service.type }}
+Get the application URL by running these commands:
+
+{{- if (not (empty .Values.controller.service.nodePorts.http)) }}
+ export HTTP_NODE_PORT={{ .Values.controller.service.nodePorts.http }}
+{{- else }}
+ export HTTP_NODE_PORT=$(kubectl --namespace {{ .Release.Namespace }} get services -o jsonpath="{.spec.ports[0].nodePort}" {{ template "nginx-ingress.controller.fullname" . }})
+{{- end }}
+{{- if (not (empty .Values.controller.service.nodePorts.https)) }}
+ export HTTPS_NODE_PORT={{ .Values.controller.service.nodePorts.https }}
+{{- else }}
+ export HTTPS_NODE_PORT=$(kubectl --namespace {{ .Release.Namespace }} get services -o jsonpath="{.spec.ports[1].nodePort}" {{ template "nginx-ingress.controller.fullname" . }})
+{{- end }}
+ export NODE_IP=$(kubectl --namespace {{ .Release.Namespace }} get nodes -o jsonpath="{.items[0].status.addresses[1].address}")
+
+ echo "Visit http://$NODE_IP:$HTTP_NODE_PORT to access your application via HTTP."
+ echo "Visit https://$NODE_IP:$HTTPS_NODE_PORT to access your application via HTTPS."
+{{- else if contains "LoadBalancer" .Values.controller.service.type }}
+It may take a few minutes for the LoadBalancer IP to be available.
+You can watch the status by running 'kubectl --namespace {{ .Release.Namespace }} get services -o wide -w {{ template "nginx-ingress.controller.fullname" . }}'
+{{- else if contains "ClusterIP" .Values.controller.service.type }}
+Get the application URL by running these commands:
+ export POD_NAME=$(kubectl --namespace {{ .Release.Namespace }} get pods -o jsonpath="{.items[0].metadata.name}" -l "app={{ template "nginx-ingress.name" . }},component={{ .Values.controller.name }},release={{ template "nginx-ingress.releaseLabel" . }}")
+ kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80
+ echo "Visit http://127.0.0.1:8080 to access your application."
+{{- end }}
+
+An example Ingress that makes use of the controller:
+
+ apiVersion: extensions/v1beta1
+ kind: Ingress
+ metadata:
+ annotations:
+ kubernetes.io/ingress.class: {{ .Values.controller.ingressClass }}
+ name: example
+ namespace: foo
+ spec:
+ rules:
+ - host: www.example.com
+ http:
+ paths:
+ - backend:
+ serviceName: exampleService
+ servicePort: 80
+ path: /
+ # This section is only required if TLS is to be enabled for the Ingress
+ tls:
+ - hosts:
+ - www.example.com
+ secretName: example-tls
+
+If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
+
+ apiVersion: v1
+ kind: Secret
+ metadata:
+ name: example-tls
+ namespace: foo
+ data:
+ tls.crt:
+ tls.key:
+ type: kubernetes.io/tls
+
+{{- if .Values.controller.headers }}
+#################################################################################
+###### WARNING: `controller.headers` has been deprecated! #####
+###### It has been renamed to `controller.proxySetHeaders`. #####
+#################################################################################
+{{- end }}
diff --git a/nginx-ingress/templates/_helpers.tpl b/nginx-ingress/templates/_helpers.tpl
new file mode 100644
index 0000000..2dbf8cf
--- /dev/null
+++ b/nginx-ingress/templates/_helpers.tpl
@@ -0,0 +1,125 @@
+{{/* vim: set filetype=mustache: */}}
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "nginx-ingress.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "nginx-ingress.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "nginx-ingress.fullname" -}}
+{{- if .Values.fullnameOverride -}}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- $name := default .Chart.Name .Values.nameOverride -}}
+{{- if contains $name .Release.Name -}}
+{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
+{{- else -}}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified controller name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "nginx-ingress.controller.fullname" -}}
+{{- printf "%s-%s" (include "nginx-ingress.fullname" .) .Values.controller.name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+
+{{/*
+Allow for the ability to override the release name used as a label in many places.
+*/}}
+{{- define "nginx-ingress.releaseLabel" -}}
+{{- .Values.releaseLabelOverride | default .Release.Name | trunc 63 -}}
+{{- end -}}
+
+{{/*
+Construct the path for the publish-service.
+
+By convention this will simply use the / to match the name of the
+service generated.
+
+Users can provide an override for an explicit service they want bound via `.Values.controller.publishService.pathOverride`
+
+*/}}
+{{- define "nginx-ingress.controller.publishServicePath" -}}
+{{- $defServiceName := printf "%s/%s" .Release.Namespace (include "nginx-ingress.controller.fullname" .) -}}
+{{- $servicePath := default $defServiceName .Values.controller.publishService.pathOverride }}
+{{- print $servicePath | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create a default fully qualified default backend name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+*/}}
+{{- define "nginx-ingress.defaultBackend.fullname" -}}
+{{- printf "%s-%s" (include "nginx-ingress.fullname" .) .Values.defaultBackend.name | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
+{{/*
+Create the name of the controller service account to use
+*/}}
+{{- define "nginx-ingress.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create -}}
+ {{ default (include "nginx-ingress.fullname" .) .Values.serviceAccount.name }}
+{{- else -}}
+ {{ default "default" .Values.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Create the name of the backend service account to use - only used when podsecuritypolicy is also enabled
+*/}}
+{{- define "nginx-ingress.defaultBackend.serviceAccountName" -}}
+{{- if .Values.defaultBackend.serviceAccount.create -}}
+ {{ default (printf "%s-backend" (include "nginx-ingress.fullname" .)) .Values.defaultBackend.serviceAccount.name }}
+{{- else -}}
+ {{ default "default-backend" .Values.defaultBackend.serviceAccount.name }}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the appropriate apiVersion for deployment.
+*/}}
+{{- define "deployment.apiVersion" -}}
+{{- if semverCompare ">=1.9-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "apps/v1" -}}
+{{- else -}}
+{{- print "extensions/v1beta1" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the appropriate apiGroup for PodSecurityPolicy.
+*/}}
+{{- define "podSecurityPolicy.apiGroup" -}}
+{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "policy" -}}
+{{- else -}}
+{{- print "extensions" -}}
+{{- end -}}
+{{- end -}}
+
+{{/*
+Return the appropriate apiVersion for podSecurityPolicy.
+*/}}
+{{- define "podSecurityPolicy.apiVersion" -}}
+{{- if semverCompare ">=1.10-0" .Capabilities.KubeVersion.GitVersion -}}
+{{- print "policy/v1beta1" -}}
+{{- else -}}
+{{- print "extensions/v1beta1" -}}
+{{- end -}}
+{{- end -}}
\ No newline at end of file
diff --git a/nginx-ingress/templates/addheaders-configmap.yaml b/nginx-ingress/templates/addheaders-configmap.yaml
new file mode 100644
index 0000000..534b133
--- /dev/null
+++ b/nginx-ingress/templates/addheaders-configmap.yaml
@@ -0,0 +1,14 @@
+{{- if .Values.controller.addHeaders }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}-custom-add-headers
+data:
+{{ toYaml .Values.controller.addHeaders | indent 2 }}
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/clusterrole.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/clusterrole.yaml
new file mode 100644
index 0000000..a248326
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/clusterrole.yaml
@@ -0,0 +1,30 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+rules:
+ - apiGroups:
+ - admissionregistration.k8s.io
+ resources:
+ - validatingwebhookconfigurations
+ verbs:
+ - get
+ - update
+{{- if .Values.podSecurityPolicy.enabled }}
+ - apiGroups: ['extensions']
+ resources: ['podsecuritypolicies']
+ verbs: ['use']
+ resourceNames:
+ - {{ template "nginx-ingress.fullname" . }}-admission
+{{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/clusterrolebinding.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/clusterrolebinding.yaml
new file mode 100644
index 0000000..c99fdf8
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/clusterrolebinding.yaml
@@ -0,0 +1,23 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+subjects:
+ - kind: ServiceAccount
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ namespace: {{ .Release.Namespace }}
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/job-createSecret.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/job-createSecret.yaml
new file mode 100644
index 0000000..f035d0a
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/job-createSecret.yaml
@@ -0,0 +1,61 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission-create
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+spec:
+ {{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }}
+ # Alpha feature since k8s 1.12
+ ttlSecondsAfterFinished: 0
+ {{- end }}
+ template:
+ metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission-create
+{{- with .Values.controller.admissionWebhooks.patch.podAnnotations }}
+ annotations:
+{{ toYaml . | indent 8 }}
+{{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ spec:
+ {{- if .Values.controller.admissionWebhooks.patch.priorityClassName }}
+ priorityClassName: {{ .Values.controller.admissionWebhooks.patch.priorityClassName }}
+ {{- end }}
+ containers:
+ - name: create
+ {{- with .Values.controller.admissionWebhooks.patch.image }}
+ image: "{{.repository}}{{- if (.digest) -}} @{{.digest}} {{- else -}} :{{ .tag }} {{- end -}}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.controller.admissionWebhooks.patch.image.pullPolicy }}
+ args:
+ - create
+ - --host={{ template "nginx-ingress.controller.fullname" . }}-admission,{{ template "nginx-ingress.controller.fullname" . }}-admission.{{ .Release.Namespace }}.svc
+ - --namespace={{ .Release.Namespace }}
+ - --secret-name={{ template "nginx-ingress.fullname". }}-admission
+{{- with .Values.controller.admissionWebhooks.patch.resources }}
+ resources:
+{{ toYaml . | indent 12 }}
+{{- end }}
+ restartPolicy: OnFailure
+ serviceAccountName: {{ template "nginx-ingress.fullname" . }}-admission
+ {{- with .Values.controller.admissionWebhooks.patch.nodeSelector }}
+ nodeSelector:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ securityContext:
+ runAsNonRoot: true
+ runAsUser: 2000
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/job-patchWebhook.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/job-patchWebhook.yaml
new file mode 100644
index 0000000..b8a6ecc
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/job-patchWebhook.yaml
@@ -0,0 +1,63 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission-patch
+ annotations:
+ "helm.sh/hook": post-install,post-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+spec:
+ {{- if .Capabilities.APIVersions.Has "batch/v1alpha1" }}
+ # Alpha feature since k8s 1.12
+ ttlSecondsAfterFinished: 0
+ {{- end }}
+ template:
+ metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission-patch
+{{- with .Values.controller.admissionWebhooks.patch.podAnnotations }}
+ annotations:
+{{ toYaml . | indent 8 }}
+{{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ spec:
+ {{- if .Values.controller.admissionWebhooks.patch.priorityClassName }}
+ priorityClassName: {{ .Values.controller.admissionWebhooks.patch.priorityClassName }}
+ {{- end }}
+ containers:
+ - name: patch
+ {{- with .Values.controller.admissionWebhooks.patch.image }}
+ image: "{{.repository}}{{- if (.digest) -}} @{{.digest}} {{- else -}} :{{ .tag }} {{- end -}}"
+ {{- end }}
+ imagePullPolicy: {{ .Values.controller.admissionWebhooks.patch.pullPolicy }}
+ args:
+ - patch
+ - --webhook-name={{ template "nginx-ingress.fullname" . }}-admission
+ - --namespace={{ .Release.Namespace }}
+ - --patch-mutating=false
+ - --secret-name={{ template "nginx-ingress.fullname". }}-admission
+ - --patch-failure-policy={{ .Values.controller.admissionWebhooks.failurePolicy }}
+{{- with .Values.controller.admissionWebhooks.patch.resources }}
+ resources:
+{{ toYaml . | indent 12 }}
+{{- end }}
+ restartPolicy: OnFailure
+ serviceAccountName: {{ template "nginx-ingress.fullname" . }}-admission
+ {{- with .Values.controller.admissionWebhooks.patch.nodeSelector }}
+ nodeSelector:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ securityContext:
+ runAsNonRoot: true
+ runAsUser: 2000
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/psp.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/psp.yaml
new file mode 100644
index 0000000..a23f927
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/psp.yaml
@@ -0,0 +1,39 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled .Values.podSecurityPolicy.enabled }}
+apiVersion: policy/v1beta1
+kind: PodSecurityPolicy
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+spec:
+ allowPrivilegeEscalation: false
+ fsGroup:
+ ranges:
+ - max: 65535
+ min: 1
+ rule: MustRunAs
+ requiredDropCapabilities:
+ - ALL
+ runAsUser:
+ rule: MustRunAsNonRoot
+ seLinux:
+ rule: RunAsAny
+ supplementalGroups:
+ ranges:
+ - max: 65535
+ min: 1
+ rule: MustRunAs
+ volumes:
+ - configMap
+ - emptyDir
+ - projected
+ - secret
+ - downwardAPI
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/role.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/role.yaml
new file mode 100644
index 0000000..665769f
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/role.yaml
@@ -0,0 +1,23 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - secrets
+ verbs:
+ - get
+ - create
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/rolebinding.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/rolebinding.yaml
new file mode 100644
index 0000000..0e4873f
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/rolebinding.yaml
@@ -0,0 +1,23 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+subjects:
+ - kind: ServiceAccount
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ namespace: {{ .Release.Namespace }}
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/job-patch/serviceaccount.yaml b/nginx-ingress/templates/admission-webhooks/job-patch/serviceaccount.yaml
new file mode 100644
index 0000000..c0822f9
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/job-patch/serviceaccount.yaml
@@ -0,0 +1,15 @@
+{{- if and .Values.controller.admissionWebhooks.enabled .Values.controller.admissionWebhooks.patch.enabled }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade,post-install,post-upgrade
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+{{- end }}
diff --git a/nginx-ingress/templates/admission-webhooks/validating-webhook.yaml b/nginx-ingress/templates/admission-webhooks/validating-webhook.yaml
new file mode 100644
index 0000000..cd962e5
--- /dev/null
+++ b/nginx-ingress/templates/admission-webhooks/validating-webhook.yaml
@@ -0,0 +1,31 @@
+{{- if .Values.controller.admissionWebhooks.enabled }}
+apiVersion: admissionregistration.k8s.io/v1beta1
+kind: ValidatingWebhookConfiguration
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}-admission
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "admission-webhook"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}-admission
+webhooks:
+ - name: validate.nginx.ingress.kubernetes.io
+ rules:
+ - apiGroups:
+ - extensions
+ - networking.k8s.io
+ apiVersions:
+ - v1beta1
+ operations:
+ - CREATE
+ - UPDATE
+ resources:
+ - ingresses
+ failurePolicy: Fail
+ clientConfig:
+ service:
+ namespace: {{ .Release.Namespace }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}-admission
+ path: /extensions/v1beta1/ingresses
+{{- end }}
diff --git a/nginx-ingress/templates/clusterrole.yaml b/nginx-ingress/templates/clusterrole.yaml
new file mode 100644
index 0000000..14667eb
--- /dev/null
+++ b/nginx-ingress/templates/clusterrole.yaml
@@ -0,0 +1,71 @@
+{{- if and (.Values.rbac.create) (not .Values.rbac.scope) -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ - endpoints
+ - nodes
+ - pods
+ - secrets
+ verbs:
+ - list
+ - watch
+{{- if and .Values.controller.scope.enabled .Values.controller.scope.namespace }}
+ - apiGroups:
+ - ""
+ resources:
+ - namespaces
+ resourceNames:
+ - "{{ .Values.controller.scope.namespace }}"
+ verbs:
+ - get
+{{- end }}
+ - apiGroups:
+ - ""
+ resources:
+ - nodes
+ verbs:
+ - get
+ - apiGroups:
+ - ""
+ resources:
+ - services
+ verbs:
+ - get
+ - list
+ - update
+ - watch
+ - apiGroups:
+ - extensions
+ - "networking.k8s.io" # k8s 1.14+
+ resources:
+ - ingresses
+ verbs:
+ - get
+ - list
+ - watch
+ - apiGroups:
+ - ""
+ resources:
+ - events
+ verbs:
+ - create
+ - patch
+ - apiGroups:
+ - extensions
+ - "networking.k8s.io" # k8s 1.14+
+ resources:
+ - ingresses/status
+ verbs:
+ - update
+{{- end -}}
diff --git a/nginx-ingress/templates/clusterrolebinding.yaml b/nginx-ingress/templates/clusterrolebinding.yaml
new file mode 100644
index 0000000..39decda
--- /dev/null
+++ b/nginx-ingress/templates/clusterrolebinding.yaml
@@ -0,0 +1,19 @@
+{{- if and (.Values.rbac.create) (not .Values.rbac.scope) -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: {{ template "nginx-ingress.fullname" . }}
+subjects:
+ - kind: ServiceAccount
+ name: {{ template "nginx-ingress.serviceAccountName" . }}
+ namespace: {{ .Release.Namespace }}
+{{- end -}}
diff --git a/nginx-ingress/templates/controller-configmap.yaml b/nginx-ingress/templates/controller-configmap.yaml
new file mode 100644
index 0000000..25625b4
--- /dev/null
+++ b/nginx-ingress/templates/controller-configmap.yaml
@@ -0,0 +1,22 @@
+{{- if or .Values.controller.config (or (or .Values.controller.proxySetHeaders .Values.controller.headers) .Values.controller.addHeaders) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+data:
+{{- if .Values.controller.addHeaders }}
+ add-headers: {{ .Release.Namespace }}/{{ template "nginx-ingress.fullname" . }}-custom-add-headers
+{{- end }}
+{{- if or .Values.controller.proxySetHeaders .Values.controller.headers }}
+ proxy-set-headers: {{ .Release.Namespace }}/{{ template "nginx-ingress.fullname" . }}-custom-proxy-headers
+{{- end }}
+{{- if .Values.controller.config }}
+{{ toYaml .Values.controller.config | indent 2 }}
+{{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/controller-daemonset.yaml b/nginx-ingress/templates/controller-daemonset.yaml
new file mode 100644
index 0000000..7918d2d
--- /dev/null
+++ b/nginx-ingress/templates/controller-daemonset.yaml
@@ -0,0 +1,259 @@
+{{- if or (eq .Values.controller.kind "DaemonSet") (eq .Values.controller.kind "Both") }}
+{{- $useHostPort := .Values.controller.daemonset.useHostPort -}}
+{{- $hostPorts := .Values.controller.daemonset.hostPorts -}}
+apiVersion: {{ template "deployment.apiVersion" . }}
+kind: DaemonSet
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+ annotations:
+{{ toYaml .Values.controller.deploymentAnnotations | indent 4}}
+spec:
+ selector:
+ matchLabels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{- if .Values.controller.useComponentLabel }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ {{- end }}
+ revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
+ updateStrategy:
+{{ toYaml .Values.controller.updateStrategy | indent 4 }}
+ minReadySeconds: {{ .Values.controller.minReadySeconds }}
+ template:
+ metadata:
+ {{- if .Values.controller.podAnnotations }}
+ annotations:
+ {{- range $key, $value := .Values.controller.podAnnotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+ {{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ component: "{{ .Values.controller.name }}"
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ {{- if .Values.controller.podLabels }}
+{{ toYaml .Values.controller.podLabels | indent 8}}
+ {{- end }}
+ spec:
+{{- if .Values.controller.dnsConfig }}
+ dnsConfig:
+{{ toYaml .Values.controller.dnsConfig | indent 8 }}
+{{- end }}
+ dnsPolicy: {{ .Values.controller.dnsPolicy }}
+ {{- if .Values.imagePullSecrets }}
+ imagePullSecrets:
+{{ toYaml .Values.imagePullSecrets | indent 8 }}
+ {{- end }}
+{{- if .Values.controller.priorityClassName }}
+ priorityClassName: "{{ .Values.controller.priorityClassName }}"
+{{- end }}
+ {{- if .Values.controller.podSecurityContext }}
+ securityContext:
+{{ toYaml .Values.controller.podSecurityContext | indent 8 }}
+ {{- end }}
+ containers:
+ - name: {{ template "nginx-ingress.name" . }}-{{ .Values.controller.name }}
+ {{- with .Values.controller.image }}
+ image: "{{- if .registry -}}{{ .registry }}/{{- end -}}{{ .repository }}{{- if (.digest) -}} @{{.digest}}{{- else -}}:{{ .tag }} {{- end -}}"
+ {{- end }}
+ imagePullPolicy: "{{ .Values.controller.image.pullPolicy }}"
+ {{- if .Values.controller.lifecycle }}
+ lifecycle:
+{{ toYaml .Values.controller.lifecycle | indent 12 }}
+ {{- end }}
+ args:
+ - /nginx-ingress-controller
+ {{- if .Values.defaultBackend.enabled }}
+ - --default-backend-service={{ .Release.Namespace }}/{{ template "nginx-ingress.defaultBackend.fullname" . }}
+ {{- else }}
+ {{- if (semverCompare "<0.21.0" .Values.controller.image.tag) }}
+ - --default-backend-service={{ required ".Values.controller.defaultBackendService is required if .Values.defaultBackend.enabled=false and .Values.controller.image.tag < 0.21.0" .Values.controller.defaultBackendService }}
+ {{- else if .Values.controller.defaultBackendService }}
+ - --default-backend-service={{ .Values.controller.defaultBackendService }}
+ {{- end }}
+ {{- end }}
+ {{- if and (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) .Values.controller.publishService.enabled }}
+ - --publish-service={{ template "nginx-ingress.controller.publishServicePath" . }}
+ {{- end }}
+ {{- if (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) }}
+ - --election-id={{ .Values.controller.electionID }}
+ {{- end }}
+ {{- if (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) }}
+ - --ingress-class={{ .Values.controller.ingressClass }}
+ {{- end }}
+ {{- if (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) }}
+ - --configmap={{ .Release.Namespace }}/{{ template "nginx-ingress.controller.fullname" . }}
+ {{- else }}
+ - --nginx-configmap={{ .Release.Namespace }}/{{ template "nginx-ingress.controller.fullname" . }}
+ {{- end }}
+ {{- if .Values.tcp }}
+ - --tcp-services-configmap={{ .Release.Namespace }}/{{ template "nginx-ingress.fullname" . }}-tcp
+ {{- end }}
+ {{- if .Values.udp }}
+ - --udp-services-configmap={{ .Release.Namespace }}/{{ template "nginx-ingress.fullname" . }}-udp
+ {{- end }}
+ {{- if .Values.controller.scope.enabled }}
+ - --watch-namespace={{ default .Release.Namespace .Values.controller.scope.namespace }}
+ {{- end }}
+ {{- if and (.Values.controller.reportNodeInternalIp) (.Values.controller.hostNetwork)}}
+ - --report-node-internal-ip-address={{ .Values.controller.reportNodeInternalIp }}
+ {{- end }}
+ {{- if .Values.controller.admissionWebhooks.enabled }}
+ - --validating-webhook=:{{ .Values.controller.admissionWebhooks.port }}
+ - --validating-webhook-certificate=/usr/local/certificates/cert
+ - --validating-webhook-key=/usr/local/certificates/key
+ {{- end }}
+ {{- if .Values.controller.maxmindLicenseKey }}
+ - --maxmind-license-key={{ .Values.controller.maxmindLicenseKey }}
+ {{- end }}
+ {{- range $key, $value := .Values.controller.extraArgs }}
+ {{- if $value }}
+ - --{{ $key }}={{ $value }}
+ {{- else }}
+ - --{{ $key }}
+ {{- end }}
+ {{- end }}
+ {{- if (semverCompare ">=0.16.0" .Values.controller.image.tag) }}
+ securityContext:
+ capabilities:
+ drop:
+ - ALL
+ add:
+ - NET_BIND_SERVICE
+ runAsUser: {{ .Values.controller.image.runAsUser }}
+ allowPrivilegeEscalation: {{ .Values.controller.image.allowPrivilegeEscalation }}
+ {{- end }}
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ {{- if .Values.controller.extraEnvs }}
+{{ toYaml .Values.controller.extraEnvs | indent 12 }}
+ {{- end }}
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: {{ .Values.controller.livenessProbe.port }}
+ scheme: HTTP
+ initialDelaySeconds: {{ .Values.controller.livenessProbe.initialDelaySeconds }}
+ periodSeconds: {{ .Values.controller.livenessProbe.periodSeconds }}
+ timeoutSeconds: {{ .Values.controller.livenessProbe.timeoutSeconds }}
+ successThreshold: {{ .Values.controller.livenessProbe.successThreshold }}
+ failureThreshold: {{ .Values.controller.livenessProbe.failureThreshold }}
+ ports:
+ {{- range $key, $value := .Values.controller.containerPort }}
+ - name: {{ $key }}
+ containerPort: {{ $value }}
+ protocol: TCP
+ {{- if $useHostPort }}
+ hostPort: {{ index $hostPorts $key | default $value }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.controller.metrics.enabled }}
+ - name: metrics
+ containerPort: {{ .Values.controller.metrics.port }}
+ protocol: TCP
+ {{- end }}
+ {{- if .Values.controller.admissionWebhooks.enabled }}
+ - name: webhook
+ containerPort: {{ .Values.controller.admissionWebhooks.port }}
+ protocol: TCP
+ {{- end }}
+ {{- range $key, $value := .Values.tcp }}
+ - name: "{{ $key }}-tcp"
+ containerPort: {{ $key }}
+ protocol: TCP
+ {{- if $useHostPort }}
+ hostPort: {{ $key }}
+ {{- end }}
+ {{- end }}
+ {{- range $key, $value := .Values.udp }}
+ - name: "{{ $key }}-udp"
+ containerPort: {{ $key }}
+ protocol: UDP
+ {{- if $useHostPort }}
+ hostPort: {{ $key }}
+ {{- end }}
+ {{- end }}
+ readinessProbe:
+ httpGet:
+ path: /healthz
+ port: {{ .Values.controller.readinessProbe.port }}
+ scheme: HTTP
+ initialDelaySeconds: {{ .Values.controller.readinessProbe.initialDelaySeconds }}
+ periodSeconds: {{ .Values.controller.readinessProbe.periodSeconds }}
+ timeoutSeconds: {{ .Values.controller.readinessProbe.timeoutSeconds }}
+ successThreshold: {{ .Values.controller.readinessProbe.successThreshold }}
+ failureThreshold: {{ .Values.controller.readinessProbe.failureThreshold }}
+{{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled) }}
+ volumeMounts:
+{{- end }}
+{{- if .Values.controller.customTemplate.configMapName }}
+ - mountPath: /etc/nginx/template
+ name: nginx-template-volume
+ readOnly: true
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.enabled }}
+ - name: webhook-cert
+ mountPath: "/usr/local/certificates/"
+ readOnly: true
+{{- end }}
+{{- if .Values.controller.extraVolumeMounts }}
+{{ toYaml .Values.controller.extraVolumeMounts | indent 12}}
+{{- end }}
+ resources:
+{{ toYaml .Values.controller.resources | indent 12 }}
+{{- if .Values.controller.extraContainers }}
+{{ toYaml .Values.controller.extraContainers | indent 8}}
+{{- end }}
+{{- if .Values.controller.extraInitContainers }}
+ initContainers:
+{{ toYaml .Values.controller.extraInitContainers | indent 8}}
+{{- end }}
+ hostNetwork: {{ .Values.controller.hostNetwork }}
+ {{- if .Values.controller.nodeSelector }}
+ nodeSelector:
+{{ toYaml .Values.controller.nodeSelector | indent 8 }}
+ {{- end }}
+ {{- if .Values.controller.tolerations }}
+ tolerations:
+{{ toYaml .Values.controller.tolerations | indent 8 }}
+ {{- end }}
+ {{- if .Values.controller.affinity }}
+ affinity:
+{{ toYaml .Values.controller.affinity | indent 8 }}
+ {{- end }}
+ serviceAccountName: {{ template "nginx-ingress.serviceAccountName" . }}
+ terminationGracePeriodSeconds: 60
+{{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraVolumes) }}
+ volumes:
+{{- end }}
+{{- if .Values.controller.customTemplate.configMapName }}
+ - name: nginx-template-volume
+ configMap:
+ name: {{ .Values.controller.customTemplate.configMapName }}
+ items:
+ - key: {{ .Values.controller.customTemplate.configMapKey }}
+ path: nginx.tmpl
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.enabled }}
+ - name: webhook-cert
+ secret:
+ secretName: {{ template "nginx-ingress.fullname". }}-admission
+{{- end }}
+{{- if .Values.controller.extraVolumes }}
+{{ toYaml .Values.controller.extraVolumes | indent 8}}
+{{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/controller-deployment.yaml b/nginx-ingress/templates/controller-deployment.yaml
new file mode 100644
index 0000000..76aa68e
--- /dev/null
+++ b/nginx-ingress/templates/controller-deployment.yaml
@@ -0,0 +1,261 @@
+{{- if or (eq .Values.controller.kind "Deployment") (eq .Values.controller.kind "Both") }}
+apiVersion: {{ template "deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+
+ {{- if .Values.controller.deploymentLabels }}
+{{ toYaml .Values.controller.deploymentLabels | indent 4 }}
+ {{- end }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+ annotations:
+{{ toYaml .Values.controller.deploymentAnnotations | indent 4}}
+spec:
+ selector:
+ matchLabels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{- if .Values.controller.useComponentLabel }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ {{- end }}
+{{- if not .Values.controller.autoscaling.enabled }}
+ replicas: {{ .Values.controller.replicaCount }}
+{{- end }}
+ revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
+ strategy:
+{{ toYaml .Values.controller.updateStrategy | indent 4 }}
+ minReadySeconds: {{ .Values.controller.minReadySeconds }}
+ template:
+ metadata:
+ {{- if or .Values.controller.podAnnotations .Values.controller.podAnnotationConfigChecksum }}
+ annotations:
+ {{- range $key, $value := .Values.controller.podAnnotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+ {{- if .Values.controller.podAnnotationConfigChecksum }}
+ checksum/config: {{ tpl (toYaml .Values.controller) . | sha256sum }}
+ {{- end }}
+ {{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ component: "{{ .Values.controller.name }}"
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ {{- if .Values.controller.podLabels }}
+{{ toYaml .Values.controller.podLabels | indent 8 }}
+ {{- end }}
+ spec:
+{{- if .Values.controller.dnsConfig }}
+ dnsConfig:
+{{ toYaml .Values.controller.dnsConfig | indent 8 }}
+{{- end }}
+ dnsPolicy: {{ .Values.controller.dnsPolicy }}
+ {{- if .Values.imagePullSecrets }}
+ imagePullSecrets:
+{{ toYaml .Values.imagePullSecrets | indent 8 }}
+ {{- end }}
+{{- if .Values.controller.priorityClassName }}
+ priorityClassName: "{{ .Values.controller.priorityClassName }}"
+{{- end }}
+ {{- if .Values.controller.podSecurityContext }}
+ securityContext:
+{{ toYaml .Values.controller.podSecurityContext | indent 8 }}
+ {{- end }}
+ containers:
+ - name: {{ template "nginx-ingress.name" . }}-{{ .Values.controller.name }}
+ {{- with .Values.controller.image }}
+ image: "{{- if .registry -}}{{ .registry }}/{{- end -}}{{ .repository }}{{- if (.digest) -}} @{{.digest}}{{- else -}}:{{ .tag }} {{- end -}}"
+ {{- end }}
+ imagePullPolicy: "{{ .Values.controller.image.pullPolicy }}"
+ {{- if .Values.controller.lifecycle }}
+ lifecycle:
+{{ toYaml .Values.controller.lifecycle | indent 12 }}
+ {{- end }}
+ args:
+ - /nginx-ingress-controller
+ {{- if .Values.defaultBackend.enabled }}
+ - --default-backend-service={{ .Release.Namespace }}/{{ template "nginx-ingress.defaultBackend.fullname" . }}
+ {{- else }}
+ {{- if (semverCompare "<0.21.0" .Values.controller.image.tag) }}
+ - --default-backend-service={{ required ".Values.controller.defaultBackendService is required if .Values.defaultBackend.enabled=false and .Values.controller.image.tag < 0.21.0" .Values.controller.defaultBackendService }}
+ {{- else if .Values.controller.defaultBackendService }}
+ - --default-backend-service={{ .Values.controller.defaultBackendService }}
+ {{- end }}
+ {{- end }}
+ {{- if and (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) .Values.controller.publishService.enabled }}
+ - --publish-service={{ template "nginx-ingress.controller.publishServicePath" . }}
+ {{- end }}
+ {{- if (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) }}
+ - --election-id={{ .Values.controller.electionID }}
+ {{- end }}
+ {{- if (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) }}
+ - --ingress-class={{ .Values.controller.ingressClass }}
+ {{- end }}
+ {{- if (semverCompare ">=0.9.0-beta.1" .Values.controller.image.tag) }}
+ - --configmap={{ default .Release.Namespace .Values.controller.configMapNamespace }}/{{ template "nginx-ingress.controller.fullname" . }}
+ {{- else }}
+ - --nginx-configmap={{ default .Release.Namespace .Values.controller.configMapNamespace }}/{{ template "nginx-ingress.controller.fullname" . }}
+ {{- end }}
+ {{- if .Values.tcp }}
+ - --tcp-services-configmap={{ default .Release.Namespace .Values.controller.tcp.configMapNamespace }}/{{ template "nginx-ingress.fullname" . }}-tcp
+ {{- end }}
+ {{- if .Values.udp }}
+ - --udp-services-configmap={{ default .Release.Namespace .Values.controller.udp.configMapNamespace }}/{{ template "nginx-ingress.fullname" . }}-udp
+ {{- end }}
+ {{- if .Values.controller.scope.enabled }}
+ - --watch-namespace={{ default .Release.Namespace .Values.controller.scope.namespace }}
+ {{- end }}
+ {{- if and (.Values.controller.scope.enabled) (.Values.rbac.scope) }}
+ - --update-status=false
+ {{- end }}
+ {{- if and (.Values.controller.reportNodeInternalIp) (.Values.controller.hostNetwork) }}
+ - --report-node-internal-ip-address={{ .Values.controller.reportNodeInternalIp }}
+ {{- end }}
+ {{- if .Values.controller.admissionWebhooks.enabled }}
+ - --validating-webhook=:{{ .Values.controller.admissionWebhooks.port }}
+ - --validating-webhook-certificate=/usr/local/certificates/cert
+ - --validating-webhook-key=/usr/local/certificates/key
+ {{- end }}
+ {{- if .Values.controller.maxmindLicenseKey }}
+ - --maxmind-license-key={{ .Values.controller.maxmindLicenseKey }}
+ {{- end }}
+ {{- range $key, $value := .Values.controller.extraArgs }}
+ {{- if $value }}
+ - --{{ $key }}={{ $value }}
+ {{- else }}
+ - --{{ $key }}
+ {{- end }}
+ {{- end }}
+ {{- if (semverCompare ">=0.16.0" .Values.controller.image.tag) }}
+ securityContext:
+ capabilities:
+ drop:
+ - ALL
+ add:
+ - NET_BIND_SERVICE
+ runAsUser: {{ .Values.controller.image.runAsUser }}
+ allowPrivilegeEscalation: {{ .Values.controller.image.allowPrivilegeEscalation }}
+ {{- end }}
+ env:
+ - name: POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ - name: POD_NAMESPACE
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.namespace
+ {{- if .Values.controller.extraEnvs }}
+{{ toYaml .Values.controller.extraEnvs | indent 12 }}
+ {{- end }}
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: {{ .Values.controller.livenessProbe.port }}
+ scheme: HTTP
+ initialDelaySeconds: {{ .Values.controller.livenessProbe.initialDelaySeconds }}
+ periodSeconds: {{ .Values.controller.livenessProbe.periodSeconds }}
+ timeoutSeconds: {{ .Values.controller.livenessProbe.timeoutSeconds }}
+ successThreshold: {{ .Values.controller.livenessProbe.successThreshold }}
+ failureThreshold: {{ .Values.controller.livenessProbe.failureThreshold }}
+ ports:
+ {{- range $key, $value := .Values.controller.containerPort }}
+ - name: {{ $key }}
+ containerPort: {{ $value }}
+ protocol: TCP
+ {{- end }}
+ {{- if .Values.controller.metrics.enabled }}
+ - name: metrics
+ containerPort: {{ .Values.controller.metrics.port }}
+ protocol: TCP
+ {{- end }}
+ {{- if .Values.controller.admissionWebhooks.enabled }}
+ - name: webhook
+ containerPort: {{ .Values.controller.admissionWebhooks.port }}
+ protocol: TCP
+ {{- end }}
+ {{- range $key, $value := .Values.tcp }}
+ - name: "{{ $key }}-tcp"
+ containerPort: {{ $key }}
+ protocol: TCP
+ {{- end }}
+ {{- range $key, $value := .Values.udp }}
+ - name: "{{ $key }}-udp"
+ containerPort: {{ $key }}
+ protocol: UDP
+ {{- end }}
+ readinessProbe:
+ httpGet:
+ path: /healthz
+ port: {{ .Values.controller.readinessProbe.port }}
+ scheme: HTTP
+ initialDelaySeconds: {{ .Values.controller.readinessProbe.initialDelaySeconds }}
+ periodSeconds: {{ .Values.controller.readinessProbe.periodSeconds }}
+ timeoutSeconds: {{ .Values.controller.readinessProbe.timeoutSeconds }}
+ successThreshold: {{ .Values.controller.readinessProbe.successThreshold }}
+ failureThreshold: {{ .Values.controller.readinessProbe.failureThreshold }}
+{{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled) }}
+ volumeMounts:
+{{- end }}
+{{- if .Values.controller.customTemplate.configMapName }}
+ - mountPath: /etc/nginx/template
+ name: nginx-template-volume
+ readOnly: true
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.enabled }}
+ - name: webhook-cert
+ mountPath: "/usr/local/certificates/"
+ readOnly: true
+{{- end }}
+{{- if .Values.controller.extraVolumeMounts }}
+{{ toYaml .Values.controller.extraVolumeMounts | indent 12}}
+{{- end }}
+ resources:
+{{ toYaml .Values.controller.resources | indent 12 }}
+{{- if .Values.controller.extraContainers }}
+{{ toYaml .Values.controller.extraContainers | indent 8}}
+{{- end }}
+{{- if .Values.controller.extraInitContainers }}
+ initContainers:
+{{ toYaml .Values.controller.extraInitContainers | indent 8}}
+{{- end }}
+ hostNetwork: {{ .Values.controller.hostNetwork }}
+ {{- if .Values.controller.nodeSelector }}
+ nodeSelector:
+{{ toYaml .Values.controller.nodeSelector | indent 8 }}
+ {{- end }}
+ {{- if .Values.controller.tolerations }}
+ tolerations:
+{{ toYaml .Values.controller.tolerations | indent 8 }}
+ {{- end }}
+ {{- if .Values.controller.affinity }}
+ affinity:
+{{ toYaml .Values.controller.affinity | indent 8 }}
+ {{- end }}
+ serviceAccountName: {{ template "nginx-ingress.serviceAccountName" . }}
+ terminationGracePeriodSeconds: {{ .Values.controller.terminationGracePeriodSeconds }}
+{{- if (or .Values.controller.customTemplate.configMapName .Values.controller.extraVolumeMounts .Values.controller.admissionWebhooks.enabled .Values.controller.extraVolumes) }}
+ volumes:
+{{- end }}
+{{- if .Values.controller.customTemplate.configMapName }}
+ - name: nginx-template-volume
+ configMap:
+ name: {{ .Values.controller.customTemplate.configMapName }}
+ items:
+ - key: {{ .Values.controller.customTemplate.configMapKey }}
+ path: nginx.tmpl
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.enabled }}
+ - name: webhook-cert
+ secret:
+ secretName: {{ template "nginx-ingress.fullname". }}-admission
+{{- end }}
+{{- if .Values.controller.extraVolumes }}
+{{ toYaml .Values.controller.extraVolumes | indent 8}}
+{{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/controller-hpa.yaml b/nginx-ingress/templates/controller-hpa.yaml
new file mode 100644
index 0000000..dd37ffd
--- /dev/null
+++ b/nginx-ingress/templates/controller-hpa.yaml
@@ -0,0 +1,34 @@
+{{- if or (eq .Values.controller.kind "Deployment") (eq .Values.controller.kind "Both") }}
+{{- if .Values.controller.autoscaling.enabled }}
+apiVersion: autoscaling/v2beta1
+kind: HorizontalPodAutoscaler
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+spec:
+ scaleTargetRef:
+ apiVersion: {{ template "deployment.apiVersion" . }}
+ kind: Deployment
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+ minReplicas: {{ .Values.controller.autoscaling.minReplicas }}
+ maxReplicas: {{ .Values.controller.autoscaling.maxReplicas }}
+ metrics:
+{{- with .Values.controller.autoscaling.targetMemoryUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: memory
+ targetAverageUtilization: {{ . }}
+{{- end }}
+{{- with .Values.controller.autoscaling.targetCPUUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: cpu
+ targetAverageUtilization: {{ . }}
+{{- end }}
+{{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/controller-metrics-service.yaml b/nginx-ingress/templates/controller-metrics-service.yaml
new file mode 100644
index 0000000..43b9759
--- /dev/null
+++ b/nginx-ingress/templates/controller-metrics-service.yaml
@@ -0,0 +1,47 @@
+{{- if .Values.controller.metrics.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+{{- if .Values.controller.metrics.service.annotations }}
+ annotations:
+ {{- range $key, $value := .Values.controller.metrics.service.annotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+{{- end }}
+ labels:
+{{- if .Values.controller.metrics.service.labels }}
+{{ toYaml .Values.controller.metrics.service.labels | indent 4 }}
+{{- end }}
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}-metrics
+spec:
+{{- if not .Values.controller.metrics.service.omitClusterIP }}
+ {{- with .Values.controller.metrics.service.clusterIP }}
+ clusterIP: {{ if eq "-" . }}""{{ else }}{{ . | quote }}{{ end }}
+ {{- end }}
+{{- end }}
+{{- if .Values.controller.metrics.service.externalIPs }}
+ externalIPs:
+{{ toYaml .Values.controller.metrics.service.externalIPs | indent 4 }}
+{{- end }}
+{{- if .Values.controller.metrics.service.loadBalancerIP }}
+ loadBalancerIP: "{{ .Values.controller.metrics.service.loadBalancerIP }}"
+{{- end }}
+{{- if .Values.controller.metrics.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges:
+{{ toYaml .Values.controller.metrics.service.loadBalancerSourceRanges | indent 4 }}
+{{- end }}
+ ports:
+ - name: metrics
+ port: {{ .Values.controller.metrics.service.servicePort }}
+ targetPort: metrics
+ selector:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ type: "{{ .Values.controller.metrics.service.type }}"
+{{- end }}
diff --git a/nginx-ingress/templates/controller-poddisruptionbudget.yaml b/nginx-ingress/templates/controller-poddisruptionbudget.yaml
new file mode 100644
index 0000000..4f236d4
--- /dev/null
+++ b/nginx-ingress/templates/controller-poddisruptionbudget.yaml
@@ -0,0 +1,19 @@
+{{- if or (and .Values.controller.autoscaling.enabled (gt (.Values.controller.autoscaling.minReplicas | int) 1)) (gt (.Values.controller.replicaCount | int) 1) }}
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+spec:
+ selector:
+ matchLabels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ minAvailable: {{ .Values.controller.minAvailable }}
+{{- end }}
diff --git a/nginx-ingress/templates/controller-prometheusrules.yaml b/nginx-ingress/templates/controller-prometheusrules.yaml
new file mode 100644
index 0000000..4a43957
--- /dev/null
+++ b/nginx-ingress/templates/controller-prometheusrules.yaml
@@ -0,0 +1,24 @@
+{{- if and .Values.controller.metrics.enabled .Values.controller.metrics.prometheusRule.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+ {{- if .Values.controller.metrics.prometheusRule.namespace }}
+ namespace: {{ .Values.controller.metrics.prometheusRule.namespace }}
+ {{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{- if .Values.controller.metrics.prometheusRule.additionalLabels }}
+{{ toYaml .Values.controller.metrics.prometheusRule.additionalLabels | indent 4 }}
+ {{- end }}
+spec:
+ {{- with .Values.controller.metrics.prometheusRule.rules }}
+ groups:
+ - name: {{ template "nginx-ingress.name" $ }}
+ rules: {{- toYaml . | nindent 4 }}
+ {{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/controller-psp.yaml b/nginx-ingress/templates/controller-psp.yaml
new file mode 100644
index 0000000..ccbf636
--- /dev/null
+++ b/nginx-ingress/templates/controller-psp.yaml
@@ -0,0 +1,80 @@
+{{- if .Values.podSecurityPolicy.enabled}}
+apiVersion: {{ template "podSecurityPolicy.apiVersion" . }}
+kind: PodSecurityPolicy
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+spec:
+ allowedCapabilities:
+ - NET_BIND_SERVICE
+ privileged: false
+ allowPrivilegeEscalation: true
+ # Allow core volume types.
+ volumes:
+ - 'configMap'
+ #- 'emptyDir'
+ - 'projected'
+ - 'secret'
+ #- 'downwardAPI'
+ hostNetwork: {{ .Values.controller.hostNetwork }}
+{{- if or .Values.controller.hostNetwork .Values.controller.daemonset.useHostPort }}
+ hostPorts:
+{{- if .Values.controller.hostNetwork }}
+{{- range $key, $value := .Values.controller.containerPort }}
+ # {{ $key }}
+ - min: {{ $value }}
+ max: {{ $value }}
+{{- end }}
+{{- else if .Values.controller.daemonset.useHostPort }}
+{{- range $key, $value := .Values.controller.daemonset.hostPorts }}
+ # {{ $key }}
+ - min: {{ $value }}
+ max: {{ $value }}
+{{- end }}
+{{- end }}
+{{- if .Values.controller.metrics.enabled }}
+ # metrics
+ - min: {{ .Values.controller.metrics.port }}
+ max: {{ .Values.controller.metrics.port }}
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.enabled }}
+ # admission webhooks
+ - min: {{ .Values.controller.admissionWebhooks.port }}
+ max: {{ .Values.controller.admissionWebhooks.port }}
+{{- end }}
+{{- range $key, $value := .Values.tcp }}
+ # {{ $key }}-tcp
+ - min: {{ $key }}
+ max: {{ $key }}
+{{- end }}
+{{- range $key, $value := .Values.udp }}
+ # {{ $key }}-udp
+ - min: {{ $key }}
+ max: {{ $key }}
+{{- end }}
+{{- end }}
+ hostIPC: false
+ hostPID: false
+ runAsUser:
+ # Require the container to run without root privileges.
+ rule: 'MustRunAsNonRoot'
+ supplementalGroups:
+ rule: 'MustRunAs'
+ ranges:
+ # Forbid adding the root group.
+ - min: 1
+ max: 65535
+ fsGroup:
+ rule: 'MustRunAs'
+ ranges:
+ # Forbid adding the root group.
+ - min: 1
+ max: 65535
+ readOnlyRootFilesystem: false
+ seLinux:
+ rule: 'RunAsAny'
+{{- end }}
diff --git a/nginx-ingress/templates/controller-role.yaml b/nginx-ingress/templates/controller-role.yaml
new file mode 100644
index 0000000..bb9ff14
--- /dev/null
+++ b/nginx-ingress/templates/controller-role.yaml
@@ -0,0 +1,91 @@
+{{- if .Values.rbac.create -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - namespaces
+ verbs:
+ - get
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ - pods
+ - secrets
+ - endpoints
+ verbs:
+ - get
+ - list
+ - watch
+ - apiGroups:
+ - ""
+ resources:
+ - services
+ verbs:
+ - get
+ - list
+ - update
+ - watch
+ - apiGroups:
+ - extensions
+ - "networking.k8s.io" # k8s 1.14+
+ resources:
+ - ingresses
+ verbs:
+ - get
+ - list
+ - watch
+ - apiGroups:
+ - extensions
+ - "networking.k8s.io" # k8s 1.14+
+ resources:
+ - ingresses/status
+ verbs:
+ - update
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ resourceNames:
+ - {{ .Values.controller.electionID }}-{{ .Values.controller.ingressClass }}
+ verbs:
+ - get
+ - update
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ verbs:
+ - create
+ - apiGroups:
+ - ""
+ resources:
+ - endpoints
+ verbs:
+ - create
+ - get
+ - update
+ - apiGroups:
+ - ""
+ resources:
+ - events
+ verbs:
+ - create
+ - patch
+{{- if .Values.podSecurityPolicy.enabled }}
+ - apiGroups: ['{{ template "podSecurityPolicy.apiGroup" . }}']
+ resources: ['podsecuritypolicies']
+ verbs: ['use']
+ resourceNames: [{{ template "nginx-ingress.fullname" . }}]
+{{- end }}
+
+{{- end -}}
diff --git a/nginx-ingress/templates/controller-rolebinding.yaml b/nginx-ingress/templates/controller-rolebinding.yaml
new file mode 100644
index 0000000..c1186c0
--- /dev/null
+++ b/nginx-ingress/templates/controller-rolebinding.yaml
@@ -0,0 +1,19 @@
+{{- if .Values.rbac.create -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ template "nginx-ingress.fullname" . }}
+subjects:
+ - kind: ServiceAccount
+ name: {{ template "nginx-ingress.serviceAccountName" . }}
+ namespace: {{ .Release.Namespace }}
+{{- end -}}
diff --git a/nginx-ingress/templates/controller-service-internal.yaml b/nginx-ingress/templates/controller-service-internal.yaml
new file mode 100644
index 0000000..dd6bf7d
--- /dev/null
+++ b/nginx-ingress/templates/controller-service-internal.yaml
@@ -0,0 +1,45 @@
+{{- if and .Values.controller.service.enabled .Values.controller.service.internal.enabled .Values.controller.service.internal.annotations}}
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ {{- range $key, $value := .Values.controller.service.internal.annotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+ labels:
+{{- if .Values.controller.service.labels }}
+{{ toYaml .Values.controller.service.labels | indent 4 }}
+{{- end }}
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}-internal
+spec:
+ ports:
+ {{- $setNodePorts := (or (eq .Values.controller.service.type "NodePort") (eq .Values.controller.service.type "LoadBalancer")) }}
+ {{- if .Values.controller.service.enableHttp }}
+ - name: http
+ port: {{ .Values.controller.service.ports.http }}
+ protocol: TCP
+ targetPort: {{ .Values.controller.service.targetPorts.http }}
+ {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.http))) }}
+ nodePort: {{ .Values.controller.service.nodePorts.http }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.controller.service.enableHttps }}
+ - name: https
+ port: {{ .Values.controller.service.ports.https }}
+ protocol: TCP
+ targetPort: {{ .Values.controller.service.targetPorts.https }}
+ {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.https))) }}
+ nodePort: {{ .Values.controller.service.nodePorts.https }}
+ {{- end }}
+ {{- end }}
+ selector:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ type: "{{ .Values.controller.service.type }}"
+{{- end }}
diff --git a/nginx-ingress/templates/controller-service.yaml b/nginx-ingress/templates/controller-service.yaml
new file mode 100644
index 0000000..5ee4278
--- /dev/null
+++ b/nginx-ingress/templates/controller-service.yaml
@@ -0,0 +1,94 @@
+{{- if .Values.controller.service.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+{{- if .Values.controller.service.annotations }}
+ annotations:
+ {{- range $key, $value := .Values.controller.service.annotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+{{- end }}
+ labels:
+{{- if .Values.controller.service.labels }}
+{{ toYaml .Values.controller.service.labels | indent 4 }}
+{{- end }}
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+spec:
+{{- if not .Values.controller.service.omitClusterIP }}
+ {{- with .Values.controller.service.clusterIP }}
+ clusterIP: {{ if eq "-" . }}""{{ else }}{{ . | quote }}{{ end }}
+ {{- end }}
+{{- end }}
+{{- if .Values.controller.service.externalIPs }}
+ externalIPs:
+{{ toYaml .Values.controller.service.externalIPs | indent 4 }}
+{{- end }}
+{{- if .Values.controller.service.loadBalancerIP }}
+ loadBalancerIP: "{{ .Values.controller.service.loadBalancerIP }}"
+{{- end }}
+{{- if .Values.controller.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges:
+{{ toYaml .Values.controller.service.loadBalancerSourceRanges | indent 4 }}
+{{- end }}
+{{- if and (semverCompare ">=1.7-0" .Capabilities.KubeVersion.GitVersion) (.Values.controller.service.externalTrafficPolicy) }}
+ externalTrafficPolicy: "{{ .Values.controller.service.externalTrafficPolicy }}"
+{{- end }}
+{{- if .Values.controller.service.sessionAffinity }}
+ sessionAffinity: "{{ .Values.controller.service.sessionAffinity }}"
+{{- end }}
+{{- if and (semverCompare ">=1.7-0" .Capabilities.KubeVersion.GitVersion) (.Values.controller.service.healthCheckNodePort) }}
+ healthCheckNodePort: {{ .Values.controller.service.healthCheckNodePort }}
+{{- end }}
+ ports:
+ {{- $setNodePorts := (or (eq .Values.controller.service.type "NodePort") (eq .Values.controller.service.type "LoadBalancer")) }}
+ {{- if .Values.controller.service.enableHttp }}
+ - name: http
+ port: {{ .Values.controller.service.ports.http }}
+ protocol: TCP
+ targetPort: {{ .Values.controller.service.targetPorts.http }}
+ {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.http))) }}
+ nodePort: {{ .Values.controller.service.nodePorts.http }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.controller.service.enableHttps }}
+ - name: https
+ port: {{ .Values.controller.service.ports.https }}
+ protocol: TCP
+ targetPort: {{ .Values.controller.service.targetPorts.https }}
+ {{- if (and $setNodePorts (not (empty .Values.controller.service.nodePorts.https))) }}
+ nodePort: {{ .Values.controller.service.nodePorts.https }}
+ {{- end }}
+ {{- end }}
+ {{- range $key, $value := .Values.tcp }}
+ - name: "{{ $key }}-tcp"
+ port: {{ $key }}
+ protocol: TCP
+ targetPort: "{{ $key }}-tcp"
+ {{- if $.Values.controller.service.nodePorts.tcp }}
+ {{- if index $.Values.controller.service.nodePorts.tcp $key }}
+ nodePort: {{ index $.Values.controller.service.nodePorts.tcp $key }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ {{- range $key, $value := .Values.udp }}
+ - name: "{{ $key }}-udp"
+ port: {{ $key }}
+ protocol: UDP
+ targetPort: "{{ $key }}-udp"
+ {{- if $.Values.controller.service.nodePorts.udp }}
+ {{- if index $.Values.controller.service.nodePorts.udp $key }}
+ nodePort: {{ index $.Values.controller.service.nodePorts.udp $key }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+ selector:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ type: "{{ .Values.controller.service.type }}"
+{{- end }}
diff --git a/nginx-ingress/templates/controller-serviceaccount.yaml b/nginx-ingress/templates/controller-serviceaccount.yaml
new file mode 100644
index 0000000..4b326e2
--- /dev/null
+++ b/nginx-ingress/templates/controller-serviceaccount.yaml
@@ -0,0 +1,15 @@
+{{- if or .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.serviceAccountName" . }}
+ {{- if .Values.serviceAccount.annotations }}
+ annotations:
+{{ toYaml .Values.serviceAccount.annotations | indent 4 }}
+ {{- end }}
+{{- end -}}
diff --git a/nginx-ingress/templates/controller-servicemonitor.yaml b/nginx-ingress/templates/controller-servicemonitor.yaml
new file mode 100644
index 0000000..f3129ea
--- /dev/null
+++ b/nginx-ingress/templates/controller-servicemonitor.yaml
@@ -0,0 +1,38 @@
+{{- if and .Values.controller.metrics.enabled .Values.controller.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: {{ template "nginx-ingress.controller.fullname" . }}
+ {{- if .Values.controller.metrics.serviceMonitor.namespace }}
+ namespace: {{ .Values.controller.metrics.serviceMonitor.namespace }}
+ {{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{- if .Values.controller.metrics.serviceMonitor.additionalLabels }}
+{{ toYaml .Values.controller.metrics.serviceMonitor.additionalLabels | indent 4 }}
+ {{- end }}
+spec:
+ endpoints:
+ - port: metrics
+ interval: {{ .Values.controller.metrics.serviceMonitor.scrapeInterval }}
+ {{- if .Values.controller.metrics.serviceMonitor.honorLabels }}
+ honorLabels: true
+ {{- end }}
+ {{- if .Values.controller.metrics.serviceMonitor.namespaceSelector }}
+ namespaceSelector:
+{{ toYaml .Values.controller.metrics.serviceMonitor.namespaceSelector | indent 4 -}}
+ {{ else }}
+ namespaceSelector:
+ matchNames:
+ - {{ .Release.Namespace }}
+ {{- end }}
+ selector:
+ matchLabels:
+ app: {{ template "nginx-ingress.name" . }}
+ component: "{{ .Values.controller.name }}"
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+{{- end }}
diff --git a/nginx-ingress/templates/controller-webhook-service.yaml b/nginx-ingress/templates/controller-webhook-service.yaml
new file mode 100644
index 0000000..67041d5
--- /dev/null
+++ b/nginx-ingress/templates/controller-webhook-service.yaml
@@ -0,0 +1,44 @@
+{{- if .Values.controller.admissionWebhooks.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+{{- if .Values.controller.admissionWebhooks.service.annotations }}
+ annotations:
+ {{- range $key, $value := .Values.controller.admissionWebhooks.service.annotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+{{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.controller.fullname" . }}-admission
+spec:
+{{- if not .Values.controller.admissionWebhooks.service.omitClusterIP }}
+ {{- with .Values.controller.admissionWebhooks.service.clusterIP }}
+ clusterIP: {{ if eq "-" . }}""{{ else }}{{ . | quote }}{{ end }}
+ {{- end }}
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.service.externalIPs }}
+ externalIPs:
+{{ toYaml .Values.controller.admissionWebhooks.service.externalIPs | indent 4 }}
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.service.loadBalancerIP }}
+ loadBalancerIP: "{{ .Values.controller.admissionWebhooks.service.loadBalancerIP }}"
+{{- end }}
+{{- if .Values.controller.admissionWebhooks.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges:
+{{ toYaml .Values.controller.admissionWebhooks.service.loadBalancerSourceRanges | indent 4 }}
+{{- end }}
+ ports:
+ - name: https-webhook
+ port: 443
+ targetPort: webhook
+ selector:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.controller.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: controller
+ type: "{{ .Values.controller.admissionWebhooks.service.type }}"
+{{- end }}
diff --git a/nginx-ingress/templates/default-backend-deployment.yaml b/nginx-ingress/templates/default-backend-deployment.yaml
new file mode 100644
index 0000000..5885e71
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-deployment.yaml
@@ -0,0 +1,114 @@
+{{- if .Values.defaultBackend.enabled }}
+apiVersion: {{ template "deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.defaultBackend.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: default-backend
+ {{- if .Values.defaultBackend.deploymentLabels }}
+{{ toYaml .Values.defaultBackend.deploymentLabels | indent 4 }}
+ {{- end }}
+ name: {{ template "nginx-ingress.defaultBackend.fullname" . }}
+spec:
+ selector:
+ matchLabels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{- if .Values.defaultBackend.useComponentLabel }}
+ {{ .Values.defaultBackend.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: default-backend
+ {{- end }}
+{{- if not .Values.defaultBackend.autoscaling.enabled }}
+ replicas: {{ .Values.defaultBackend.replicaCount }}
+{{- end }}
+ revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
+ template:
+ metadata:
+ {{- if .Values.defaultBackend.podAnnotations }}
+ annotations:
+ {{- range $key, $value := .Values.defaultBackend.podAnnotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+ {{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.defaultBackend.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: default-backend
+ {{- if .Values.defaultBackend.podLabels }}
+{{ toYaml .Values.defaultBackend.podLabels | indent 8 }}
+ {{- end }}
+ spec:
+ {{- if .Values.imagePullSecrets }}
+ imagePullSecrets:
+{{ toYaml .Values.imagePullSecrets | indent 8 }}
+ {{- end }}
+{{- if .Values.defaultBackend.priorityClassName }}
+ priorityClassName: "{{ .Values.defaultBackend.priorityClassName }}"
+{{- end }}
+ {{- if .Values.defaultBackend.podSecurityContext }}
+ securityContext:
+{{ toYaml .Values.defaultBackend.podSecurityContext | indent 8 }}
+ {{- end }}
+ containers:
+ - name: {{ template "nginx-ingress.name" . }}-{{ .Values.defaultBackend.name }}
+ {{- with .Values.defaultBackend.image }}
+ image: "{{.repository}}{{- if (.digest) -}} @{{.digest}} {{- else -}} :{{ .tag }} {{- end -}}"
+ {{- end }}
+ imagePullPolicy: "{{ .Values.defaultBackend.image.pullPolicy }}"
+ args:
+ {{- range $key, $value := .Values.defaultBackend.extraArgs }}
+ {{- if $value }}
+ - --{{ $key }}={{ $value }}
+ {{- else }}
+ - --{{ $key }}
+ {{- end }}
+ {{- end }}
+ securityContext:
+ runAsUser: {{ .Values.defaultBackend.image.runAsUser }}
+ {{- if .Values.defaultBackend.extraEnvs }}
+ env:
+{{ toYaml .Values.defaultBackend.extraEnvs | indent 12 }}
+ {{- end }}
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: {{ .Values.defaultBackend.port }}
+ scheme: HTTP
+ initialDelaySeconds: {{ .Values.defaultBackend.livenessProbe.initialDelaySeconds }}
+ periodSeconds: {{ .Values.defaultBackend.livenessProbe.periodSeconds }}
+ timeoutSeconds: {{ .Values.defaultBackend.livenessProbe.timeoutSeconds }}
+ successThreshold: {{ .Values.defaultBackend.livenessProbe.successThreshold }}
+ failureThreshold: {{ .Values.defaultBackend.livenessProbe.failureThreshold }}
+ readinessProbe:
+ httpGet:
+ path: /healthz
+ port: {{ .Values.defaultBackend.port }}
+ scheme: HTTP
+ initialDelaySeconds: {{ .Values.defaultBackend.readinessProbe.initialDelaySeconds }}
+ periodSeconds: {{ .Values.defaultBackend.readinessProbe.periodSeconds }}
+ timeoutSeconds: {{ .Values.defaultBackend.readinessProbe.timeoutSeconds }}
+ successThreshold: {{ .Values.defaultBackend.readinessProbe.successThreshold }}
+ failureThreshold: {{ .Values.defaultBackend.readinessProbe.failureThreshold }}
+ ports:
+ - name: http
+ containerPort: {{ .Values.defaultBackend.port }}
+ protocol: TCP
+ resources:
+{{ toYaml .Values.defaultBackend.resources | indent 12 }}
+ {{- if .Values.defaultBackend.nodeSelector }}
+ nodeSelector:
+{{ toYaml .Values.defaultBackend.nodeSelector | indent 8 }}
+ {{- end }}
+ serviceAccountName: {{ template "nginx-ingress.defaultBackend.serviceAccountName" . }}
+ {{- if .Values.defaultBackend.tolerations }}
+ tolerations:
+{{ toYaml .Values.defaultBackend.tolerations | indent 8 }}
+ {{- end }}
+ {{- if .Values.defaultBackend.affinity }}
+ affinity:
+{{ toYaml .Values.defaultBackend.affinity | indent 8 }}
+ {{- end }}
+ terminationGracePeriodSeconds: 60
+{{- end }}
diff --git a/nginx-ingress/templates/default-backend-hpa.yaml b/nginx-ingress/templates/default-backend-hpa.yaml
new file mode 100644
index 0000000..56a6594
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-hpa.yaml
@@ -0,0 +1,32 @@
+{{- if .Values.defaultBackend.autoscaling.enabled }}
+apiVersion: autoscaling/v2beta1
+kind: HorizontalPodAutoscaler
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.defaultBackend.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ .Release.Name }}
+ name: {{ template "nginx-ingress.defaultBackend.fullname" . }}
+spec:
+ scaleTargetRef:
+ apiVersion: {{ template "deployment.apiVersion" . }}
+ kind: Deployment
+ name: {{ template "nginx-ingress.defaultBackend.fullname" . }}
+ minReplicas: {{ .Values.defaultBackend.autoscaling.minReplicas }}
+ maxReplicas: {{ .Values.defaultBackend.autoscaling.maxReplicas }}
+ metrics:
+{{- with .Values.defaultBackend.autoscaling.targetCPUUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: cpu
+ targetAverageUtilization: {{ . }}
+{{- end }}
+{{- with .Values.defaultBackend.autoscaling.targetMemoryUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: memory
+ targetAverageUtilization: {{ . }}
+{{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/default-backend-poddisruptionbudget.yaml b/nginx-ingress/templates/default-backend-poddisruptionbudget.yaml
new file mode 100644
index 0000000..6a753c1
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-poddisruptionbudget.yaml
@@ -0,0 +1,19 @@
+{{- if or (gt (.Values.defaultBackend.replicaCount | int) 1) (gt (.Values.defaultBackend.autoscaling.minReplicas | int) 1) }}
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ {{ .Values.defaultBackend.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: default-backend
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.defaultBackend.fullname" . }}
+spec:
+ selector:
+ matchLabels:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.defaultBackend.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: default-backend
+ minAvailable: {{ .Values.defaultBackend.minAvailable }}
+{{- end }}
diff --git a/nginx-ingress/templates/default-backend-psp.yaml b/nginx-ingress/templates/default-backend-psp.yaml
new file mode 100644
index 0000000..38191d4
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-psp.yaml
@@ -0,0 +1,35 @@
+{{- if and .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled -}}
+apiVersion: {{ template "podSecurityPolicy.apiVersion" . }}
+kind: PodSecurityPolicy
+metadata:
+ name: {{ template "nginx-ingress.fullname" . }}-backend
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+spec:
+ allowPrivilegeEscalation: false
+ fsGroup:
+ ranges:
+ - max: 65535
+ min: 1
+ rule: MustRunAs
+ requiredDropCapabilities:
+ - ALL
+ runAsUser:
+ rule: MustRunAsNonRoot
+ seLinux:
+ rule: RunAsAny
+ supplementalGroups:
+ ranges:
+ - max: 65535
+ min: 1
+ rule: MustRunAs
+ volumes:
+ - configMap
+ - emptyDir
+ - projected
+ - secret
+ - downwardAPI
+{{- end -}}
diff --git a/nginx-ingress/templates/default-backend-role.yaml b/nginx-ingress/templates/default-backend-role.yaml
new file mode 100644
index 0000000..11fbba9
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-role.yaml
@@ -0,0 +1,16 @@
+{{- if and .Values.rbac.create .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}-backend
+rules:
+ - apiGroups: ['{{ template "podSecurityPolicy.apiGroup" . }}']
+ resources: ['podsecuritypolicies']
+ verbs: ['use']
+ resourceNames: [{{ template "nginx-ingress.fullname" . }}-backend]
+{{- end -}}
diff --git a/nginx-ingress/templates/default-backend-rolebinding.yaml b/nginx-ingress/templates/default-backend-rolebinding.yaml
new file mode 100644
index 0000000..7d03ef4
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-rolebinding.yaml
@@ -0,0 +1,19 @@
+{{- if and .Values.rbac.create .Values.podSecurityPolicy.enabled .Values.defaultBackend.enabled -}}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}-backend
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ template "nginx-ingress.fullname" . }}-backend
+subjects:
+ - kind: ServiceAccount
+ name: {{ template "nginx-ingress.defaultBackend.serviceAccountName" . }}
+ namespace: {{ .Release.Namespace }}
+{{- end -}}
diff --git a/nginx-ingress/templates/default-backend-service.yaml b/nginx-ingress/templates/default-backend-service.yaml
new file mode 100644
index 0000000..bfa022a
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-service.yaml
@@ -0,0 +1,45 @@
+{{- if .Values.defaultBackend.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+{{- if .Values.defaultBackend.service.annotations }}
+ annotations:
+ {{- range $key, $value := .Values.defaultBackend.service.annotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+{{- end }}
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.defaultBackend.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.defaultBackend.fullname" . }}
+spec:
+{{- if not .Values.defaultBackend.service.omitClusterIP }}
+ {{- with .Values.defaultBackend.service.clusterIP }}
+ clusterIP: {{ if eq "-" . }}""{{ else }}{{ . | quote }}{{ end }}
+ {{- end }}
+{{- end }}
+{{- if .Values.defaultBackend.service.externalIPs }}
+ externalIPs:
+{{ toYaml .Values.defaultBackend.service.externalIPs | indent 4 }}
+{{- end }}
+{{- if .Values.defaultBackend.service.loadBalancerIP }}
+ loadBalancerIP: "{{ .Values.defaultBackend.service.loadBalancerIP }}"
+{{- end }}
+{{- if .Values.defaultBackend.service.loadBalancerSourceRanges }}
+ loadBalancerSourceRanges:
+{{ toYaml .Values.defaultBackend.service.loadBalancerSourceRanges | indent 4 }}
+{{- end }}
+ ports:
+ - name: http
+ port: {{ .Values.defaultBackend.service.servicePort }}
+ protocol: TCP
+ targetPort: http
+ selector:
+ app: {{ template "nginx-ingress.name" . }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ {{ .Values.defaultBackend.componentLabelKeyOverride | default "app.kubernetes.io/component" }}: default-backend
+ type: "{{ .Values.defaultBackend.service.type }}"
+{{- end }}
diff --git a/nginx-ingress/templates/default-backend-serviceaccount.yaml b/nginx-ingress/templates/default-backend-serviceaccount.yaml
new file mode 100644
index 0000000..94689a6
--- /dev/null
+++ b/nginx-ingress/templates/default-backend-serviceaccount.yaml
@@ -0,0 +1,11 @@
+{{- if and .Values.defaultBackend.enabled .Values.defaultBackend.serviceAccount.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.defaultBackend.serviceAccountName" . }}
+{{- end }}
diff --git a/nginx-ingress/templates/proxyheaders-configmap.yaml b/nginx-ingress/templates/proxyheaders-configmap.yaml
new file mode 100644
index 0000000..ae918ae
--- /dev/null
+++ b/nginx-ingress/templates/proxyheaders-configmap.yaml
@@ -0,0 +1,18 @@
+{{- if or .Values.controller.proxySetHeaders .Values.controller.headers }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}-custom-proxy-headers
+data:
+{{- if .Values.controller.proxySetHeaders }}
+{{ toYaml .Values.controller.proxySetHeaders | indent 2 }}
+{{ else if and .Values.controller.headers (not .Values.controller.proxySetHeaders) }}
+{{ toYaml .Values.controller.headers | indent 2 }}
+{{- end }}
+{{- end }}
diff --git a/nginx-ingress/templates/tcp-configmap.yaml b/nginx-ingress/templates/tcp-configmap.yaml
new file mode 100644
index 0000000..96de14f
--- /dev/null
+++ b/nginx-ingress/templates/tcp-configmap.yaml
@@ -0,0 +1,14 @@
+{{- if .Values.tcp }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}-tcp
+data:
+{{ tpl (toYaml .Values.tcp) . | indent 2 }}
+{{- end }}
diff --git a/nginx-ingress/templates/udp-configmap.yaml b/nginx-ingress/templates/udp-configmap.yaml
new file mode 100644
index 0000000..69ee361
--- /dev/null
+++ b/nginx-ingress/templates/udp-configmap.yaml
@@ -0,0 +1,14 @@
+{{- if .Values.udp }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ labels:
+ app: {{ template "nginx-ingress.name" . }}
+ chart: {{ template "nginx-ingress.chart" . }}
+ component: "{{ .Values.controller.name }}"
+ heritage: {{ .Release.Service }}
+ release: {{ template "nginx-ingress.releaseLabel" . }}
+ name: {{ template "nginx-ingress.fullname" . }}-udp
+data:
+{{ tpl (toYaml .Values.udp) . | indent 2 }}
+{{- end }}
diff --git a/nginx-ingress/values.yaml b/nginx-ingress/values.yaml
new file mode 100644
index 0000000..01debff
--- /dev/null
+++ b/nginx-ingress/values.yaml
@@ -0,0 +1,606 @@
+## nginx configuration
+## Ref: https://github.com/kubernetes/ingress/blob/master/controllers/nginx/configuration.md
+##
+controller:
+ name: controller
+ image:
+ # registry value can be any of the following:
+ # us.gcr.io
+ # eu.gcr.io
+ # asia.gcr.io
+ registry: us.gcr.io
+ repository: k8s-artifacts-prod/ingress-nginx/controller
+ tag: "v0.34.1"
+ # digest: sha256:0e072dddd1f7f8fc8909a2ca6f65e76c5f0d2fcfb8be47935ae3457e8bbceb20
+ pullPolicy: IfNotPresent
+ # www-data -> uid 101
+ runAsUser: 101
+ allowPrivilegeEscalation: true
+
+ # This will fix the issue of HPA not being able to read the metrics.
+ # Note that if you enable it for existing deployments, it won't work as the labels are immutable.
+ # We recommend setting this to true for new deployments.
+ useComponentLabel: false
+
+ # Override component label key
+ # componentLabelKeyOverride:
+
+ # Configures the ports the nginx-controller listens on
+ containerPort:
+ http: 80
+ https: 443
+
+ # Will add custom configuration options to Nginx https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/
+ config: {}
+
+ # Maxmind license key to download GeoLite2 Databases
+ # https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-geolite2-databases
+ maxmindLicenseKey: ""
+
+ # Will add custom headers before sending traffic to backends according to https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/customization/custom-headers
+ proxySetHeaders: {}
+
+ # Will add custom headers before sending response traffic to the client according to: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#add-headers
+ addHeaders: {}
+
+ # Required for use with CNI based kubernetes installations (such as ones set up by kubeadm),
+ # since CNI and hostport don't mix yet. Can be deprecated once https://github.com/kubernetes/kubernetes/issues/23920
+ # is merged
+ hostNetwork: false
+
+ # Optionally customize the pod dnsConfig.
+ dnsConfig: {}
+
+ # Optionally change this to ClusterFirstWithHostNet in case you have 'hostNetwork: true'.
+ # By default, while using host network, name resolution uses the host's DNS. If you wish nginx-controller
+ # to keep resolving names inside the k8s network, use ClusterFirstWithHostNet.
+ dnsPolicy: ClusterFirst
+
+ # Bare-metal considerations via the host network https://kubernetes.github.io/ingress-nginx/deploy/baremetal/#via-the-host-network
+ # Ingress status was blank because there is no Service exposing the NGINX Ingress controller in a configuration using the host network, the default --publish-service flag used in standard cloud setups does not apply
+ reportNodeInternalIp: false
+
+ ## Use host ports 80 and 443
+ daemonset:
+ useHostPort: false
+
+ hostPorts:
+ http: 80
+ https: 443
+
+ ## Required only if defaultBackend.enabled = false
+ ## Must be /
+ ##
+ defaultBackendService: ""
+
+ ## Election ID to use for status update
+ ##
+ electionID: ingress-controller-leader
+
+ ## Name of the ingress class to route through this controller
+ ##
+ ingressClass: nginx
+
+ # labels to add to the deployment metadata
+ deploymentLabels: {}
+
+ # labels to add to the pod container metadata
+ podLabels: {}
+ # key: value
+
+ ## Security Context policies for controller pods
+ ## See https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/ for
+ ## notes on enabling and using sysctls
+ ##
+ podSecurityContext: {}
+
+ ## Allows customization of the external service
+ ## the ingress will be bound to via DNS
+ publishService:
+ enabled: false
+ ## Allows overriding of the publish service to bind to
+ ## Must be /
+ ##
+ pathOverride: ""
+
+ ## Limit the scope of the controller
+ ##
+ scope:
+ enabled: false
+ namespace: "" # defaults to .Release.Namespace
+
+ ## Allows customization of the configmap / nginx-configmap namespace
+ ##
+ configMapNamespace: "" # defaults to .Release.Namespace
+
+ ## Allows customization of the tcp-services-configmap namespace
+ ##
+ tcp:
+ configMapNamespace: "" # defaults to .Release.Namespace
+
+ ## Allows customization of the udp-services-configmap namespace
+ ##
+ udp:
+ configMapNamespace: "" # defaults to .Release.Namespace
+
+ ## Additional command line arguments to pass to nginx-ingress-controller
+ ## E.g. to specify the default SSL certificate you can use
+ ## extraArgs:
+ ## default-ssl-certificate: "/"
+ extraArgs: {}
+
+ ## Additional environment variables to set
+ extraEnvs: []
+ # extraEnvs:
+ # - name: FOO
+ # valueFrom:
+ # secretKeyRef:
+ # key: FOO
+ # name: secret-resource
+
+ ## DaemonSet or Deployment
+ ##
+ kind: Deployment
+
+ ## Annotations to be added to the controller deployment
+ ##
+ deploymentAnnotations: {}
+
+ # The update strategy to apply to the Deployment or DaemonSet
+ ##
+ updateStrategy: {}
+ # rollingUpdate:
+ # maxUnavailable: 1
+ # type: RollingUpdate
+
+ # minReadySeconds to avoid killing pods before we are ready
+ ##
+ minReadySeconds: 0
+
+
+ ## Node tolerations for server scheduling to nodes with taints
+ ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
+ ##
+ tolerations: []
+ # - key: "key"
+ # operator: "Equal|Exists"
+ # value: "value"
+ # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
+
+ ## Affinity and anti-affinity
+ ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+ ##
+ affinity: {}
+ # # An example of preferred pod anti-affinity, weight is in the range 1-100
+ # podAntiAffinity:
+ # preferredDuringSchedulingIgnoredDuringExecution:
+ # - weight: 100
+ # podAffinityTerm:
+ # labelSelector:
+ # matchExpressions:
+ # - key: app
+ # operator: In
+ # values:
+ # - nginx-ingress
+ # topologyKey: kubernetes.io/hostname
+
+ # # An example of required pod anti-affinity
+ # podAntiAffinity:
+ # requiredDuringSchedulingIgnoredDuringExecution:
+ # - labelSelector:
+ # matchExpressions:
+ # - key: app
+ # operator: In
+ # values:
+ # - nginx-ingress
+ # topologyKey: "kubernetes.io/hostname"
+
+ ## terminationGracePeriodSeconds
+ ##
+ terminationGracePeriodSeconds: 60
+
+ ## Node labels for controller pod assignment
+ ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
+ ##
+ nodeSelector: {}
+
+ ## Liveness and readiness probe values
+ ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes
+ ##
+ livenessProbe:
+ failureThreshold: 3
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 1
+ port: 10254
+ readinessProbe:
+ failureThreshold: 3
+ initialDelaySeconds: 10
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 1
+ port: 10254
+
+ ## Annotations to be added to controller pods
+ ##
+ podAnnotations: {}
+
+ # Add Config Checksum to pod Annotations
+ # This will trigger Rolling Updates on configuration changes
+ podAnnotationConfigChecksum: false
+
+ replicaCount: 1
+
+ minAvailable: 1
+
+ resources: {}
+ # limits:
+ # cpu: 100m
+ # memory: 64Mi
+ # requests:
+ # cpu: 100m
+ # memory: 64Mi
+
+ autoscaling:
+ enabled: false
+ minReplicas: 2
+ maxReplicas: 11
+ targetCPUUtilizationPercentage: 50
+ targetMemoryUtilizationPercentage: 50
+
+ ## Override NGINX template
+ customTemplate:
+ configMapName: ""
+ configMapKey: ""
+
+ service:
+ enabled: true
+
+ annotations: {}
+ labels: {}
+ ## Deprecated, instead simply do not provide a clusterIP value
+ omitClusterIP: false
+ # clusterIP: ""
+
+ ## List of IP addresses at which the controller services are available
+ ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
+ ##
+ externalIPs: []
+
+ loadBalancerIP: ""
+ loadBalancerSourceRanges: []
+
+ enableHttp: true
+ enableHttps: true
+
+ ## Set external traffic policy to: "Local" to preserve source IP on
+ ## providers supporting it
+ ## Ref: https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typeloadbalancer
+ externalTrafficPolicy: ""
+
+ # Must be either "None" or "ClientIP" if set. Kubernetes will default to "None".
+ # Ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
+ sessionAffinity: ""
+
+ healthCheckNodePort: 0
+
+ ports:
+ http: 80
+ https: 443
+
+ targetPorts:
+ http: http
+ https: https
+
+ type: LoadBalancer
+
+ # type: NodePort
+ # nodePorts:
+ # http: 32080
+ # https: 32443
+ # tcp:
+ # 8080: 32808
+ nodePorts:
+ http: ""
+ https: ""
+ tcp: {}
+ udp: {}
+
+ ## Enables an additional internal load balancer (besides the external one).
+ ## Annotations are mandatory for the load balancer to come up. Varies with the cloud service.
+ internal:
+ enabled: false
+ annotations: {}
+
+ extraContainers: []
+ ## Additional containers to be added to the controller pod.
+ ## See https://github.com/lemonldap-ng-controller/lemonldap-ng-controller as example.
+ # - name: my-sidecar
+ # image: nginx:latest
+ # - name: lemonldap-ng-controller
+ # image: lemonldapng/lemonldap-ng-controller:0.2.0
+ # args:
+ # - /lemonldap-ng-controller
+ # - --alsologtostderr
+ # - --configmap=$(POD_NAMESPACE)/lemonldap-ng-configuration
+ # env:
+ # - name: POD_NAME
+ # valueFrom:
+ # fieldRef:
+ # fieldPath: metadata.name
+ # - name: POD_NAMESPACE
+ # valueFrom:
+ # fieldRef:
+ # fieldPath: metadata.namespace
+ # volumeMounts:
+ # - name: copy-portal-skins
+ # mountPath: /srv/var/lib/lemonldap-ng/portal/skins
+
+ extraVolumeMounts: []
+ ## Additional volumeMounts to the controller main container.
+ # - name: copy-portal-skins
+ # mountPath: /var/lib/lemonldap-ng/portal/skins
+
+ extraVolumes: []
+ ## Additional volumes to the controller pod.
+ # - name: copy-portal-skins
+ # emptyDir: {}
+
+ extraInitContainers: []
+ ## Containers, which are run before the app containers are started.
+ # - name: init-myservice
+ # image: busybox
+ # command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
+
+ admissionWebhooks:
+ enabled: false
+ failurePolicy: Fail
+ port: 8443
+
+ service:
+ annotations: {}
+ ## Deprecated, instead simply do not provide a clusterIP value
+ omitClusterIP: false
+ # clusterIP: ""
+ externalIPs: []
+ loadBalancerIP: ""
+ loadBalancerSourceRanges: []
+ servicePort: 443
+ type: ClusterIP
+
+ patch:
+ enabled: true
+ image:
+ repository: jettech/kube-webhook-certgen
+ tag: v1.0.0
+ pullPolicy: IfNotPresent
+ ## Provide a priority class name to the webhook patching job
+ ##
+ priorityClassName: ""
+ podAnnotations: {}
+ nodeSelector: {}
+ resources: {}
+
+ metrics:
+ port: 10254
+ # if this port is changed, change healthz-port: in extraArgs: accordingly
+ enabled: false
+
+ service:
+ annotations: {}
+ # prometheus.io/scrape: "true"
+ # prometheus.io/port: "10254"
+
+ ## Deprecated, instead simply do not provide a clusterIP value
+ omitClusterIP: false
+ # clusterIP: ""
+
+ ## List of IP addresses at which the stats-exporter service is available
+ ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
+ ##
+ externalIPs: []
+
+ loadBalancerIP: ""
+ loadBalancerSourceRanges: []
+ servicePort: 9913
+ type: ClusterIP
+
+ serviceMonitor:
+ enabled: false
+ additionalLabels: {}
+ namespace: ""
+ namespaceSelector: {}
+ # Default: scrape .Release.Namespace only
+ # To scrape all, use the following:
+ # namespaceSelector:
+ # any: true
+ scrapeInterval: 30s
+ # honorLabels: true
+
+ prometheusRule:
+ enabled: false
+ additionalLabels: {}
+ namespace: ""
+ rules: []
+ # # These are just examples rules, please adapt them to your needs
+ # - alert: TooMany500s
+ # expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"5.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
+ # for: 1m
+ # labels:
+ # severity: critical
+ # annotations:
+ # description: Too many 5XXs
+ # summary: More than 5% of the all requests did return 5XX, this require your attention
+ # - alert: TooMany400s
+ # expr: 100 * ( sum( nginx_ingress_controller_requests{status=~"4.+"} ) / sum(nginx_ingress_controller_requests) ) > 5
+ # for: 1m
+ # labels:
+ # severity: critical
+ # annotations:
+ # description: Too many 4XXs
+ # summary: More than 5% of the all requests did return 4XX, this require your attention
+
+
+ lifecycle: {}
+
+ priorityClassName: ""
+
+## Rollback limit
+##
+revisionHistoryLimit: 10
+
+## Default 404 backend
+##
+defaultBackend:
+
+ ## If false, controller.defaultBackendService must be provided
+ ##
+ enabled: true
+
+ name: default-backend
+ image:
+ repository: k8s.gcr.io/defaultbackend-amd64
+ tag: "1.5"
+ pullPolicy: IfNotPresent
+ # nobody user -> uid 65534
+ runAsUser: 65534
+
+ # This will fix the issue of HPA not being able to read the metrics.
+ # Note that if you enable it for existing deployments, it won't work as the labels are immutable.
+ # We recommend setting this to true for new deployments.
+ useComponentLabel: false
+
+ # Override component label key
+ # componentLabelKeyOverride:
+
+ extraArgs: {}
+
+ serviceAccount:
+ create: true
+ name:
+ ## Additional environment variables to set for defaultBackend pods
+ extraEnvs: []
+
+ port: 8080
+
+ ## Readiness and liveness probes for default backend
+ ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
+ ##
+ livenessProbe:
+ failureThreshold: 3
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ successThreshold: 1
+ timeoutSeconds: 5
+ readinessProbe:
+ failureThreshold: 6
+ initialDelaySeconds: 0
+ periodSeconds: 5
+ successThreshold: 1
+ timeoutSeconds: 5
+
+ ## Node tolerations for server scheduling to nodes with taints
+ ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
+ ##
+ tolerations: []
+ # - key: "key"
+ # operator: "Equal|Exists"
+ # value: "value"
+ # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)"
+
+ affinity: {}
+
+ ## Security Context policies for controller pods
+ ## See https://kubernetes.io/docs/tasks/administer-cluster/sysctl-cluster/ for
+ ## notes on enabling and using sysctls
+ ##
+ podSecurityContext: {}
+
+ # labels to add to the deployment metadata
+ deploymentLabels: {}
+
+ # labels to add to the pod container metadata
+ podLabels: {}
+ # key: value
+
+ ## Node labels for default backend pod assignment
+ ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
+ ##
+ nodeSelector: {}
+
+ ## Annotations to be added to default backend pods
+ ##
+ podAnnotations: {}
+
+ replicaCount: 1
+
+ minAvailable: 1
+
+ resources: {}
+ # limits:
+ # cpu: 10m
+ # memory: 20Mi
+ # requests:
+ # cpu: 10m
+ # memory: 20Mi
+
+ autoscaling:
+ enabled: false
+ minReplicas: 1
+ maxReplicas: 2
+ targetCPUUtilizationPercentage: 50
+ targetMemoryUtilizationPercentage: 50
+
+ service:
+ annotations: {}
+ ## Deprecated, instead simply do not provide a clusterIP value
+ omitClusterIP: false
+ # clusterIP: ""
+
+ ## List of IP addresses at which the default backend service is available
+ ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips
+ ##
+ externalIPs: []
+
+ loadBalancerIP: ""
+ loadBalancerSourceRanges: []
+ servicePort: 80
+ type: ClusterIP
+
+ priorityClassName: ""
+
+# If provided, the value will be used as the `release` label instead of .Release.Name
+releaseLabelOverride: ""
+
+## Enable RBAC as per https://github.com/kubernetes/ingress/tree/master/examples/rbac/nginx and https://github.com/kubernetes/ingress/issues/266
+rbac:
+ create: true
+ scope: false
+
+# If true, create & use Pod Security Policy resources
+# https://kubernetes.io/docs/concepts/policy/pod-security-policy/
+podSecurityPolicy:
+ enabled: false
+
+serviceAccount:
+ create: true
+ name:
+ annotations: {}
+
+## Optional array of imagePullSecrets containing private registry credentials
+## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
+imagePullSecrets: []
+# - name: secretName
+
+# TCP service key:value pairs
+# Ref: https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx/examples/tcp
+##
+tcp: {}
+# 8080: "default/example-tcp-svc:9000"
+
+# UDP service key:value pairs
+# Ref: https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx/examples/udp
+##
+udp: {}
+# 53: "kube-system/kube-dns:53"
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..2fe278e
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1910 @@
+{
+ "name": "app",
+ "version": "0.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/babel-types": {
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.9.tgz",
+ "integrity": "sha512-qZLoYeXSTgQuK1h7QQS16hqLGdmqtRmN8w/rl3Au/l5x/zkHx+a4VHrHyBsi1I1vtK2oBHxSzKIu0R5p6spdOA=="
+ },
+ "@types/babylon": {
+ "version": "6.16.5",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz",
+ "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==",
+ "requires": {
+ "@types/babel-types": "*"
+ }
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
+ },
+ "acorn-globals": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
+ "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
+ "requires": {
+ "acorn": "^4.0.4"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+ }
+ }
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "requires": {
+ "kind-of": "^3.0.2",
+ "longest": "^1.0.1",
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "allure-js-commons": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-1.3.2.tgz",
+ "integrity": "sha512-FTmoqP36ZjHFT4iLdYamyCFhyj1jqD6BIdiZ5pBlyafDJrFRV76XIXNxwRqbHpSw40o1vHzYi4vGpmREnhnHVw==",
+ "dev": true,
+ "requires": {
+ "file-type": "^7.7.1",
+ "fs-extra": "^6.0.1",
+ "js2xmlparser": "^3.0.0",
+ "mime": "^2.3.1",
+ "object-assign": "^4.1.1",
+ "uuid": "^3.0.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz",
+ "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "mime": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+ "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+ "dev": true
+ }
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
+ },
+ "ansi-colors": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
+ "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
+ "dev": true
+ },
+ "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
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "body-parser": {
+ "version": "1.18.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "~1.6.3",
+ "iconv-lite": "0.4.23",
+ "on-finished": "~2.3.0",
+ "qs": "6.5.2",
+ "raw-body": "2.3.3",
+ "type-is": "~1.6.16"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "requires": {
+ "align-text": "^0.1.3",
+ "lazy-cache": "^1.0.3"
+ }
+ },
+ "chai": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+ "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.1.0",
+ "type-detect": "^4.0.5"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "character-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
+ "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
+ "requires": {
+ "is-regex": "^1.0.3"
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "clean-css": {
+ "version": "3.4.28",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
+ "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
+ "requires": {
+ "commander": "2.8.x",
+ "source-map": "0.4.x"
+ }
+ },
+ "cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
+ "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
+ "requires": {
+ "graceful-readlink": ">= 1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "constantinople": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
+ "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==",
+ "requires": {
+ "@types/babel-types": "^7.0.0",
+ "@types/babylon": "^6.16.2",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-parser": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz",
+ "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==",
+ "requires": {
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6"
+ }
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "core-js": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+ },
+ "dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "diff": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
+ "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
+ "dev": true
+ },
+ "doctypes": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
+ "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "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
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "es-abstract": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz",
+ "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "express": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
+ "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+ "requires": {
+ "accepts": "~1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.3",
+ "content-disposition": "0.5.2",
+ "content-type": "~1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.1.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.4",
+ "qs": "6.5.2",
+ "range-parser": "~1.2.0",
+ "safe-buffer": "5.1.2",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "~1.4.0",
+ "type-is": "~1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
+ }
+ }
+ },
+ "file-type": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.7.1.tgz",
+ "integrity": "sha512-bTrKkzzZI6wH+NXhyD3SOXtb2zXTw2SbwI2RxUlRcXVsnN7jNL5hJzVQLYv7FOQhxFkK4XWdAflEaWFpaLLWpQ==",
+ "dev": true
+ },
+ "finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "statuses": "~1.4.0",
+ "unpipe": "~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"
+ }
+ },
+ "flat": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
+ "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
+ "dev": true,
+ "requires": {
+ "is-buffer": "~2.0.3"
+ }
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsu": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz",
+ "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "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
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "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"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
+ },
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-buffer": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+ "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true
+ },
+ "is-expression": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
+ "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
+ "requires": {
+ "acorn": "~4.0.2",
+ "object-assign": "^4.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+ }
+ }
+ },
+ "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-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "js-stringify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
+ "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "js2xmlparser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz",
+ "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=",
+ "dev": true,
+ "requires": {
+ "xmlcreate": "^1.0.1"
+ }
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jstransformer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
+ "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
+ "requires": {
+ "is-promise": "^2.0.0",
+ "promise": "^7.0.1"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ }
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
+ },
+ "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"
+ }
+ },
+ "lodash": {
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+ },
+ "lodash.isempty": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz",
+ "integrity": "sha1-b4bL7di+TsmHvpqvM8loTbGzHn4=",
+ "dev": true
+ },
+ "lodash.isfunction": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+ "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
+ "dev": true
+ },
+ "lodash.isobject": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
+ "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=",
+ "dev": true
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1"
+ }
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
+ },
+ "mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
+ },
+ "mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "requires": {
+ "mime-db": "1.44.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mocha": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz",
+ "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "3.2.3",
+ "browser-stdout": "1.3.1",
+ "debug": "3.2.6",
+ "diff": "3.5.0",
+ "escape-string-regexp": "1.0.5",
+ "find-up": "3.0.0",
+ "glob": "7.1.3",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "3.13.1",
+ "log-symbols": "2.2.0",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "ms": "2.1.1",
+ "node-environment-flags": "1.0.5",
+ "object.assign": "4.1.0",
+ "strip-json-comments": "2.0.1",
+ "supports-color": "6.0.0",
+ "which": "1.3.1",
+ "wide-align": "1.1.3",
+ "yargs": "13.3.0",
+ "yargs-parser": "13.1.1",
+ "yargs-unparser": "1.6.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "mocha-allure-reporter": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/mocha-allure-reporter/-/mocha-allure-reporter-1.4.0.tgz",
+ "integrity": "sha512-Iqp4qxE9CBbikq3JjST9FY2JYFHtyoXb3i4u0g+h5KZBtjn4Rkb5ROfLeZLsnIf8RPK5nKcFGaH6DKrk7/fmYw==",
+ "dev": true,
+ "requires": {
+ "allure-js-commons": "^1.3.2"
+ }
+ },
+ "mochawesome": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mochawesome/-/mochawesome-4.1.0.tgz",
+ "integrity": "sha512-U23K19mLqmuBqFyIBl7FVkcIuG/2JYStCj+91WmxK1/psLgHlWBEZsNe25U0x4t1Eqgu55aHv+0utLwzfhnupw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "diff": "^4.0.1",
+ "json-stringify-safe": "^5.0.1",
+ "lodash.isempty": "^4.4.0",
+ "lodash.isfunction": "^3.0.9",
+ "lodash.isobject": "^3.0.2",
+ "lodash.isstring": "^4.0.1",
+ "mochawesome-report-generator": "^4.0.0",
+ "strip-ansi": "^5.0.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "mochawesome-report-generator": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-4.1.0.tgz",
+ "integrity": "sha512-8diUnfzLqMPybIsq3aw3Zc4Npw9W2ZCx8/fMR0ShAXfDTtPH4t2mRykXEWBhsBA5+jM74mjWpwEqY6Pmz+pCsw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "dateformat": "^3.0.2",
+ "fs-extra": "^7.0.0",
+ "fsu": "^1.0.2",
+ "lodash.isfunction": "^3.0.8",
+ "opener": "^1.4.2",
+ "prop-types": "^15.7.2",
+ "react": "^16.8.5",
+ "react-dom": "^16.8.5",
+ "tcomb": "^3.2.17",
+ "tcomb-validation": "^3.3.0",
+ "validator": "^10.11.0",
+ "yargs": "^13.2.2"
+ }
+ },
+ "morgan": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
+ "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
+ "requires": {
+ "basic-auth": "~2.0.0",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "on-headers": "~1.0.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "node-environment-flags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
+ "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
+ "dev": true,
+ "requires": {
+ "object.getownpropertydescriptors": "^2.0.3",
+ "semver": "^5.7.0"
+ }
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "object.getownpropertydescriptors": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+ "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "opener": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz",
+ "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==",
+ "dev": true
+ },
+ "p-limit": {
+ "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"
+ }
+ },
+ "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
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "requires": {
+ "asap": "~2.0.3"
+ }
+ },
+ "prop-types": {
+ "version": "15.7.2",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+ "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.8.1"
+ }
+ },
+ "proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "pug": {
+ "version": "2.0.0-beta11",
+ "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-beta11.tgz",
+ "integrity": "sha1-Favmr1AEx+LPRhPksnRlyVRrXwE=",
+ "requires": {
+ "pug-code-gen": "^1.1.1",
+ "pug-filters": "^2.1.1",
+ "pug-lexer": "^3.0.0",
+ "pug-linker": "^2.0.2",
+ "pug-load": "^2.0.5",
+ "pug-parser": "^2.0.2",
+ "pug-runtime": "^2.0.3",
+ "pug-strip-comments": "^1.0.2"
+ }
+ },
+ "pug-attrs": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz",
+ "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==",
+ "requires": {
+ "constantinople": "^3.0.1",
+ "js-stringify": "^1.0.1",
+ "pug-runtime": "^2.0.5"
+ }
+ },
+ "pug-code-gen": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-1.1.1.tgz",
+ "integrity": "sha1-HPcnRO8qA56uajNAyqoRBYcSWOg=",
+ "requires": {
+ "constantinople": "^3.0.1",
+ "doctypes": "^1.1.0",
+ "js-stringify": "^1.0.1",
+ "pug-attrs": "^2.0.2",
+ "pug-error": "^1.3.2",
+ "pug-runtime": "^2.0.3",
+ "void-elements": "^2.0.1",
+ "with": "^5.0.0"
+ }
+ },
+ "pug-error": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz",
+ "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ=="
+ },
+ "pug-filters": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz",
+ "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==",
+ "requires": {
+ "clean-css": "^3.3.0",
+ "constantinople": "^3.0.1",
+ "jstransformer": "1.0.0",
+ "pug-error": "^1.3.2",
+ "pug-walk": "^1.1.5",
+ "resolve": "^1.1.6",
+ "uglify-js": "^2.6.1"
+ }
+ },
+ "pug-lexer": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz",
+ "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=",
+ "requires": {
+ "character-parser": "^2.1.1",
+ "is-expression": "^3.0.0",
+ "pug-error": "^1.3.2"
+ }
+ },
+ "pug-linker": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-2.0.3.tgz",
+ "integrity": "sha1-szH/olc33eacEntWwQ/xf652bco=",
+ "requires": {
+ "pug-error": "^1.3.2",
+ "pug-walk": "^1.1.2"
+ }
+ },
+ "pug-load": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz",
+ "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==",
+ "requires": {
+ "object-assign": "^4.1.0",
+ "pug-walk": "^1.1.8"
+ }
+ },
+ "pug-parser": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-2.0.2.tgz",
+ "integrity": "sha1-U6aAz9BQOdywwn0CkJS8SnkmibA=",
+ "requires": {
+ "pug-error": "^1.3.2",
+ "token-stream": "0.0.1"
+ }
+ },
+ "pug-runtime": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz",
+ "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw=="
+ },
+ "pug-strip-comments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz",
+ "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==",
+ "requires": {
+ "pug-error": "^1.3.3"
+ }
+ },
+ "pug-walk": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz",
+ "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA=="
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ },
+ "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=="
+ },
+ "raw-body": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+ "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.23",
+ "unpipe": "1.0.0"
+ }
+ },
+ "react": {
+ "version": "16.12.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz",
+ "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "react-dom": {
+ "version": "16.12.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz",
+ "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.18.0"
+ }
+ },
+ "react-is": {
+ "version": "16.12.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz",
+ "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "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
+ },
+ "resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "requires": {
+ "align-text": "^0.1.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "scheduler": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz",
+ "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.0",
+ "statuses": "~1.4.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.2",
+ "send": "0.16.2"
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
+ },
+ "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"
+ }
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+ "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+ "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "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"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "tcomb": {
+ "version": "3.2.29",
+ "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz",
+ "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==",
+ "dev": true
+ },
+ "tcomb-validation": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz",
+ "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==",
+ "dev": true,
+ "requires": {
+ "tcomb": "^3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+ },
+ "token-stream": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
+ "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "requires": {
+ "source-map": "~0.5.1",
+ "uglify-to-browserify": "~1.0.0",
+ "yargs": "~3.10.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "requires": {
+ "center-align": "^0.1.1",
+ "right-align": "^0.1.1",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "requires": {
+ "camelcase": "^1.0.2",
+ "cliui": "^2.1.0",
+ "decamelize": "^1.0.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "optional": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
+ "uuid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
+ "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==",
+ "dev": true
+ },
+ "validator": {
+ "version": "10.11.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz",
+ "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==",
+ "dev": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^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=",
+ "dev": true
+ },
+ "wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2"
+ },
+ "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
+ },
+ "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",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
+ },
+ "with": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
+ "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
+ "requires": {
+ "acorn": "^3.1.0",
+ "acorn-globals": "^3.0.0"
+ }
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
+ },
+ "wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "xmlcreate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz",
+ "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "13.3.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
+ "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
+ "dev": true,
+ "requires": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "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"
+ }
+ },
+ "yargs-unparser": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
+ "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
+ "dev": true,
+ "requires": {
+ "flat": "^4.1.0",
+ "lodash": "^4.17.15",
+ "yargs": "^13.3.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d0c6af2
--- /dev/null
+++ b/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "app",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "start": "node ./bin/www",
+ "test": "mocha --reporter mochawesome",
+ "allure-test": "mocha --reporter mocha-allure-reporter"
+ },
+ "dependencies": {
+ "cookie-parser": "~1.4.4",
+ "debug": "~2.6.9",
+ "express": "~4.16.1",
+ "http-errors": "~1.6.3",
+ "morgan": "~1.9.1",
+ "pug": "2.0.0-beta11"
+ },
+ "devDependencies": {
+ "chai": "^4.2.0",
+ "mocha": "^6.2.2",
+ "mocha-allure-reporter": "^1.4.0",
+ "mochawesome": "^4.1.0"
+ }
+}
diff --git a/pipeline.yml b/pipeline.yml
new file mode 100644
index 0000000..bd58ce1
--- /dev/null
+++ b/pipeline.yml
@@ -0,0 +1,20 @@
+version: "1.0"
+stages:
+ - "clone"
+ - "build"
+steps:
+ main_clone:
+ title: "Clone"
+ type: "git-clone"
+ description: "Cloning main repository..."
+ repo: "vadim-kharin-codefresh/test"
+ revision: "${{CF_BRANCH}}"
+ git: test1
+ stage: "clone"
+ build:
+ title: "Building Docker Image"
+ type: "build"
+ image_name: "vadim-kharin-codefresh/test"
+ tag: "${{CF_BRANCH_TAG_NORMALIZED}}"
+ dockerfile: "Dockerfile"
+ stage: "build"
diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css
new file mode 100644
index 0000000..9453385
--- /dev/null
+++ b/public/stylesheets/style.css
@@ -0,0 +1,8 @@
+body {
+ padding: 50px;
+ font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
+}
+
+a {
+ color: #00B7FF;
+}
diff --git a/routes/index.js b/routes/index.js
new file mode 100644
index 0000000..ecca96a
--- /dev/null
+++ b/routes/index.js
@@ -0,0 +1,9 @@
+var express = require('express');
+var router = express.Router();
+
+/* GET home page. */
+router.get('/', function(req, res, next) {
+ res.render('index', { title: 'Express' });
+});
+
+module.exports = router;
diff --git a/routes/users.js b/routes/users.js
new file mode 100644
index 0000000..623e430
--- /dev/null
+++ b/routes/users.js
@@ -0,0 +1,9 @@
+var express = require('express');
+var router = express.Router();
+
+/* GET users listing. */
+router.get('/', function(req, res, next) {
+ res.send('respond with a resource');
+});
+
+module.exports = router;
diff --git a/test.txt b/test.txt
index 9daeafb..0867e73 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,3 @@
test
+test
+test
diff --git a/test/sum.js b/test/sum.js
new file mode 100644
index 0000000..84ae937
--- /dev/null
+++ b/test/sum.js
@@ -0,0 +1,21 @@
+const expect = require('chai').expect;
+
+describe('#test()', function() {
+
+ context('without arguments', function() {
+ it('should return 0', function() {
+ expect(0).to.equal(0)
+ })
+ })
+
+ context('with number arguments', function() {
+ it('should return sum of arguments', function() {
+ allure.createAttachment('test.html', '', 'text/html')
+ expect(15).to.equal(15)
+ })
+
+ it('should return argument when only one argument is passed', function() {
+ expect(5).to.equal(5)
+ })
+ })
+})
diff --git a/views/error.pug b/views/error.pug
new file mode 100644
index 0000000..51ec12c
--- /dev/null
+++ b/views/error.pug
@@ -0,0 +1,6 @@
+extends layout
+
+block content
+ h1= message
+ h2= error.status
+ pre #{error.stack}
diff --git a/views/index.pug b/views/index.pug
new file mode 100644
index 0000000..3d63b9a
--- /dev/null
+++ b/views/index.pug
@@ -0,0 +1,5 @@
+extends layout
+
+block content
+ h1= title
+ p Welcome to #{title}
diff --git a/views/layout.pug b/views/layout.pug
new file mode 100644
index 0000000..15af079
--- /dev/null
+++ b/views/layout.pug
@@ -0,0 +1,7 @@
+doctype html
+html
+ head
+ title= title
+ link(rel='stylesheet', href='/stylesheets/style.css')
+ body
+ block content